ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Modbus TCP Java入门 - 指南

Modbus TCP Java入门 - 指南

前言

        手上有个需求需要对接一个继电器 TAS-IO-231R,遂了解下相关知识,该产品支持串口、和Modbus TCP、Modbus RTU协议,4个DO和4个DI口。

一、Modbus RTU、ASCII、TCP性能对比分析

性能指标Modbus RTUModbus ASCIIModbus TCP说明
传输效率⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐RTU二进制最高效,ASCII字符编码效率低
有效数据率~85%~40%~95%协议开销占比
帧开销4字节 (地址+CRC)7字节 (起始+地址+LRC+结束)7字节 (MBAP头)不含功能码和数据
单帧最大数据253字节253字节253字节PDU限制
实时性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐TCP网络延迟最低,ASCII最慢
典型响应时间40-100ms80-200ms5-20ms9600bps串口 vs 以太网
最大轮询频率10-25 Hz5-12 Hz100+ Hz取决于数据量和网络
可靠性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐TCP有重传机制,CRC比LRC更强
错误检测能力CRC-16LRC-8TCP校验和CRC-16检错能力最强
抗干扰能力强中等强二进制vs文本,网络隔离
易调试性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐ASCII人类可读,便于调试
协议可读性二进制文本可读二进制ASCII可直接查看内容
调试工具需求专用工具串口终端即可网络抓包工具ASCII最简单
网络扩展性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐TCP支持路由、交换,串口点对点
最大节点数247 (理论)247 (理论)无限制串口实际32-64个,TCP受网络限制
传输距离1200m1200m无限制RS-485限制 vs 以太网路由
硬件成本⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐串口芯片便宜,以太网成本高
设备成本低低中等RS-485收发器 vs 以太网PHY
布线成本低低中等双绞线 vs 网线+交换机
实现复杂度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐TCP栈复杂,但有现成实现
软件复杂度中等中等高时序控制 vs 网络栈
硬件复杂度低低高UART vs 以太网控制器

这里博主选择了网络延迟更小、更可靠、拓展性强的Modbus TCP协议

二、Modbus TCP

Modbus TCP 是 Modbus 协议家族中的一种传输模式,它利用标准的 TCP/IP 网络协议栈在以太网线路上进行数据交换。Modbus TCP 采用客户端-服务器(Client-Server)模型。同时沿用了 Modbus RTU 的核心数据模型。

Modbus TCP 在标准的 Modbus PDU (Protocol Data Unit) 前面增加了一个 MBAP (Modbus Application Protocol) 头部,并移除了 Modbus RTU 中的 CRC 校验

Modbus TCP 请求/响应报文的结构如下:

[MBAP 头部] [Modbus PDU]7字节        N字节

MBAP

[事务标识符] [协议标识符] [长度] [单元标识符]2字节        2字节     2字节      1字节
Modbus PDU (Protocol Data Unit) - 变长

Modbus PDU 是 Modbus 协议的核心部分,它在 Modbus RTU 和 Modbus TCP 中是基本相同的。它包含了功能码和与该功能码相关的数据。

[功能码] [数据字段]1字节    N字节

三、报文实例

do控制为例

3.1 串口协议
3.2 对应的Modbus-TCP报文如下

3.3  Modbus-TCP 详细解释
        线圈写(控制继电器do指令)00 04 00 00 00 06 11 05 00 00 FF 00│     │     │     │  │  │     ││     │     │     │  │  │     └─ 写入的状态(FF 00 代表闭合状态)│     │     │     │  │  └─ Data DO1寄存器地址 (0000)│     │     │     │  └─ Function Code 功能码05-写入单个寄存器│     │     │     └─ Unit ID 设备地址 (0x11)│     │     └─ Length 后续字节长度│     └─  Protocol ID 2 bytes└─  Transaction ID 2 bytes

四、Modbus-TCP Java实现

4.1 引入Maven依赖

            com.digitalpetri.modbusmodbus-tcp2.1.3

4.2 Modbus-TCP源码

    private static final Integer port= 10123;public static void main(String[] args) throws ModbusExecutionException, ModbusTimeoutException, ModbusResponseException {ModbusTCPTest modbusTCPTest = new ModbusTCPTest();modbusTCPTest.testControlDO1();}public void testControlDO1() throws ModbusExecutionException, ModbusTimeoutException, ModbusResponseException {System.out.println("开始测试控制DO-1...");var transport = NettyTcpClientTransport.create(cfg -> {cfg.setHostname(host_name);cfg.setPort(port);});var client = ModbusTcpClient.create(transport);client.connect();int unitId = 0x11;int addressStart = 0x00;int value = 0XFF00;// 先读取当前状态WriteSingleCoilResponse readResponse = client.writeSingleCoil(unitId,new WriteSingleCoilRequest(addressStart, value));System.out.println("DO-1状态: " + (readResponse.value()==value));}

tip:TAS-IO-231R对接会遇到的一些问题

1、设备ip是多少

        TAS-IO-231R接到路由器等设备后,会自动分配ip,使用官方提供的工具,点击搜索即可找到相关设备

2、设置静态ip

        连接之后表盘切换至以太网模式,配置服务器和设备ip,保存之后重启设备即可

3、粘包

        登录后设备会自动向服务器发送注册表,如没有特殊处理可能会导致粘包异常,关闭注册包即可

参考

塔石资料

https://github.com/digitalpetri/modbus

https://modbuskit.com/zh/blog/modbus-tcp-basic-tutorial

返回列表