RS485 电表如何连接 MODBUS 网关呢?

2021-05-27 09:40:22 +08:00
 mrco

大家好,我最近想给家里新增一个电能表,然后通过其 MODBUS 协议来检测家庭用电情况。

电能表是:正泰 DDSU666 ;

MODBUS 网关是:ZLAN5143,配置其 IP 为 10.1.1.17/24,设置波特率和电表一致,勾选了 MODBUS 协议转换,tcpserver 模式;

接线:电表的 A 、B 分别接网关的 T+、T-;

但用 mbpoll 测试却一致 timeout,请问大家,是线没接对还是网关没配置完啊?

mbpoll -r 1 -c 30 -a 0 -p 4196 -t 3:float -B -1 10.1.1.17
mbpoll 1.0-0 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright © 2015-2019 Pascal JEAN, https://github.com/epsilonrt/mbpoll
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type 'mbpoll -w' for details.

Protocol configuration: Modbus TCP
Slave configuration...: address = [0]
                        start reference = 1, count = 30
Communication.........: 10.1.1.17, port 4196, t/o 1.00 s, poll rate 1000 ms
Data type.............: 32-bit float (big endian), input register table

-- Polling slave 0...
Read input register failed: Connection timed out

PS:电表显示的其通讯地址为 068,我不知道这个 068 应该运用到哪里。

1457 次点击
所在节点    问与答
12 条回复
neroanelli
2021-05-27 10:32:46 +08:00
1 、接线不对,网关支持 RS422,电表是 RS485,应该是 T+/R+短接然后接 A,T-/R-短接然后接 B ;
2 、网关里一般可以配置 Slave 设备(如电表)的通讯地址和寄存器地址;
3 、通过网络连接网关,配置好 ip 地址、端口、Slave 地址、寄存器地址、寄存器长度、寄存器类型等参数就可以读取了
mrco
2021-05-27 10:59:57 +08:00
@neroanelli 晚上回家试试!!先谢谢你了
mrco
2021-05-27 19:18:41 +08:00
http://www.shwanqiao.com/protocols_rand_9527/DDSU666.pdf 这是电表的文档,我按照你的建议将先连接,提示:
```
root@monitor:~# mbpoll -r 1 -c 1 -a 0 -p 502 -1 -t 3:float -B 10.1.1.17
mbpoll 1.0-0 - FieldTalk(tm) Modbus(R) Master Simulator
Copyright © 2015-2019 Pascal JEAN, https://github.com/epsilonrt/mbpoll
This program comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it
under certain conditions; type 'mbpoll -w' for details.

Protocol configuration: Modbus TCP
Slave configuration...: address = [0]
start reference = 1, count = 1
Communication.........: 10.1.1.17, port 502, t/o 1.00 s, poll rate 1000 ms
Data type.............: 32-bit float (big endian), input register table

-- Polling slave 0...
Read input register failed: Invalid data
```

可否帮忙排查一下啊,我完全不懂这个。
mrco
2021-05-27 19:18:56 +08:00
xderam
2021-05-28 00:12:28 +08:00
@mrco 找个搞嵌入式的哥们带你玩吧 一般来说他们用 windows 下的调试软件很熟 我也是找了一个哥们一起才搞下来的 还写了一个普罗米修斯的插件用来监控 希望对你有参考价值 https://git.yimeng.ch/post/2019/ammeter/
neroanelli
2021-05-28 00:40:09 +08:00
@mrco 太晚了才看到,明天有空再看看哈。这个比较好调试,需要搞清楚以下几个问题:
1.slave 设备的地址,范围 0-255,默认是 0 或者 1
2.读取的数据是输入寄存器还是保持寄存器
3.明确起始地址和数据长度
4.数据类型,是 float 还是 long,以及数据的转换说明(一般电表手册上会提供)
whc2001
2021-05-28 04:49:54 +08:00
最近也在折腾类似的玩意(用的德力西 DTSU6606 ),不过没试过 RTU 转 TCP,稍微看了一下说明书,感觉有如下几个地方可以排查一下,首先放一段说明书原文:

> DL/T 645-2007 协议切换到 ModBus-RTU 通讯协议的数据帧如下:FE FE FE FE 68 xx xx xx xx xx xx 68 14 0E 33 33 35 3D 35 33 33 33 33 33 33 33 33 33 CS 16
>
> 注意:xx xx xx xx xx xx 为表通讯地址; CS 为校验码.
>
> 仪表默认出厂参数:波特率 2400bps ( DDSU666-E/D/F 波特率为 9600bps ),偶校验。1 停止位,协议 DL/T645-2007,表号为标签表号,共 12 位(十进制)。

- 说明书中提到这台表支持 Modbus RTU 和 DL/T 645 两种软件协议,同时默认是 DL/T 645 协议(见说明书第 9 页)。说明书给出了从 DL/T 645 切换到 Modbus RTU 的对应指令:

此处涉及到 DL/T 645 协议,6 个字节的“表通讯地址”实质上是电表 SN 序列号的 BCD 表示(两个字符一组,倒着写),通常印在表的前面板上,小端在前。例如表号为 No.123456789098,则通讯地址为 0x98 0x90 0x78 0x56 0x34 0x12 。

而根据 DL/T 645 协议,校验码的计算方法为求校验码之前所有字节的和,长度为 1 字节溢出丢弃(例如数据为 0x12 0x34 0x56 0x78 0x9A,校验码 0x12 + 0x34 + 0x56 + 0x78 + 0x9A = 0x01AE 取最低字节即为 0xAE 。

为了排除干扰,建议此处暂时忽略 Modbus 网关,使用 USB 转 RS485 设备和串口终端程序直接与电表进行进行通信。

- 发送切换到 Modbus 的指令之后,需要验证是否成功切换,此处可以手动构建并发送一个 Modbus RTU 数据包。参考 **说明书第 10 页的表格** ,可以看到表内实现的所有保持寄存器的地址。

此处使用“A 相电压”寄存器进行测试,阅读表格可知其地址为 0x2000,类型为 float,长度为 2 字节。根据 Modbus RTU 协议构造一个请求数据包:

`01 03 20 00 00 02 CF CB`

0x01: 从机地址,默认应该为 0x01,不行的话自己遍历一下

0x03: 指令“读保持寄存器”

0x0020: 从地址 0x2000 开始读(小端在前)

0x0002: 从起始地址连续读 2 字节(大端在前)

0xCFCB: Modbus RTU 使用的 CRC-32 校验,可以使用 [这个网站]([Online Modbus RTU Parser & Modbus TCP Parser (rapidscada.net)]( https://rapidscada.net/modbus/ModbusParser.aspx) 进行验证,如果不正确会自动提示并算出正确的校验值。

一切正常则发送之后应会收到应答,应答内容粘贴进上面的网站可以看到数据解析。

- 确定电表本身 Modbus RTU 通讯正常之后就可以上网关了,个人没用过 Modbus TCP 和 mbpoll,感觉应该是要在网关的配置中把 Modbus TCP (网关端口 502 对外开放的服务器)的寄存器映射到 Modbus RTU (网关连接的电表) 的寄存器?
whc2001
2021-05-28 04:55:45 +08:00
@whc2001 淦,刚发现 V2EX 不支持 Markdown,请忽略文中奇奇怪怪的符号

以及发出去才发现忘了提一点,DL/T 645 协议中要求一个数据包开始之前发 0 - 4 个 0xFE,然后才是正式数据开始,所以前面的那 4 个 0xFE 是不参与校验码计算的。
mrco
2021-05-28 11:21:06 +08:00
@whc2001 非常谢谢你的详细回复,可以 PM 个 QQ 之类的帮忙远程看看吗?谢谢啦
whc2001
2021-05-28 18:17:42 +08:00
@mrco V2EX 好像也不支持私信,我直接发你 Base64 解码 2 次吧:TXpFeU16UXhPREl4TVE9PQ==,备注写 V2EX
whc2001
2021-05-28 22:43:44 +08:00
问题已解决,总结一下防止后面有人踩坑:Modbus 网关为透明传输可以忽略,主要问题出现在 mbpoll 和电表交互过程中对协议和标准的理解上:

1. Modbus 的读取长度通常以单字( Word )为单位,1 个单字为 2 个字节,读取长度要注意和说明书中的匹配( mbpoll 和说明书均以单字作为单位)。

2. Modbus 的地址起始值要注意,比如 mbpoll 的地址是从 1 开始,说明书是从 0 开始,会导致偏移。

3. 读出数据解释时要注意大小端,mbpoll 默认是小端序解析,电表经过试验存储格式为大端序。
mrco
2021-05-30 19:47:08 +08:00
@whc2001 非常感谢你深夜远程协助! it's very nice of you !!!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/779485

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX