PLC结构化文本IF语句功能块不受en控制始终执行问题咨询
问题根因
这个异常的核心原因是你定义的输入变量名en撞上了IEC 61131-3标准里PLC功能块的内置保留变量名,编译器的特殊处理逻辑直接让你写的条件判断失效了。
你编写的功能块定义和逻辑如下:
FUNCTION_BLOCK chujwamwdupe VAR_INPUT en:BOOL; val:INT; END_VAR VAR_OUTPUT oval:INT; END_VAR VAR END_VAR
IF (en = TRUE) THEN oval := val; END_IF
具体原理
- 按照PLC通用的IEC 61131-3编程规范,所有功能块默认自带两个隐式保留变量,不需要用户手动声明:一个是BOOL类型的输入引脚
EN,控制功能块是否执行;另一个是BOOL类型的输出引脚ENO,反馈功能块是否正常执行完成。 - 内置
EN的处理优先级比用户写的内部代码高得多:只有EN为TRUE时,功能块内部的用户代码才会运行;如果EN为FALSE,整个功能块的内部代码会被直接跳过,所有输出保持上一次扫描的数值。 - 当你手动在VAR_INPUT段声明同名的
en:BOOL时,几乎所有PLC编译器都不会报重名错误,但会触发两个不符合你预期的处理逻辑:- 编译器会把功能块真正的内置
EN强制设为恒TRUE,也就是说不管你调用功能块时给外面看到的en引脚传TRUE还是FALSE,功能块每个扫描周期都会正常执行内部代码,根本不会跳过。 - 编译器看到你在内部代码里判断
en变量,会默认这个判断是多余的——毕竟能跑到内部代码,就说明内置EN已经是TRUE了,所以编译优化阶段直接把IF (en = TRUE) THEN这个条件判断删掉,oval := val就变成了每次都执行的无条件语句。
- 编译器会把功能块真正的内置
- 最后就会出现你碰到的现象:不管
en输入是什么值,oval都会被赋值为val。
修复方法
把你自定义的使能输入改个名,比如叫enable、i_en这类非保留字的名字,避开EN、ENO两个内置保留名就行。如果你本来就打算用功能块自带的使能引脚,根本不需要手动声明en变量,直接在调用功能块的时候给内置EN引脚传参就可以。
内容的提问来源于stack exchange,提问作者user3742046
相关产品推荐
相关产品推荐

