Modbus是一種串行通信協(xié)議,是Modicon于1979年,為使用可編程邏輯控制器(PLC)而發(fā)表的。事實上,它已經(jīng)成為工業(yè)領域通信協(xié)議標準,并且現(xiàn)在是工業(yè)電子設備之間相當常用的連接方式。
Modbus協(xié)議目前存在用于串口、以太網(wǎng)以及其他支持互聯(lián)網(wǎng)協(xié)議的網(wǎng)絡的版本。
大多數(shù)Modbus設備通信通過串口EIA-485物理層進行。 對于串行連接,存在兩個變種,它們在數(shù)值數(shù)據(jù)表示不同和協(xié)議細節(jié)上略有不同。Modbus RTU是一種緊湊的,采用二進制表示數(shù)據(jù)的方式,Modbus ASCII是一種人類可讀的,冗長的表示方式。這兩個變種都使用串行通訊(serial communication)方式。RTU格式后續(xù)的命令/數(shù)據(jù)帶有循環(huán)冗余校驗的校驗和,而ASCII格式采用縱向冗余校驗的校驗和。被配置為RTU變種的節(jié)點不會和設置為ASCII變種的節(jié)點通信,反之亦然。
modbusrtu的一個報文分析
先聲明下我們的目的,我們是要兩個設備通訊,用的是MODBUS協(xié)議。上面簡單介紹了:“報文”“CRC校驗”“功能號”。
在單片機中拿出一部分內(nèi)存(RAM)進行兩個設備通訊,例如:
數(shù)組后面的注釋,說明
OX[20] 代表是輸出線圈,用功能碼 0x01,0x05,0x0F 訪問, 開頭地址是 0 (這個后續(xù)說明)
IX[20] 代表是輸入線圈,用功能碼 0x02 訪問, 開頭地址是 1 (這個后續(xù)說明)
另外兩個一樣的道理。
注意:所謂的“線圈”“寄存器”就是“位變量”“16位變量”,不要被迷惑。之所以稱“線圈”我覺得應該是對于應用的設備,MODBUS協(xié)議是專門針對485總線設備(例PLC)開發(fā)的。
1、主機對從機寫數(shù)據(jù)操作
如果單片機接收到一個報文那么就對報文進行解析執(zhí)行相應的處理,如上面報文:
01 06 00 01 00 17 98 04
從機地址 功能號 數(shù)據(jù)地址 數(shù)據(jù) CRC校驗
假如本機地址是 1 ,那么單片機接收到這串數(shù)據(jù)根據(jù)數(shù)據(jù)計算CRC校驗判斷數(shù)據(jù)是否正確,如果判斷數(shù)據(jù)無誤,則結果是:
HoldDataReg[1] = 0x0017;
MODBUS主機就完成了一次對從機數(shù)據(jù)的寫操作,實現(xiàn)了通訊。
2、主機對從機讀數(shù)據(jù)操作
主機進行讀HoldDataReg[1] 操作,則報文是:
01 03 00 01 00 01 D5 CA
從機地址 功能號 數(shù)據(jù)地址 讀取數(shù)據(jù)個數(shù) CRC校驗
那么單片機接收到這串數(shù)據(jù)根據(jù)數(shù)據(jù)計算CRC校驗判斷數(shù)據(jù)是否正確,如果判斷數(shù)據(jù)無誤,則結果是:返回信息給主機,返回的信息也是有格式的:
返回內(nèi)容:
01 03 02 0017 F8 4A
從機地址 功能號 數(shù)據(jù)字節(jié)個數(shù) 兩個字節(jié)數(shù)據(jù) CRC校驗
MODBUS主機就完成了一次對從機數(shù)據(jù)的讀操作,實現(xiàn)了通訊。
MODBUS報文模型
以上了解到了MODBUS的一幀報文是如何通訊的,其實每個報文的格式都基本一樣的。
這里兩個縮略詞以前不知道,但是現(xiàn)在要明白指的是什么,“ADU”“PDU”
ADU: 應用數(shù)據(jù)單元
PDU: 協(xié)議數(shù)據(jù)單元
modbusrtu報文格式
所有交換的RTU類型報文(幀),無論上/下行,具有相同的結構:
每幀報文包含4種類型的信息:
從站號
從站號為1字節(jié),取值范圍為0~FFH.例外的,如果此值為0,則作為主站的廣播信文標識.因此,物理上使用的從站號只能在01H~FFH之間(即1~255之間)。
功能碼
功能碼為1字節(jié),它被用來選擇一個命令(讀、寫或回答校驗是否正確等),有效功能碼范圍為1~255之間,本手冊支持的功能碼將在第2章中加以詳述。
數(shù)據(jù)區(qū)
數(shù)據(jù)區(qū)為n字節(jié),它包含與功能碼相關的一串十六進制數(shù)據(jù)。
評論
查看更多