看到一个网友的问题,西门子200PLC采用MODBUS RTU协议采集多功能仪表的数据,接收的数据均是32位的单精度浮点数,我怎么在PLC程序里面实现单精度浮点数与十进制之间的转换?
且问题的配图如下:
结合图片看了你的问题,其实你的问题就是你接收的到的32位数据是450F9000,而且你知道这个数据其实是单精度浮点数,转换为10进制的结果是2297,你想知道在西门子200PLC中如何实现这个转换工程?
来说一下解题思路吧:
1:你不知道西门子200PLC中如何实现这个转换,可能的原因是你对16#450F9000如何转换为2297可能也有点不理解?
2:你不知道西门子200PLC中应该用什么样的指令来实现这个转换工程!
16#450F9000如何转换为2297?
来先看一下计算器中的转换吧:
这是我电脑win10系统中的计算器切换到程序员模式,可以看到16进制的450F 9000转换为十进制数是1158647808,和你的2297是不一样的!--但是我在BIN就是二进制这里画了红线,我想说的是你如果对西门子PLC中32位浮点数的数据格式有清楚的理解的话,你根据这段二进制值就可以推算出这个实数的值是多少,因为我(控制研究控)在之前的问答和文章中有说过这个知识点,所以这里我就不再多说了!---但是我自己计算了一下结果就是2297!
PLC程序中如何将16进制的450F9000转换为十进制数?
其实西门子PLC中的ROUND指令就是用来取整的将浮点数转换为整数的,西门子300和200PLC中都有这个指令,所以我都测试了一下!
先看一下西门子300PLC执行的结果:
这个图片是我在step7项目中建立的一个300CPU项目的简单程序,可以看到我把16#450F9000这串数据认为是双正式,通过DI_R指令转换的结果存储到MD10中得到的实数值是1.15865e+009,这是一个双整数转实数的指令,但是如题目所说开始的16#450F9000它本身就是浮点数格式,因此这里视为双整数是不对的!
而我又用round指令,将16#450F9000这个数据转换为整数,可以看到MD20的结果就是2297,这个结果才是对的。这里就是已经认定16#450F9000这串数据代表的是32位实数,因此结果正确!
再看一下西门子200PLC中的执行结果:
这个图片是我在西门子200的非官方模拟器中做的测试程序,可以看到和西门子300PLC的程序是很相似的,指令都是一样的DI_R双整数转实数,和ROUND取整指令!
也可以看到他们执行的结果都是一样的,最重要的是通过round指令就可以实现将32位浮点数16#450F9000转换为整数2297,也就是10进制的2297!
所以说这个问题应该是很简单的,就一个round指令就可以实现浮点数取整的功能,其实这个在模拟量转换中经常用到的,应该说是一个常见指令,做工控的朋友都应该了解!
西门子PLC
2020-03-29
阅读
685