1 | 题目
定义一个FC或FB,比较两个数(双整数)的大小,只需要判断出小于或不小于(即大于等于即可)。判断结果如果是小于则输出TRUE,如果是不小于则输出FALSE,注意不能使用大于、等于和小于运算符,也不能使用IF语句。
2 | 设计分析
双整数的长度为32位,由两部分组成:一部分是符号,另一部分是数值。第0位到30位表示数值。第31位为符号位,表示值的正负状态,值为0(FALSE)表示正值,为1(TRUE)表示负值。利用符号位进行两个数的大小比较。
3 | 创建功能或功能块
添加功能块FB,命名为:“DIntCompare”。
4 | 定义接口变量
具体接口变量定义见下图:
输出变量(Output)是一种非常特殊的变量,建议变量命名时加以区分,我在命名时加了一个Q。后面有机会的话,可以和朋友们进行深入交流。
5 | 程序代码
编写程序代码。如下图:
博途SCL提供了访问数据单元某一个位的简洁方法“%X位号”,即片段访问。
6 | 代码测试
在循环OB中调用FB- “DIntCompare”,调用时会自动创建背景数据块,命名为“InstDIntCompare”,本例不使用背景数据块而是使用监控与强制表的方式进行监视和修改数据,因为背景数据块监视不能进行显示格式选择。
转至在线并监控程序。如下图:
999和888比较,999大于888,符号位为0,输出结果为FALSE,即不小于。
666和888比较,666小于888,符号位为1,输出结果为TRUE,即小于。
7 | 总结
变量定义时如果定义为临时变量,在监控和强制表中看不到;
片段访问可以用X访问位单元、B访问字节单元、W访问字单元、D访问双字单元。
西门子 1500 1200 PLC,位访问, 字节访问
访问byte,word中的位
mybyte.%X1
myword.%X1
访问word/dword中的byte
myword.%B0
myword.%B1
myDword.%B0
文中mybyte, myword, mydword请替换为自己的变量
处理 ENO
如果说编一些报警程序,想必每个开发者或者公司都有相关经验,方法也是五花八门。但如果只是指令的一些报警,这个可能大家就不是很熟悉了。这里就介绍一个小技巧,可以在处理指令报警时达到事半功倍的效果。
可能大家都注意到了,很多指令,例如数学运算、转换等,或者FC、FB中都会在右边输出端有个ENO。一般都空在那里,也没有什么影响,要不就是后面串联其他的块,仅此而已。
其实不然,之所以感觉不到它有什么作用,是因为这个功能默认不激活,也就是ENO一直为True。但实际上我们可以激活这个功能,让ENO去判断指令或块是否执行异常。这时计算正常ENO输出True,计算异常ENO输出False。
像指令中的计算超限、或者转换出错等都可以判断出来。此外还可以在自定义块中对ENO赋值,自行给出或判断ENO状态。
那怎么能使得指令、块的 ENO 激活呢?
非常简单,对于LAD/FBD中调用的基本指令,可以直接在指令的右键菜单中生成ENO,即激活ENO。如图5所示。
图5. 生成 ENO
如果是SCL块,或者是LAD/FBD块中SCL段调用基本指令激活ENO,则不能像图5中的方式。需要在所在块属性中激活设置,如图6所示的红框。
图6. SCL生成ENO
当然如果是系统指令块或者是用户块的话,只要是块内部有对ENO 进行修改,那么在调用该块的时候就可能会出现ENO = False的情况。
下面我们看一个SCL中ENO的使用例子,如图7所示。看了这个例子您应该对ENO就有了更深一步的认识了。
图7.ENO 示例
上面的例子中,因为DINT的范围比INT要大,转换是可能会失败的,一旦变量num的范围超过了INT的范围,那ENO必然会输出False。
所以利用ENO的功能,可以优化程序。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |