摘要:進行基于Modbus協議和TCP/IP協議相結合的遠程網絡通信,采用了套接字和多線程技術,使得Modbus協議的信息可以在TCP/IP協議的Internet上傳輸,從而擴展了Modbus 協議的應用,并用基于以太網的控制器和制冷機組設備組成的網絡上實現了遠程網絡通信。
關鍵詞:Modbus TCP/IP;制冷機組;套接字
中圖分類號:TP393文獻標識碼:A文章編號:1009-3044(2008)30-0553-02
Based on The Mobus TCP/IP Protocol Realization
WANG Ke-peng
(Tongji University, Shanghai 201804, China)
Abstract: Based on the combination of the Modbus protocol and TCP/IP protocol, remote network communication was realized. Due to adopting technology of socket and multithread, it makes information of Modbus protocol to be transmited in Internet via TCP/IP protocol, more expanded application of Modbus protocol, and realized remote network communication in Modbus network that is made up of the controller and related chiller devices.
Key words: modbus TCP/IP; chiller; socket
1 引言
Modbus是一種通訊協議,是基于客戶機端和服務器端方式連設備,實現設備間的數據交換?;贛odbus應用協議族的工業以太網解決方案已經逐漸應用于各種現場測控領域。而工業以太網的領先者Modbus TCP/IP也正逐漸成為一種自動化控制的通信協議標準,在我們的風洞監控系統中的子系統制冷機組的監控功能就是利用Modbus TCP/IP 協議來實現了對遠程制冷機組的數據提取和數據傳輸從而達到監控目的。
2 Modbus TCP/IP協議簡介
Modbus/TCP報文服務采用客戶端/服務器的模式交換實時信息,該模式基于以下四種類型的報文:Modbus請求、Modbus確認、Modbus指示和Modbus響應。(如圖1)
請求(Request):客戶端為開始事物處理而發出的信息。
指示(Indication):服務器端接收到的請求信息。
響應(Response):由服務器端發出的響應信息。
確認(Confirmation):客戶端接收到響應信息。
3 Modbus TCP/IP協議結構
常用的Modbus報文格式由附加地址、功能代碼、數據域組成,與通常的Modbus不同,在Modbus/TCP報文不再需要CRC-16或LRC校驗域。因為TCP/IP協議和以太網的鏈路層校驗機制保證了數據包傳遞的正確性。報文的具體格式(如圖2)。
另外,報文中增加的專用的MAPH頭(Modbus Application Protocol Header),用以識別Modbus應用數據單元ADU(Application Data Unit),該頭的具體組成及含義如表1所示。
Modbus TCP功能代碼概要:功能代碼劃分:按應用深淺,可分為3個類別。
類別0,對于客戶機/服務器最小的可用子集:讀多個保持寄存器(fc.3);寫多個保持寄存器(fc.16)。
類別1,可實現基本互易操作的常用代碼:讀線圈(fc.1);讀開關量輸入(fc.2);讀輸入寄存
(fc.4);寫線圈(fc.5);寫單一寄存器(fc.6)。
類別2,用于人機界面、監控系統的例行操作和數據傳送功能:強制多個線圈(fc.15);讀通用寄存器(fc.20);寫通用寄存器(fc.21);屏蔽寫寄存器(fc.22);讀寫寄存器(fc.23)
4 結合Modbus TCP/IP在風洞監測系統的應用
涉及到Modbus TCP/IP通信的模塊流程:其中該模塊用到的Modbus的功能代碼為寫線圈(fc.5)、讀多個保持寄存器(fc.3)。
該模塊對象在風動系統中為chiller,其中封裝了寫線圈(fc.5)和讀多個保持寄存器(fc.3),在模塊對象chiller的接口分別為
ForeceSingleCoils(int _transaction, int _protocolIdentifier, int _length, byte _unitId, byte _function, int _dataAddress, int _inputData)
ReadHoldingRegister(int _transaction, int _protocolIdentifier, int _length, byte _unitId, byte _function, int _dataAddress, int _numUnit)
在服務端有兩臺制冷機組 compressor F1,compressor F2
1) 開關控制步驟:其中A1為對compressor F1的開關控制,A2為對compressor F2的開關控制
首先向server發送連接請求進行基于tcp的以太網的連接,如果連接成功,則做A1到F1的連接,起動過程如下:
由B判斷是否與Server連接成功,如果未連接成功,則轉向繼續想Server請求連接,如果連接成功,則轉向C調用chiller.ForceSingleCoils()再到D調用Assemble()返回封裝好的buffer,最后到E調用m_Socket.SendData().,其中compressor1_ID是compressor F1的unitId。
發命令:chiller.ForceSingleCoils(1, 0, 6, compressor1_ID, 5, 61, 1))->
SubSystemSocket.m_Socket.SendData(Assemble(1, 0, 6, compressor1_ID, 5, 61, 1))(其中Assemble()是根據Modbus tcp規定對數據進行封裝的過程,并返回一個數據塊buffer供套接字作參數發送到server再根據其中的unitId找到對應的compressor,并將其設置為開啟狀態,如果開啟成功,則返回原命令,如果開啟不成功,則把5+80作為functioncode的值返回。
2) 監測compressor各參數數值步驟:
當發送一個讀取數據的命令時由B判斷是否與compressor F1連接成功,如果未連接成功,則轉向繼續向compressor F1請求連接,如果連接成功,則轉向C調用chiller.ReadHoldingRegitsters再到D調用Assemble()返回封裝好的buffer,最后到E調用m_Socket.SendData().,其中compressor1_ID是compressor F1的unitId)
發命令:chiller.ReadHoldingRegisters(1, 0, 6, compressor1_ID, 3, 62, 5))->
SubSystemSocket.m_Socket.SendData(Assemble(1, 0, 6, compressor1_ID, 3, 62, 5))其中Assemble()是根據Modbus tcp規定對數據進行封裝的過程,并返回一個數據塊buffer供套接字作參數發送到server再根據其中的unitId找到對應的compressor,并讀取從_dataAddress開始的連續_numUnit個值,如果讀取成功,則返回值,如果讀取不成功,則把3+80作為functioncode的值返回。
如下為Assemble()的封裝源碼(其中的封裝順序是由Modbus文檔規定的):
注:本文中所涉及到的圖表、注解、公式等內容請以PDF格式閱讀原文