请问在STEP 7 5.5里如何把数据块里的character数据‘500’变成整数500或小数500.0啊?

S7-300的PLC系统用STEP 7 5.5编程,通过tcp通讯读取第三方发送过来的浮点数。第三方发送500.0到DB6.DBD0里;但是DB6.DBD0里的数据格式不正确,是个乱七八糟的数值,只有把display format里的数据格式改成character后,DB6.DBD0里的数据才会变成‘500’。请问这是为什么?我该如何把DB6.DBD0里的character数据‘500’变成整数500或小数500.0啊?

还有,DB6.DBD0是32位的,但是character数据好像只有8位,位数不一样,如何传送到DB7.DBD0里

图片说明:

请问在STEP 7 5.5里如何把数据块里的character数据‘500’变成整数500或小数500.0啊?   

最佳答案

1、为什么要改成character才能正确显示为500?
这就首先要谈存储:存储在计算机(广义的)的一切,都是以二进制为基础。字符型数据是以ASCII码存储的。字符型‘500’存储在计算机是“35H/30H/30H”,按字符一个一个取ASCII码。你可以把你图中的参数类型选为:Hexadecimal。你一定可以看到上面三个字节的数据(理应是4个字符,为什么只显示500这3个字符,你可以研究一下)。字符型数据类型,长度是8位,也就是说按字节寻址,你使用了DB1.DBD0这一包含4个字节的变量,那软件按字节理解为字符。
计算机上存储内容一定,显示为什么数据,依赖你定义的的数据类型。例如PLC内DB1.DD0存储:40H/40H/00H/00H。你把他显示为Decimal,则显示为:+1077936128,若你把它定义为浮点数则是:3.0。(1.1B*2e1=符号位0+指数位10000000B+小数位10000000000000000000000B合计32位)
所以,PLC实际通信接收到的是ASCII码,并不是浮点数本身(500.0的浮点数为43FA0000H)。至于第三方设备怎么把浮点数变化为ASCII码传送出去的,要去看该第三方设备的说明书。
2、设备之间通信交换数据有两种数据格式,一种传递源码也就是直接以16进制数传递,例如Modbus RTU通信,一种是ASCII码。可以从常见的串口调试助手上看到。接收方必须以发送方的方式来理解所接受的信号。通信电缆上传递电平信号形成的数据20H,按ASCII码理解就是空格,按16进制理解就是32.
ACSII传递数据明显比16进制低,32按16进制就是一个字节20H,按ASCII码则需2个字节存储33H/32H.传输效率低了一半。但ASCII可以传递控制字符、符号等。
3、在PLC上要明确字符型和字符串型数据存储格式是不同的。
多个字符型构成的变量,可以理解为字符数组。而字符串存储是除了存储字符串里的每一个字符外,还有一个字节存储其长度,这个字节位于字符串占用存储空间的首字节。
所有的转换功能块都是以字符串为目标,而不是字符数组。因此对字符数组使用功能块,需要在字符数组前一个字节写上字符长度,并且以该字节作为字符串首地址引用在程序中。
4、Char_Int则是将4个ASCII码(连续的4个字节)转换为整数(INT),然后可以使用I-DI、DI-R转换为实数也就是浮点数。

提问者对于答案的评价:
非常感谢

原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc290447.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年10月31日 上午12:31
下一篇 2020年10月31日 上午12:31

相关推荐