Modbus功能碼一覽
Modbus網(wǎng)絡(luò)是一個(gè)工業(yè)通信系統(tǒng),由帶智能終端的可編程序控制器和計(jì)算機(jī)通過公用線路或局部專用線路連接而成。其系統(tǒng)結(jié)構(gòu)既包括硬件、亦包括軟件。它可應(yīng)用于各種數(shù)據(jù)采集和過程監(jiān)控。下表1是ModBus的功能碼定義。
表1 ModBus功能碼列表
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各功能碼對應(yīng)的數(shù)據(jù)類型。
表2 ModBus功能碼與數(shù)據(jù)類型對應(yīng)表
(1)ModBus的傳輸方式
在ModBus系統(tǒng)中有2種傳輸模式可選擇。這2種傳輸模式與從機(jī)PC通信的能力是同等的。選擇時(shí)應(yīng)視所用ModBus主機(jī)而定, 每個(gè)ModBus系統(tǒng)只能使用一種模式,不允許2種模式混用。一種模式是ASCII(美國信息交換碼),另一種模式是RTU(遠(yuǎn)程終端設(shè)備)這兩種模式的 定義見表3
表3 ASCII和RTU傳輸模式的特性
ASCII可打印字符便于故障檢測,而且對于用高級語言(如Fortan)編程的主計(jì)算機(jī)及主PC很適宜。RTU則適用于機(jī)器語言編程的計(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)生長達(dá)1s的間隔,以適應(yīng)速度較快的機(jī)器。表4給出了以RTU 方式讀取整數(shù)據(jù)的例子
以RTU方式讀取整數(shù)據(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)文,若無錯(cuò)誤,到接收設(shè)備后再被同一多項(xiàng)式(X↑16+X↑15+X↑2+1)除,會得到一個(gè) 零余數(shù)(接收設(shè)備核驗(yàn)這個(gè)CRC字節(jié),并將其與被傳送的CRC比較)。全部運(yùn)算以2為模(無進(jìn)位)。
習(xí)慣于成串發(fā)送數(shù)據(jù)的設(shè)備會首選送出字符的最右位(LSB-最低有效位)。而在生成CRC情況下,發(fā)送首位應(yīng)是被除數(shù)的最高有效位MSB。由于在運(yùn)算中不 用進(jìn)位,為便于操作起見,計(jì)算CRC時(shí)設(shè)MSB在最右位。生成多項(xiàng)式的位序也必須反過來,以保持一致。多項(xiàng)式的MSB略去不記,因其只對商有影響而不影響 余數(shù)。
生成CRC-16校驗(yàn)字節(jié)的步驟如下:
①裝如一個(gè)16位寄存器,所有數(shù)位均為1。
②該16位寄存器的高位字節(jié)與開始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)制,加上無循環(huán)進(jìn) 位的二進(jìn)制字符和二進(jìn)制補(bǔ)碼結(jié)果生成LRC錯(cuò)誤校驗(yàn)(參見圖)。這個(gè)LRC在接收設(shè)備進(jìn)行核驗(yàn),并與被傳送的LRC進(jìn)行比較,冒號(:)、回車符號 (CR)、換行字符(LF)和置入的其他任何非ASCII十六進(jìn)制字符在運(yùn)算時(shí)忽略不計(jì)。
表5 LRC生成范例--讀取02號從機(jī)的前8個(gè)線圈