发表于:2021/10/27 20:13:39
#0楼
【万泉河】SMART 200转换LREAL长浮点型数据
我有写过文章,讲浮点数累加,当累加数太大之后, 会产生溢出的问题。后来终极的解决方案不是自己做函数,而是当CPU支持64位的长浮点数LREAL数据之后,自然就迎刃而解了。
技术的进步秒杀你曾经一切辛辛苦苦的努力。
这个技能不光PLC需要, 反而更需要的是各种流量仪表。水流量表,电度表等等。对这些仪表来说,累加是基本功能,所以他们只需要把底层芯片升级到支持64位,也是瞬间解决了大问题。
然而技术的进步总不能完全同步的。
前段时间,就有遇到网友咨询,SMART 200跟流量计通讯,读来了LREAL类型的数据不能识别,该怎么处理。
即,现场的仪表很容易就升级了,然而,控制系统使用的PLC却并不能做到同步升级。 总要遇到这样的速度不匹配的状况。
如果PLC是S7-1200/1500, 那很简单, 直接用LREAL数据来识别运算即可。
而SMART 200所能识别的数据最多只有32位,根本没有可能。
所以唯一的办法是自己动手做个转换函数,转换为32位的REAL数据。
这个转换过程, 就类似于把一个DINT转换为INT一样, 前提都是数值表达区间没有过限,同时与64位数据相比, 还会损失一部分表达精度。 但通常,这些都不重要。 重要的是能识别。这才是最主要的, 有时候也是最要命的。
所以,专门做了个函数。
函数的使用和接口都很简单。 收来的2个DWORD依次放到2个输入管脚,输出部分即可得到答案。
然而,测试和验证却是不太容易。
我现在可以告诉你,比如一个数值 -123.44 , 对应的2个DWORD分别是:
16#C05E_DC6A
16#7EF9_DB23
那你仍然不会满意, 你会需要更多的数值多次验证。
那么我们如何可以知道一个LREAL数值, 拆到2个DWORD之后的数值是多少呢?不知道就无从测试啊!
这里教给大家一个简便的方法。 这种方法在实际调试中非常有用,特别是各种通讯数据处理时。 然而恐怕大部分同行不知道。或者说没想到过。
准备一个S7-1200的PLC。
变量表中定义一个LREAL的变量,指向比如M10.0, 然后再定义2个DWORD, 分别指向MD10和MD14。
然后在线后添加这3个变量的监控:
在修改值中随意修改数值,即在下方监视值中看到了对应的十六进制的值。
事实上我做这个程序的测试,就是同时开着S7-1200和SMART200,对照执行实现的。
如果开PLCSIM, 也完全可以。 我在S7-300的时候,类似的调试都是直接使用PLCSIM的。甚至,STEP7中都不需要定义什么变量,直接监控绝对地址的变量值即可。 有正在运行的PLC, 随便找一块未用的数据区进行这种数值的转换,都可以。
把得到的数值在SMART 200的监控表中监控,就得到了正确的转换值
我有写过文章,讲浮点数累加,当累加数太大之后, 会产生溢出的问题。后来终极的解决方案不是自己做函数,而是当CPU支持64位的长浮点数LREAL数据之后,自然就迎刃而解了。
技术的进步秒杀你曾经一切辛辛苦苦的努力。
这个技能不光PLC需要, 反而更需要的是各种流量仪表。水流量表,电度表等等。对这些仪表来说,累加是基本功能,所以他们只需要把底层芯片升级到支持64位,也是瞬间解决了大问题。
然而技术的进步总不能完全同步的。
前段时间,就有遇到网友咨询,SMART 200跟流量计通讯,读来了LREAL类型的数据不能识别,该怎么处理。
即,现场的仪表很容易就升级了,然而,控制系统使用的PLC却并不能做到同步升级。 总要遇到这样的速度不匹配的状况。
如果PLC是S7-1200/1500, 那很简单, 直接用LREAL数据来识别运算即可。
而SMART 200所能识别的数据最多只有32位,根本没有可能。
所以唯一的办法是自己动手做个转换函数,转换为32位的REAL数据。
这个转换过程, 就类似于把一个DINT转换为INT一样, 前提都是数值表达区间没有过限,同时与64位数据相比, 还会损失一部分表达精度。 但通常,这些都不重要。 重要的是能识别。这才是最主要的, 有时候也是最要命的。
所以,专门做了个函数。
函数的使用和接口都很简单。 收来的2个DWORD依次放到2个输入管脚,输出部分即可得到答案。
然而,测试和验证却是不太容易。
我现在可以告诉你,比如一个数值 -123.44 , 对应的2个DWORD分别是:
16#C05E_DC6A
16#7EF9_DB23
那你仍然不会满意, 你会需要更多的数值多次验证。
那么我们如何可以知道一个LREAL数值, 拆到2个DWORD之后的数值是多少呢?不知道就无从测试啊!
这里教给大家一个简便的方法。 这种方法在实际调试中非常有用,特别是各种通讯数据处理时。 然而恐怕大部分同行不知道。或者说没想到过。
准备一个S7-1200的PLC。
变量表中定义一个LREAL的变量,指向比如M10.0, 然后再定义2个DWORD, 分别指向MD10和MD14。
然后在线后添加这3个变量的监控:
在修改值中随意修改数值,即在下方监视值中看到了对应的十六进制的值。
事实上我做这个程序的测试,就是同时开着S7-1200和SMART200,对照执行实现的。
如果开PLCSIM, 也完全可以。 我在S7-300的时候,类似的调试都是直接使用PLCSIM的。甚至,STEP7中都不需要定义什么变量,直接监控绝对地址的变量值即可。 有正在运行的PLC, 随便找一块未用的数据区进行这种数值的转换,都可以。
把得到的数值在SMART 200的监控表中监控,就得到了正确的转换值
PLC标准化编程