摘 要:在工業(yè)自動化監(jiān)控系統(tǒng)中,為了通過上位機與智能儀表的通信達到實時控制管理的目的,在詳細分析了Modbus RTU規(guī)約及其通信原理的基礎上,結合一個應用實例,給出了VB 6.0編程環(huán)境下利用MSComm通信控件和Timer定時器控件實現(xiàn)基于該規(guī)約的計算機與智能儀表之間的串口通信編程方法,建立了低成本的分布式監(jiān)控系統(tǒng)。該系統(tǒng)簡單、實用,具有良好的兼容性和可移植性,對類似的由其它類型智能儀表與上位機組成的控制系統(tǒng)的通信實現(xiàn)具有一定的參考價值,并在石化企業(yè)中得到了成功應用,有效地提高了智能化控制水平和企業(yè)的生產效率。
關鍵字:智能儀表;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è)領域得到廣泛應用,許多企業(yè)對于中小規(guī)模的設備,出于硬件軟件投資利潤率和性能價格比的考慮,常常是自行開發(fā)或參與開發(fā)本企業(yè)的監(jiān)控系統(tǒng)。分布式監(jiān)控系統(tǒng)以微機為基礎,用數(shù)據(jù)通信將微機連在一起實現(xiàn)數(shù)據(jù)共享,從而對工業(yè)過程進行集中監(jiān)視管理和分散控制[1]。
本文的實例為低壓配電監(jiān)控系統(tǒng),隨著自動化大規(guī)模生產時代的到來,生產現(xiàn)場往往同時運轉著上十臺甚至數(shù)十臺電動機,往往需要對這些電動機的運行參數(shù)進行集中監(jiān)控,以便操作人員及時發(fā)現(xiàn)故障并進行處理。現(xiàn)采用計算機+智能儀表的方案,由上位機定時對下位機采用輪巡的方式進行數(shù)據(jù)采集。上位機和下位機之間采用RS485總線進行通信,現(xiàn)場智能Modbus儀表掛在RS485總線上,上位機通過RS232/485轉換器與RS485總線相連,采用VB編程語言,通過Modbus協(xié)議用串口與智能儀表進行通信,在控制成本的情況下,組成一個小型分布式監(jiān)控系統(tǒng)。
2 監(jiān)控系統(tǒng)概述
系統(tǒng)采用主從式點對點的通訊方式,由現(xiàn)場智能儀表和1臺PC機組成,其中現(xiàn)場智能儀表采用天津東泰科技發(fā)展有限公司生產的DYZB-101A型低壓智能綜合保護器。由于本系統(tǒng)的智能電子設備通訊是通過RS485總線的,因此采用特征阻抗為120Ω的屏蔽雙絞線連接。PC機一般沒有RS485接口,但都有RS232串行接口,因此采用一個RS232/485轉換器,可將RS232串行接口直接轉換成RS485接口,再通過RS485總線與智能儀表相連。在串行通訊中,主要借助VB開發(fā)平臺下的MSComm、Timer控件來設計。其中智能儀表對所檢測的電力系統(tǒng)進行在線檢測,檢測電網的電流、電壓、視在功率、啟動次數(shù)、運行時間、頻率等狀態(tài)信息。PC機通過網絡可以實現(xiàn)對儀表的數(shù)據(jù)讀取、診斷、測試、參數(shù)更新等,輕松實現(xiàn)遙測、遙信、遙控。
[align=center]

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

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

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

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

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

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