ModBus通信系統(tǒng)協(xié)議
ModBus通信系統(tǒng)協(xié)議
ModBus網(wǎng)絡(luò)是一個(gè)工業(yè)通信系統(tǒng),由帶智能終端的可編程序控制器和計(jì)算機(jī)通過(guò)公用線路或局部專(zhuān)用線路連接而成,。其系統(tǒng)結(jié)構(gòu)既包括硬件,、亦包括軟件,。它可應(yīng)用于各種數(shù)據(jù)采集和過(guò)程監(jiān)控。下表1是ModBus的功能碼定義,。
表1 ModBus功能碼
功能碼 | 名稱(chēng) | 作用 |
01 | 讀取線圈狀態(tài) | 取得一組邏輯線圈的當(dāng)前狀態(tài)(ON/OFF) |
02 | 讀取輸入狀態(tài) | 取得一組開(kāi)關(guān)輸入的當(dāng)前狀態(tài)(ON/OFF) |
03 | 讀取保持寄存器 | 在一個(gè)或多個(gè)保持寄存器中取得當(dāng)前的二進(jìn)制值 |
04 | 讀取輸入寄存器 | 在一個(gè)或多個(gè)輸入寄存器中取得當(dāng)前的二進(jìn)制值 |
05 | 強(qiáng)置單線圈 | 強(qiáng)置一個(gè)邏輯線圈的通斷狀態(tài) |
06 | 預(yù)置單寄存器 | 把具體二進(jìn)值裝入一個(gè)保持寄存器 |
07 | 讀取異常狀態(tài) | 取得8個(gè)內(nèi)部線圈的通斷狀態(tài),,這8個(gè)線圈的地址由控制器決定,用戶邏輯可以將這些線圈定義,,以說(shuō)明從機(jī)狀態(tài),,短報(bào)文適宜于迅速讀取狀態(tài) |
08 | 回送診斷校驗(yàn) | 把診斷校驗(yàn)報(bào)文送從機(jī),以對(duì)通信處理進(jìn)行評(píng)鑒 |
09 | 編程(只用于484) | 使主機(jī)模擬編程器作用,,修改PC從機(jī)邏輯 |
10 | 控詢(只用于484) | 可使主機(jī)與一臺(tái)正在執(zhí)行長(zhǎng)程序任務(wù)從機(jī)通信,,探詢?cè)搹臋C(jī)是否已完成其操作任務(wù),僅在含有功能碼9的報(bào)文發(fā)送后,,本功能碼才發(fā)送 |
11 | 讀取事件計(jì)數(shù) | 可使主機(jī)發(fā)出單詢問(wèn),,并隨即判定操作是否成功,尤其是該命令或其他應(yīng)答產(chǎn)生通信錯(cuò)誤時(shí) |
12 | 讀取通信事件記錄 | 可是主機(jī)檢索每臺(tái)從機(jī)的ModBus事務(wù)處理通信事件記錄,。如果某項(xiàng)事務(wù)處理完成,,記錄會(huì)給出有關(guān)錯(cuò)誤 |
13 | 編程(184/384 484 584) | 可使主機(jī)模擬編程器功能修改PC從機(jī)邏輯 |
14 | 探詢(184/384 484 584) | 可使主機(jī)與正在執(zhí)行任務(wù)的從機(jī)通信,定期控詢?cè)搹臋C(jī)是否已完成其程序操作,,僅在含有功能13的報(bào)文發(fā)送后,,本功能碼才得發(fā)送 |
15 | 強(qiáng)置多線圈 | 強(qiáng)置一串連續(xù)邏輯線圈的通斷 |
16 | 預(yù)置多寄存器 | 把具體的二進(jìn)制值裝入一串連續(xù)的保持寄存器 |
17 | 報(bào)告從機(jī)標(biāo)識(shí) | 可使主機(jī)判斷編址從機(jī)的類(lèi)型及該從機(jī)運(yùn)行指示燈的狀態(tài) |
18 | (884和MICRO 84) | 可使主機(jī)模擬編程功能,修改PC狀態(tài)邏輯 |
19 | 重置通信鏈路 | 發(fā)生非可修改錯(cuò)誤后,,是從機(jī)復(fù)位于已知狀態(tài),,可重置順序字節(jié) |
20 | 讀取通用參數(shù)(584L) | 顯示擴(kuò)展存儲(chǔ)器文件中的數(shù)據(jù)信息 |
21 | 寫(xiě)入通用參數(shù)(584L) | 把通用參數(shù)寫(xiě)入擴(kuò)展存儲(chǔ)文件,或修改之 |
22~64 | 保留作擴(kuò)展功能備用 | |
65~72 | 保留以備用戶功能所用 | 留作用戶功能的擴(kuò)展編碼 |
73~119 | 非法功能 | |
120~127 | 保留 | 留作內(nèi)部作用 |
128~255 | 保留 | 用于異常應(yīng)答 |
ModBus網(wǎng)絡(luò)只是一個(gè)主機(jī),,所有通信都由他發(fā)出,。網(wǎng)絡(luò)可支持247個(gè)之多的遠(yuǎn)程從屬控制器,但實(shí)際所支持的從機(jī)數(shù)要由所用通信設(shè)備決定,。采用這個(gè)系統(tǒng),,各PC可以和中心主機(jī)交換信息而不影響各PC執(zhí)行本身的控制任務(wù)。表2是ModBus各功能碼對(duì)應(yīng)的數(shù)據(jù)類(lèi)型。
表2 ModBus功能碼與數(shù)據(jù)類(lèi)型對(duì)應(yīng)表
代碼 | 功能 | 數(shù)據(jù)類(lèi)型 |
01 | 讀 | 位 |
02 | 讀 | 位 |
03 | 讀 | 整型,、字符型,、狀態(tài)字、浮點(diǎn)型 |
04 | 讀 | 整型,、狀態(tài)字,、浮點(diǎn)型 |
05 | 寫(xiě) | 位 |
06 | 寫(xiě) | 整型、字符型,、狀態(tài)字,、浮點(diǎn)型 |
08 | N/A | 重復(fù)“回路反饋”信息 |
15 | 寫(xiě) | 位 |
16 | 寫(xiě) | 整型、字符型,、狀態(tài)字,、浮點(diǎn)型 |
17 | 讀 | 字符型 |
(1)ModBus的傳輸方式
在ModBus系統(tǒng)中有2種傳輸模式可選擇。這2種傳輸模式與從機(jī)PC通信的能力是同等的,。選擇時(shí)應(yīng)視所用ModBus主機(jī)而定,,每個(gè)ModBus系統(tǒng)只能使用一種模式,不允許2種模式混用,。一種模式是ASCII(美國(guó)信息交換碼),,另一種模式是RTU(遠(yuǎn)程終端設(shè)備)這兩種模式的定義見(jiàn)表3
表3 ASCII和RTU傳輸模式的特性
特性 | ASCII(7位) | RTU(8位) | |
編碼系統(tǒng) | 十六進(jìn)制(使用ASCII可打印字符:0~9,A~F) | 二進(jìn)制 | |
每一個(gè)字符的位數(shù) | 開(kāi)始位 | 1位 | 1位 |
數(shù)據(jù)位(有效位*) | 7位 | 8位 | |
奇偶校驗(yàn)(任選) | 1位(此位用于奇偶校驗(yàn),,無(wú)校應(yīng)則無(wú)該位) | 1位(此位用于奇偶校驗(yàn),,無(wú)校應(yīng)則無(wú)該位) | |
停止位 | 1或2位 | 1或2位 | |
錯(cuò)誤校驗(yàn) | LRC(即縱向冗余校驗(yàn)) | CRC(即循環(huán)冗余校驗(yàn)) |
ASCII可打印字符便于故障檢測(cè),而且對(duì)于用高級(jí)語(yǔ)言(如Fortan)編程的主計(jì)算機(jī)及主PC很適宜,。RTU則適用于機(jī)器語(yǔ)言編程的計(jì)算機(jī)和PC主機(jī),。
用RTU模式傳輸?shù)臄?shù)據(jù)是8位二進(jìn)制字符。如欲轉(zhuǎn)換為ASCII模式,,則每個(gè)RTU字符首先應(yīng)分為高位和低位兩部分,,這兩部分各含4位,然后轉(zhuǎn)換成十六進(jìn)制等量值,。用以構(gòu)成報(bào)文的ASCII字符都是十六進(jìn)制字符,。ASCII模式使用的字符雖是RTU模式的兩倍,但ASCII數(shù)據(jù)的譯瑪和處理更為容易一些,,此外,,用RTU模式時(shí)報(bào)文字符必須以連續(xù)數(shù)據(jù)流的形式傳送,用ASCII模式,,字符之間可產(chǎn)生長(zhǎng)達(dá)1s的間隔,,以適應(yīng)速度較快的機(jī)器。
表4給出了以RTU方式讀取整數(shù)據(jù)的例子
以RTU方式讀取整數(shù)據(jù)的例子
主機(jī)請(qǐng)求 | ||||||
地址 | 功能碼 | 第一個(gè)寄存器的高位地址 | 第一個(gè)寄存器的低位地址 | 寄存器的數(shù)量的高位 | 寄存器的數(shù)量的底位 | 錯(cuò)誤校驗(yàn) |
01 | 03 | 00 | 38 | 00 | 01 | XX |
從機(jī)應(yīng)答 | |||||
地址 | 功能碼 | 字節(jié)數(shù) | 數(shù)據(jù)高字節(jié) | 數(shù)據(jù)低字節(jié) | 錯(cuò)誤校驗(yàn) |
01 | 03 | 2 | 41 | 24 | XX |
十六進(jìn)制數(shù)4124表示的十進(jìn)制整數(shù)為16676,,錯(cuò)誤校驗(yàn)值要根據(jù)傳輸方式而定,。 |
(2)ModBus的數(shù)據(jù)校驗(yàn)方式
CRC-16(循環(huán)冗余錯(cuò)誤校驗(yàn))
CRC-16錯(cuò)誤校驗(yàn)程序如下:報(bào)文(此處只涉及數(shù)據(jù)位,,不指起始位、停止位和任選的奇偶校驗(yàn)位)被看作是一個(gè)連續(xù)的二進(jìn)制,,其最高有效位(MSB)發(fā)送,。報(bào)文先與X↑16相乘(左移16位),然后看X↑16+X↑15+X↑2+1除,,X↑16+X↑15+X↑2+1可以表示為二進(jìn)制數(shù)11000000000000101,。整數(shù)商位忽略不記,16位余數(shù)加入該報(bào)文(MSB先發(fā)送),,成為2個(gè)CRC校驗(yàn)字節(jié)。余數(shù)中的1全部初始化,,以免所有的零成為一條報(bào)文被接收,。經(jīng)上述處理而含有CRC字節(jié)的報(bào)文,若無(wú)錯(cuò)誤,,到接收設(shè)備后再被同一多項(xiàng)式(X↑16+X↑15+X↑2+1)除,,會(huì)得到一個(gè)零余數(shù)(接收設(shè)備核驗(yàn)這個(gè)CRC字節(jié),并將其與被傳送的CRC比較),。全部運(yùn)算以2為模(無(wú)進(jìn)位),。
習(xí)慣于成串發(fā)送數(shù)據(jù)的設(shè)備會(huì)送出字符的最右位(LSB有效位)。而在生成CRC情況下,,發(fā)送應(yīng)是被除數(shù)的最高有效位MSB,。由于在運(yùn)算中不用進(jìn)位,為便于操作起見(jiàn),,計(jì)算CRC時(shí)設(shè)MSB在最右位,。生成多項(xiàng)式的位序也必須反過(guò)來(lái),以保持一致,。多項(xiàng)式的MSB略去不記,,因其只對(duì)商有影響而不影響余數(shù)。
生成CRC-16校驗(yàn)字節(jié)的步驟如下:
①裝如一個(gè)16位寄存器,,所有數(shù)位均為1,。
②該16位寄存器的高位字節(jié)與開(kāi)始8位字節(jié)進(jìn)行“異或”運(yùn)算。運(yùn)算結(jié)果放入這個(gè)16位寄存器,。
③把這個(gè)16寄存器向右移一位,。
④若向右(標(biāo)記位)移出的數(shù)位是1,則生成多項(xiàng)式1010000000000001和這個(gè)寄存器進(jìn)行“異或”運(yùn)算,;若向右移出的數(shù)位是0,,則返回③。
⑤重復(fù)③和④,,直至移出8位,。
⑥另外8位與該十六位寄存器進(jìn)行“異或”運(yùn)算,。
⑦重復(fù)③~⑥,直至該報(bào)文所有字節(jié)均與16位寄存器進(jìn)行“異或”運(yùn)算,,并移位8次,。
⑧這個(gè)16位寄存器的內(nèi)容即2字節(jié)CRC錯(cuò)誤校驗(yàn),被加到報(bào)文的最高有效位,。
另外,,在某些非ModBus通信協(xié)議中也經(jīng)常使用CRC16作為校驗(yàn)手段,而且產(chǎn)生了一些CRC16的變種,,他們是使用CRC16多項(xiàng)式X↑16+X↑15+X↑2+1,,單裝入的16位寄存器為0000;使用CRC16的反序X↑16+X↑14+X↑1+1,,裝入寄存器值為0000或FFFFH,。
LRC(縱向冗余錯(cuò)誤校驗(yàn))
LRC錯(cuò)誤校驗(yàn)用于ASCII模式。這個(gè)錯(cuò)誤校驗(yàn)是一個(gè)8位二進(jìn)制數(shù),,可作為2個(gè)ASCII十六進(jìn)制字節(jié)傳送,。把十六進(jìn)制字符轉(zhuǎn)換成二進(jìn)制,加上無(wú)循環(huán)進(jìn)位的二進(jìn)制字符和二進(jìn)制補(bǔ)碼結(jié)果生成LRC錯(cuò)誤校驗(yàn)(參見(jiàn)圖),。這個(gè)LRC在接收設(shè)備進(jìn)行核驗(yàn),,并與被傳送的LRC進(jìn)行比較,冒號(hào)(:),、回車(chē)符號(hào)(CR),、換行字符(LF)和置入的其他任何非ASCII十六進(jìn)制字符在運(yùn)算時(shí)忽略不計(jì)。
表5 LRC生成范例--讀取02號(hào)從機(jī)的前8個(gè)線圈
| 二進(jìn)制 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|