将保持寄存器解码为二进制格式

问题描述

需要帮助将存储寄存器解码为二进制格式。读取时,我得到一个 8 到 15 位的值。我无法读取 0 到 7 位的值,我想将 0-15 位计算为请求,但是 8-15 进来了。我做错了什么? 我尝试了不同的寄存器轮询组合:

(res5.registers,Endian.Big,Endian.Big).decode_bits
(res5.registers,Endian.Little,Endian.Little).decode_bits

Modbus 从站:ID:1 F:03 0: -47,2 (float32) 1: 2:-7565(整数) 3:-3(整数) 4:4581(单位) 5:5555(单位) 6:67(单位) 7:76(单位) 8:0000 0001 0101 1001(布尔值) 9:0000 0100 0110 0011(布尔)

版本 蟒蛇:3.9.1 操作系统:Windows 10 专业版 2004 Pymodbus:2.5.1,客户端:RTU

# code

   from pymodbus.client.sync import ModbusSerialClient
    from pymodbus.payload import BinaryPayloadDecoder
    from pymodbus.constants import Endian
    
    client = ModbusSerialClient(method='rtu',port='COM5',baudrate=19200,timeout=3,parity='N',stopbits=1,bytesize=8)
    
    if client.connect():
        res1 = client.read_holding_registers(0,10,unit=1)
        res2 = client.read_holding_registers(0,2,unit=1)
        res3 = client.read_holding_registers(2,1,unit=1)
        res4 = client.read_holding_registers(3,unit=1)
        res5 = client.read_holding_registers(8,unit=1)
        if not res3.isError():
            print(res1)
            print(res1.registers)
            print("-" * 60)
            print(BinaryPayloadDecoder.fromregisters(res2.registers,Endian.Big).decode_32bit_float())
            print(BinaryPayloadDecoder.fromregisters(res3.registers,Endian.Little).decode_16bit_int())
            print(BinaryPayloadDecoder.fromregisters(res4.registers,Endian.Little).decode_16bit_int())
            print(BinaryPayloadDecoder.fromregisters(res5.registers,Endian.Little).decode_bits())
        else:
            print(res3,'Error')
            # print('\n')
        print("-" * 60)
    else:
        print('Cannot connect Modbus Server/Slave')

日志

ReadHoldingRegistersResponse (10) [49724,52429,57971,65533,4581,5555,67,76,345,1123]

-47.20000076293945 -7565 -3 [真假假假假假假假假假假]

进程结束,退出代码 0

解决方法

正如我在评论中所说,我不完全确定我理解您的问题所在。

但重点关注如何使用 decode_bits() 获取整个 16 位寄存器,您可以执行以下操作:

# First read the register:
reg = client.read_holding_registers(8,1,unit=1)

# Then instantiate your decoder with the right configuration
decoder = BinaryPayloadDecoder.fromRegisters(reg,Endian.Big,Endian.Little)

# And now do the decoding,first 8 bits:
bits_in_reg = decoder.decode_bits()

# And 8 bits more,note the += to keep and shift the bits you just read
bits_in_reg += decoder.decode_bits()

您尝试这样做的方式是否更有意义?我猜……但是 decode_bits() 函数被实现为读取字(8 位块)而不是寄存器

为了完整起见,我在这里添加了一个示例。如果我定义 regs=[128,129] 这就是运行上面的代码后得到的结果:

[False,False,True]

如果我再调用 decoder.decode_bits() 两次,我会得到这个:

[False,True,True]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...