簡介
為更好地普及和推動Modbus在基於乙太網上的分散式套用,目前施耐德公司已將Modbus協定的所有權移交給IDA(InterfaceforDistributedAutomation,分散式自動化接口)組織,並成立了Modbus-IDA組織,為Modbus今後的發展奠定了基礎。在中國,Modbus已經成為國家標準GB/T19582-2008。據不完全統計:截止到2007年,Modbus的節點安裝數量已經超過了1000萬個。Modbus協定是套用於電子控制器上的一種通用語言。通過此協定,控制器相互之間、控制器經由網路(例如乙太網)和其它設備之間可以通信。它已經成為一通用工業標準。有了它,不同廠商生產的控制設備可以連成工業網路,進行集中監控。此協定定義了一個控制器能認識使用的訊息結構,而不管它們是經過何種網路進行通信的。它描述了一控制器請求訪問其它設備的過程,如何回應來自其它設備的請求,以及怎樣偵測錯誤並記錄。它制定了訊息域格局和內容的公共格式。
當在一Modbus網路上通信時,此協定決定了每個控制器須要知道它們的設備地址,識別按地址發來的訊息,決定要產生何種行動。如果需要回應,控制器將生成反饋信息並用Modbus協定發出。在其它網路上,包含了Modbus協定的訊息轉換為在此網路上使用的幀或包結構。這種轉換也擴展了根據具體的網路解決節地址、路由路徑及錯誤檢測的方法。
此協定支持傳統的RS-232、RS-422、RS-485和乙太網設備。許多工業設備,包括PLC,DCS,智慧型儀表等都在使用Modbus協定作為他們之間的通訊標準。
特性
特點
(1)標準、開放,用戶可以免費、放心地使用Modbus協定,不需要交納許可證費,也不會侵犯智慧財產權。目前,支持Modbus的廠家超過400家,支持Modbus的產品超過600種。(2)Modbus可以支持多種電氣接口,如RS-232、RS-485等,還可以在各種介質上傳送,如雙絞線、光纖、無線等。
(3)Modbus的幀格式簡單、緊湊,通俗易懂。用戶使用容易,廠商開發簡單。
網路傳輸
標準的Modbus口是使用RS-232-C兼容串列接口,它定義了連線口的針腳、電纜、信號位、傳輸波特率、奇偶校驗。控制器能直接或經由Modem組網。控制器通信使用主—從技術,即僅一設備(主設備)能初始化傳輸(查詢)。其它設備(從設備)根據主設備查詢提供的數據作出相應反應。典型的主設備:主機和可程式儀表。典型的從設備:可程式控制器。
主設備可單獨和從設備通信,也能以廣播方式和所有從設備通信。如果單獨通信,從設備返回一訊息作為回應,如果是以廣播方式查詢的,則不作任何回應。Modbus協定建立了主設備查詢的格式:設備(或廣播)地址、功能代碼、所有要傳送的數據、一錯誤檢測域。
從設備回應訊息也由Modbus協定構成,包括確認要行動的域、任何要返回的數據、和一錯誤檢測域。如果在訊息接收過程中發生一錯誤,或從設備不能執行其命令,從設備將建立一錯誤訊息並把它作為回應傳送出去。
其它類型傳輸
在其它網路上,控制器使用對等技術通信,故任何控制器都能初始化和其它控制器的通信。這樣在單獨的通信過程中,控制器既可作為主設備也可作為從設備。提供的多個內部通道可允許同時發生的傳輸進程。在訊息位,Modbus協定仍提供了主—從原則,儘管網路通信方法是“對等”。如果一控制器傳送一訊息,它只是作為主設備,並期望從從設備得到回應。同樣,當控制器接收到一訊息,它將建立一從設備回應格式並返回給傳送的控制器。
查詢回應周期
(1)查詢查詢訊息中的功能代碼告之被選中的從設備要執行何種功能。數據段包含了從設備要執行功能的任何附加信息。例如功能代碼03是要求從設備讀保持暫存器並返回它們的內容。數據段必須包含要告之從設備的信息:從何暫存器開始讀及要讀的暫存器數量。錯誤檢測域為從設備提供了一種驗證訊息內容是否正確的方法。
(2)回應
如果從設備產生一正常的回應,在回應訊息中的功能代碼是在查詢訊息中的功能代碼的回應。數據段包括了從設備收集的數據:像暫存器值或狀態。如果有錯誤發生,功能代碼將被修改以用於指出回應訊息是錯誤的,同時數據段包含了描述此錯誤信息的代碼。錯誤檢測域允許主設備確認訊息內容是否可用。
傳輸方式
在ModBus系統中有2種傳輸模式可選擇。這2種傳輸模式與從機PC通信的能力是同等的。選擇時應視所用ModBus主機而定,每個ModBus系統只能使用一種模式,不允許2種模式混用。一種模式是ASCII(美國信息交換碼),另一種模式是RTU(遠程終端設備)。用戶選擇想要的模式,包括串口通信參數(波特率、校驗方式等),在配置每個控制器的時候,在一個Modbus網路上的所有設備都必須選擇相同的傳輸模式和串口參數。所選的ASCII或RTU方式僅適用於標準的Modbus網路,它定義了在這些網路上連續傳輸的訊息段的每一位,以及決定怎樣將信息打包成訊息域和如何解碼。在其它網路上(像MAP和ModbusPlus)Modbus訊息被轉成與串列傳輸無關的幀。
傳輸模式特性
ASCII可列印字元便於故障檢測,而且對於用高級語言(如Fortran)編程的主計算機及主PC很適宜。RTU則適用於機器語言編程的計算機和PC主機。用RTU模式傳輸的數據是8位二進制字元。如欲轉換為ASCII模式,則每個RTU字元首先應分為高位和低位兩部分,這兩部分各含4位,然後轉換成十六進制等量值。用以構成報文的ASCII字元都是十六進制字元。ASCII模式使用的字元雖是RTU模式的兩倍,但ASCII數據的解碼和處理更為容易一些,此外,用RTU模式時報文字元必須以連續數據流的形式傳送,用ASCII模式,字元之間可產生長達1s的間隔,以適應速度較慢的機器。
控制器能設定為兩種傳輸模式(ASCII或RTU)中的任何一種在標準的Modbus網路通信。
ASCII模式
當控制器設為在Modbus網路上以ASCII(美國標準信息交換代碼)模式通信,在訊息中的每個8Bit位元組都作為一個ASCII碼(兩個十六進制字元)傳送。這種方式的主要優點是字元傳送的時間間隔可達到1秒而不產生錯誤。代碼系統
·十六進制,ASCII字元0...9,A...F
·訊息中的每個ASCII字元都是一個十六進制字元組成
每個位元組的位
·1個起始位
·7個數據位,最小的有效位先傳送
·1個奇偶校驗位,無校驗則無
1個停止位(有校驗時),2個Bit(無校驗時)
錯誤檢測域
·LRC(縱向冗長檢測)
RTU模式
當控制器設為在Modbus網路上以RTU(遠程終端單元)模式通信,在訊息中的每個8Bit位元組包含兩個4Bit的十六進制字元。這種方式的主要優點是:在同樣的波特率下,可比ASCII方式傳送更多的數據。代碼系統
8位二進制,十六進制數0...9,A...F
訊息中的每個8位域都是一或兩個十六進制字元組成
每個位元組的位
1個起始位
8個數據位,最小的有效位先傳送
1個奇偶校驗位,無校驗則無
1個停止位(有校驗時),2個Bit(無校驗時)
數據校驗方式
CRC
CRC域是兩個位元組,包含一16位的二進制值。它由傳輸設備計算後加入到訊息中。接收設備重新計算收到訊息的CRC,並與接收到的CRC域中的值比較,如果兩值不同,則有誤。CRC是先調入一值是全“1”的16位暫存器,然後調用一過程將訊息中連續的8位位元組各當前暫存器中的值進行處理。僅每個字元中的8Bit數據對CRC有效,起始位和停止位以及奇偶校驗位均無效。
CRC產生過程中,每個8位字元都單獨和暫存器內容相異或(XOR),結果向最低有效位方向移動,最高有效位以0填充。LSB被提取出來檢測,如果LSB為1,暫存器單獨和預置的值或一下,如果LSB為0,則不進行。整個過程要重複8次。在最後一位(第8位)完成後,下一個8位位元組又單獨和暫存器的當前值相或。最終暫存器中的值,是訊息中所有的位元組都執行之後的CRC值。
CRC添加到訊息中時,低位元組先加入,然後高位元組。
CRC-16錯誤校驗程式如下:報文(此處只涉及數據位,不指起始位、停止位和任選的奇偶校驗位)被看作是一個連續的二進制,其最高有效位(MSB)首選傳送。報文先與X↑16相乘(左移16位),然後看X↑16+X↑15+X↑2+1除,X↑16+X↑15+X↑2+1可以表示為二進制數11000,0000,0000,0101。整數商位忽略不記,16位餘數加入該報文(MSB先傳送),成為2個CRC校驗位元組。餘數中的1全部初始化,以免所有的零成為一條報文被接收。經上述處理而含有CRC位元組的報文,若無錯誤,到接收設備後再被同一多項式(X↑16+X↑15+X↑2+1)除,會得到一個零餘數(接收設備核驗這個CRC位元組,並將其與被傳送的CRC比較)。全部運算以2為模(無進位)。
習慣於成串傳送數據的設備會首選送出字元的最右位(LSB-最低有效位)。而在生成CRC情況下,傳送首位應是被除數的最高有效位MSB。由於在運算中不用進位,為便於操作起見,計算CRC時設MSB在最右位。生成多項式的位序也必須反過來,以保持一致。多項式的MSB略去不記,因其只對商有影響而不影響餘數。
生成CRC-16校驗位元組的步驟如下:
①裝如一個16位暫存器,所有數位均為1。
②該16位暫存器的高位位元組與開始8位位元組進行“異或”運算。運算結果放入這個16位暫存器。
③把這個16暫存器向右移一位。
④若向右(標記位)移出的數位是1,則生成多項式10,1000,000,0000,001和這個暫存器進行“異或”運算;若向右移出的數位是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。
CRC簡單函式如下:
unsignedshortCRC16(puchMsg,usDataLen)
unsignedchar*puchMsg;/*要進行CRC校驗的訊息*/
unsignedshortusDataLen;/*訊息中位元組數*/
{
unsignedcharuchCRCHi=0xFF;/*高CRC位元組初始化*/
unsignedcharuchCRCLo=0xFF;/*低CRC位元組初始化*/
unsigneduIndex;/*CRC循環中的索引*/
while(usDataLen--)/*傳輸訊息緩衝區*/
{
uIndex=uchCRCHi^*puchMsgg++;/*計算CRC*/
uchCRCHi=uchCRCLo^auchCRCHi[uIndex};
uchCRCLo=auchCRCLo][uIndex];
}
return(uchCRCHi<<8|uchCRCLo);
}
/*CRC高位位元組值表*/
staticunsignedcharauchCRCHi[]={
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低位位元組值表*/
staticcharauchCRCLo[]={
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
};
LRC
LRC錯誤校驗用於ASCII模式。這個錯誤校驗是一個8位二進制數,可作為2個ASCII十六進制位元組傳送。把十六進制字元轉換成二進制,加上無循環進位的二進制字元和二進制補碼結果生成LRC錯誤校驗(參見圖)。這個LRC在接收設備進行核驗,並與被傳送的LRC進行比較,冒號(:)、回車符號(CR)、換行字元(LF)和置入的其他任何非ASCII十六進制字元在運算時忽略不計。功能碼定義
表1ModBus功能碼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 |