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

问题描述 投票:0回答:1

我试图通过 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。

python modbus modbus-tcp pymodbus pymodbustcp
1个回答
0
投票

对我的问题添加评论的人是正确的,这是一个有符号整数与无符号整数问题。为了解决这个问题,我将整数转换回 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
© www.soinside.com 2019 - 2024. All rights reserved.