2

我有一个 PyModbus 在Raspberry PI 3b上运行。我有用于Nemo 96HD数字万用表的IF96015以太网接口。当我尝试使用 PyModbus 控制台通过 ModbusTCP 连接到它时,我可以询问它是否已连接并且它说“true”但我无法从中读取任何数据。

根据手册,第一个使用的地址是301,当我尝试阅读时,.Coil()我得到:

"original_function_code": "1 (0x1)", 
"error": "[Input/Output] No Response received from the remote unit/Unable to decode response"

打开控制台:

pymodbus.console tcp --host 192.168.178.200 --port 502

检查连接:

client.connect

尝试阅读线圈:

client.read_coils address 301 count 1

输出:

"original_function_code": "1 (0x1)", 
"error": "[Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 8 bytes (0 received)"

[注意]:

IF96015手册:

手册_1

手册_2

4

3 回答 3

1

每个 Modbus 从站/服务器都有一个unit_ID,因此您需要在.read_coil()方法上添加它。

在许多情况下,unit参数等于1Modbus 从站端的默认值。


这是一个示例(Modbus 客户端):

pymodbus.console tcp --host 192.168.178.200 --port 502
client.connect
client.read_coils address=301 count=1 unit=1

.read_holding_registers()这是另一个使用及其解码器进行多次读取的示例:

client.read_holding_registers count=4 address=9 unit=1
{
    "registers": [
        60497,
        47134,
        34091,
        15424
    ]
}


result.raw
{
    "registers": [
        15626,
        55203,
        28733,
        18368
    ]
}

result.decode word_order=little byte_order=little formatters=float64
28.17

[注意]:

  • read_coil()读/写数字值(1位)
  • read_holding_registers()读/写模拟值(16 位)
  • 一些地址是十六进制的(也许0x301301
  • 不要忘记=在每个这样的论点之后(count=1而不是count 1
于 2018-10-21T06:13:19.433 回答
1

在手册 2 中,地址为0x301十六进制。试试client.read_coils address = 769 count = 1。地址应以十进制格式(十六进制0x301= 十进制769)给出。

于 2019-01-27T18:07:37.220 回答
0

我找到了解决方案。问题在于单元 ID 的默认值。可以在供应商网站上找到的手册显示了一个示例 Modbus TCP 数据包格式,其中单元 ID 值设置为“1”。

但单元 ID 的出厂设置为“255”。您可以更改菜单中的默认地址,密码 3002。现在,我可以使用以下 Python 代码读取值:

message = tcp.read_holding_registers(slave_id=255, starting_address=0x1000, quantity=6)
response = tcp.send_message(message, sock)
于 2019-04-25T07:07:44.443 回答