2.7 使用系統的對時訊號來創造計時器


INCON-M 系列控制器的 PLC 將系統對時訊號(time tick)儲存在 sts.sysTimeTick,單位是 1/256 秒,PLC 可以利用這個對時訊號來設計計時器。


典型的計時器會用旗標 ( flag)表示其狀態,用變數來設定結束時間。寫法:先為計時器定義一個新的資料型態timerPlc),再使 generalTimer 成為 timerPlc 資料型態的資料(為 PLC 程序創造一個計時器)。下面的例子 M17(case 17)是指吹氣裝置的作用時間,至於時間的長短可以透過參數來設定。


#define oAirBlow (plc.gdo[1].bit.bit00) //吹氣控制輸出訊號

#define paAirBlowTime (para[10]) //吹氣裝置的作用時間以參數設定

struct timerPlc{ //定義計時器的資料型態

int flag; //計時器的 flag

long int time; //對時訊號計數

}

timerPlc generalTimer; //用 timePlc 型態定義一個一般的計時器

enum {IDLE = 0, START, STEP_1, STEP_2, STEP_3, STEP_4, STEP_5, STEP_6, STEP_7, STEP_8, STEP_9, STEP_10, FINISH}; //各個 flag 的值

void PLCAPI plcOpen(struct Status &sts, struct PlcBlock &plc, unsigned short *PlcData, long *LongPlcData){

generalTimer.flag = IDLE; //開機時的初始設定

oAirBlow = 0; //吹氣裝置的初始狀態,設定成吹氣不作用的狀態。

}

void PLCAPI plcRun(struct Status &sts, struct PlcBlock &plc){

if(plc.mCode.flag){

 switch(plc.mCode.data){

  case 17: //吹氣裝置的作用時間

   if(generalTimer.flag == IDLE){

    oAirBlow = 1;

    generalTimer.flag = START; //啟動計時器計時

    generalTimer.time = sts.sysTimeTick + paAirBlowTime;  //對時訊號計算

   }

   if(generalTimer.flag == FINISH){

    generalTimer.flag = IDLE;

    oAirBlow = 0;

    plc.mCode.finish = 1;

   }

   break;

 }

}

//一般計時器的 stage machine

if(generalTimer.flag != IDLE){

 switch(generalTimer.flag){

  case START:

    generalTimer.flag = STEP_1;

    break;

  case STEP_1:

   if(sts.sysTimeTick >= generalTimer.time)

    generalTimer.flag = FINISH;

   break;

 }

}

}