我试图通过 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。
对我的问题添加评论的人是正确的,这是一个有符号整数与无符号整数问题。为了解决这个问题,我将整数转换回 16 个字符的二进制数(16 位 = 2 个字节),然后根据 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