/* * * while(!isWaitingForStop()){ * if(当前样本处理完成){ * if(入料口有样本){ * 扫描样本 && 判断耗材是否充足 * 如果耗材不足, * 提示用户(抛出提示事件), * 暂停设备(退出线程(抛出pause异常)) * 如果扫描样本有误 * 提示用户 * 暂停设备 * } * } * else{ * 处理样本 * } * } * * try{ * * }catch(PauseException e){ * //pauseSelf * //抛出事件 * } * * if(event){ * pauseSampleProcessThread(); * } * */ 经验: 动作与赋值分开 当一组动作完全执行完之后,再赋值给状态,这样就可以使得动作在执行过程中任意时间点都可以被打断。 while(true){ TubeCfg cfg = getTubeCfg(i); moveTubeHolderProcessPos if(tubeType == xxx) takeTube shakeTube(times,degree) takeHap move else if(){ ... } pausePoint; } 问题: 有两种暂停状态: 一种是复位势暂停。 一种是保持现状势暂停。(前提是循环中) pause/stop 动作划分为状态机 scan{ . . . . } 状态机->enter 状态机->enter { IDLE { if(state.eq(wokring)){ state.changeTo(scanPrepare) } } SCANPREPARE { enterState exitState if(ioTrigger){ moveTubeHolderTo waitForIoTrigger changeStateTo(scanTubeHolderType) if(error){ changeStateToError } } } SCANHODLER { move scan } SCAN PAUSE { } } ``` 用户PAUSE --> 暂停,恢复,全局状态的变更。 遇到错误 --> 通知,记录,清空工作位。无需恢复。 状态机 --> 修改全局状态。 记录。 执行动作。 前端接口: pause; continue; 全局都有哪些状态? 1. 类似于配置, 初始化 运行过程中修改(前端提交) 2. 运行过程控制,记录当前设备运行到哪一步,以便执行下一步。 步骤与暂停之间的关系。 步骤与恢复? 步骤与停止之间的关系。 步骤 步骤 步骤 步骤 步骤 暂停 步骤 ---------------------------------------------- 每一步都有几种处理方法 1. firstEnter checkCondition是否满足 2. finalExit 3. loop 4. pause 5. continue waitting_for_take_sample pause stepPause; stepContinue; stop 协作? 全局状态 { take_tip take_xxx put_xxx waitting_for onPause{ .... } onStop{ ... } pauseCondtion{ ... } } { pause... } pause_point ``` ``` 服务的提供者, 服务的使用者, 相互配合呢? triggerHasTakeSample doNext ---处理--- | | | --搬运--(等待) | | 扫描与预处理(等待) 抛出事件。 机械臂 takeSampleEnd ---------------------------- 暂停: waitingForPause,不需要弹出,只有单次循环结束 停止: break? 异常: exception? 第一假如需要允许暂停,则需要将步骤进行拆分,暂停点作为一步。 机械动作的暂停,涉及到,暂停和暂停恢复,不能简单的在代码中添加一个pause就可以的。 ```