首先,简单介绍一下Modbus协议。这是一个通讯协议,用于工业设备之间传输信息,地位类似于互联网领域中的http协议。
简单理解,通讯协议可以分为两层:硬件层和软件层。硬件层负责传输数据,如 232/485串口协议、tcp协议等。软件层则在硬件层的基础上定义了传输数据的格式。
Modbus采用主-从结构,主机会不断地发送指令给从机,从机执行指令,并返回执行结果。
以一条Modbus报文数据举例,其传输原始数据如下 01 06 00 01 00 17 98 04
,对应的解析为:
01——从机地址
06——功能号
00 01——数据地址
00 17——数据
98 04——CRC校验
翻译成人话就是:主机对1号从机说“把数据 0x0017(十进制23) 写入 0x0001寄存器”
Modbus4j——Java版本modbus协议实现
支持的从机transports类型有:ASCII, RTU, TCP, and UDP。
核心类
- 主机Master及其子类:主机的入口,数据流的起点和终点。
- 数据端口类StreamTransport:负责数据的写入和读出。
- Modbus消息类ModbusMessage及其子类:支持Modbus定义的各种方法(FunctionCode)
- 收发数据控制类MessageControl:支持 timeout、retries,默认200ms,1次。
- 收发等待室WaitingRoom:负责同步收发逻辑。
- 输出Request消息类:OutgoingRequestMessage 及其子类。
- 收到Response消息类:IncomingResponseMessage 及其子类。
- 解析类MessageParser:负责解析收到的消息。
- 协议数据类型定义:DataType
- 协议功能码定义:FunctionCode
- 协议寄存器范围:RegisterRange
数据流程
- 透过
ModbusFactory
创建对应的Master
对象。 - 封装需要发送的指令,比如
ReadHoldingRegistersRequest
,这是一个读寄存器指令,指定寄存器地址和长度即可。 -
Master
对象将这个ReadHoldingRegistersRequest
转化为OutgoingRequestMessage
对象,然后传输给MessageControl
。 - 透过驱动层,
MessageControl
将这个OutgoingRequestMessage
写入对应的通讯硬件外设(串口、网口等),并等待返回数据IncomingResponseMessage
。 - 如果没有等到,就返回null,并提醒超时。
- 如果等到了有效返回,则
MessageControl
利用MessageParser
将IncomingResponseMessage
转化为对应ModbusResponse
返回给上层。
单元测试
在modbus4j/src_test/定义了一系列单元测试方法,跟踪其中相关方法,即可了解modbus协议的实际运作流程。
网友评论