You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/* * * 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就可以的。
协作
机械臂异常--> 中断 --> 退出。 扫描与预处理 --> break = WaittingForFlag(stop)
---------------------- 急停: 不恢复--->threadStop-->触发线程异常
停止: 抛出异常 程序打断
打断当前状态,调用状态本身的onStop(); stop--->
停止: 不想用异常 stopPoint. stopPoint. stopPoint(if(isStopFlag) throwException)
onStop{
}
waittingForState(其他线程,用户,等触发的逻辑){}
取试管 if(stopFlag){ .... .... return; }
if(stopFlag){ .... .... .... } putTubeBak ... ... ... ... ... ..
stop()
公共区+相互等待
取样的时候,机械臂线程出现异常 机械臂退出 尝试一次复位
预处理线程 stop(); 直接执行,抛出异常。
stop stop stop
isStoped isStoped isStoped
前端只触发状态的改变,而不直接触发具体动作。这样可以保证让某些接口可以重复调用而不出错。
stoped...... stoped...... stoped......
耗材不足 ---> 暂停补充耗材 pause: 先抛出事件,再执行暂停动作
--------------------------------------------- 1. 耗材不足导致的暂停(任何阶段,例如取耗材失败) 2. 用户信息获取失败导致的暂停(扫描阶段)
设备继续运行下 设备触发耗材不足事件 在触发点等待waitingForStop
如果是计数不对,则设置错误标志位。 如果耗材数量不足,则在处理当前试管前,触发stop
// 状态: 1. 满足自己运行的状态。 2. 满足其他服务运行的状态。
```
``` ```
|