Pymodbus读取并解码寄存器值



我是modbus通信的新手,我必须使用modbus协议从一个寄存器中读取一个值(为此,我使用python和pymodbus(:从逆变器文档中,我读到了寄存器文档:

注册ADR:31249说明:PCC处系统的有功功率(W(CNT:2型号:S32格式:FIX0访问:RO

好吧,我试着用我的python脚本:

from pymodbus.client.sync import ModbusTcpClient
client = ModbusTcpClient("192.168.1.10", port=502, timeout=3)
client.connect()
read=client.read_holding_registers(address = 31249 ,count =2,unit=1)
read.registers

所以我有这个值:

[65535, 65535]

我想这不是寄存器的解码值,所以我尝试解码提取值:

read_encoded = read.encode()
read_encoded
b'xffxffxffxff'
read_encoded_value = int.from_bytes(read_encoded, byteorder="big")
read_encoded_value

所以如果我打印我的变量,我会得到:

4294967295

它的意思是有点大。读取和解码modbus寄存器值的过程正确吗?

如何从逆变器的modbus寄存器doc中提取和读取数据?

提前感谢

据我所知,您正在尝试连接SMA逆变器。

阅读第一本手册时,我会发现它并不完全清楚,但您试图读取的寄存器似乎不是保持寄存器,而是输入寄存器(对于大多数Modbus设备,如果寄存器编号在3XXXX范围内,通常意味着输入寄存器,4XXXX用于保持寄存器(。

第二个技巧是偏移:pyModbus不考虑协议中寄存器的寻址方式,因此您必须注意:

-当您试图读取或写入输入寄存器时,需要减去30001。对于您的情况,它是:31249-30001=1248(请注意,在一些奇怪的设备中,偏移量实际上是30000,所以您可能也想尝试一下(。

-对于保持寄存器,偏移量显然是40001。

如果我上面提到的手册对您的设备是正确的,那么您应该像现在这样寻址第二单元,而不是1。如果这是正确的,你必须更改这一行:

read=client.read_holding_registers(address = 31249 ,count=2,unit=1)

至:

read=client.read_holding_registers(address = 1248 ,count=2,unit=2)

一旦找到正确的寄存器,就必须使用pymodbus.payload中的BinaryPayloadDecoder(有关更多详细信息,请参阅本示例(。

您可能需要做以下操作(不要忘记上面的导入(:

decoder = BinaryPayloadDecoder.fromRegisters(read.registers, byteorder=Endian.Big, wordorder=Endian.Big)

根据我的手册,单词s的格式是Motorola big-endian,我猜字节也很大(不过你可能需要试着看看,直到找到正确的组合(。

最后,在构建解码器之后,您需要解码32位带符号的int,如下所示:

active_power_w = decoder.decode_32bit_int()

当你打印它时,这应该会给你一些有意义的功率值

相关内容

  • 没有找到相关文章

最新更新