在论坛看到不少关于在子程序内部如何使用临时变量判断上升沿、下降沿的讨论,看到不少朋友将其当成了“禁区”。其实不然,在理解了PLC循环执行程序的过程,上升沿、下降沿的工作原理,以及子程序形参、实参的传递过程,就比较容易解决此类问题。在S7-300、400里面也是同样适用,以前也这么用。
今天得空,写了个简单的脉冲计数器子程序,在CPU226CN里面多次调用、测试了一下,功能正常。程序里面做了相应的分析和注释,也许对朋友们有用,分享一下,将此代码导入S7-200就可以了:
SUBROUTINE_BLOCK SBR_0:SBR0
TITLE=SUBROUTINE COMMENTS
VAR_INPUT
START:BOOL; // 启动计数
PULSE_IN:BOOL;// 输入脉冲
END_VAR
VAR_IN_OUT
AUX_BYTE:BYTE;// 辅助存储字节
PULSE_TOTAL:DINT; // 脉冲累计
END_VAR
VAR
SAVE_BIT:BOOL; // 上个周期的脉冲输入信号状态
EDGE_UP:BOOL; // 上升沿状态
END_VAR
BEGIN
Network 1 // Network Title
// 累计脉冲的计数器子程序,功能简单了点,主要表达了在子程序内部使用临时变量来判断脉冲上升沿的一种思想和模式。如果要判断下降沿,程序稍加修改就好了。
LD SM0.0
MOVB #AUX_BYTE:LB1, LB6 //从子程序外部读取上一个周期上升沿状态、脉冲信号的状态
LD #PULSE_IN:L0.1 //扫描本周期脉冲信号输入状态
AN #SAVE_BIT:L6.0 //扫描上个周期的脉冲输入信号反状态
= #EDGE_UP:L6.1 //脉冲上升沿状态(本周期和上周期脉冲状态比较的结果)
LD #PULSE_IN:L0.1 //扫描本周期脉冲信号输入状态
= #SAVE_BIT:L6.0 //存储本周期脉冲信号输入状态
LD #START:L0.0 //扫描启动计数
A #EDGE_UP:L6.1 //扫描脉冲上升沿的状态
INCD #PULSE_TOTAL:LD2 //对长整数+1累计
LD SM0.0
MOVB LB6, #AUX_BYTE:LB1 //将本周期上升沿状态、脉冲信号的状态储到子程序外部保存
END_SUBROUTINE_BLOCK