ModBus

ModBus

Modbus是由Modicon(現為施耐德電氣公司的一個品牌)在1979年發明的,是全球第一個真正用於工業現場的匯流排協定。ModBus網路是一個工業通信系統,由帶智慧型終端的可程式序控制器和計算機通過公用線路或局部專用線路連線而成。其系統結構既包括硬體、亦包括軟體。它可套用於各種數據採集和過程監控。ModBus網路只有一個主機,所有通信都由他發出。網路可支持247個之多的遠程從屬控制器,但實際所支持的從機數要由所用通信設備決定。採用這個系統,各PC可以和中心主機交換信息而不影響各PC執行本身的控制任務。

基本信息

簡介

ModBus示意圖ModBus示意圖
為更好地普及和推動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協定作為他們之間的通訊標準。

特性

特點

ModBusModBus
(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)回應
如果從設備產生一正常的回應,在回應訊息中的功能代碼是在查詢訊息中的功能代碼的回應。數據段包括了從設備收集的數據:像暫存器值或狀態。如果有錯誤發生,功能代碼將被修改以用於指出回應訊息是錯誤的,同時數據段包含了描述此錯誤信息的代碼。錯誤檢測域允許主設備確認訊息內容是否可用。

傳輸方式

ModBusModBus
在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

ModBus示意圖ModBus示意圖
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

相關詞條

相關搜尋

熱門詞條

聯絡我們