大家好,我最近想给家里新增一个电能表,然后通过其 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 应该运用到哪里。
1
neroanelli 2021-05-27 10:32:46 +08:00 1
1 、接线不对,网关支持 RS422,电表是 RS485,应该是 T+/R+短接然后接 A,T-/R-短接然后接 B ;
2 、网关里一般可以配置 Slave 设备(如电表)的通讯地址和寄存器地址; 3 、通过网络连接网关,配置好 ip 地址、端口、Slave 地址、寄存器地址、寄存器长度、寄存器类型等参数就可以读取了 |
2
mrco OP @neroanelli 晚上回家试试!!先谢谢你了
|
3
mrco OP 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 ``` 可否帮忙排查一下啊,我完全不懂这个。 |
4
mrco OP |
5
xderam 2021-05-28 00:12:28 +08:00 via iPhone
@mrco 找个搞嵌入式的哥们带你玩吧 一般来说他们用 windows 下的调试软件很熟 我也是找了一个哥们一起才搞下来的 还写了一个普罗米修斯的插件用来监控 希望对你有参考价值 https://git.yimeng.ch/post/2019/ammeter/
|
6
neroanelli 2021-05-28 00:40:09 +08:00 via iPhone
@mrco 太晚了才看到,明天有空再看看哈。这个比较好调试,需要搞清楚以下几个问题:
1.slave 设备的地址,范围 0-255,默认是 0 或者 1 2.读取的数据是输入寄存器还是保持寄存器 3.明确起始地址和数据长度 4.数据类型,是 float 还是 long,以及数据的转换说明(一般电表手册上会提供) |
7
whc2001 2021-05-28 04:49:54 +08:00 1
最近也在折腾类似的玩意(用的德力西 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 (网关连接的电表) 的寄存器? |
8
whc2001 2021-05-28 04:55:45 +08:00
@whc2001 淦,刚发现 V2EX 不支持 Markdown,请忽略文中奇奇怪怪的符号
以及发出去才发现忘了提一点,DL/T 645 协议中要求一个数据包开始之前发 0 - 4 个 0xFE,然后才是正式数据开始,所以前面的那 4 个 0xFE 是不参与校验码计算的。 |
10
whc2001 2021-05-28 18:17:42 +08:00
@mrco V2EX 好像也不支持私信,我直接发你 Base64 解码 2 次吧:TXpFeU16UXhPREl4TVE9PQ==,备注写 V2EX
|
11
whc2001 2021-05-28 22:43:44 +08:00
问题已解决,总结一下防止后面有人踩坑:Modbus 网关为透明传输可以忽略,主要问题出现在 mbpoll 和电表交互过程中对协议和标准的理解上:
1. Modbus 的读取长度通常以单字( Word )为单位,1 个单字为 2 个字节,读取长度要注意和说明书中的匹配( mbpoll 和说明书均以单字作为单位)。 2. Modbus 的地址起始值要注意,比如 mbpoll 的地址是从 1 开始,说明书是从 0 开始,会导致偏移。 3. 读出数据解释时要注意大小端,mbpoll 默认是小端序解析,电表经过试验存储格式为大端序。 |