PyModbusTCP读取的值与实际ModBus值不符?
我正在尝试通过PyModbusTCP读取从40001到40004的寄存器。当我在PyModbusTCP上读取40001的值时,得到的值和设备屏幕上显示的值不一样,而通过Open ModScan读取到的值和设备上显示的值是一样的。我不确定这是不是和零基地址有关,或者只是因为要读取的值像是-1000,这样的值没有意义(传感器坏了,但仍然在输出)。
Modbus地址如下:40001 -> 当前值,40003 -> 工作设定点,40004 -> 当前输出百分比。这些值都是乘以10的。
我尝试过的操作:
print(c.read_holding_registers(0, 4))
这行代码的输出是:55532, 0, 100, 100(最后两个值和屏幕上的值一致)
而在同一时间,ModScan的输出是:40001 -> -10003,40002 -> 0,40003 -> 100,40004 -> 100。
1 个回答
0
给我问题留言的人说得对,这是一个有符号整数和无符号整数的问题。为了解决这个问题,我把整数转换回16个字符的二进制数字(16位 = 2字节),然后根据二进制的补码或无符号转换来得到十进制的整数值。
import sys
def twos(val_str, bytes):
val = int(val_str, 2)
b = val.to_bytes(bytes, byteorder=sys.byteorder, signed=False)
return int.from_bytes(b, byteorder=sys.byteorder, signed=True)
def misread_correction(decimal):
binary = bin(decimal & 0xffff)[2:].zfill(16)
corrected = twos(binary,2)
corrected /= 10
return corrected