胡文翔 蔡 政 郭偉瑋 吳銀鋒
(北京航空航天大學儀器科學與光電工程學院,北京 100191)
Modbus協議是Modicon公司研發的一種完全開放且免費的通信協議,它支持多種電氣接口,且幀格式簡單緊湊,目前已經在工業領域得到了廣泛應用。通過Modbus,不同廠商生產的設備可連成網絡進行集中監控[1-4]。Modbus定義了常用公共功能碼,同時為協議擴展預留了地址空間。Gianluca Cena等人擴展了Modbus地址域,使Modbus由支持255個從節點增加到65 535個。聶文惠等人提出了aModbus,在數據域增加物理地址信息,并應用于分布式控制。趙學軍擴展了Modbus支持字節操作,并將其應用于RS-485總線測控模塊[5-7]。
本文在分析Modbus標準協議及總結前人對Modbus擴展的基礎上,發現Modbus仍存在以下兩點不足:①通信安全性低,操作權限沒有區分;②當訪問離散地址寄存器時需進行多次通信,通信效率較低。針對以上兩點不足,分別對協議進行了“身份認證”與“讀離散寄存器”功能擴展,并將擴展協議成功應用于基于RS-485的某太陽能發電控制網絡。
Modbus通信協議定義了與基礎通信層無關的簡單協議數據單元(protocol data unit,PDU)和由特定總線或網絡引入的一些附加域的應用數據單元(application data unit,ADU)[8-9]。Modbus 串行鏈路ADU通用幀格式由地址域、功能碼、數據域和差錯校驗四部分組成。其中,“地址域”為設備ID地址和數據的邏輯地址,“功能碼”區別通信功能,“數據域”存放通信的數據內容,“差錯校驗”檢驗接收到的報文的完整性。
Modbus通信協議是一種主/從協議,當主站發出通信請求時,從站根據接收到的ADU報文,對主站的請求作出判斷并響應,當出現差錯時從站響應相應的差錯碼和異常碼。Modbus定義了一些常用的公共功能碼,同時也保留了0x41~0x48和0x64~0x6E范圍內的數據,供用戶定義功能碼[8-9]。
本文針對Modbus協議通信安全性差和對離散地址寄存器操作效率低這兩點不足,擴展了0x41、0x42和0x43功能碼,其中0x41和0x42功能碼供“身份認證”使用、0x43功能碼供“讀離散寄存器”使用。
Modbus通信協議的通信過程是完全開放的,主站可以對從站線圈和保持寄存器進行任意修改。為防止Modbus從站本地數據內容遭到不當或惡意修改,提高通信安全性,對主站用戶操作權限設定一定的限制,使不同用戶擁有不同的操作權限。協議中擴展了身份認證機制,主站需要登錄獲得相應的權限才能對從站進行相應權限的操作。
身份認證包括0x41、0x42兩個功能碼,用戶通過功能碼0x41登錄,通過功能碼0x42修改密碼。身份認證(0x41、0x42)PDU幀格式如表1所示。

表1 身份認證PDU幀格式Tab.1 ID authentication PDU frame format
登錄時主站向從站發送一個登錄請求幀,從站接收到登錄請求幀后,對用戶進行身份認證,為用戶分配相應的權限值,并啟動一個計時器。在規定的時間內,用戶擁有從站分配的權限級別,可以對相應的變量進行操作。當計時器超時,用戶具有的權限值失效,從站給用戶分配默認的權限值。用戶重新登錄后,可以再次獲得相應的權限。當低權限用戶進行高權限操作時,從站響應一個權限不足的報文,提示主站用戶操作權限不足。
Modbus標準通信協議比較適合對地址連續的寄存器進行處理。當寄存器地址不連續時,需要通過多次通信分別進行處理,效率較低。為提高通信效率,本文擴展了“讀離散寄存器”功能碼。該功能碼從一個從站設備中強制連續地讀多個寄存器,即使所請求的寄存器地址段在該從站設備中不連續。
2.2.1 PDU 幀格式
讀離散寄存器(0x43)PDU幀格式如表2所示。響應PDU包括了一個參數報告表和讀到的寄存器的值。參數報告表標志了所請求的寄存器地址是否存在于從站設備。若從站設備存在請求的寄存器,則參數報告表中相應的位為1,否則為0。參數報告表采用大端編碼,高字節在前、低字節在后,最低位對應第一個寄存器。從站設備將不存在的寄存器剔除后返回實際讀到的寄存器的值。Modbus RTU 幀最大長度為 256 B[10-11],因此,從站響應讀離散寄存器ADU字節數=地址(1 B)+功能碼(1 B)+參數報告表(15 B)+寄存器數據(118×2 B)+CRC(2 B)=255 B。該功能碼最多可連續讀118個地址的寄存器。

表2 讀離散寄存器PDU幀格式Tab.2 Read discrete registers PDU frame format
2.2.2 通信效率分析
以讀118個地址的寄存器操作為例,對比分析Modbus定義的公共功能碼“讀保持寄存器(0x03)”與“讀離散寄存器(0x43)”。設該118個地址在從站設備中存在N個寄存器,由M個離散地址段組成。
當使用讀保持寄存器(0x03)操作時,通信分別需要M次主站請求與M次從站應答,通信共需字節數=M次×8 B(請求ADU)+N×2 B(所有寄存器)+M次×5 B(響應ADU除去寄存器)=(13×M+2×N)B。
當使用讀離散寄存器(0x43)時,通信分別需要1次主站請求與1次從站應答,通信共需字節數=8 B(請求ADU)+20 B(ADU響應除去寄存器)+N×2(所有寄存器)=(2×N+28)B。兩種通信方式所需通信字節個數差值為(13×M-38)B。
當讀118個地址寄存器時,讀保持寄存器(0x03)與讀離散寄存器(0x43)通信對比如表3所示。

表3 讀保持寄存器與讀離散寄存器通信對比Tab.3 Comparison of communication for read holding and discrete register
當使用讀保持寄存器(0x03)時,離散次數決定主從通信次數;而當使用讀離散寄存器(0x43)時,僅需1次主從通信。當118個地址完全連續時(即離散次數為0時),讀保持寄存器(0x03)比讀離散寄存器(0x43)通信少15 B;當離散次數為1時,雖然讀保持寄存器(0x03)比讀離散寄存器(0x43)通信少2 B,但需2次主從通信,因此對于實際通信效率,讀離散寄存器(0x43)較高;當離散次數大于1,地址越離散時,讀保持寄存器(0x03)所需主從通信次數越多,且所需通信字節數越多。因此,讀離散寄存器(0x43)效率更高。
Modbus PDU中0~65 535個尋址地址的分配至關重要。通常為保證通信效率,在分配地址時應盡量連續。使用讀離散寄存器(0x43)功能碼,可以在地址分配上增加不連續的“空”地址情況,為后續擴展增加的地址預留空間,同時在通信時也可以讀該“空”地址寄存器。當升級產品補充“空”地址寄存器時,“空”地址的寄存器內容在不修改通信請求的情況下,也可以被主站讀取。另外當存在不連續地址時,使用讀離散寄存器可以極大地減少通信次數與通信的等待時間。
由以上分析可知,讀離散寄存器功能碼既提高了對離散地址寄存器讀操作的效率,同時也為工程的維護與升級提供了便利。
將Modbus應用于RS-485總線控制網絡,通常按照EIA/TIA485標準實現電氣接口,每臺設備連接到干線電纜上,形成菊花鏈式的拓撲結構[10-11]。控制網絡監控設備往往作為主站采集、記錄并控制各從站設備。為保證監控數據的實時性,監控設備與各節點設備間需一直處于數據更新的通信狀態,而控制網絡通信存在通信繁雜、通信阻塞、通信搶占等問題。因此,為保證通信效率與可靠性,提高通信的靈活性,將通信管理融入Modbus應用。
將每一次通信請求封裝成一個通信節點,根據通信先后順序建立通信鏈表,如圖1所示。

圖1 Modbus通信鏈表Fig.1 Modbus communication link
當有搶占通信請求時,搶占通信節點插入通信鏈表并立即通信;當鏈表中存在搶占通信請求時,新的搶占通信請求加在最后一個搶占通信請求后。為保證通信的成功率,每個通信請求可嘗試多次請求通信,通信成功或嘗試次數用完后進行下一通信請求。遍歷完整個通信鏈表后,主站根據當前子節點連接狀態,重新建立通信鏈表。
在軟件實現上,Modbus提供了鏈表建立與修改的各函數,方便應用過程中靈活地對通信請求進行調整。
上電時,控制網絡監控設備(主站)通過讀設備識別碼(0x2B),發出從地址1 ~247 的通信請求[10-11],并根據從設備響應,判斷掛載在RS-485總線上的設備并記錄;同時根據掛載的設備建立通信請求鏈表,開始遍歷通信鏈表。當某設備某一通信請求嘗試多次后無應答時,認為該設備脫離RS-485總線。當遍歷完通信鏈表后,根據當前連接的設備重新建立通信鏈表。當有設備接入變化時,也可通過手動觸發中斷,重新判斷子節點設備并建立通信鏈表。主站通信過程如圖2所示。

圖2 主站通信過程Fig.2 Master station communication process
當用戶操作監控設備時,用戶操作請求作為搶占通信請求,通過中斷添加到通信鏈表。用戶通過登錄(0x41)獲得操作權限(默認權限為只讀),登錄成功后,可獲得修改參數的操作權限,從而對從站設備進行操作控制。
針對Modbus標準協議在通信安全性和通信效率方面存在的不足,本文擴展了“身份認證”和“讀離散寄存器”功能,擴展功能彌補了Modbus標準協議在安全方面的不足并提高了通信效率。將擴展協議應用于基于RS-485總線的某太陽能發電控制網絡,應用結果表明,所開發的控制網絡通信安全可靠、效率高,具有一定的推廣應用價值。
[1]王佳承,費敏銳,王海寬.基于Modbus的多現場總線集成測控系統設計[J].自動化儀表,2009,30(6):20 -25.
[2]封亞斌.采用串口通信技術實現Modbus數據通信[J].自動化儀表,2004,25(10):56 -58.
[3]華镕.從Modbus到透明就緒—施耐德電氣工業網絡的協議、設計、安裝和應用[M].北京:機械工業出版社,2009:5-8.
[4]李偉.基于Modbus協議的工控節點設計與實現[J].計算機工程,2010,36(16):226 -231.
[5] Cena G,Cereia M,Bertolotti I C,et al.A Modbus extension for inexpensive distributed embedded systems[C]//IEEE International Workshop on Factory Communication Systems(WFCS)2010,Torino,2010:251-260.
[6]聶文惠,鞠時光,王英粟,等.利用優化的MODBUS協議實現分布式控制[J].微計算機信息,2010,26(4):44 -46.
[7]趙學軍.RS485總線測控模塊的MODBUS擴展協議設計[J].自動化與儀表,2007,22(2):37 -40.
[8]國家質量監督檢驗檢疫總局.GB/T 19582.1-2008基于Modbus協議的工業自動化網絡規范第1部分:Modbus應用協議[S].北京:中國標準出版社,2008.
[9] Modbusorg.Modbus application protocol v1.1b[EB/OL].[2012 -03 -15].http://www.modbus.org/doc/Modbus_Application_Protocol_V1_1b.pdf.
[10]國家質量監督檢驗檢疫總局.GB/T 19582.2-2008基于Modbus協議的工業自動化網絡規范第2部分:Modbus協議在串行鏈路上的實現指南[S].北京:中國標準出版社,2008.
[11]Modbus org.Modbus overserial line specification and implementation guide V1.02[EB/OL].[2012 - 03 - 15].http://www.modbus.org/docs/Modbus_over_serial_lin-e_V1_02.pdf.