发表于:2022/4/29 9:58:00
#0楼
0428 【万泉河】PLC编程:谈虎色变双线圈
双线圈问题是PLC行业独有的问题。如果把这个名词讲给没有接触过PLC的IT程序员, 对方一定蒙逼,不知所云。
所以,可以算作是PLC工程师相比IT工程师掌握的为数不多的行业门槛。
很多人引以为傲, 而同时也有很多人提及双线圈就谈虎色变。
对程序中有可能出现双线圈忧心忡忡。
看来是入门学习PLC的时候,被某些培训老师给惊吓着了。 留下了病根。
而有一些品牌如三菱的编程软件,在编译过程中会频繁冒出双线圈警告,无疑在同行中也加深了这种忧虑。
以为是完全不可触及的禁区。
而其实,是个很简单的小问题。
双线圈问题的描述是基于梯形图语言的:即在整个PLC的程序范围内,对同一个Q点的输出线圈()指令只能有一次。 不要超过两次。 如果超过两次,就很有可能程序有BUG。 因为两次线圈()之中的某一次会无效。
线圈指令的本质是赋值。
是对某个开关量的Q点,赋值以计算后的结果1或者0。
即如果程序中有连续两次赋值:
Q:=1;
Q:=0;
则最终执行的结果是0,前面的1的赋值部分,被冲掉了。
所以, 除非你有意这样写程序,否则检查中发现这样的语句,就需要小心一点,有可能有错误。
我们这里讲线圈的本质是赋值,但反过来却未必成立。 赋值指令却未必是线圈(),因为还有(S)/(R)置位/复位指令。即,后两者并不是线圈,当说到双线圈的时候,唯一特指的就是只有()。
(S)/(R)置位/复位指令的本质是条件赋值。
所以,线圈指令的本质其实是无条件赋值。 警惕双线圈其实是要你警惕两次以上的无条件赋值。
比如
Q:=I;
这是赋值。
而如果用SR指令写,其实是IF/THEN的条件判断,以文本表达为:
IF I=TRUE THEN
Q:=TRUE;
ELSE
Q:=FALSE;
END_IF;
上述两种程序写法是完全等效的,效果完全一样。然而如果遇到两次需要写操作的场合,而且两次写操作不能合并, 只能分在两个不同的位置。前一种:
Q:=I1;
…
Q:=I2;
程序是有错误,而且无法解决。
而后一种,则可以各自增加上升沿下降沿的判断,最终分别实现
IF I1=TRUE AND I1_SAVE=FALSE THEN
Q:=TRUE;
IF I1=FALSE AND I1_SAVE= TRUE THEN
Q:=FALSE;
I1_SAVE:=I1;
………….
IF I2=TRUE AND I2_SAVE=FALSE THEN
Q:=TRUE;
IF I2=FALSE AND I2_SAVE= TRUE THEN
Q:=FALSE;
I2_SAVE:=I2;
这样的程序,大致实现了I1和I2分别为TRUE时,都可以点亮Q。 而不必非要把程序逻辑拼在一个段落中, 用OR语句来实现。
注意, 这里的逻辑还是只是大致实现。 是假设I1和I2的变化不会同时发生的情况下。
如果有同时发生, 而且发生时间片段有重叠,那么还需要更复杂的处理。
在我的新书《PLC标准化编程原理与方法》CH5.6.1一节中有详细介绍。
总之,对于双线圈难题的解决方案是:不要用线圈。
S/R不是线圈。
双线圈问题是PLC行业独有的问题。如果把这个名词讲给没有接触过PLC的IT程序员, 对方一定蒙逼,不知所云。
所以,可以算作是PLC工程师相比IT工程师掌握的为数不多的行业门槛。
很多人引以为傲, 而同时也有很多人提及双线圈就谈虎色变。
对程序中有可能出现双线圈忧心忡忡。
看来是入门学习PLC的时候,被某些培训老师给惊吓着了。 留下了病根。
而有一些品牌如三菱的编程软件,在编译过程中会频繁冒出双线圈警告,无疑在同行中也加深了这种忧虑。
以为是完全不可触及的禁区。
而其实,是个很简单的小问题。
双线圈问题的描述是基于梯形图语言的:即在整个PLC的程序范围内,对同一个Q点的输出线圈()指令只能有一次。 不要超过两次。 如果超过两次,就很有可能程序有BUG。 因为两次线圈()之中的某一次会无效。
线圈指令的本质是赋值。
是对某个开关量的Q点,赋值以计算后的结果1或者0。
即如果程序中有连续两次赋值:
Q:=1;
Q:=0;
则最终执行的结果是0,前面的1的赋值部分,被冲掉了。
所以, 除非你有意这样写程序,否则检查中发现这样的语句,就需要小心一点,有可能有错误。
我们这里讲线圈的本质是赋值,但反过来却未必成立。 赋值指令却未必是线圈(),因为还有(S)/(R)置位/复位指令。即,后两者并不是线圈,当说到双线圈的时候,唯一特指的就是只有()。
(S)/(R)置位/复位指令的本质是条件赋值。
所以,线圈指令的本质其实是无条件赋值。 警惕双线圈其实是要你警惕两次以上的无条件赋值。
比如
Q:=I;
这是赋值。
而如果用SR指令写,其实是IF/THEN的条件判断,以文本表达为:
IF I=TRUE THEN
Q:=TRUE;
ELSE
Q:=FALSE;
END_IF;
上述两种程序写法是完全等效的,效果完全一样。然而如果遇到两次需要写操作的场合,而且两次写操作不能合并, 只能分在两个不同的位置。前一种:
Q:=I1;
…
Q:=I2;
程序是有错误,而且无法解决。
而后一种,则可以各自增加上升沿下降沿的判断,最终分别实现
IF I1=TRUE AND I1_SAVE=FALSE THEN
Q:=TRUE;
IF I1=FALSE AND I1_SAVE= TRUE THEN
Q:=FALSE;
I1_SAVE:=I1;
………….
IF I2=TRUE AND I2_SAVE=FALSE THEN
Q:=TRUE;
IF I2=FALSE AND I2_SAVE= TRUE THEN
Q:=FALSE;
I2_SAVE:=I2;
这样的程序,大致实现了I1和I2分别为TRUE时,都可以点亮Q。 而不必非要把程序逻辑拼在一个段落中, 用OR语句来实现。
注意, 这里的逻辑还是只是大致实现。 是假设I1和I2的变化不会同时发生的情况下。
如果有同时发生, 而且发生时间片段有重叠,那么还需要更复杂的处理。
在我的新书《PLC标准化编程原理与方法》CH5.6.1一节中有详细介绍。
总之,对于双线圈难题的解决方案是:不要用线圈。
S/R不是线圈。
PLC标准化编程