V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mrco
V2EX  ›  问与答

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

  •  
  •   mrco · 2021-05-27 09:40:22 +08:00 · 1619 次点击
    这是一个创建于 1274 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    电能表是:正泰 DDSU666 ;

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

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

    iShot2021-05-27 09.29.44.png

    但用 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 应该运用到哪里。

    12 条回复    2021-05-30 19:47:08 +08:00
    neroanelli
        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 地址、寄存器地址、寄存器长度、寄存器类型等参数就可以读取了
    mrco
        2
    mrco  
    OP
       2021-05-27 10:59:57 +08:00
    @neroanelli 晚上回家试试!!先谢谢你了
    mrco
        3
    mrco  
    OP
       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
        4
    mrco  
    OP
       2021-05-27 19:18:56 +08:00
    xderam
        5
    xderam  
       2021-05-28 00:12:28 +08:00 via iPhone
    @mrco 找个搞嵌入式的哥们带你玩吧 一般来说他们用 windows 下的调试软件很熟 我也是找了一个哥们一起才搞下来的 还写了一个普罗米修斯的插件用来监控 希望对你有参考价值 https://git.yimeng.ch/post/2019/ammeter/
    neroanelli
        6
    neroanelli  
       2021-05-28 00:40:09 +08:00 via iPhone
    @mrco 太晚了才看到,明天有空再看看哈。这个比较好调试,需要搞清楚以下几个问题:
    1.slave 设备的地址,范围 0-255,默认是 0 或者 1
    2.读取的数据是输入寄存器还是保持寄存器
    3.明确起始地址和数据长度
    4.数据类型,是 float 还是 long,以及数据的转换说明(一般电表手册上会提供)
    whc2001
        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 (网关连接的电表) 的寄存器?
    whc2001
        8
    whc2001  
       2021-05-28 04:55:45 +08:00
    @whc2001 淦,刚发现 V2EX 不支持 Markdown,请忽略文中奇奇怪怪的符号

    以及发出去才发现忘了提一点,DL/T 645 协议中要求一个数据包开始之前发 0 - 4 个 0xFE,然后才是正式数据开始,所以前面的那 4 个 0xFE 是不参与校验码计算的。
    mrco
        9
    mrco  
    OP
       2021-05-28 11:21:06 +08:00
    @whc2001 非常谢谢你的详细回复,可以 PM 个 QQ 之类的帮忙远程看看吗?谢谢啦
    whc2001
        10
    whc2001  
       2021-05-28 18:17:42 +08:00
    @mrco V2EX 好像也不支持私信,我直接发你 Base64 解码 2 次吧:TXpFeU16UXhPREl4TVE9PQ==,备注写 V2EX
    whc2001
        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 默认是小端序解析,电表经过试验存储格式为大端序。
    mrco
        12
    mrco  
    OP
       2021-05-30 19:47:08 +08:00
    @whc2001 非常感谢你深夜远程协助! it's very nice of you !!!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2703 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 00:26 · PVG 08:26 · LAX 16:26 · JFK 19:26
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.