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