发布
社区首页 >问答首页 >如何通过IME修复无法解码响应的PyModbus - IF96015接口错误

如何通过IME修复无法解码响应的PyModbus - IF96015接口错误
EN

Stack Overflow用户
提问于 2018-10-20 14:35:49
回答 3查看 2.1K关注 0票数 2

我有一个PyModbus运行在一个覆盆子PI 3b。我有Nemo 96HD数字万用表的IF96015以太网接口。当我试图通过ModbusTCP通过PyModbus控制台连接到它时,我可以问它是否已连接,它说的是“真”,但我无法从其中读取任何数据。

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

代码语言:javascript
代码运行次数:0
复制
"original_function_code": "1 (0x1)", 
"error": "[Input/Output] No Response received from the remote unit/Unable to decode response"

打开控制台:

代码语言:javascript
代码运行次数:0
复制
pymodbus.console tcp --host 192.168.178.200 --port 502

检查连接:

代码语言:javascript
代码运行次数:0
复制
client.connect

试着阅读线圈:

代码语言:javascript
代码运行次数:0
复制
client.read_coils address 301 count 1

输出:

代码语言:javascript
代码运行次数:0
复制
"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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-25 07:07:44

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

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

代码语言:javascript
代码运行次数:0
复制
message = tcp.read_holding_registers(slave_id=255, starting_address=0x1000, quantity=6)
response = tcp.send_message(message, sock)
票数 0
EN

Stack Overflow用户

发布于 2018-10-21 06:13:19

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

在许多情况下,unit参数在Modbus从侧作为缺省值等于1

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

代码语言:javascript
代码运行次数:0
复制
pymodbus.console tcp --host 192.168.178.200 --port 502
client.connect
client.read_coils address=301 count=1 unit=1

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

代码语言:javascript
代码运行次数:0
复制
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位)
  • 有些地址是十六进制(可能是0x301而不是301)
  • 每次争论之后不要忘记= (count=1而不是count 1)
票数 1
EN

Stack Overflow用户

发布于 2019-01-27 18:07:37

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52906770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档