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.
 
 
 

5.2 KiB

    /*
     *
     *	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. 满足其他服务运行的状态。