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.

354 lines
5.2 KiB

10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
10 months ago
  1. /*
  2. *
  3. * while(!isWaitingForStop()){
  4. * if(当前样本处理完成){
  5. * if(入料口有样本){
  6. * 扫描样本 && 判断耗材是否充足
  7. * 如果耗材不足,
  8. * 提示用户(抛出提示事件),
  9. * 暂停设备(退出线程(抛出pause异常))
  10. * 如果扫描样本有误
  11. * 提示用户
  12. * 暂停设备
  13. * }
  14. * }
  15. * else{
  16. * 处理样本
  17. * }
  18. * }
  19. *
  20. * try{
  21. *
  22. * }catch(PauseException e){
  23. * //pauseSelf
  24. * //抛出事件
  25. * }
  26. *
  27. * if(event){
  28. * pauseSampleProcessThread();
  29. * }
  30. *
  31. */
  32. 经验:
  33. 动作与赋值分开
  34. 当一组动作完全执行完之后,再赋值给状态,这样就可以使得动作在执行过程中任意时间点都可以被打断。
  35. while(true){
  36. TubeCfg cfg = getTubeCfg(i);
  37. moveTubeHolderProcessPos
  38. if(tubeType == xxx)
  39. takeTube
  40. shakeTube(times,degree)
  41. takeHap
  42. move
  43. else if(){
  44. ...
  45. }
  46. pausePoint;
  47. }
  48. 问题:
  49. 有两种暂停状态:
  50. 一种是复位势暂停。
  51. 一种是保持现状势暂停。(前提是循环中)
  52. pause/stop
  53. 动作划分为状态机
  54. scan{
  55. .
  56. .
  57. .
  58. .
  59. }
  60. 状态机->enter
  61. 状态机->enter
  62. {
  63. IDLE
  64. {
  65. if(state.eq(wokring)){
  66. state.changeTo(scanPrepare)
  67. }
  68. }
  69. SCANPREPARE
  70. {
  71. enterState
  72. exitState
  73. if(ioTrigger){
  74. moveTubeHolderTo
  75. waitForIoTrigger
  76. changeStateTo(scanTubeHolderType)
  77. if(error){
  78. changeStateToError
  79. }
  80. }
  81. }
  82. SCANHODLER
  83. {
  84. move
  85. scan
  86. }
  87. SCAN
  88. PAUSE
  89. {
  90. }
  91. }
  92. ```
  93. 用户PAUSE --> 暂停,恢复,全局状态的变更。
  94. 遇到错误 --> 通知,记录,清空工作位。无需恢复。
  95. 状态机 -->
  96. 修改全局状态。
  97. 记录。
  98. 执行动作。
  99. 前端接口:
  100. pause;
  101. continue;
  102. 全局都有哪些状态?
  103. 1. 类似于配置,
  104. 初始化
  105. 运行过程中修改(前端提交)
  106. 2. 运行过程控制,记录当前设备运行到哪一步,以便执行下一步。
  107. 步骤与暂停之间的关系。
  108. 步骤与恢复?
  109. 步骤与停止之间的关系。
  110. 步骤
  111. 步骤
  112. 步骤
  113. 步骤
  114. 步骤
  115. 暂停
  116. 步骤
  117. ----------------------------------------------
  118. 每一步都有几种处理方法
  119. 1. firstEnter
  120. checkCondition是否满足
  121. 2. finalExit
  122. 3. loop
  123. 4. pause
  124. 5. continue
  125. waitting_for_take_sample
  126. pause
  127. stepPause;
  128. stepContinue;
  129. stop
  130. 协作?
  131. 全局状态
  132. {
  133. take_tip
  134. take_xxx
  135. put_xxx
  136. waitting_for
  137. onPause{
  138. ....
  139. }
  140. onStop{
  141. ...
  142. }
  143. pauseCondtion{
  144. ...
  145. }
  146. }
  147. {
  148. pause...
  149. }
  150. pause_point
  151. ```
  152. ```
  153. 服务的提供者,
  154. 服务的使用者,
  155. 相互配合呢?
  156. triggerHasTakeSample
  157. doNext
  158. ---处理---
  159. | |
  160. | --搬运--(等待)
  161. | |
  162. 扫描与预处理(等待) 抛出事件。
  163. 机械臂
  164. takeSampleEnd
  165. ----------------------------
  166. 暂停:
  167. waitingForPause,不需要弹出,只有单次循环结束
  168. 停止:
  169. break?
  170. 异常:
  171. exception?
  172. 第一假如需要允许暂停,则需要将步骤进行拆分,暂停点作为一步。
  173. 机械动作的暂停,涉及到,暂停和暂停恢复,不能简单的在代码中添加一个pause就可以的。
  174. 协作
  175. 机械臂异常--> 中断 --> 退出。
  176. 扫描与预处理 --> break = WaittingForFlag(stop)
  177. ----------------------
  178. 急停:
  179. 不恢复--->threadStop-->触发线程异常
  180. 停止:
  181. 抛出异常
  182. 程序打断
  183. 打断当前状态,调用状态本身的onStop();
  184. stop--->
  185. 停止:
  186. 不想用异常
  187. stopPoint.
  188. stopPoint.
  189. stopPoint(if(isStopFlag) throwException)
  190. onStop{
  191. }
  192. waittingForState(其他线程,用户,等触发的逻辑){}
  193. 取试管
  194. if(stopFlag){
  195. ....
  196. ....
  197. return;
  198. }
  199. if(stopFlag){
  200. ....
  201. ....
  202. ....
  203. }
  204. putTubeBak
  205. ...
  206. ...
  207. ...
  208. ...
  209. ...
  210. ..
  211. stop()
  212. 公共区+相互等待
  213. 取样的时候,机械臂线程出现异常
  214. 机械臂退出
  215. 尝试一次复位
  216. 预处理线程
  217. stop();
  218. 直接执行,抛出异常。
  219. stop
  220. stop
  221. stop
  222. isStoped
  223. isStoped
  224. isStoped
  225. 前端只触发状态的改变,而不直接触发具体动作。这样可以保证让某些接口可以重复调用而不出错。
  226. stoped......
  227. stoped......
  228. stoped......
  229. 耗材不足
  230. ---> 暂停补充耗材
  231. pause:
  232. 先抛出事件,再执行暂停动作
  233. ---------------------------------------------
  234. 1. 耗材不足导致的暂停(任何阶段,例如取耗材失败)
  235. 2. 用户信息获取失败导致的暂停(扫描阶段)
  236. 设备继续运行下
  237. 设备触发耗材不足事件
  238. 在触发点等待waitingForStop
  239. 如果是计数不对,则设置错误标志位。
  240. 如果耗材数量不足,则在处理当前试管前,触发stop
  241. //
  242. 状态:
  243. 1. 满足自己运行的状态。
  244. 2. 满足其他服务运行的状态。
  245. ```
  246. ```
  247. ```