红云123
级别: 略有小成
精华主题: 0
发帖数量: 311 个
工控威望: 381 点
下载积分: 2894 分
在线时间: 162(小时)
注册时间: 2020-09-22
最后登录: 2025-03-10
查看红云123的 主题 / 回贴
楼主  发表于: 2022-09-14 14:56
F5UJ进行modbusTCP通讯时当读取的数据是正数时,设置的读取数据长度和接收的数据长度一致,数据也没有错误。

当读取到的数据是负数时,收到的数据长度在某个位置是设置的2倍,因为负数的位置不确定所以收到的数据也无从下手去处理。
也就是负数时收到的数据地址和服务器的数据地址对应不上了。
当进行modbusTCP通讯时负数怎么处理?
真诚求助
冲出枪林弹雨
冲出枪林弹雨
级别: 家园常客
精华主题: 0
发帖数量: 145 个
工控威望: 625 点
下载积分: 356 分
在线时间: 88(小时)
注册时间: 2020-09-05
最后登录: 2025-03-05
查看冲出枪林弹雨的 主题 / 回贴
1楼  发表于: 2022-09-15 08:34
通讯时都是客户端读取服务端的寄存器,数据类型不同,占用寄存器数量不同(16位,32位,64位,字符串看长度);建议将数据转成16进制进行查看,看看是不是读取的数据高低位被调换,也可以先用tcp模拟软件进行测试。
技术交流vx: Electric973
冲出枪林弹雨
冲出枪林弹雨
级别: 家园常客
精华主题: 0
发帖数量: 145 个
工控威望: 625 点
下载积分: 356 分
在线时间: 88(小时)
注册时间: 2020-09-05
最后登录: 2025-03-05
查看冲出枪林弹雨的 主题 / 回贴
2楼  发表于: 2022-09-15 10:05
引用
引用第2楼红云123于2022-09-15 09:30发表的  :
用的测试工具测试的

读取寄存器个数改为4,PLC监视数据使用16进制查看
技术交流vx: Electric973
冲出枪林弹雨
冲出枪林弹雨
级别: 家园常客
精华主题: 0
发帖数量: 145 个
工控威望: 625 点
下载积分: 356 分
在线时间: 88(小时)
注册时间: 2020-09-05
最后登录: 2025-03-05
查看冲出枪林弹雨的 主题 / 回贴
3楼  发表于: 2022-09-15 10:16
好吧,说下这个正数和负数
值为5它在计算机中表示为:
00000000 00000000 00000000 00000101
5转换成二制是101,不过int类型的数占用4字节(32位),前面填了一堆0
-5在计算机中,负数以原码的补码形式表达。
原码:
一个正数,按照绝对值大小转换成的二进制数就是正数的原码
一个负数,按照绝对值大小转换成的二进制数,然后最高位补1,就是负数的原码
比如
00000000 00000000 00000000 00000101 是5的原码。
10000000 00000000 00000000 00000101 是-5的原码。
补码
正数的补码与原码相同
负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1
比如:
10000000 00000000 00000000 00000101 的反码
是:11111111 11111111 11111111 11111010
那么,补码为:
11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011
-5 在计算机中表达为:11111111 11111111 11111111 11111011
转换为十六进制:0xFFFFFFFB
楼主留言:
道理倒是明白,关键是收到数据后怎么处理。收到的数据有正数也有负数时,怎么才知道自己收到的是负数,负数在哪个寄存器里。
技术交流vx: Electric973
冲出枪林弹雨
冲出枪林弹雨
级别: 家园常客
精华主题: 0
发帖数量: 145 个
工控威望: 625 点
下载积分: 356 分
在线时间: 88(小时)
注册时间: 2020-09-05
最后登录: 2025-03-05
查看冲出枪林弹雨的 主题 / 回贴
4楼  发表于: 2022-09-15 12:54
图片:
图片:
看了你图中发送内容,你用的工具多发了两个字节内容
技术交流vx: Electric973