你好,我是Modbus TCP協議(yì)
2020-10-16新聞
大(dà)家好,我是Modbus-TCP協議(yì)。
我來(lái)自Modbus大(dà)家庭,我們家有三個(gè)兄弟(dì):大(dà)哥(gē)(Modbus-RTU協議(yì))、二哥(gē)(Modbus-ASCII協議(yì))和(hé)我,我們都活躍在工業通(tōng)信領域。我大(dà)哥(gē)和(hé)二哥(gē)擅長(cháng)串行通(tōng)信,比如基于RS485或者RS232的(de)通(tōng)信,而我則擅長(cháng)基于以太網的(de)通(tōng)信。由于底層所使用(yòng)的(de)結構不同,我們的(de)應用(yòng)數據單元(Application Data Unit,ADU)有所不同。你可(kě)能并不清楚什(shén)麽是ADU,我來(lái)詳細介紹下(xià)吧。
爲了(le)進行通(tōng)信,我們家規定了(le)一種很簡單的(de)數據結構,被稱爲"協議(yì)數據單元"(Protocol Data Unit,PDU)。
協議(yì)數據單元由功能碼+數據構成,如下(xià)面這(zhè)張圖:
功能碼的(de)長(cháng)度爲1個(gè)字節,它表示要執行的(de)功能。比如常見的(de):01讀取線圈;02讀取離散量輸入值;03讀取保持寄存器值;05寫單個(gè)線圈等;
數據部分(fēn)的(de)長(cháng)度爲0~252個(gè)字節,它表示要讀的(de)地址或者要寫入的(de)值,不同的(de)功能碼對(duì)應的(de)數據有所不同。比如01功能碼,其數據爲4個(gè)字節,其中前兩個(gè)字節表示要讀取的(de)線圈的(de)地址,後兩個(gè)字節表示要讀取線圈的(de)數量;而對(duì)于05功能碼,其數據也(yě)是4個(gè)字節,前兩個(gè)字節表示要寫入線圈的(de)地址,後面兩字節表示要寫入的(de)值。
協議(yì)數據單元有三種類型:請求型協議(yì)數據單元(Request PDU)、應答(dá)型協議(yì)數據單元(Response PDU)、及異常應答(dá)型協議(yì)數據單元(Exception Response PDU),更多(duō)關于協議(yì)數據單元的(de)内容,你可(kě)以去我家官網(http://modbus.org)下(xià)載通(tōng)信規範好好閱讀下(xià),或者去北(běi)島李工的(de)網站(https://www.founderchip.com)下(xià)載。
協議(yì)數據單元是我們家族的(de)通(tōng)用(yòng)數據結構,它與底層物(wù)理(lǐ)結構無關,我們三兄弟(dì)都使用(yòng)相同的(de)協議(yì)數據單元。但是,我們在通(tōng)信的(de)時(shí)候,總要依賴物(wù)理(lǐ)網絡。因此要把協議(yì)數據單元映射到物(wù)理(lǐ)網絡上,這(zhè)就形成了(le)應用(yòng)數據單元(Application Data Unit,ADU)。由于底層網絡的(de)不同,我跟兩個(gè)哥(gē)哥(gē)的(de)應用(yòng)數據單元是不同的(de),他(tā)們的(de)ADU結構如下(xià)圖所示:
而我的(de)ADU結構如下(xià):
可(kě)以看到,我的(de)應用(yòng)數據單元是在協議(yì)數據單元的(de)基礎上,添加了(le)一個(gè)叫做(zuò)"MBAP頭(MBAP Header)"的(de)結構。MBAP是英文"ModBus APlication"的(de)縮寫,即"應用(yòng)數據單元"的(de)意思。
MBAP頭結構由7個(gè)字節構成,如下(xià)表所示:
其中:
傳輸标識符:用(yòng)于标識應用(yòng)數據單元,即請求和(hé)應答(dá)之間的(de)配對(duì);客戶端對(duì)該部分(fēn)進行初始化(huà),服務器端将其拷貝到自己的(de)ADU中;
協議(yì)标識符:系統間的(de)協議(yì)标識,0=Modbus;
長(cháng)度:接下(xià)來(lái)要發送的(de)數據長(cháng)度,即:單元标識符+PDU的(de)總長(cháng)度,以字節爲單位;
單元标識符:用(yòng)于系統間的(de)站尋址,比如在以太網+串行鏈路的(de)網絡中,遠(yuǎn)程站的(de)地址;
這(zhè)就是我的(de)ADU結構,即:MBAP頭+PDU,是不是很簡單呢(ne)?我的(de)數據傳輸采用(yòng)的(de)是一種被稱爲"客戶端/服務器"的(de)模式,這(zhè)也(yě)是上面的(de)表格中會出現客戶端/服務器功能描述的(de)原因。其實,很多(duō)網絡通(tōng)信都采用(yòng)的(de)這(zhè)種方式,比如大(dà)名鼎鼎的(de)西門子的(de)S7通(tōng)信協議(yì)。在串行鏈路中,這(zhè)種方式也(yě)稱爲主-從通(tōng)信。
說到這(zhè)裏,你可(kě)能會有一個(gè)疑惑。因爲我們在網絡通(tōng)信中,通(tōng)常需要寫明(míng)IP地址和(hé)端口号,爲什(shén)麽我的(de)ADU中沒有相關的(de)内容呢(ne)?
哈哈,其實這(zhè)是因爲我是一個(gè)應用(yòng)層的(de)協議(yì),而你說的(de)IP地址和(hé)端口号屬于傳輸層/網絡層的(de)協議(yì)。還(hái)沒明(míng)白,好吧,看看這(zhè)張圖:
你看,在邏輯上我是在TCP層上的(de)。在發送數據的(de)時(shí)候,我的(de)應用(yòng)數據單元首先向下(xià)傳送給傳輸層,加上TCP協議(yì)的(de)報文;再傳送給網絡層,加上IP協議(yì)的(de)報文;再向下(xià)傳送給數據鏈路層及物(wù)理(lǐ)層;接收的(de)過程正好相反,從物(wù)理(lǐ)層一層一層的(de)去掉相應層的(de)報文,最終到達應用(yòng)層。所以在使用(yòng)我進行數據傳輸的(de)時(shí)候,是要配合TCP/IP協議(yì)來(lái)使用(yòng)的(de)。通(tōng)常如果你使用(yòng)電腦(nǎo)編程,就要用(yòng)到SOCKET技術;如果是使用(yòng)PLC編程,通(tōng)常廠家已經把底層通(tōng)信封裝成庫指令了(le),你隻要直接調用(yòng)就好了(le)。比如西門子S7-200 SMART/1200/1500等PLC都有現成的(de)Modbus-TCP指令庫。