分类 电气 下的文章

急停判定的作用是:在急停常闭中断时,输出急停激活信号,且在按下复位按钮之前,保持急停状态不变。

这意味着我们要记忆状态,但是IEC61131-3标准Function是无状态的,而且也不接受指针、引用作为参数。

方法一自然是使用Function_Block,但是为这个简单的功能建一个FB,有点杀鸡焉用牛刀之感;何况其中只有一个BOOL型状态变量,我并不确定这个FB的实例会占据多大的字节空间——对这个FB中的BOOL型变量究竟是否会被优化与其它外部BOOL型变量合并,我更是持怀疑态度。

方法二是借用函数式编程语言的惯用操作,状态由外部存储和管理,FUNCTION只接收老状态,经过计算后返回新状态。由于FUNCTION本身无状态,所使用的参数和局部变量都分配在栈上,这种方式更符合我的品味,所以这里采用这种方法。
其声明如下:

FUNCTION CheckEmStop

VAR_INPUT
    btnEmStop_nc: BOOL;      // 急停信号常闭点
    btnReset: BOOL ;         // 复位信号
    oldEmStopActive: BOOL;   // 老状态
END_VAR
 
VAR_OUTPUT
    newEmStopActive : BOOL;  // 新状态
END_VAR

代码实现非常简单,直接按业务逻辑进行翻译即可:

阅读剩余部分