Modbus功能碼一覽
Modbus網(wǎng)絡是一個工業(yè)通信系統(tǒng),由帶智能終端的可編程序控制器和計算機通過公用線路或局部專用線路連接而成。其系統(tǒng)結構既包括硬件、亦包括軟件。它可應用于各種數(shù)據(jù)采集和過程監(jiān)控。下表1是ModBus的功能碼定義。
表1 ModBus功能碼列表
Modbus網(wǎng)絡只是一個主機,所有通信都由他發(fā)出。網(wǎng)絡可支持247個之多的遠程從屬控制器,但實際所支持的從機數(shù)要由所用通信設備決定。采用這個系 統(tǒng),各PC可以和中心主機交換信息而不影響各PC執(zhí)行本身的控制任務。表2是ModBus各功能碼對應的數(shù)據(jù)類型。
(1)ModBus的傳輸方式
在ModBus系統(tǒng)中有2種傳輸模式可選擇。這2種傳輸模式與從機PC通信的能力是同等的。選擇時應視所用ModBus主機而定, 每個ModBus系統(tǒng)只能使用一種模式,不允許2種模式混用。一種模式是ASCII(美國信息交換碼),另一種模式是RTU(遠程終端設備)這兩種模式的 定義見表3
表3 ASCII和RTU傳輸模式的特性
ASCII可打印字符便于故障檢測,而且對于用高級語言(如Fortan)編程的主計算機及主PC很適宜。RTU則適用于機器語言編程的計算機和PC主機。
用RTU模式傳輸?shù)臄?shù)據(jù)是8位二進制字符。如欲轉(zhuǎn)換為ASCII模式,則每個RTU字符首先應分為高位和低位兩部分,這兩部分各含4位,然后轉(zhuǎn)換成十六進 制等量值。用以構成報文的ASCII字符都是十六進制字符。ASCII模式使用的字符雖是RTU模式的兩倍,但ASCII數(shù)據(jù)的譯瑪和處理更為容易一些, 此外,用RTU模式時報文字符必須以連續(xù)數(shù)據(jù)流的形式傳送,用ASCII模式,字符之間可產(chǎn)生長達1s的間隔,以適應速度較快的機器。表4給出了以RTU 方式讀取整數(shù)據(jù)的例子
以RTU方式讀取整數(shù)據(jù)的例子
(2)Modbus的數(shù)據(jù)校驗方式
CRC-16(循環(huán)冗余錯誤校驗)
CRC-16錯誤校驗程序如下:報文(此處只涉及數(shù)據(jù)位,不指起始位、停止位和任選的奇偶校驗位)被看作是一個連續(xù)的二進制,其最高有效位(MSB)首選 發(fā)送。報文先與X↑16相乘(左移16位),然后看X↑16+X↑15+X↑2+1除,X↑16+X↑15+X↑2+1可以表示為二進制數(shù) 11000000000000101。整數(shù)商位忽略不記,16位余數(shù)加入該報文(MSB先發(fā)送),成為2個CRC校驗字節(jié)。余數(shù)中的1全部初始化,以免所 有的零成為一條報文被接收。經(jīng)上述處理而含有CRC字節(jié)的報文,若無錯誤,到接收設備后再被同一多項式(X↑16+X↑15+X↑2+1)除,會得到一個 零余數(shù)(接收設備核驗這個CRC字節(jié),并將其與被傳送的CRC比較)。全部運算以2為模(無進位)。
習慣于成串發(fā)送數(shù)據(jù)的設備會首選送出字符的最右位(LSB-最低有效位)。而在生成CRC情況下,發(fā)送首位應是被除數(shù)的最高有效位MSB。由于在運算中不 用進位,為便于操作起見,計算CRC時設MSB在最右位。生成多項式的位序也必須反過來,以保持一致。多項式的MSB略去不記,因其只對商有影響而不影響 余數(shù)。
生成CRC-16校驗字節(jié)的步驟如下:
①裝如一個16位寄存器,所有數(shù)位均為1。
②該16位寄存器的高位字節(jié)與開始8位字節(jié)進行“異或”運算。運算結果放入這個16位寄存器。
③把這個16寄存器向右移一位。
④若向右(標記位)移出的數(shù)位是1,則生成多項式1010000000000001和這個寄存器進行“異或”運算;若向右移出的數(shù)位是0,則返回③。
⑤重復③和④,直至移出8位。
⑥另外8位與該十六位寄存器進行“異或”運算。
⑦重復③~⑥,直至該報文所有字節(jié)均與16位寄存器進行“異或”運算,并移位8次。
⑧這個16位寄存器的內(nèi)容即2字節(jié)CRC錯誤校驗,被加到報文的最高有效位。
另外,在某些非ModBus通信協(xié)議中也經(jīng)常使用CRC16作為校驗手段,而且產(chǎn)生了一些CRC16的變種,他們是使用CRC16多項式X↑16+ X↑15+X↑2+1,單首次裝入的16位寄存器為0000;使用CRC16的反序X↑16+X↑14+X↑1+1,首次裝入寄存器值為0000或 FFFFH。
LRC(縱向冗余錯誤校驗)
LRC錯誤校驗用于ASCII模式。這個錯誤校驗是一個8位二進制數(shù),可作為2個ASCII十六進制字節(jié)傳送。把十六進制字符轉(zhuǎn)換成二進制,加上無循環(huán)進 位的二進制字符和二進制補碼結果生成LRC錯誤校驗(參見圖)。這個LRC在接收設備進行核驗,并與被傳送的LRC進行比較,冒號(:)、回車符號 (CR)、換行字符(LF)和置入的其他任何非ASCII十六進制字符在運算時忽略不計。
表5 LRC生成范例--讀取02號從機的前8個線圈