胡文翔 蔡 政 郭偉瑋 吳銀鋒
(北京航空航天大學(xué)儀器科學(xué)與光電工程學(xué)院,北京 100191)
Modbus協(xié)議是Modicon公司研發(fā)的一種完全開放且免費(fèi)的通信協(xié)議,它支持多種電氣接口,且?guī)袷胶唵尉o湊,目前已經(jīng)在工業(yè)領(lǐng)域得到了廣泛應(yīng)用。通過Modbus,不同廠商生產(chǎn)的設(shè)備可連成網(wǎng)絡(luò)進(jìn)行集中監(jiān)控[1-4]。Modbus定義了常用公共功能碼,同時(shí)為協(xié)議擴(kuò)展預(yù)留了地址空間。Gianluca Cena等人擴(kuò)展了Modbus地址域,使Modbus由支持255個(gè)從節(jié)點(diǎn)增加到65 535個(gè)。聶文惠等人提出了aModbus,在數(shù)據(jù)域增加物理地址信息,并應(yīng)用于分布式控制。趙學(xué)軍擴(kuò)展了Modbus支持字節(jié)操作,并將其應(yīng)用于RS-485總線測控模塊[5-7]。
本文在分析Modbus標(biāo)準(zhǔn)協(xié)議及總結(jié)前人對Modbus擴(kuò)展的基礎(chǔ)上,發(fā)現(xiàn)Modbus仍存在以下兩點(diǎn)不足:①通信安全性低,操作權(quán)限沒有區(qū)分;②當(dāng)訪問離散地址寄存器時(shí)需進(jìn)行多次通信,通信效率較低。針對以上兩點(diǎn)不足,分別對協(xié)議進(jìn)行了“身份認(rèn)證”與“讀離散寄存器”功能擴(kuò)展,并將擴(kuò)展協(xié)議成功應(yīng)用于基于RS-485的某太陽能發(fā)電控制網(wǎng)絡(luò)。
Modbus通信協(xié)議定義了與基礎(chǔ)通信層無關(guān)的簡單協(xié)議數(shù)據(jù)單元(protocol data unit,PDU)和由特定總線或網(wǎng)絡(luò)引入的一些附加域的應(yīng)用數(shù)據(jù)單元(application data unit,ADU)[8-9]。Modbus 串行鏈路ADU通用幀格式由地址域、功能碼、數(shù)據(jù)域和差錯(cuò)校驗(yàn)四部分組成。其中,“地址域”為設(shè)備ID地址和數(shù)據(jù)的邏輯地址,“功能碼”區(qū)別通信功能,“數(shù)據(jù)域”存放通信的數(shù)據(jù)內(nèi)容,“差錯(cuò)校驗(yàn)”檢驗(yàn)接收到的報(bào)文的完整性。
Modbus通信協(xié)議是一種主/從協(xié)議,當(dāng)主站發(fā)出通信請求時(shí),從站根據(jù)接收到的ADU報(bào)文,對主站的請求作出判斷并響應(yīng),當(dāng)出現(xiàn)差錯(cuò)時(shí)從站響應(yīng)相應(yīng)的差錯(cuò)碼和異常碼。Modbus定義了一些常用的公共功能碼,同時(shí)也保留了0x41~0x48和0x64~0x6E范圍內(nèi)的數(shù)據(jù),供用戶定義功能碼[8-9]。
本文針對Modbus協(xié)議通信安全性差和對離散地址寄存器操作效率低這兩點(diǎn)不足,擴(kuò)展了0x41、0x42和0x43功能碼,其中0x41和0x42功能碼供“身份認(rèn)證”使用、0x43功能碼供“讀離散寄存器”使用。
Modbus通信協(xié)議的通信過程是完全開放的,主站可以對從站線圈和保持寄存器進(jìn)行任意修改。為防止Modbus從站本地?cái)?shù)據(jù)內(nèi)容遭到不當(dāng)或惡意修改,提高通信安全性,對主站用戶操作權(quán)限設(shè)定一定的限制,使不同用戶擁有不同的操作權(quán)限。協(xié)議中擴(kuò)展了身份認(rèn)證機(jī)制,主站需要登錄獲得相應(yīng)的權(quán)限才能對從站進(jìn)行相應(yīng)權(quán)限的操作。
身份認(rèn)證包括0x41、0x42兩個(gè)功能碼,用戶通過功能碼0x41登錄,通過功能碼0x42修改密碼。身份認(rèn)證(0x41、0x42)PDU幀格式如表1所示。
表1 身份認(rèn)證PDU幀格式Tab.1 ID authentication PDU frame format
登錄時(shí)主站向從站發(fā)送一個(gè)登錄請求幀,從站接收到登錄請求幀后,對用戶進(jìn)行身份認(rèn)證,為用戶分配相應(yīng)的權(quán)限值,并啟動(dòng)一個(gè)計(jì)時(shí)器。在規(guī)定的時(shí)間內(nèi),用戶擁有從站分配的權(quán)限級別,可以對相應(yīng)的變量進(jìn)行操作。當(dāng)計(jì)時(shí)器超時(shí),用戶具有的權(quán)限值失效,從站給用戶分配默認(rèn)的權(quán)限值。用戶重新登錄后,可以再次獲得相應(yīng)的權(quán)限。當(dāng)?shù)蜋?quán)限用戶進(jìn)行高權(quán)限操作時(shí),從站響應(yīng)一個(gè)權(quán)限不足的報(bào)文,提示主站用戶操作權(quán)限不足。
Modbus標(biāo)準(zhǔn)通信協(xié)議比較適合對地址連續(xù)的寄存器進(jìn)行處理。當(dāng)寄存器地址不連續(xù)時(shí),需要通過多次通信分別進(jìn)行處理,效率較低。為提高通信效率,本文擴(kuò)展了“讀離散寄存器”功能碼。該功能碼從一個(gè)從站設(shè)備中強(qiáng)制連續(xù)地讀多個(gè)寄存器,即使所請求的寄存器地址段在該從站設(shè)備中不連續(xù)。
2.2.1 PDU 幀格式
讀離散寄存器(0x43)PDU幀格式如表2所示。響應(yīng)PDU包括了一個(gè)參數(shù)報(bào)告表和讀到的寄存器的值。參數(shù)報(bào)告表標(biāo)志了所請求的寄存器地址是否存在于從站設(shè)備。若從站設(shè)備存在請求的寄存器,則參數(shù)報(bào)告表中相應(yīng)的位為1,否則為0。參數(shù)報(bào)告表采用大端編碼,高字節(jié)在前、低字節(jié)在后,最低位對應(yīng)第一個(gè)寄存器。從站設(shè)備將不存在的寄存器剔除后返回實(shí)際讀到的寄存器的值。Modbus RTU 幀最大長度為 256 B[10-11],因此,從站響應(yīng)讀離散寄存器ADU字節(jié)數(shù)=地址(1 B)+功能碼(1 B)+參數(shù)報(bào)告表(15 B)+寄存器數(shù)據(jù)(118×2 B)+CRC(2 B)=255 B。該功能碼最多可連續(xù)讀118個(gè)地址的寄存器。
表2 讀離散寄存器PDU幀格式Tab.2 Read discrete registers PDU frame format
2.2.2 通信效率分析
以讀118個(gè)地址的寄存器操作為例,對比分析Modbus定義的公共功能碼“讀保持寄存器(0x03)”與“讀離散寄存器(0x43)”。設(shè)該118個(gè)地址在從站設(shè)備中存在N個(gè)寄存器,由M個(gè)離散地址段組成。
當(dāng)使用讀保持寄存器(0x03)操作時(shí),通信分別需要M次主站請求與M次從站應(yīng)答,通信共需字節(jié)數(shù)=M次×8 B(請求ADU)+N×2 B(所有寄存器)+M次×5 B(響應(yīng)ADU除去寄存器)=(13×M+2×N)B。
當(dāng)使用讀離散寄存器(0x43)時(shí),通信分別需要1次主站請求與1次從站應(yīng)答,通信共需字節(jié)數(shù)=8 B(請求ADU)+20 B(ADU響應(yīng)除去寄存器)+N×2(所有寄存器)=(2×N+28)B。兩種通信方式所需通信字節(jié)個(gè)數(shù)差值為(13×M-38)B。
當(dāng)讀118個(gè)地址寄存器時(shí),讀保持寄存器(0x03)與讀離散寄存器(0x43)通信對比如表3所示。
表3 讀保持寄存器與讀離散寄存器通信對比Tab.3 Comparison of communication for read holding and discrete register
當(dāng)使用讀保持寄存器(0x03)時(shí),離散次數(shù)決定主從通信次數(shù);而當(dāng)使用讀離散寄存器(0x43)時(shí),僅需1次主從通信。當(dāng)118個(gè)地址完全連續(xù)時(shí)(即離散次數(shù)為0時(shí)),讀保持寄存器(0x03)比讀離散寄存器(0x43)通信少15 B;當(dāng)離散次數(shù)為1時(shí),雖然讀保持寄存器(0x03)比讀離散寄存器(0x43)通信少2 B,但需2次主從通信,因此對于實(shí)際通信效率,讀離散寄存器(0x43)較高;當(dāng)離散次數(shù)大于1,地址越離散時(shí),讀保持寄存器(0x03)所需主從通信次數(shù)越多,且所需通信字節(jié)數(shù)越多。因此,讀離散寄存器(0x43)效率更高。
Modbus PDU中0~65 535個(gè)尋址地址的分配至關(guān)重要。通常為保證通信效率,在分配地址時(shí)應(yīng)盡量連續(xù)。使用讀離散寄存器(0x43)功能碼,可以在地址分配上增加不連續(xù)的“空”地址情況,為后續(xù)擴(kuò)展增加的地址預(yù)留空間,同時(shí)在通信時(shí)也可以讀該“空”地址寄存器。當(dāng)升級產(chǎn)品補(bǔ)充“空”地址寄存器時(shí),“空”地址的寄存器內(nèi)容在不修改通信請求的情況下,也可以被主站讀取。另外當(dāng)存在不連續(xù)地址時(shí),使用讀離散寄存器可以極大地減少通信次數(shù)與通信的等待時(shí)間。
由以上分析可知,讀離散寄存器功能碼既提高了對離散地址寄存器讀操作的效率,同時(shí)也為工程的維護(hù)與升級提供了便利。
將Modbus應(yīng)用于RS-485總線控制網(wǎng)絡(luò),通常按照EIA/TIA485標(biāo)準(zhǔn)實(shí)現(xiàn)電氣接口,每臺(tái)設(shè)備連接到干線電纜上,形成菊花鏈?zhǔn)降耐負(fù)浣Y(jié)構(gòu)[10-11]??刂凭W(wǎng)絡(luò)監(jiān)控設(shè)備往往作為主站采集、記錄并控制各從站設(shè)備。為保證監(jiān)控?cái)?shù)據(jù)的實(shí)時(shí)性,監(jiān)控設(shè)備與各節(jié)點(diǎn)設(shè)備間需一直處于數(shù)據(jù)更新的通信狀態(tài),而控制網(wǎng)絡(luò)通信存在通信繁雜、通信阻塞、通信搶占等問題。因此,為保證通信效率與可靠性,提高通信的靈活性,將通信管理融入Modbus應(yīng)用。
將每一次通信請求封裝成一個(gè)通信節(jié)點(diǎn),根據(jù)通信先后順序建立通信鏈表,如圖1所示。
圖1 Modbus通信鏈表Fig.1 Modbus communication link
當(dāng)有搶占通信請求時(shí),搶占通信節(jié)點(diǎn)插入通信鏈表并立即通信;當(dāng)鏈表中存在搶占通信請求時(shí),新的搶占通信請求加在最后一個(gè)搶占通信請求后。為保證通信的成功率,每個(gè)通信請求可嘗試多次請求通信,通信成功或嘗試次數(shù)用完后進(jìn)行下一通信請求。遍歷完整個(gè)通信鏈表后,主站根據(jù)當(dāng)前子節(jié)點(diǎn)連接狀態(tài),重新建立通信鏈表。
在軟件實(shí)現(xiàn)上,Modbus提供了鏈表建立與修改的各函數(shù),方便應(yīng)用過程中靈活地對通信請求進(jìn)行調(diào)整。
上電時(shí),控制網(wǎng)絡(luò)監(jiān)控設(shè)備(主站)通過讀設(shè)備識(shí)別碼(0x2B),發(fā)出從地址1 ~247 的通信請求[10-11],并根據(jù)從設(shè)備響應(yīng),判斷掛載在RS-485總線上的設(shè)備并記錄;同時(shí)根據(jù)掛載的設(shè)備建立通信請求鏈表,開始遍歷通信鏈表。當(dāng)某設(shè)備某一通信請求嘗試多次后無應(yīng)答時(shí),認(rèn)為該設(shè)備脫離RS-485總線。當(dāng)遍歷完通信鏈表后,根據(jù)當(dāng)前連接的設(shè)備重新建立通信鏈表。當(dāng)有設(shè)備接入變化時(shí),也可通過手動(dòng)觸發(fā)中斷,重新判斷子節(jié)點(diǎn)設(shè)備并建立通信鏈表。主站通信過程如圖2所示。
圖2 主站通信過程Fig.2 Master station communication process
當(dāng)用戶操作監(jiān)控設(shè)備時(shí),用戶操作請求作為搶占通信請求,通過中斷添加到通信鏈表。用戶通過登錄(0x41)獲得操作權(quán)限(默認(rèn)權(quán)限為只讀),登錄成功后,可獲得修改參數(shù)的操作權(quán)限,從而對從站設(shè)備進(jìn)行操作控制。
針對Modbus標(biāo)準(zhǔn)協(xié)議在通信安全性和通信效率方面存在的不足,本文擴(kuò)展了“身份認(rèn)證”和“讀離散寄存器”功能,擴(kuò)展功能彌補(bǔ)了Modbus標(biāo)準(zhǔn)協(xié)議在安全方面的不足并提高了通信效率。將擴(kuò)展協(xié)議應(yīng)用于基于RS-485總線的某太陽能發(fā)電控制網(wǎng)絡(luò),應(yīng)用結(jié)果表明,所開發(fā)的控制網(wǎng)絡(luò)通信安全可靠、效率高,具有一定的推廣應(yīng)用價(jià)值。
[1]王佳承,費(fèi)敏銳,王海寬.基于Modbus的多現(xiàn)場總線集成測控系統(tǒng)設(shè)計(jì)[J].自動(dòng)化儀表,2009,30(6):20 -25.
[2]封亞斌.采用串口通信技術(shù)實(shí)現(xiàn)Modbus數(shù)據(jù)通信[J].自動(dòng)化儀表,2004,25(10):56 -58.
[3]華镕.從Modbus到透明就緒—施耐德電氣工業(yè)網(wǎng)絡(luò)的協(xié)議、設(shè)計(jì)、安裝和應(yīng)用[M].北京:機(jī)械工業(yè)出版社,2009:5-8.
[4]李偉.基于Modbus協(xié)議的工控節(jié)點(diǎn)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(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]聶文惠,鞠時(shí)光,王英粟,等.利用優(yōu)化的MODBUS協(xié)議實(shí)現(xiàn)分布式控制[J].微計(jì)算機(jī)信息,2010,26(4):44 -46.
[7]趙學(xué)軍.RS485總線測控模塊的MODBUS擴(kuò)展協(xié)議設(shè)計(jì)[J].自動(dòng)化與儀表,2007,22(2):37 -40.
[8]國家質(zhì)量監(jiān)督檢驗(yàn)檢疫總局.GB/T 19582.1-2008基于Modbus協(xié)議的工業(yè)自動(dòng)化網(wǎng)絡(luò)規(guī)范第1部分:Modbus應(yīng)用協(xié)議[S].北京:中國標(biāo)準(zhǔn)出版社,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]國家質(zhì)量監(jiān)督檢驗(yàn)檢疫總局.GB/T 19582.2-2008基于Modbus協(xié)議的工業(yè)自動(dòng)化網(wǎng)絡(luò)規(guī)范第2部分:Modbus協(xié)議在串行鏈路上的實(shí)現(xiàn)指南[S].北京:中國標(biāo)準(zhǔn)出版社,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.