摘 要:在工業(yè)自動化監(jiān)控系統(tǒng)中,為了通過上位機(jī)與智能儀表的通信達(dá)到實(shí)時控制管理的目的,在詳細(xì)分析了Modbus RTU規(guī)約及其通信原理的基礎(chǔ)上,結(jié)合一個應(yīng)用實(shí)例,給出了VB 6.0編程環(huán)境下利用MSComm通信控件和Timer定時器控件實(shí)現(xiàn)基于該規(guī)約的計算機(jī)與智能儀表之間的串口通信編程方法,建立了低成本的分布式監(jiān)控系統(tǒng)。該系統(tǒng)簡單、實(shí)用,具有良好的兼容性和可移植性,對類似的由其它類型智能儀表與上位機(jī)組成的控制系統(tǒng)的通信實(shí)現(xiàn)具有一定的參考價值,并在石化企業(yè)中得到了成功應(yīng)用,有效地提高了智能化控制水平和企業(yè)的生產(chǎn)效率。
關(guān)鍵字:智能儀表;Modbus協(xié)議;VB 6.0;分布式監(jiān)控系統(tǒng);串口通信
[b][align=center]Design and realization of Modbus Communication in the Distributed
Monitoring System Based on VB
SHI Fei, CHEN Xing[/align][/b]
Abstract: In the field of industry automation control system, in order to realize real-time control and management by communication of computer and intelligent instrument, on the basis of the analysis of Modbus-RTU protocol and the communication principle, this paper gives a method which uses the component MSComm and Timer provided by VB. This method establishes a low cost distributed monitoring system by integrating an application. This system is easy to use and good for compatibility and portability, also have some value on the communication realization in the systems which are control by intelligent instrument and host computer. Moreover, it has been used in petrochemical enterprise successfully and improved the level of intelligent control and the production efficiency of the enterprise effectively.
Key Words: intelligent instrument; Modbus protocol; VB 6.0; distributed monitoring system; serial communication
1 引言
分布式監(jiān)控系統(tǒng)(DMS)已在工業(yè)領(lǐng)域得到廣泛應(yīng)用,許多企業(yè)對于中小規(guī)模的設(shè)備,出于硬件軟件投資利潤率和性能價格比的考慮,常常是自行開發(fā)或參與開發(fā)本企業(yè)的監(jiān)控系統(tǒng)。分布式監(jiān)控系統(tǒng)以微機(jī)為基礎(chǔ),用數(shù)據(jù)通信將微機(jī)連在一起實(shí)現(xiàn)數(shù)據(jù)共享,從而對工業(yè)過程進(jìn)行集中監(jiān)視管理和分散控制[1]。
本文的實(shí)例為低壓配電監(jiān)控系統(tǒng),隨著自動化大規(guī)模生產(chǎn)時代的到來,生產(chǎn)現(xiàn)場往往同時運(yùn)轉(zhuǎn)著上十臺甚至數(shù)十臺電動機(jī),往往需要對這些電動機(jī)的運(yùn)行參數(shù)進(jìn)行集中監(jiān)控,以便操作人員及時發(fā)現(xiàn)故障并進(jìn)行處理。現(xiàn)采用計算機(jī)+智能儀表的方案,由上位機(jī)定時對下位機(jī)采用輪巡的方式進(jìn)行數(shù)據(jù)采集。上位機(jī)和下位機(jī)之間采用RS485總線進(jìn)行通信,現(xiàn)場智能Modbus儀表掛在RS485總線上,上位機(jī)通過RS232/485轉(zhuǎn)換器與RS485總線相連,采用VB編程語言,通過Modbus協(xié)議用串口與智能儀表進(jìn)行通信,在控制成本的情況下,組成一個小型分布式監(jiān)控系統(tǒng)。
2 監(jiān)控系統(tǒng)概述
系統(tǒng)采用主從式點(diǎn)對點(diǎn)的通訊方式,由現(xiàn)場智能儀表和1臺PC機(jī)組成,其中現(xiàn)場智能儀表采用天津東泰科技發(fā)展有限公司生產(chǎn)的DYZB-101A型低壓智能綜合保護(hù)器。由于本系統(tǒng)的智能電子設(shè)備通訊是通過RS485總線的,因此采用特征阻抗為120Ω的屏蔽雙絞線連接。PC機(jī)一般沒有RS485接口,但都有RS232串行接口,因此采用一個RS232/485轉(zhuǎn)換器,可將RS232串行接口直接轉(zhuǎn)換成RS485接口,再通過RS485總線與智能儀表相連。在串行通訊中,主要借助VB開發(fā)平臺下的MSComm、Timer控件來設(shè)計。其中智能儀表對所檢測的電力系統(tǒng)進(jìn)行在線檢測,檢測電網(wǎng)的電流、電壓、視在功率、啟動次數(shù)、運(yùn)行時間、頻率等狀態(tài)信息。PC機(jī)通過網(wǎng)絡(luò)可以實(shí)現(xiàn)對儀表的數(shù)據(jù)讀取、診斷、測試、參數(shù)更新等,輕松實(shí)現(xiàn)遙測、遙信、遙控。
[align=center]

圖1 監(jiān)控系統(tǒng)結(jié)構(gòu)圖
Fig.1 The structure of monitoring system[/align]
3 Modbus通訊協(xié)議簡介
Modbus協(xié)議是MODICON公司開發(fā)推行的通信協(xié)議,已經(jīng)成為一種廣泛應(yīng)用于工業(yè)自動化控制器上的標(biāo)準(zhǔn)通信協(xié)議。通過該協(xié)議,不同廠商生產(chǎn)的控制設(shè)備可以進(jìn)行工業(yè)網(wǎng)絡(luò)互聯(lián),從而實(shí)現(xiàn)集散控制[2]。
Modbus協(xié)議采用主從工作方式,允許一臺主機(jī)和多臺從機(jī)通信,每臺從機(jī)地址由用戶設(shè)定,地址范圍為1-255。通信采用命令/應(yīng)答方式,每一種命令幀都對應(yīng)一個應(yīng)答幀。命令幀由主機(jī)發(fā)出,所有從機(jī)都將收到報文,但只有被尋址的從機(jī)才會響應(yīng)相應(yīng)命令,返回相應(yīng)的應(yīng)答幀。圖2是一個完整的主從查詢-回應(yīng)周期。
[align=center]

圖2 主從查詢-回應(yīng)周期表
Fig.2 The periodic table of master salve query-response[/align]
3.1 Modbus協(xié)議通訊模式
Modbus通訊協(xié)議有兩種傳送方式:RTU方式和ASCII方式,兩種方式如下所示:
ASCII模式:當(dāng)控制器設(shè)為在Modbus網(wǎng)絡(luò)上以ASCII(美國標(biāo)準(zhǔn)信息交換代碼)模式通信,在消息中的每個8Bit字節(jié)都作為兩個ASCII字符發(fā)送。這種方式的主要優(yōu)點(diǎn)是字符發(fā)送的時間間隔可達(dá)到1秒而不產(chǎn)生錯誤。
RTU模式:當(dāng)控制器設(shè)為在Modbus網(wǎng)絡(luò)上以RTU(遠(yuǎn)程終端單元)模式通信,在消息中的每個8Bit字節(jié)包含兩個4Bit的十六進(jìn)制字符。這種方式的主要優(yōu)點(diǎn)是:相對于ASCII模式,RTU模式表達(dá)相同的信息需要較少的位數(shù),且在相同通訊速率下具有更大的數(shù)據(jù)流量。因此通常情況下,一般工業(yè)智能儀器儀表都是采用RTU模式的Modbus規(guī)約。本文采用的是Modbus RTU模式。
3.2 Modbus RTU消息幀格式
使用RTU模式時,消息發(fā)送至少要以3.5個字符時間的停頓間隔開始(如表1中的T1-T2-T3-T4所示)。傳輸?shù)牡谝粋€域是設(shè)備地址??梢允褂玫膫鬏斪址鞘M(jìn)制的0-9,A-F。網(wǎng)絡(luò)設(shè)備不斷偵測網(wǎng)絡(luò)總線,當(dāng)?shù)谝粋€域(地址域)接收到,每個設(shè)備都進(jìn)行解碼以判斷是否發(fā)給自己。在最后一個傳輸字符之后,一個至少3.5個字符時間的停頓標(biāo)定了消息的結(jié)束。一個新的消息可在此停頓后開始[3]。
整個消息幀必須作為一連續(xù)的流傳輸。如果在幀完成之前有超過3.5個字符時間的停頓時間,接收設(shè)備將刷新不完整的消息并假定下一字節(jié)是一個新消息的地址域。同樣地,如果一個新消息在小于3.5個字符時間內(nèi)接著前一消息開始,接收的設(shè)備將認(rèn)為它是前一消息的延續(xù)。這將導(dǎo)致一個錯誤,因為在最后的CRC 域的值不可能是正確的。一典型的RTU模式的消息結(jié)構(gòu)如表1所示。
表1 RTU模式的消息幀結(jié)構(gòu)
Tab.1 The message frame structure of RTU mode

3.3 Modbus基本規(guī)則
?。?) 所有RS485通訊回路都應(yīng)遵照主/從方式,依照這種方式,數(shù)據(jù)可以在一臺主機(jī)(如PC機(jī))和多臺從機(jī)(如DYZB-101A)之間傳遞,從機(jī)數(shù)量應(yīng)限制在32個以內(nèi)。
?。?) 主機(jī)初始化和控制在RS485通訊回路上傳遞的所有信息。
?。?) 任何一次通訊都不能從從機(jī)開始。
?。?) 在RS485回路上的所有通訊都以“信息幀”方式傳遞。
(5) 如果主機(jī)或從機(jī)接收到含有未知命令的信息幀,則不予以響應(yīng)。
主機(jī)為主動通信方式,通信開始后主機(jī)依次查詢各從機(jī)并等待從機(jī)的應(yīng)答,主機(jī)發(fā)出某一詢問碼后,必須在一段時間內(nèi)接收到對應(yīng)從機(jī)的應(yīng)答。當(dāng)通訊命令發(fā)送至儀表時,符合相應(yīng)的地址碼的設(shè)備接收通訊的命令,讀取信息,如果沒有出錯,則執(zhí)行相應(yīng)的任務(wù),然后把執(zhí)行結(jié)果返送給主機(jī)。返送的信息中包括地址碼,執(zhí)行動作的功能碼,執(zhí)行動作后的數(shù)據(jù)以及錯誤校驗碼(CRC或LRC)。如果出錯就不發(fā)送任何信息。如果主機(jī)在規(guī)定的接收時間內(nèi)沒有收到對應(yīng)從機(jī)的任何有效的應(yīng)答,則可以認(rèn)為該從機(jī)通信故障,從下一個從機(jī)繼續(xù)詢問。
4 主機(jī)通信軟件設(shè)計
DYZB-101A型低壓智能綜合保護(hù)器適用于交流400V低壓電力系統(tǒng),作為低壓電動機(jī)的保護(hù)、檢測設(shè)備。該智能儀表中的數(shù)據(jù)信息主要分為動態(tài)信息、查詢信息和控制信息。動態(tài)信息包括電流、電壓、功率等信息;查詢信息包括啟動次數(shù)、運(yùn)行時間、開關(guān)狀態(tài)、報警等信息;控制信息包括對時、啟動、設(shè)置參數(shù)等信息。上位機(jī)監(jiān)控系統(tǒng)在獲取智能儀表中的各類信息時,主要是采用輪巡的方式,由于不同的數(shù)據(jù)信息對實(shí)時性的要求不同,因此上位機(jī)可針對各類不同的數(shù)據(jù)信息進(jìn)行周期性輪巡和非周期性輪巡,其中周期性輪巡可根據(jù)實(shí)際需要設(shè)置不同的輪巡周期。本文將以對智能儀表中實(shí)時性要求較高的動態(tài)信息為例來討論上位機(jī)通訊軟件的實(shí)現(xiàn)[4]。
4.1 MSComm控件與串行通信
RS232/485轉(zhuǎn)換器將RS232信號轉(zhuǎn)換成RS485信號進(jìn)行傳輸。對于主機(jī)來講,通信軟件就是對RS232串行通信端口進(jìn)行編程。
主機(jī)通信軟件采用Windows環(huán)境下的VB 6.0進(jìn)行編程。Windows操作系統(tǒng)在底層實(shí)現(xiàn)了和串行通信有關(guān)的很多復(fù)雜的工作,它自動將所有接收到的字符放到接收緩沖區(qū)中,而所有發(fā)送的字符也都進(jìn)入發(fā)送緩沖區(qū)中。程序可讀取接收緩沖區(qū)的數(shù)據(jù),或者向發(fā)送緩沖區(qū)發(fā)送數(shù)據(jù)。VB6.0是微軟公司開發(fā)的一種可視化編程工具,具有界面友好、編程方便、簡單易行等特點(diǎn)。VB6.0與Windows系統(tǒng)有著非常完美的接口,可據(jù)以設(shè)計系統(tǒng)的內(nèi)建及外掛控件更是眾多。同時,VB6.0還提供了一個非常方便的通信控件MSComm。應(yīng)用程序嵌入MSComm控件,通過MSComm控件提供的事件驅(qū)動或查詢方式來進(jìn)行串行通信管理[5, 6]。
編寫RS485網(wǎng)絡(luò)通信程序很少用事件驅(qū)動方式,而多采用查詢方式。本程序使用的方法對常用的查詢方式進(jìn)行了簡化,不用檢測CommEvent屬性值,節(jié)省了程序運(yùn)行時間。
4.2 編程要點(diǎn)
4.2.1 實(shí)現(xiàn)校驗
主機(jī)發(fā)送查詢命令或接收從機(jī)應(yīng)答數(shù)據(jù)時,校驗碼的計算是通過調(diào)用函數(shù)fun_SerialCRC()實(shí)現(xiàn)的。函數(shù)fun_SerialCRC()放在程序模塊中。
CRC校驗的軟件實(shí)現(xiàn)有兩種方法:一種為計算法;另一種為查表法。計算法就是依據(jù)CRC校驗碼的產(chǎn)生原理來設(shè)計程序的。其優(yōu)點(diǎn)就是:模塊代碼少,修改靈活,可移植性好。其缺點(diǎn)就是:計算量大。而查表法的優(yōu)缺點(diǎn)正好與計算法相反,因為對于固定字節(jié)CRC校驗計算的多項式因子,其CRC值是固定的,因而,采用查表法可以簡化計算過程、節(jié)省應(yīng)答時間、提高通信效率。本文采用的是查表法,程序流程圖如圖3所示。
[align=center]

圖3 CRC16查表法實(shí)現(xiàn)流程圖
Fig.3 The flowchart of CRC16 table lookup[/align]
4.2.2 實(shí)現(xiàn)周期性輪巡發(fā)送
為了保證主機(jī)不斷地將查詢命令下達(dá)到各個從機(jī),程序使用一個定時器控件Timer1,將Timer控件的間隔屬性設(shè)置為100ms,在定時器的Timer事件過程中寫入主機(jī)向一臺從機(jī)發(fā)送查詢信息的子程序SendPackage()。這樣每隔100ms調(diào)用一次子程序,主機(jī)向一臺從機(jī)完成一次命令發(fā)送。如果有十臺從機(jī),這樣依次每隔100ms便查詢一臺從機(jī),1s鐘就可以實(shí)現(xiàn)對十臺從機(jī)的輪巡。
如果主機(jī)是對各個從機(jī)的同一個數(shù)據(jù)信息進(jìn)行查詢,查詢信息幀的命令內(nèi)容是完全相同的,除從機(jī)地址碼不同外,其格式基本相同。發(fā)送命令子程序流程圖如圖4所示。
[align=center]

圖4 發(fā)送命令子程序流程圖
Fig.4 The subroutine flowchart of sending command[/align]
4.2.3 實(shí)現(xiàn)50ms時限
在發(fā)送命令的過程中,程序利用Timer1控件定時,中斷后通過調(diào)用信息發(fā)送子函數(shù)實(shí)現(xiàn)主機(jī)對各個從機(jī)的輪巡查詢。在子函數(shù)中,程序利用Output屬性發(fā)送查詢命令,之后,不用檢測CommEvent屬性值,而是啟動另一個定時器控件Timer2(間隔屬性設(shè)置為10ms),直接利用Input屬性從接收緩沖區(qū)讀取字符串,每隔10ms讀取一次,循環(huán)接收從機(jī)應(yīng)答字符串,直至達(dá)到最大時限(50ms)。
該定時器事件是程序的核心,它不僅實(shí)現(xiàn)了50ms接收時限,而且在這里對接收到的響應(yīng)數(shù)據(jù)幀進(jìn)行有效性判別和應(yīng)答。該段程序流程圖如圖5所示。
[align=center]

圖5 定時器Timer2事件過程流程圖
Fig.5 The event process flowchart of Timer2[/align]
圖中,REVOK—處理mbEvent所代表的事件;mbEvent=0—正常接收并進(jìn)行數(shù)據(jù)解析;mbEvent=1—地址錯誤;mbEvent=2—功能碼錯誤;mbEvent=3—CRC16校驗錯誤;i—循環(huán)變量。
4.2.4 安全數(shù)組實(shí)現(xiàn)循環(huán)接收
主機(jī)接收從機(jī)的響應(yīng)數(shù)據(jù)時,通過啟動定時器Timer2,每隔10ms對輸入緩沖區(qū)中的數(shù)據(jù)進(jìn)行一次讀取,直至最大時限(50ms),實(shí)現(xiàn)了循環(huán)接收輸入緩沖區(qū)中的數(shù)據(jù)。根據(jù)下位機(jī)的回送的數(shù)據(jù)信息,上位機(jī)解析所接收的數(shù)據(jù),并進(jìn)行必要的處理。一般而言從下位機(jī)發(fā)送的數(shù)據(jù)都有一定的幀長度,特別是對于一些固化好的智能儀表。因此最好的方法是按照通信回送的幀長度,在上位機(jī)程序中分別開辟兩個數(shù)組。一個為安全數(shù)組,設(shè)為動態(tài)數(shù)組,用來循環(huán)接收串口緩沖區(qū)中的數(shù)據(jù);另一個作為接收數(shù)組,長度為回送數(shù)據(jù)幀長度,用來復(fù)制接收安全數(shù)組中的數(shù)據(jù)并進(jìn)行解析。這樣可以提高整個系統(tǒng)的容錯能力。具體代碼(寫在定時器事件中)如下:
Dim inputbuf(14) As Byte ’接收數(shù)組
Dim inputsafebuf() As Byte ’安全數(shù)組
Dim a As Integer
Dim index As Integer
a = 0
……
Private Sub Timer2_Timer()
Inputsafebuf = MSComm1.Input ’將輸入緩沖區(qū)中的數(shù)據(jù)放入安全數(shù)組中
For index = LBound(inputsafebuf) To UBound(inputsafebuf)
inputbuf(index + a) = inputsafebuf(index)
Next index ’將安全數(shù)組中的數(shù)據(jù)放入接收數(shù)組中
a = UBound(inputsafebuf) + a + 1 ’循環(huán)變量,實(shí)現(xiàn)循環(huán)接收
……
End Sub
代碼中的inputbuf()為接收數(shù)組,而inputsafebuf()就是另外開辟的安全數(shù)組。
4.3 窗體載入事件過程
窗體載入事件(Form_Load)在程序剛開始時被調(diào)用,負(fù)責(zé)設(shè)置通信端口參數(shù),啟動定時器Timer1。主要程序代碼如下:
Pravite Form_Load()
MSComm.CommPort = 1 ’設(shè)定需要使用的串口,當(dāng)然這里可以用輸入方式靈活設(shè)定。暫定1號端口
MSComm.Settings = “9600,n,8,1” ’設(shè)定傳輸?shù)牟ㄌ芈屎托r灧绞?
MSComm.InputLen = 0 ’一次全部讀入所需要的數(shù)據(jù)
MSComm.InputMode = comInputModeBinary ’設(shè)定為二進(jìn)制的數(shù)據(jù)流方式
……
MSComm1.Portopen = True ’打開通信串口
Timer1.Interval = 100 ’設(shè)定定時器1定時值為100ms
Timer1.Enable = True ’啟動定時器1
Timer2.Interval = 10 ’設(shè)定定時器2定時值為10ms
Timer2.Enable = False ’關(guān)閉定時器2
End Sub
4.4 定時器Timer1事件過程
此事件會在每1個屬性值的間隔內(nèi)(前已設(shè)定為100ms)被調(diào)用一次,完成主機(jī)和從機(jī)之間的周期性輪巡通信。主要程序代碼如下:
Dim j As Interger
Dim n As Interger
j = 0
Pravite Timer1_Timer()
j = j + 1
n = j
If j >= 10 Then j = 0 ’周期性輪巡
SendPackage n ’調(diào)用與n號從機(jī)通信的子程序
End Sub
5 結(jié)論
在本監(jiān)控系統(tǒng)中,RS485總線上連有10臺低壓智能綜合保護(hù)器,所選用的傳輸波特率為9600bps,保護(hù)器中的動態(tài)信息數(shù)據(jù)可以在PC機(jī)上實(shí)現(xiàn)每隔1s更新一次。對于保護(hù)器中的其他數(shù)據(jù)信息,發(fā)送與接收數(shù)據(jù)幀最大不超過60byte,因此,該通訊軟件完全能夠滿足傳輸過程中的穩(wěn)定性、可靠性和準(zhǔn)確性。但在實(shí)際通訊的過程中,可根據(jù)工業(yè)現(xiàn)場的具體情況調(diào)整傳輸波特率和輪巡周期的長度。
本文設(shè)計的通信軟件已應(yīng)用于低壓配電監(jiān)控系統(tǒng)中,實(shí)踐證明本系統(tǒng)能夠正常運(yùn)行,上位機(jī)與下位機(jī)的通信穩(wěn)定可靠,軟件使用方便,實(shí)現(xiàn)了對綜合保護(hù)器DYZB-101A的智能化控制,有效地降低了工業(yè)現(xiàn)場的故障發(fā)生率。本通信協(xié)議和通信軟件也有一定的通用性,提供了一個對于工廠、電廠、工業(yè)監(jiān)控系統(tǒng)簡單實(shí)用的通信軟件。
參考文獻(xiàn)
[1] 范逸之. Visual Basic與分布式監(jiān)控系統(tǒng)[M]. 北京:清華大學(xué)出版社,2002
[2] 馬驊,張國勛. Modbus通訊協(xié)議在液位監(jiān)測系統(tǒng)中的應(yīng)用[J]. 邢臺職業(yè)技術(shù)學(xué)院學(xué)報,2004,21(3):36-38
[3] 李喜東,劉濤,劉剛. Modbus-RTU串行通信協(xié)議在工業(yè)現(xiàn)場的應(yīng)用[J]. 自動化技術(shù)與應(yīng)用,2005,24(7):37-40
[4] DYZB-101A型低壓智能綜合保護(hù)器使用說明書. 天津東泰科技發(fā)展有限公司,2004
[5] 范逸之,陳立元. Visual Basic與RS-232串行通信控制[M]. 北京:清華大學(xué)出版社,2002:54-110
[6] 李湘江. Visual Basic串行通信技術(shù)[J]. 電氣傳動自動化,2004,20(6):9-11