首先,簡(jiǎn)單介紹一下Modbus協(xié)議。這是一個(gè)通訊協(xié)議,用于工業(yè)設(shè)備之間傳輸信息,地位類似于互聯(lián)網(wǎng)領(lǐng)域中的http協(xié)議。
簡(jiǎn)單理解,通訊協(xié)議可以分為兩層:硬件層和軟件層。硬件層負(fù)責(zé)傳輸數(shù)據(jù),如 232/485串口協(xié)議、tcp協(xié)議等。軟件層則在硬件層的基礎(chǔ)上定義了傳輸數(shù)據(jù)的格式。
Modbus采用主-從結(jié)構(gòu),主機(jī)會(huì)不斷地發(fā)送指令給從機(jī),從機(jī)執(zhí)行指令,并返回執(zhí)行結(jié)果。
以一條Modbus報(bào)文數(shù)據(jù)舉例,其傳輸原始數(shù)據(jù)如下 01 06 00 01 00 17 98 04,對(duì)應(yīng)的解析為:
01——從機(jī)地址
06——功能號(hào)
00 01——數(shù)據(jù)地址
00 17——數(shù)據(jù)
98 04——CRC校驗(yàn)
翻譯成人話就是:主機(jī)對(duì)1號(hào)從機(jī)說(shuō)“把數(shù)據(jù) 0x0017(十進(jìn)制23) 寫(xiě)入 0x0001寄存器”
Modbus4j——Java版本modbus協(xié)議實(shí)現(xiàn)
支持的從機(jī)transports類型有:ASCII, RTU, TCP, and UDP。
核心類
- 主機(jī)Master及其子類:主機(jī)的入口,數(shù)據(jù)流的起點(diǎn)和終點(diǎn)。
- 數(shù)據(jù)端口類StreamTransport:負(fù)責(zé)數(shù)據(jù)的寫(xiě)入和讀出。
- Modbus消息類ModbusMessage及其子類:支持Modbus定義的各種方法(FunctionCode)
- 收發(fā)數(shù)據(jù)控制類MessageControl:支持 timeout、retries,默認(rèn)200ms,1次。
- 收發(fā)等待室WaitingRoom:負(fù)責(zé)同步收發(fā)邏輯。
- 輸出Request消息類:OutgoingRequestMessage 及其子類。
- 收到Response消息類:IncomingResponseMessage 及其子類。
- 解析類MessageParser:負(fù)責(zé)解析收到的消息。
- 協(xié)議數(shù)據(jù)類型定義:DataType
- 協(xié)議功能碼定義:FunctionCode
- 協(xié)議寄存器范圍:RegisterRange
數(shù)據(jù)流程
- 透過(guò)
ModbusFactory創(chuàng)建對(duì)應(yīng)的Master對(duì)象。 - 封裝需要發(fā)送的指令,比如
ReadHoldingRegistersRequest,這是一個(gè)讀寄存器指令,指定寄存器地址和長(zhǎng)度即可。 -
Master對(duì)象將這個(gè)ReadHoldingRegistersRequest轉(zhuǎn)化為OutgoingRequestMessage對(duì)象,然后傳輸給MessageControl。 - 透過(guò)驅(qū)動(dòng)層,
MessageControl將這個(gè)OutgoingRequestMessage寫(xiě)入對(duì)應(yīng)的通訊硬件外設(shè)(串口、網(wǎng)口等),并等待返回?cái)?shù)據(jù)IncomingResponseMessage。 - 如果沒(méi)有等到,就返回null,并提醒超時(shí)。
- 如果等到了有效返回,則
MessageControl利用MessageParser將IncomingResponseMessage轉(zhuǎn)化為對(duì)應(yīng)ModbusResponse返回給上層。
單元測(cè)試
在modbus4j/src_test/定義了一系列單元測(cè)試方法,跟蹤其中相關(guān)方法,即可了解modbus協(xié)議的實(shí)際運(yùn)作流程。