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

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

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

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

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

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

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