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;
}
}
}