2.8 Stage Machine 概念說明
在上例中可以發現到:case 17 其實不會計時,而是當偵測到計時器的狀態為 IDLE 才改變計時器的狀態為 START,啟動輸出訊號直到計時器狀態變成 FINISH,才關閉輸出訊號,並且送出 plc.mCode.finish,讓計時器的狀態又回到 IDLE。
StageMachine 概念:StageMachine 平時處於 IDLE 狀態,必須被喚醒後才能開始執行,執行程序完成後會進入 FINISH。再由喚醒者下令讓其進入 IDLE 狀態,釋放出 StageMachine 好讓其它程序使用。使用 StageMachine 撰寫 PLC,有使 PLC 清楚、易維護之優點,故建議應使用。
我們可寫一個能讓許多功能函數呼叫的子功能函數(sub function),這樣不但可以節省程式的長度,且簡化處理程序。
因為這些函數在 PLC 程序中都是相同的概念,所以只要寫一個 StageMachine 來呼叫它。子功能函數和 StageMachine 不同的地方是:子功能函數是屬於函數的外部程式,但是 StageMachine 則是在 plcRun 程序裡面。StageMachine 可以被呼叫者喚醒及命令它進入 idle 狀態;在這個 StageMachine 未處於 idle 狀態時,其它的呼叫者是無法使用它的。
以下說明了 M03 解碼、手動啟動主軸正轉這兩個事件共用主軸正轉啟動的 StageMachine:
void PLCAPI plcRun(struct Status & sts, struct PlcBlock &plc){
if(sts.state0.bManual){ //系統在手動模式下
if(piM03 && m03StageMachine.flag == IDLE){
m03StageMachine.flag = START;
}
if(m03StageMachine.flag == FINISH)
m03StageMachine.flag = IDLE;
}
if(plc.mCode.flag){ //M 碼解碼
switch(plc.mCode.data){
case 3: //M03
if(m03StageMachine.flag == IDLE)
m03StageMachine.flag = START;
if(m03StageMachine.flag == FINISH){
m03StageMachine.flag = IDLE;
plc.mCode.finish = 1;
}
break;
}
}
// stage machine of M03
if(m03StageMachine.flag != IDLE){
switch(m03StageMachine.flag){
case START:
oM03 =1;
m03StageMachine.flag = STEP_1;
break;
case STEP_1:
if(iSpeedReach)
m03StageMachine.flag = FINISH;
break;
}
}
}