PyModbusTCP读取的值与实际ModBus值不符?

1 投票
1 回答
48 浏览
提问于 2025-04-13 15:44

我正在尝试通过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

撰写回答