1,实际生产中,收到的开关信号往往是短信号/脉冲
2, Step 变化的逻辑和设备的逻辑分开。Step的变化逻辑在实际中往往是设备的反馈信号决定,在此处用定时器信号代替。定时器的触发用Step的状态触发,写在IF ELSIF 语句之外,用定时器(或设备反馈)的Q驱动Step的更新
3,IF ELSIF 之间是互斥事件
4, 如果只用IF ELSIF 而不用ELSE, 那么短信号的判断条件有效, 结果且带自锁
5, 如果用了IF ELSIF + ELSE,那么长信号的判断条件有效,结果且不带自锁, 短信号判断条件时效过后, 会自动跳至Else
6,如果使用IF ELSIF 语句,那么每条结果最好都写上所有OutPut的状态,例如这里的“电机正转”,“电机反转”,“指示灯闪烁”,这样逻辑更严谨
7,多个相同设备的模板程序,需要通过Input OutPut传入参数的程序需要用FB,而不是FC。因为FC中的InPut和OutPut没有分配内存,表现在程序中就是:通过FC块传入的Input变量在做If 条件时,判断的结果OutPut没有自锁功能
启动 Bool false
停止 Bool false
Output
电机正转 Bool false
电机反转 Bool false
指示灯闪烁 Bool false
InOut
Static
上升沿 Array[0..5] of Bool
Step Int 0
R_TRIG_Start R_TRIG
TON1 TON_TIME
T1On Bool false
TON2 TON_TIME
R_TRIG_Stop R_TRIG
REGION #启动和停止的触发
#R_TRIG_Start(CLK := #启动,
Q => #上升沿[0]);
#R_TRIG_Stop(CLK := #停止,
Q => #上升沿[1]);
END_REGION
REGION Step 顺序控制步数的更新
IF #上升沿[0] THEN
#Step := 1;
;
ELSIF #TON1.Q THEN
#Step := 2
;
ELSIF #TON2.Q THEN
#Step := 3
;
ELSIF #上升沿[1] THEN
#Step := 0
;
END_IF;
END_REGION
REGION 根据Step的状态更新设备状态
IF #Step = 1 THEN
#电机正转 := TRUE;
#电机反转 := FALSE;
#指示灯闪烁 := FALSE;
;
ELSIF #Step = 2 THEN
#电机反转 := TRUE;
#电机正转 := FALSE;
#指示灯闪烁 := FALSE;
;
ELSIF #Step = 3 THEN
#电机反转 := FALSE;
#电机正转 := FALSE;
#指示灯闪烁 := FALSE;
ELSIF #Step = 0 THEN
#电机反转 := FALSE;
#电机正转 := FALSE;
#指示灯闪烁 := TRUE;
;
END_IF;
END_REGION
REGION 根据Step更新定时器状态
#TON1(IN := #Step = 1,
PT := T#5S);
#TON2(IN := #Step = 2,
PT := T#5S);
END_REGION