|
Modbus 一個(gè)工業(yè)上常用的通訊協(xié)議、一種通訊約定。Modbus協(xié)議包括RTU、ASCII、TCP。其中MODBUS-RTU最常用,比較簡(jiǎn)單,在單片機(jī)上很容易實(shí)現(xiàn)。雖然RTU比較簡(jiǎn)單,但是看協(xié)議資料、手冊(cè)說(shuō)得太專(zhuān)業(yè)了,起初很多內(nèi)容都很難理解。
所謂的協(xié)議是什么?就是互相之間的約定嘛,如果不讓別人知道那就是暗號(hào)。現(xiàn)在就來(lái)定義一個(gè)新的最簡(jiǎn)單協(xié)議。例如,
協(xié)議: “A” --“LED滅”
“B” --“報(bào)警”
“C” --“LED亮”
單片機(jī)接收到“A”控制一個(gè)LED滅,單片機(jī)接收到“B”控制報(bào)警,單片機(jī)接收到“A”控制一個(gè)LED亮。那么當(dāng)收到對(duì)應(yīng)的信息就執(zhí)行相應(yīng)的動(dòng)作,這就是協(xié)議,很簡(jiǎn)單吧。
先來(lái)簡(jiǎn)單分析一條MODBUS-RTU報(bào)文,例如:01 06 00 01 00 17 98 04
01 06 00 01 00 17 98 04
從機(jī)地址 功能號(hào) 數(shù)據(jù)地址 數(shù)據(jù) CRC校驗(yàn)
這一串?dāng)?shù)據(jù)的意思是:把數(shù)據(jù) 0x0017(十進(jìn)制23) 寫(xiě)入 1號(hào)從機(jī)地址 0x0001數(shù)據(jù)地址。
先弄明白下面的東西。
1、報(bào)文
一個(gè)報(bào)文就是一幀數(shù)據(jù),一個(gè)數(shù)據(jù)幀就一個(gè)報(bào)文: 指的是一串完整的指令數(shù)據(jù),就像上面的一串?dāng)?shù)據(jù)。
2、CRC校驗(yàn)
意義:例如上面的 98 04 是它前面的數(shù)據(jù)(01 06 00 01 00 17)通過(guò)一算法(見(jiàn)附錄2,很簡(jiǎn)單的)計(jì)算出來(lái)的結(jié)果,其實(shí)就像是計(jì)算累加和那樣。(累加和:就是010600010017加起來(lái)的值,然后它的算法就是加法)。
作用:在數(shù)據(jù)傳輸過(guò)程中可能數(shù)據(jù)會(huì)發(fā)生錯(cuò)誤,CRC檢驗(yàn)檢測(cè)接收的數(shù)據(jù)是否正確。比如主機(jī)發(fā)出01 06 00 01 00 17 98 04,那么從機(jī)接收到后要根據(jù)01 06 00 01 00 17 再計(jì)算CRC校驗(yàn)值,從機(jī)判斷自己計(jì)算出來(lái)的CRC校驗(yàn)是否與接收的CRC校驗(yàn)(98 04主機(jī)計(jì)算的)相等,如果不相等那么說(shuō)明數(shù)據(jù)傳輸有錯(cuò)誤這些數(shù)據(jù)不能要。
3、功能號(hào)
意義:modbus 定義。見(jiàn)附錄1。
作用:指示具體的操作。
MODBUS-RTU
一、一個(gè)報(bào)文分析
先聲明下我們的目的,我們是要兩個(gè)設(shè)備通訊,用的是MODBUS協(xié)議。上面簡(jiǎn)單介紹了:“報(bào)文”“CRC校驗(yàn)”“功能號(hào)”。
在單片機(jī)中拿出一部分內(nèi)存(RAM)進(jìn)行兩個(gè)設(shè)備通訊,例如:
a58009b78662d933562008ac2e52fbe6.jpg (17.85 KB, 下載次數(shù): 51)
下載附件
2017-6-28 18:12 上傳
數(shù)組后面的注釋?zhuān)f(shuō)明
OX[20] 代表是輸出線(xiàn)圈,用功能碼 0x01,0x05,0x0F 訪(fǎng)問(wèn), 開(kāi)頭地址是 0 (這個(gè)后續(xù)說(shuō)明)
IX[20] 代表是輸入線(xiàn)圈,用功能碼 0x02 訪(fǎng)問(wèn), 開(kāi)頭地址是 1 (這個(gè)后續(xù)說(shuō)明)
另外兩個(gè)一樣的道理。
注意:所謂的“線(xiàn)圈”“寄存器”就是“位變量”“16位變量”,不要被迷惑。之所以稱(chēng)“線(xiàn)圈”我覺(jué)得應(yīng)該是對(duì)于應(yīng)用的設(shè)備,MODBUS協(xié)議是專(zhuān)門(mén)針對(duì)485總線(xiàn)設(shè)備(例PLC)開(kāi)發(fā)的。
1、主機(jī)對(duì)從機(jī)寫(xiě)數(shù)據(jù)操作
如果單片機(jī)接收到一個(gè)報(bào)文那么就對(duì)報(bào)文進(jìn)行解析執(zhí)行相應(yīng)的處理,如上面報(bào)文:
01 06 00 01 00 17 98 04
從機(jī)地址 功能號(hào) 數(shù)據(jù)地址 數(shù)據(jù) CRC校驗(yàn)
假如本機(jī)地址是 1 ,那么單片機(jī)接收到這串?dāng)?shù)據(jù)根據(jù)數(shù)據(jù)計(jì)算CRC校驗(yàn)判斷數(shù)據(jù)是否正確,如果判斷數(shù)據(jù)無(wú)誤,則結(jié)果是:
HoldDataReg[1] = 0x0017;
MODBUS主機(jī)就完成了一次對(duì)從機(jī)數(shù)據(jù)的寫(xiě)操作,實(shí)現(xiàn)了通訊。
2、主機(jī)對(duì)從機(jī)讀數(shù)據(jù)操作
主機(jī)進(jìn)行讀HoldDataReg[1] 操作,則報(bào)文是:
01 03 00 01 00 01 D5 CA
從機(jī)地址 功能號(hào) 數(shù)據(jù)地址 讀取數(shù)據(jù)個(gè)數(shù) CRC校驗(yàn)
那么單片機(jī)接收到這串?dāng)?shù)據(jù)根據(jù)數(shù)據(jù)計(jì)算CRC校驗(yàn)判斷數(shù)據(jù)是否正確,如果判斷數(shù)據(jù)無(wú)誤,則結(jié)果是:返回信息給主機(jī),返回的信息也是有格式的:
返回內(nèi)容:
01 03 02 0017 F8 4A
從機(jī)地址 功能號(hào) 數(shù)據(jù)字節(jié)個(gè)數(shù) 兩個(gè)字節(jié)數(shù)據(jù) CRC校驗(yàn)
MODBUS主機(jī)就完成了一次對(duì)從機(jī)數(shù)據(jù)的讀操作,實(shí)現(xiàn)了通訊。
二、MODBUS報(bào)文模型
以上了解到了MODBUS的一幀報(bào)文是如何通訊的,其實(shí)每個(gè)報(bào)文的格式都基本一樣的。
06f929bb1277393c890676f1b8fff846.jpg (10.59 KB, 下載次數(shù): 55)
下載附件
2017-6-28 18:12 上傳
這里兩個(gè)縮略詞以前不知道,但是現(xiàn)在要明白指的是什么,“ADU”“PDU”
ADU: 應(yīng)用數(shù)據(jù)單元
PDU: 協(xié)議數(shù)據(jù)單元
三、MODBUS數(shù)據(jù)模型
5b1d72d9d9477840f28ea0538725cbbe.jpg (33.42 KB, 下載次數(shù): 47)
下載附件
2017-6-28 18:12 上傳
21a5a957173fea5b0621bc150f517caf.jpg (26.57 KB, 下載次數(shù): 49)
下載附件
2017-6-28 18:12 上傳
四、MODBUS事務(wù)處理
下列狀態(tài)圖描述了在服務(wù)器側(cè)MODBUS事務(wù)處理的一般處理過(guò)程。
fee9e3ef8b0444a9eff9bc66d0a2a5c5.jpg (18.23 KB, 下載次數(shù): 64)
下載附件
2017-6-28 18:12 上傳
五、MODBUS請(qǐng)求與響應(yīng)
看MODBUS協(xié)議手冊(cè),中文第 10 頁(yè)開(kāi)始,英文第 24 頁(yè)開(kāi)始。手冊(cè)非常詳細(xì)舉例說(shuō)明了MODBUS協(xié)議各個(gè)功能號(hào)的請(qǐng)求與響應(yīng)。
modbus協(xié)議在單片機(jī)上實(shí)現(xiàn)過(guò)程
MODBUS 任務(wù)處理函數(shù)
c00a6d7148715e6b8e70e510594e6ee5.jpg (49.87 KB, 下載次數(shù): 45)
下載附件
2017-6-28 18:12 上傳
函數(shù)中,RcvBuf 為串口接收緩沖區(qū),如果接收了一個(gè)報(bào)文則,RcvBuf[0] 為從機(jī)地址,RcvBuf[0] 為MODBUS功能號(hào)。根據(jù)功能號(hào)做出響應(yīng),而具體的操作根據(jù)功能號(hào)在各自的函數(shù)中執(zhí)行,相當(dāng)于解析接收到的數(shù)據(jù)。
附錄1:MODBUS-RTU功能碼
最常用功能碼:
下面“線(xiàn)圈”“寄存器”其實(shí)分別直的就是“位變量”“16位變量”
01 (0x01) 讀線(xiàn)圈
02 (0x02) 讀離散量輸入
03 (0x03) 讀保持寄存器
04(0x04) 讀輸入寄存器
05 (0x05) 寫(xiě)單個(gè)線(xiàn)圈
06 (0x06) 寫(xiě)單個(gè)寄存器
15 (0x0F) 寫(xiě)多個(gè)線(xiàn)圈
16 (0x10) 寫(xiě)多個(gè)寄存器
|
|