在 RPI 上使用 modbus RTU 读取 kWh 电表 (PM5100)

Posted

技术标签:

【中文标题】在 RPI 上使用 modbus RTU 读取 kWh 电表 (PM5100)【英文标题】:Read outh kWh meter (PM5100) with modbus RTU on RPI 【发布时间】:2021-12-21 10:15:33 【问题描述】:

我的目标是使用 modbus rtu 在树莓派上读取带有 Python 脚本的施耐德 PM5100。 我已经能够使用 modbus 为另一个仪表 (SDM220) 做到这一点,它工作得很好,但我似乎无法在这个上做到这一点。

PM5100 我配置为: 从属地址:1 波特率:19200 奇偶校验:无

我认为布线应该没问题,GND 和屏蔽没有连接,但 D1 和 D0 带有 RS485 到 USB 连接器。

简单代码:

#!/usr/bin/python3

import minimalmodbus

mb = minimalmodbus.Instrument("/dev/ttyUSB0", 1)
mb.serial.baudrate = 19200
mb.debug = True

val = mb.read_float(3212,3,4)
print(val)

这会产生错误 InvalidResponseError:

MinimalModbus debug mode. Will write to instrument (expecting 13 bytes back): 01 03 0C 8C 00 04 86 B2 (8 bytes)
MinimalModbus debug mode. Clearing serial buffers for port /dev/ttyUSB0
MinimalModbus debug mode. No sleep required before write. Time since previous read: 439371243.54 ms, minimum silent period: 2.01 ms.
MinimalModbus debug mode. Response from instrument: 7F 7E DE CE F7 F3 13 (7 bytes), roundtrip time: 0.1 ms. Timeout for reading: 50.0 ms.

Traceback (most recent call last):
  File "1.py", line 9, in <module>
    val = mb.read_float(3212,3,4)
  File "/usr/local/lib/python3.7/dist-packages/minimalmodbus.py", line 717, in read_float
    payloadformat=_Payloadformat.FLOAT,
  File "/usr/local/lib/python3.7/dist-packages/minimalmodbus.py", line 1245, in _generic_command
    payload_from_slave = self._perform_command(functioncode, payload_to_slave)
  File "/usr/local/lib/python3.7/dist-packages/minimalmodbus.py", line 1330, in _perform_command
    response, self.address, self.mode, functioncode
  File "/usr/local/lib/python3.7/dist-packages/minimalmodbus.py", line 1867, in _extract_payload
    raise InvalidResponseError(text)
minimalmodbus.InvalidResponseError: Checksum error in rtu mode: 'ó\x13' instead of '\\>' . The response is: '\x7f~ÞÎ÷ó\x13' (plain response: '\x7f~ÞÎ÷ó\x13')

那么,我做错了什么?

    不确定我是否使用了正确的寄存器,但它也不适用于其他号码。 错误的库?会很奇怪,因为它可以在另一个仪表 (SDM220) 上工作 我已尝试更改为“read_register”并更改参数,但没有成功

欢迎任何有任何经验、提示、猜测或答案的人回复。 谢谢!

来源: PM5100:https://www.se.com/be/nl/product/METSEPM5100/pm5100-meetcentrale---tot-15de-h---1do-33-alarmen--paneelmontage/ 注册名单:https://www.se.com/ww/en/download/document/PM5100-PM5300_PublicRegisterList/ RS485 转 USB:https://www.bol.com/be/nl/p/usb-to-rs485-485-converter-adapter-support-win7-xp-vista-linux-mac-os-wince5-0/9300000012988342/?Referrer=ADVNLGOO002013-G-120928976848-S-1076696512011-9300000012988342&gclid=Cj0KCQiAsqOMBhDFARIsAFBTN3epmK66KNj2IufWmjeGY_nkGep_roirDZxfyLu0H3UaVYvewlDRMx4aAhgwEALw_wcB 最小Modbus:https://minimalmodbus.readthedocs.io/en/stable/readme.html

【问题讨论】:

【参考方案1】:

我认为布线应该没问题,GND 和屏蔽没有连接,但 D1 和 D0 带有 RS485 到 USB 连接器。

抱歉,假设错误。

RS-485 或 RS-422确实需要第三根电线才能让电流返回(接地)。

您遇到的这些Checksum error in rtu mode 是由干扰信号的噪声或共模电压引起的。

在使用这些没有 GND 连接的廉价 USB 转 RS485 收发器时,您需要确保两侧的 GND 通过电源连接。

如果您将功率计和笔记本电脑放在同一个房间,这应该很容易:只需将笔记本电脑的充电器连接到同一个电源插座即可。请注意,如果您使用电池供电运行笔记本电脑,您将无法获得可靠的连接,除非您使用第三根电缆连接地面,如下所示。

如果您处于不同的环境中(例如,您的仪表和笔记本电脑位于不同的建筑物中,或者您的电源插座未正确接地),那么您需要在电缆上添加第三根电线。由于您没有地方可以连接到记忆棒本身,您可能需要以某种方式将其连接到不同的 USB 防护罩。这可能不是一个非常好的解决方案,所以也许投资another USB-to-RS485 adaptor 并不是一个坏主意。

您可以在 EESE 上找到更多关于此主题的 cmets、参考资料和疯狂科学家的理论。

【讨论】:

该死的,谢谢!我买了你推荐的适配器,希望能解决问题。 我几乎可以肯定它会,但您可以在购买之前尝试通过将另一个 USB 端口的屏蔽与仪表上的 GND 连接起来,以消除任何不确定性......无论如何祝你好运跨度>

以上是关于在 RPI 上使用 modbus RTU 读取 kWh 电表 (PM5100)的主要内容,如果未能解决你的问题,请参考以下文章

如何计算modbus-rtu的crc校验码

modbus RTU通讯如何通过一帧数据读取多个地址

做MODBUS RTU通讯时,如何读取设备寄存器40001中的浮点数

Java实现使用Modbus4j+seroUtils读取Mudbus RTU/ASCII Over TCP/IP连接设备数据

大家好,谁会通过软件读取仪表数据。上传到SQL里面, 我的仪表支持Modbus RTU 协议 ,

Java使用Netty实现Modbus-RTU通信协议