SpringBoot基于modbus4j实现Modbus/TCP通讯
1、Modbus/TCP
Modbus是MODICON公司与1979年开发的一种通讯协议,是一种工业现场总线协议标准。1996年施耐德公司推出了基于以太网TCP/IP的Modbus协议------ModbusTCP。
Modbus协议是一项应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型,协议本身并没有定义物理层,只是定义了控制器能够认识和使用的消息结构,而不管他们是经过何种网络进行通信的。
标准的Modbus协议物理层接口有RS232、RS422、RS485和以太网口。采用Master/Slave(主/从)方式通信。
协议基础
- 定义:Modbus/TCP 是基于 Modbus 协议和 TCP/IP 协议族的通信协议。它使工业自动化系统中的设备能够相互交换数据和进行通信。
- 工作原理:它将 Modbus 消息封装在 TCP 数据包中,并通过以太网网络进行传输。客户端设备向服务器设备发送请求消息,服务器设备则返回所请求的数据。
优点
- 兼容性广泛:它得到了众多工业设备和设备制造商的支持,便于将不同设备集成到一个统一的系统中。
- 高速高效:使用 TCP/IP 协议,能够实现高速数据传输,适用于需要实时数据处理的应用场景。
- 远距离传输:通过以太网网络可以进行长距离的数据传输,能够对分布式工业系统进行集中监控。
- 可靠性高:TCP/IP 协议提供了可靠的数据传输,确保数据在传输过程中的完整性和准确性。
2、modbus4j
com.infiniteautomation.modbus4j 是一个用于 Java 语言的开源 Modbus 通信库,借助它你能够在 Java 应用程序里方便地实现 Modbus 协议通信。下面从功能特性、使用场景等方面展开介绍:
功能特性
- 支持多种 Modbus 协议类型:涵盖 Modbus TCP、Modbus RTU 以及 Modbus ASCII 等常见协议类型,可适配不同的 Modbus 设备与应用场景。
- 读写操作丰富:支持各类 Modbus 读写操作,像读取线圈状态(Read Coils)、读取离散输入(Read Discrete Inputs)、读取保持寄存器(Read Holding Registers)、读取输入寄存器(Read Input Registers),还有写入单个线圈(Write Single Coil)、写入多个线圈(Write Multiple Coils)、写入单个寄存器(Write Single Register)和写入多个寄存器(Write Multiple Registers)等。
- 错误处理与异常机制:提供了完备的错误处理和异常机制,能对通信过程中可能出现的错误和异常状况进行捕获与处理,增强了程序的稳定性与可靠性。
- 线程安全:该库在设计上保证了线程安全,你可以在多线程环境下安全地使用它,满足并发通信的需求。
使用场景
- 工业自动化:在工业自动化系统里,借助该库能够实现 Java 应用程序与 Modbus 设备(如 PLC、传感器等)之间的通信,达成对设备的监控和控制。
- 数据采集:可以用它从 Modbus 设备中采集数据,例如温度、压力、流量等传感器数据,并将这些数据传输到上位机系统进行分析和处理。
- 设备控制:通过 Modbus 协议对工业设备进行控制,像控制电机的启停、调节阀门的开度等。
3、SpringBoot集成modbus4j
添加依赖
SpringBoot版本:
org.springframework.boot spring-boot-starter-parent 3.4.1
modbus4j依赖:
com.infiniteautomation modbus4j 3.1.0 org.apache.commons commons-lang3 3.12.0
初始化modbus配置
初始化ModbusMaster,配置host和port以及timeout。
ModbusFactory 是用于创建 主站(Master)和从站(Slave)实例的工厂类。借助这个类,能够依据不同的 Modbus 协议类型创建对应的通信对象,从而实现 Modbus 设备之间的通信。
在此,我们使用createTcpMaster(IpParameters params, boolean keepAlive),用于创建 Modbus TCP 主站实例。host 是 Modbus TCP 服务器的主机名或 IP 地址,keepAlive 表示是否保持 TCP 连接的活跃状态。
import com.serotonin.modbus4j.ModbusFactory; import com.serotonin.modbus4j.ModbusMaster; import com.serotonin.modbus4j.ip.IpParameters; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ModbusConfig { @Value("${modbus.host:127.0.0.1}") private S