我是Modbus-RTU協議,我有兩個兄弟
我是Modbus RTU協議,我來自Modbus大家庭。早在1971年,Modicon公司首次推出了Modbus協議,我和我大哥——Modbus ASCII 都誕生在這裡。後來施耐德電氣(Schneider Electric)收購了Modicon公司,並在1997年推出了Modbus TCP協議,這就是我的三弟。2004年,中國國家標準委員會正式把Modbus作為了國家標準,開啟了我們為中國工業通信做貢獻的新篇章。
我們三兄弟在工業通信中應用廣泛,我和我大哥(Modbus ASCII)主要活躍在串列通信領域,而我三弟(Modbus TCP)則擅長乙太網通信。你可以看看下面這張圖:
在串列鏈路中,我們(Modbus)使用一種簡單的主從協議(客戶機/伺服器協議)進行通信。客戶機作為主站,向伺服器發送請求;伺服器(從站)接到請求後,對請求進行分析並作出應答。我和小夥伴的通信幀被稱為應用數據單元(Application Data Unit,ADU),它包括通信地址段、功能代碼段、數據段和校驗段,如下圖:
其中,功能代碼段和數據段組合稱為協議數據單元(Protocol Data Unit,PDU)。功能代碼段佔用一個位元組,取值範圍為1~255,其中128~255為保留值,用於異常消息應答報文。1~127為功能代碼編號,其中65~72和100~110為用戶自定義編碼,具體請看下面這張圖片:
通用功能編碼(Public function code)是已經公布的功能代碼,有確定的功能,用戶不能修改。比如:0x01表示讀取線圈,0x02表示讀取離散量的輸入等等。下圖是一些常用的功能代碼的描述:
早期在RS485串列通信中規定ADU的最大長度為256個位元組,其中:通信地址佔用1個位元組,校驗段佔用2個位元組,所以協議數據單元(PDU)的最大長度為256-1-2=253 位元組。而我三弟(Modbus TCP)因為要增加一個7個位元組的MBAP(MODBUS Application Protocol)的報文頭,所以他的ADU的長度=253+7=260 位元組。
下面這張圖是我(Modbus -RTU)的通信數據單元(ADU)的結構:
我可以使用不同功能代碼來完成不同的功能,比如下面表格左邊的請求(request)指令使用0x05功能來使線圈173變為ON狀態:
該PDU指令中,第一個位元組表示功能號「05」表示對單獨線圈進行寫操作(write single coil);第二個位元組表示線圈地址的高位元組位,第三個位元組表示線圈地址的低位元組位(線圈的編號從0開始)。本常式中,第173號線圈的序號為172(0x00AC);第四個位元組表示輸出值得高位元組位,第五個位元組表示輸出值的低位元組位。對於單獨線圈操作,0xFF00表示置位(ON),0x0000表示複位(OFF);不同的功能代碼,其參數的位元組的定義不同,使用時要參考下手冊哦。
由於我(Modbus RTU)的報文格式沒有定義幀的起始與結束字元,因此對於幀識別有時間上的要求:幀與幀之間的時間間隔要大於3.5個字元(位元組)的時間;而幀內部的字元之間的間隔不能大於1.5個字元的時間,如下圖:
我大哥(Modbus - ASCII)的幀的起始和停止有明確的字元定義;而我三弟(Modbus TCP)在傳輸過程中要增加一個報文頭—MBAP,以後有時間我再給你們介紹;
好了,有空去官網方正智芯(founder chip)看看吧,可以下載PDF版本。
推薦閱讀:
※PLC快速入門3分鐘搞定
※如何在西門子博途(TIA Potal)環境下組態通信連接(UDP)?
※PLC基礎篇之常量與變數
※什麼情況下Profibus網路要使用RS485中繼器(Repeater)?
TAG:可编程逻辑控制器PLC | 通信工程 | 自动控制 |