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;

 }

}

}