我正在尝试从反相器读取数值(用于太阳能电池板)。变频器采用带SunSpec协议的Modbus (TCP/IP)协议。
我正在使用pyModbusTCP,我可以连接到逆变器并获得int16和uint16类型的值,但不是string或acc64类型的值。我使用以下代码来获取这些值:
from pyModbusTCP.client import ModbusClient
client = ModbusClient(host="192.168.40.10", port=502)
client.open()
client.read_holding_registers(40084)是否需要导入其他内容才能读取这些值?我是python的新手,这也是我第一次使用pyModbusTCP。
带有一些SunSpec信息的PDF:https://sunspec.org/wp-content/uploads/2015/06/SunSpec-Information-Models-12041.pdf
发布于 2021-03-11 20:12:01
在pyModbusTCP:https://pymodbustcp.readthedocs.io/en/latest/package/class_ModbusClient.html的官方文档中,我们可以看到下面的描述: read_holding_registers(reg_addr,reg_nb=1)
Modbus function READ_HOLDING_REGISTERS (0x03)
参数:
reg_addr (int) -寄存器地址(0至65535)
reg_nb (int) -要读取的寄存器数(1到125)
返回:
寄存器列表或无(如果失败
返回类型:
int或None的列表
返回类型是list,所以我们可以这样做:
values = client.read_holding_registers(40084)
if values:
for value in values:
# you can convert int to string
converted_value = str(value)
# implement here you own lgorithm发布于 2021-08-31 14:31:13
首先,确保寄存器40084包含您要查找的值。我们使用版本4的SunSpec协议,AC终身有效(实际)能量输出存储在40187地址的acc64寄存器中。无论如何,为了读取acc64值,您必须读取4个值,每个值16位:
client.read_holding_registers(40084,4).您将返回4个值,如下所示:
0
0
869
55690其中的每一个现在都需要转换回十六进制,连接togheter,然后再转换回int:
0 (dec) --> 00 00 (Hex)
0 (dec) --> 00 00 (Hex)
869 (dec) --> 03 65 (Hex)
55690 (dec) --> D9 8A (Hex)最终十六进制值为: 00 00 00 03 65 D9 8A,换算为DEC为57.006.474
https://stackoverflow.com/questions/66581549
复制相似问题