Modbus總線有三種協議:Modbus RTU協議、Modbus ASCII協議和Modbus TCP協議,Modbus總線活躍在工業通信領域。Modbus RTU和Modbus ASCII擅長串行通信,比如基于RS485或者RS232的通信,而ModbusTCP則擅長基于以太網的通信。由于底層所使用的結構不同,Modbus的應用數據單元(Application Data Unit,ADU)有所不同。請看以下的詳細介紹。 為了進行通信,Modbus規定了一種很簡單的數據結構,被稱為“協議數據單元”(Protocol Data Unit,PDU)。協議數據單元由功能碼 數據構成,如下圖:
功能碼的長度為1個字節,它表示要執行的功能。比如常見的:01讀取線圈;02讀取離散量輸入值;03讀取保持寄存器值;05寫單個線圈等;數據部分的長度為0-252個字節,它表示要讀的地址或者要寫入的值,不同的功能碼對應的數據有所不同。比如01功能碼,其數據為4個字節,其中前兩個字節表示要讀取的線圈的地址,后兩個字節表示要讀取線圈的數量;而對于05功能碼,其數據也是4個字節,前兩個字節表示要寫入線圈的地址,后面兩字節表示要寫入的值。 協議數據單元有三種類型:請求型協議數據單元(Request PDU)、應答型協議數據單元(Response PDU)、及異常應答型協議數據單元(Exception Response PDU)。 協議數據單元是Modbus的通用數據結構,它與底層物理結構無關,Modbus RTU、Modbus ASCII和Modbus TCP都使用相同的協議數據單元。但是,Modbus在通信的時候,總要依賴物理網絡。因此要把協議數據單元映射到物理網絡上,這就形成了應用數據單元(Application Data Unit,ADU)。由于底層網絡的不同,Modbus TCP跟Modbus RTU和Modbus ASCII的應用數據單元是不同的,Modbus RTU和Modbus ASCII的ADU結構如下圖所示:
而Modbus TCP的ADU結構如下:
可以看到,Modbus TCP的應用數據單元是在協議數據單元的基礎上,添加了一個叫做“MBAP頭(MBAP Header)”的結構。MBAP是英文“ModBus APlication”的縮寫,即“應用數據單元”的意思。 MBAP頭結構由7個字節構成,如下表所示:
其中: ◆傳輸標識符:用于標識應用數據單元,即請求和應答之間的配對;客戶端對該部分進行初始化,服務器端將其拷貝到自己的ADU中; ◆協議標識符:系統間的協議標識,0=Modbus; ◆長度:接下來要發送的數據長度,即:單元標識符 PDU的總長度,以字節為單位; ◆單元標識符:用于系統間的站尋址,比如在以太網 串行鏈路的網絡中,遠程站的地址; 這就是Modbus TCP的ADU結構,即:MBAP頭 PDU,是不是很簡單呢?Modbus TCP的數據傳輸采用的是一種被稱為“客戶端/服務器”的模式,這也是上面的表格中會出現客戶端/服務器功能描述的原因。其實,很多網絡通信都采用的這種方式,比如西門子的S7通信協議。在串行鏈路中,這種方式也稱為主-從通信。 在Modbus在網絡通信中,通常需要寫明IP地址和端口號,為什么Modbus TCP的ADU中沒有相關的內容呢? 其實這是因為Modbus TCP是一個應用層的協議,通常意義上的IP地址和端口號屬于傳輸層/網絡層的協議:
在邏輯上Modbus TCP是在TCP層上的。在發送數據的時候,Modbus TCP的應用數據單元首先向下傳送給傳輸層,加上TCP協議的報文;再傳送給網絡層,加上IP協議的報文;再向下傳送給數據鏈路層及物理層;接收的過程正好相反,從物理層一層一層的去掉相應層的報文,最終到達應用層。所以在使用Modbus TCP進行數據傳輸的時候,是要配合TCP/IP協議來使用的。使用電腦編程,就要用到SOCKET技術;如果是使用PLC編程,通常廠家已經把底層通信封裝成庫指令了,可直接調用。Modbus TCP使用的端口號是502需要為Modbus TCP預留。