MODBUS通訊傳輸介紹
Modbus協議是應用於電子控制器上的一種通用語言通過此協議控制器相互之間控制器經由網絡例如以太網和其它設備之間可以通信它已經成為一通用工業標準有了它不同廠商生產的控制設備可以連成工業網絡進行集中監控此協議定義了一個控制器能認識使用的消息結構而不管它們是經過何種網絡進行通信的它描述了一控制器請求訪問其它設備的過程如果回應來自其它設備的請求以及怎樣偵測錯誤並記錄它制定了消息域格局和內容的公共格式
當在一的Modbus網絡上通信時此協議決定了每個控制器須要知道它們的設備地址識別按地址發來的消息決定要產生何種行動如果需要回應控制器將生成反饋信息並用的Modbus協議發出在其它網絡上包含了的Modbus協議的消息轉換為在此網絡上使用的幀或包結構這種轉換也擴展了根據具體的網絡解決節地址路由路徑及錯誤檢測的方法
在的Modbus網絡上轉輸
標準的的Modbus口是使用一的RS - 232C兼容串行接口,它定義了連接口的針腳,電纜,信號位,傳輸波特率,奇偶校驗。控制器能直接或經由調製解調器組網。控制器通信使用主 - 從技術,即僅一設備(主設備)能初始化傳輸(查詢)。其它設備(從設備)根據主設備查詢提供的數據作出相應反應。典型的主設備:主機和可編程儀表。典型的從設備:可編程控制器。主設備可單獨和從設備通信,也能以廣播方式和所有從設備通信。如果單獨通信,從設備返回一消息作為回應,如果是以廣播方式查詢的,則不作任何回應。的Modbus協議建立了主設備查詢的格式:設備(或廣播)地址,功能代碼,所有要發送的數據,一錯誤檢測域。從設備回應消息也由的Modbus協議構成,包括確認要行動的域,任何要返回的數據,和一錯誤檢測域。如果在消息接收過程中發生一錯誤,或從設備不能執行其命令,從設備將建立一錯誤消息並把它作為回應發送出去
在其它類型網絡上轉輸
在其它網絡上控制器使用對等技術通信故任何控制都能初始和其它控制器的通信這樣在單獨的通信過程中控制器既可作為主設備也可作為從設備提供的多個內部通道可允許同時發生的傳輸進程在消息位Modbus總線協議仍提供了主-從原則儘管網絡通信方法是對等“。如果一控制器發送一消息它只是作為主設備並期望從從設備得到回應同樣當控制器接收到一消息它將建立一從設備回應格式並返回給發送的控制器
查詢 - 回應週期
(1)查詢查詢消息中的功能代碼告之被選中的從設備要執行何種功能。數據段包含了從設備要執行功能的任何附加信息。例如功能代碼 03是要求從設備讀保持寄存器並返回它們的內容。數據段必須包含要告之從設備的信息:從何寄存器開始讀及要讀的寄存器數量。錯誤檢測域為從設備提供了一種驗證消息內容是否正確的方法。(2)回應如果從設備產生一正常的回應,在回應消息中的功能代碼是在查詢消息中的功能代碼的回應。數據段包括了從設備收集的數據:象寄存器值或狀態。如果有錯誤發生,功能代碼將被修改以用於指出回應消息是錯誤的,同時數據段包含了描述此錯誤信息的代碼。錯誤檢測域允許主設備確認消息內容是否可用
控制器能設置為兩種傳輸模式(ASCII碼RTU)的中的任何一種在標準的Modbus總線網絡通信用戶選擇想要的模式包括串口通信參數波特率校驗方式等在配置每個控制器的時候在一個的Modbus網絡上的所有設備都必須選擇相同的傳輸模式和串口參數所選的ASCII碼RTU的方式僅適用於標準的Modbus總線網絡它定義了在這些網絡上連續傳輸的消息段的每一位以及決定怎樣將信息打包成消息域和如何解碼在其它網絡上地圖Modbus Plus的的Modbus消息被轉成與串行傳輸無關的幀
1,ASCII碼模式當控制器設為在Modbus總線網絡上以ASCII碼(美國標準信息交換代碼模式通信在消息中的每個字節都作為兩個8位的ASCII字符發送這種方式的主要優點是字符發送的時間間隔可達到1秒而不產生錯誤
代碼系統十六進制,ASCII碼字符0 ...9,甲.. F·消息中的每個 ASCII的字符都是一個十六進制字符組成每個字節的位1個起始位· 7個數據位最小的有效位先發送1個奇偶校驗位無校驗則無
CRC域是兩個字節,包含一16位的二進制值。它由傳輸設備計算後加入到消息中。接收設備重新計算收到消息的CRC校驗,並與接收到的CRC域中的值比較,如果兩值不同,則有誤。CRC是先調入一值是全“1”的16位寄存器,然後調用一過程將消息中連續的8位字節各當前寄存器中的值進行處理。僅每個字符中的8位數據對CRC有效,起始位和停止位以及奇偶校驗位均無效。CRC產生過程中,每個 8位字符都單獨和寄存器內容相或(OR),結果向最低有效位方向移動,最高有效位以0填充。的LSB被提取出來檢測,如果LSB的為 1,寄存器單獨和預置的值或一下,如果LSB的為 0,則不進行。整個過程要重複 8次。在最後一位(第8位)完成後,下一個 8位字節又單獨和寄存器的當前值相或。最終寄存器中的值,是消息中所有的字節都執行之後的CRC校驗值。
CRC添加到消息中時低字節先加入然後高字節CRC簡單函數如下

unsigned short CRC16(puchMsg, usDataLen)

   unsigned char *puchMsg ; /* 要進行CRC校驗的消息 */
   unsigned short usDataLen ; /* 消息中字節數 */
   {
   unsigned char uchCRCHi = 0xFF ; /* 高CRC字節初始化 */
   unsigned char uchCRCLo = 0xFF ; /* 低CRC 字節初始化 */
   unsigned uIndex ; /* CRC循環中的索引 */
   while (usDataLen--) /* 傳輸消息缓冲區 */
   {
   uIndex = uchCRCHi ^ *puchMsgg++ ; /* 计算CRC */
   uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ;
   uchCRCLo = auchCRCLo[uIndex] ;
   }
   return (uchCRCHi << 8 uchCRCLo) ;
   }
   /* CRC 高位字節值表 */
   static unsigned char auchCRCHi[] = {
   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
   0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
   0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
   0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
   0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
   0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
   0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
   0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
   0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
   0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
   0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
   0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
   0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
   0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
   0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
   } ;
   /* CRC低位字節值表*/
   static char auchCRCLo[] = {
   0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
   0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
   0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
   0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
   0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
   0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
   0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
   0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
   0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
   0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
   0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
   0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
   0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
   0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
   0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
   0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
   0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
   0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
   0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
   0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
   0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
   0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
   0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
   0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
   0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
   0x43, 0x83, 0x41, 0x81, 0x80, 0x40
   } ;
   ModBus網络是一个工業通信系统,由带智能终端的可编程序控制器和計算機通過公用線路或局部專用線路連接而成。其系统结構既包括硬體、亦包括软體。它可應用於各種數據採集和過程監控。下表1是ModBus的功能碼定義。
   表1 ModBus功能碼
   01 READ COIL STATUS
   02 READ INPUT STATUS
   03 READ HOLDING REGISTER
   04 READ INPUT REGISTER
   05 WRITE SINGLE COIL
   06 WRITE SINGLE REGISTER
   15 WRITE MULTIPLE COIL
   16 WRITE MULTIPLE REGISTER

Modbus網絡只是一個主機,所有通信都由他發出。網絡可支持247個之多的遠程從屬控制器,但實際所支持的從機數要由所用通信設備決定。採用這個系統,各PC機可以和中心主機交換信息而不影響各電腦執行本身的控制任務。

 

(1)Modbus總線的傳輸方式在Modbus總線系統中有2種傳輸模式可選擇。這 2種傳輸模式與從機 PC機通信的能力是同等的。

選擇時應視所用的Modbus主機而定,每個 Modbus總線系統只能使用一種模式,不允許 2種模式混用。

一種模式是ASCII碼(美國信息交換碼),另一種模式是RTU的(遠程終端設備)這兩種模式的定義見表 3表3的ASCII和RTU的傳輸模式的特性的ASCII可打印字符便於故障檢測,而且對於用高級語言(如Fortan)編程的主計算機及主PC機很適宜。

RTU的則適用於機器語言編程的計算機和個人電腦主機。

用RTU的模式傳輸的數據是8位二進制字符。

如欲轉換為 ASCII的模式,則每個 RTU的字符首先應分為高位和低位兩部分,這兩部分各含4位,然後轉換成十六進制等量值。

用以構成報文的ASCII碼字符都是十六進制字符。ASCII碼模式使用的字符雖是RTU的模式的兩倍,但ASCII碼數據的譯瑪和處理更為容易一些,此外,用RTU的模式時報文字符必須以連續數據流的形式傳送,用ASCII碼模式,字符之間可產生長達 1秒的間隔,以適應速度較快的機器。

 

(2)的Modbus的數據校驗方式的CRC - 16(循環冗餘錯誤校驗)CRC - 16的錯誤校驗程序如下:報文(此處只涉及數據位,不指起始位,停止位和任選的奇偶校驗位)被看作是一個連續的二進制,其最高有效位(最高位)首選發送。

報文先與 X↑16相乘(左移16位),然後看X↑16 + x的↑↑15 + x的2 +1除中,x 16 + x的↑↑↑15 + x的2 +1可以表示為二進制數 11000000000000101。

整數商位忽略不記,16位餘數加入該報文(最高位先發送),成為 2個 CRC校驗校驗字節。餘數中的1全部初始化,以免所有的零成為一條報文被接收。經上述處理而含有CRC校驗字節的報文,若無錯誤,到接收設備後再被同一多項式(十↑ 16 + x的↑↑15 + x的2 +1)除,會得到一個零餘數(接收設備核驗這個華潤字節,並將其與被傳送的CRC校驗比較)。

全部運算以2為模(無進位)。習慣於成串發送數據的設備會首選送出字符的最右位(LSB的最低有效位)。

而在生成CRC校驗情況下,發送首位應是被除數的最高有效位的最高位。

由於在運算中不用進位,為便於操作起見,計算的CRC時設的MSB在最右位。生成多項式的位序也必須反過來,以保持一致。多項式的最高位略去不記,因其只對商有影響而不影響餘數。

生成的CRC - 16校驗字節的步驟如下:①裝如一個 16位寄存器,所有數位均為 1。②該 16位寄存器的高位字節與開始 8位字節進行“異或”運算。運算結果放入這個 16位寄存器。③把這個 16寄存器向右移一位。

④若向右(標記位)移出的數位是1,則生成多項式 1010000000000001和這個寄存器進行“異或”運算;若向右移出的數位是0,則返回③。

⑤重複③和④,直至移出8位。

⑥另外8位與該十六位寄存器進行“異或”運算。

⑦重複③〜⑥,直至該報文所有字節均與 16位寄存器進行“異或”運算,並移位8次。

⑧這個 16位寄存器的內容即2字節的CRC錯誤校驗,被加到報文的最高有效位。另外,在某些非的Modbus通信協議中也經常使用的CRC16作為校驗手段,而且產生了一些的CRC16的變種,他們是使用的CRC16多項式 X↑16 + x的↑↑15 + x的2 +1,單首次裝入的16位寄存器為 0000;使用的CRC16的反序X↑16 + x的↑↑14 + x的1 +1,首次裝入寄存器值為 0000或FFFFH的。法改會(縱向冗餘錯誤校驗)法改會錯誤校驗用於 ASCII碼模式。這個錯誤校驗是一個 8位二進制數,可作為 2個 ASCII的十六進制字節傳送。把十六進制字符轉換成二進制,加上無循環進位的二進制字符和二進制補碼結果生成法改會錯誤校驗。

這個法改會在接收設備進行核驗,並與被傳送的法改會進行比較,冒號(:),回車符號(CR)和換行字符(LF)和置入的其他任何非ASCII的十六進制字符在運算時忽略不計。