通信結構
MODBUS TCP/IP 的通信系統可以包括不同類型的設備:
- 502端口是爲MODBUS通信保留的,在缺省狀態下,強制偵聽這個口。
- 連接至TCP/IP 網絡的MODBUS TCP/IP 客戶機和服務器設備
- 互連設備,例如:在TCP/IP網絡和串行鏈路子網之間互連的網橋、路由器或網關,聯接,該子網允許將MODBUS 串行鏈路客戶機和服務器終端設備連接起來。
報文幀
modbus tcp用MBAP報文頭中的單個字節單元標識符取代MODBUS串行鏈路上通常使用的MODBUS從地址域。
報文頭爲7 個字節長:
- 事務處理標識符:用於事務處理配對。在響應中,MODBUS服務器複製請求的事務處理標識符。
- 協議標識符:用於系統內的多路複用。通過值0 識別MODBUS 協議。
- 長度:長度域是下一個域的字節數,包括單元標識符和數據域。
- 單元標識符:爲了系統內路由,使用這個域。專門用於通過以太網TCP-IP網絡和MODBUS串行鏈路之間的網關對MODBUS或MODBUS+串行鏈路從站的通信。MODBUS客戶機在請求中設置這個域,在響應中服務器必須利用相同的值返回這個域。
網絡配置
SO-RCVBUF, SO-SNDBUF:
這些參數允許爲發送和接收用套接字接口設定高限位。可以通過調整這些參數來實現流量控制管理。接收緩存區的的大小即爲每個連接advertised window的最大值。爲了提高性能,必須增加套接字緩存區的大小。否則,這些值必須小於內部驅動器的資源,以便在內部驅動器的資源耗盡之前關閉TCP 窗口。
接收緩存區大小取決於TCP窗口大小、TCP最大段的大小和接收輸入幀所需的時間。由於最大段的尺寸爲300個字(一個MODBUS請求需要最大256字+MBAP報文頭),如果需要3 幀進行緩存,可將套接字緩存區大小調整爲900字。爲了滿足最大的緩存需求和預定的時間,可以增加TCP 窗口的大小。
TCP-NODELAY:
通常,小報文(稱爲:tinygrams)在局域網(LAN)上的傳輸不會產生問題,因爲多數局域網是不擁堵的,但是,這些tinygrams 在廣域網上將會造成擁堵。一個稱爲“NAGLE 算法”的簡單方案是:收集小量的數據,當前面報文的TCP 確認到達時再用單個進行發送。
爲了獲得更好的實時特性,建議:將小量的數據直接發送,而不要試圖將其收集到一個段內再發送。這就是爲什麼建議強制TCP-NODELAY 選項,這個選項禁用客戶機和服務器連接的“NAGLE算法”。
SO-REUSEADDR:
當 MODBUS 服務器關閉一個由遠端客戶啓動的TCP 連接時,在這個連接處於“時間等待”狀態(兩個MSL:最大段壽命)的過程中,該連接所用的本地口號不能被再次用來打開一個新的連接。
建議:爲每個客戶機和服務器連接,指明SO-REUSEADDR 選項,以迂迴這個限制。此選項允許爲自身分配一個口號,它作爲連接的一部分在2MSL期間內等待客戶機並偵聽套接字接口。
SO-KEEPALIVE:
TCP/IP 協議缺省狀態下,不通過空閒的TCP 連接發送數據。因此,如果在TCP 連接端這個過程沒有發送數據,在兩個TCP 模塊間就沒有交換任何數據。這就假設客戶機端應用和服務器端應用均採用計數器來探測連接的存活性,以便關閉連接。
建議:在客戶機與服務器連接兩端均採用KEEPALIVE 選項,以便查詢另一端得知對方是否故障並死機,或故障並重新啓動。
然而,我們必須牢記,採用KEEPALIVE 可能引起一個非常良好的連接,在瞬間故障時通信中斷,如果保持連接計時器計時週期太短,將佔用不必要的網絡帶寬。