摘 要:智能小區(qū)電表、水表和煤氣表數(shù)據(jù)采集和監(jiān)控的實現(xiàn),對降低管理費用、提高物業(yè)管理水平具有舉足輕重的作用。利用VB6.0 ActiveX通信控件MSComm和C-MBUS總線實現(xiàn)了單臺PC機(jī)與多個智能表的串行通信和監(jiān)控,可以集中控制分散設(shè)備、采集計量數(shù)據(jù)和自動上報。
關(guān)鍵詞:智能小區(qū);集中抄表系統(tǒng);數(shù)據(jù)采集;智能儀表
中圖分類號:TP274 文獻(xiàn)標(biāo)識碼:A 文章編號:2095-6835(2014)05-0129-03
近年,智能小區(qū)逐漸由構(gòu)想變成了現(xiàn)實,其中水、電、煤氣的數(shù)據(jù)遠(yuǎn)傳是其重要組成部分。它的實現(xiàn)對提高物業(yè)管理水平和工作效率、降低管理費用具有十分重要的意義,目前正被廣泛地推廣和運用。
本文利用C-MBUS(China Meter-Bus)總線和Vb6.0的ActiveX──Microsoft Communication控鍵,實現(xiàn)了Windows環(huán)境下1臺PC機(jī)對小區(qū)“三表”的串行通信功能,并完成對數(shù)據(jù)的采集和監(jiān)控。
C-MBUS是一種低成本的、一點對多點的通訊總線,具有通訊容量大(500點)、通訊速率高(9 600 bps)、抗干擾能力強(qiáng)、功耗成本低和設(shè)計簡單等特點。此外,C-MBUS搭建的自動抄表通信系統(tǒng)還具有自動登陸、節(jié)點中斷報警和雙向可中斷的先進(jìn)通訊功能。
1 系統(tǒng)硬件設(shè)計
C-MBUS電氣特性規(guī)定,在兩線制傳輸方式下實現(xiàn)半雙工通信,在波特率為4.8 kb/s時通訊距離可達(dá)2.4 km,通訊容量為500個結(jié)點;當(dāng)通訊距離超過2 km時,可使用隔離中繼器使設(shè)備再延長2 km,增大通訊距離,系統(tǒng)結(jié)構(gòu)框圖如圖1所示。
圖1 C-MBUS通訊系統(tǒng)框圖
圖1中,串口RS-232經(jīng)總線集中器和C-MBUS總線隔離器與末端通訊節(jié)點——智能儀表相連。總線集中器接口電路如圖2和圖3所示,其主要由C-MBUS主控芯片CMT100和MAX232電平轉(zhuǎn)換電路組成。當(dāng)通訊總線上部分通訊節(jié)點的智能儀表發(fā)生故障時,總線隔離器確保剩余總線上的通信節(jié)點仍能實現(xiàn)與上位機(jī)正常通訊。在總線上,各智能儀表被賦予唯一的地址碼,用以身份識別。
圖2 CMT100與PC機(jī)電平轉(zhuǎn)換電路
2 智能儀表的結(jié)構(gòu)與通訊功能
2.1 儀表的組成
隨著單片機(jī)技術(shù)的發(fā)展,用戶表大多采用單片機(jī)組建的儀表智能系統(tǒng)。在該系統(tǒng)中,智能儀表的核心由零功耗磁敏傳感器、低功耗MSP430系列MSP430F449單片機(jī)和C-MBUS通信芯片CMT001構(gòu)成,它們之間的完美組合不但能完成數(shù)據(jù)的采集,還可以運用一定的通信協(xié)議或遵循相同協(xié)議的設(shè)備聯(lián)網(wǎng)通信,硬件設(shè)計如圖4所示。
圖3 CMT100與總線接口電路
圖4 CMT001與單片機(jī)的接口電路
2.2 智能儀表與計算機(jī)的通信
采用半雙工的通訊方式,智能儀表為從機(jī),上位PC機(jī)為主機(jī),總線集中器為C-MBUS的主控端,并實現(xiàn)與PC機(jī)的RS232進(jìn)行數(shù)據(jù)傳輸,波特率為4 800 bps,通訊格式為3個前導(dǎo)字節(jié)(FE,F(xiàn)E,F(xiàn)E)、1位起始位(68H)、8位數(shù)據(jù)位、無奇偶校驗位、2位停止位,數(shù)據(jù)格式為十六進(jìn)制,且每個從機(jī)(智能儀表)被賦予唯一的地址,主機(jī)循環(huán)查詢,從機(jī)應(yīng)答方式。主機(jī)通過總線向智能儀表發(fā)送包含儀表地址的控制命令幀啟動一次通訊,從機(jī)接收到數(shù)據(jù)后,判斷主機(jī)呼叫地址是否和本機(jī)地址匹配:如果地址相同,則握手成功,智能儀表作出響應(yīng),并給出相應(yīng)的返回碼;否則不會作出任何響應(yīng)。
3 用VB6.0實現(xiàn)對用戶表的串行通信控制
出于安全性的考慮,Windows環(huán)境下各種硬件資源直接由操作系統(tǒng)負(fù)責(zé)管理和配置,編程人員通過應(yīng)用接口程序(API)或VC標(biāo)準(zhǔn)函數(shù)來控制各種硬件資源。在VB6.0編程環(huán)境下,利用其提供的ActiveX控件——Microsoft Communication Control,version6.0(MSComm),通過設(shè)置MSComm控件屬性,PC機(jī)很容易實現(xiàn)串口通訊和管理。
MSComm常用的重要屬性如下:①Commport. 設(shè)置串口號,類型short設(shè)置為1,2,3等,分別為COM1,COM2,COM3.②Settings. 以字符串形式設(shè)置串口通訊參數(shù),格式為MSComm.Settings=”4800,n,8,2”,字符串中的第一部分為波特率;第二部分為奇偶校驗,其中n表示無奇偶校驗,E表示奇校驗,0表示偶校驗;第三部分為數(shù)據(jù)位;第四部分為停止。③Portopen. 設(shè)置COM端口的狀態(tài),類型為Bool.④Input.從接收緩沖區(qū)返回和刪除字符,類型為Long. ⑤Output.向傳輸緩沖區(qū)寫一個字符,類型為Long。⑥InputLen. 設(shè)置從接收緩沖區(qū)取得字符數(shù),類型為Short。⑦InputMode. 設(shè)置取回的數(shù)據(jù)類型,類型為VARIANT,0或comInputModeText表示以文本形式取回,1或comInputModeBinary表示以二進(jìn)制形式取回。如果數(shù)據(jù)只用ANSI字符集,則用comInputModeText;對其他字符數(shù)據(jù),則使用comInputModeBinary.⑧Comm Event.串口事件,類型為Short.
另外,還有一些屬性比較重要,例如InBuffersize(設(shè)置輸入緩沖區(qū)的大?。?、OutBuffersize(設(shè)置輸出緩沖區(qū)的大小)、Sthreshold(設(shè)置輸出緩沖區(qū)允許的最少的字符數(shù))、Rthreshold(設(shè)置輸入緩沖區(qū)允許的最少的字符數(shù)),Windows正是利用這些屬性的設(shè)置來實現(xiàn)串行端口的中斷功能。
新建工程引用MSComm通訊控件,在窗體中添加以下控件:①1個MSComm控件,用于軟件對串口的訪問。②3個定時器控件,分別為TSend,TRev和TDelay,其中TSend用于PC機(jī)啟動對各儀表發(fā)送周期性的命令,時期定時回傳實時數(shù)據(jù);TDelay用于延時,即相鄰兩次指令發(fā)送周期,控制兩次周期指令傳送之間的時間間隔;TRev接收儀表設(shè)備回傳數(shù)據(jù)的響應(yīng)時間。③監(jiān)控軟件的核心是采用何種策略,實時、準(zhǔn)確獲取和處理現(xiàn)場儀表數(shù)據(jù)。endprint
本設(shè)計主要從以下幾個方面著手:①主機(jī)采用自動循環(huán)方式查詢從機(jī);②利用串口通信,采用半雙工確保數(shù)據(jù)的準(zhǔn)確傳送和接收;③主機(jī)呼叫從機(jī)且無應(yīng)答時,給出相應(yīng)的提示,跳過該從機(jī)并執(zhí)行其他任務(wù),避免系統(tǒng)因一個從機(jī)的故障而影響其他儀表正常通訊。
以下是通訊時的部分代碼和運行界面,實時采集界面如圖5所示。
Dim iLoop As Integer
Dim iloop1 As Integer
…
cport(1) = "COM2"
…
cmbSerial(0).Clear
vCommPointer = 0
For iloop1 = 0 To UBound(cport)
… //通訊參數(shù)的設(shè)置
cPortSpeedA(9) = "4800,n,8,2"
…
cmbSerial(0).ListIndex = 0
cmbSerial(1).ListIndex = 9
txtRevData.Text = "" //清空接受區(qū)
txtsendData.Text = "" //清空發(fā)送區(qū)
End Sub
Private Sub cmdSend_Click() //通訊開始
…
Timesend = True //Timesend控件使能
…
End Sub
Private Sub timesend_Timer()
Call senddata //調(diào)用發(fā)送程序
End Sub
Private Sub mscCom_OnComm()
…
Select Case mscCom.CommEvent //中斷響應(yīng)事件
…
Case comEvReceive
timRev.Enabled = True
…
End Select
End Sub
4 數(shù)據(jù)的接收和處理
智能儀表回傳數(shù)據(jù)時即刻在主機(jī)上引發(fā)OnComm()事件,在此事件處理函數(shù)中,首先判斷接收數(shù)據(jù)的完整性,然后將數(shù)據(jù)一次全部讀到所定義的變量中,根據(jù)流量計通訊協(xié)議重定義的內(nèi)容分別取出各字節(jié),解析出意義并在屏幕上顯示如圖5所示。同時利用Access數(shù)據(jù)庫,在VB監(jiān)控程序中加入DATA控件,將數(shù)據(jù)存入數(shù)據(jù)庫中,利用數(shù)據(jù)庫報表功能即可產(chǎn)生日、月、年報表,同時,可以通過編程將數(shù)據(jù)發(fā)送到各公司的數(shù)據(jù)庫,實現(xiàn)能源計量數(shù)據(jù)的自動上報。
5 結(jié)束語
利用VB6.0的ActiveX空間實現(xiàn)Windows環(huán)境下,單臺PC機(jī)與255臺用戶表的采集和監(jiān)控,其數(shù)據(jù)傳輸穩(wěn)定可靠,具有擴(kuò)展性好、調(diào)試維護(hù)方便等優(yōu)點,避免人工抄表工作量大、效率低等弊端。
參考文獻(xiàn)
[1]劉萌,周學(xué)明,郭安源.Visual Basic企業(yè)辦公系統(tǒng)開發(fā)實例導(dǎo)航[M].北京:人民郵電出版社,2004.
[2]范逸之,陳立元.Visual Basic與RS-232串行通信控制[M].北京:清華大學(xué)出版社,2002.
————————
作者簡介:賈琦(1989—),男,山西臨汾人,2012畢業(yè)于中北大學(xué)自動化專業(yè),工學(xué)學(xué)士。
〔編輯:李玨〕endprint
本設(shè)計主要從以下幾個方面著手:①主機(jī)采用自動循環(huán)方式查詢從機(jī);②利用串口通信,采用半雙工確保數(shù)據(jù)的準(zhǔn)確傳送和接收;③主機(jī)呼叫從機(jī)且無應(yīng)答時,給出相應(yīng)的提示,跳過該從機(jī)并執(zhí)行其他任務(wù),避免系統(tǒng)因一個從機(jī)的故障而影響其他儀表正常通訊。
以下是通訊時的部分代碼和運行界面,實時采集界面如圖5所示。
Dim iLoop As Integer
Dim iloop1 As Integer
…
cport(1) = "COM2"
…
cmbSerial(0).Clear
vCommPointer = 0
For iloop1 = 0 To UBound(cport)
… //通訊參數(shù)的設(shè)置
cPortSpeedA(9) = "4800,n,8,2"
…
cmbSerial(0).ListIndex = 0
cmbSerial(1).ListIndex = 9
txtRevData.Text = "" //清空接受區(qū)
txtsendData.Text = "" //清空發(fā)送區(qū)
End Sub
Private Sub cmdSend_Click() //通訊開始
…
Timesend = True //Timesend控件使能
…
End Sub
Private Sub timesend_Timer()
Call senddata //調(diào)用發(fā)送程序
End Sub
Private Sub mscCom_OnComm()
…
Select Case mscCom.CommEvent //中斷響應(yīng)事件
…
Case comEvReceive
timRev.Enabled = True
…
End Select
End Sub
4 數(shù)據(jù)的接收和處理
智能儀表回傳數(shù)據(jù)時即刻在主機(jī)上引發(fā)OnComm()事件,在此事件處理函數(shù)中,首先判斷接收數(shù)據(jù)的完整性,然后將數(shù)據(jù)一次全部讀到所定義的變量中,根據(jù)流量計通訊協(xié)議重定義的內(nèi)容分別取出各字節(jié),解析出意義并在屏幕上顯示如圖5所示。同時利用Access數(shù)據(jù)庫,在VB監(jiān)控程序中加入DATA控件,將數(shù)據(jù)存入數(shù)據(jù)庫中,利用數(shù)據(jù)庫報表功能即可產(chǎn)生日、月、年報表,同時,可以通過編程將數(shù)據(jù)發(fā)送到各公司的數(shù)據(jù)庫,實現(xiàn)能源計量數(shù)據(jù)的自動上報。
5 結(jié)束語
利用VB6.0的ActiveX空間實現(xiàn)Windows環(huán)境下,單臺PC機(jī)與255臺用戶表的采集和監(jiān)控,其數(shù)據(jù)傳輸穩(wěn)定可靠,具有擴(kuò)展性好、調(diào)試維護(hù)方便等優(yōu)點,避免人工抄表工作量大、效率低等弊端。
參考文獻(xiàn)
[1]劉萌,周學(xué)明,郭安源.Visual Basic企業(yè)辦公系統(tǒng)開發(fā)實例導(dǎo)航[M].北京:人民郵電出版社,2004.
[2]范逸之,陳立元.Visual Basic與RS-232串行通信控制[M].北京:清華大學(xué)出版社,2002.
————————
作者簡介:賈琦(1989—),男,山西臨汾人,2012畢業(yè)于中北大學(xué)自動化專業(yè),工學(xué)學(xué)士。
〔編輯:李玨〕endprint
本設(shè)計主要從以下幾個方面著手:①主機(jī)采用自動循環(huán)方式查詢從機(jī);②利用串口通信,采用半雙工確保數(shù)據(jù)的準(zhǔn)確傳送和接收;③主機(jī)呼叫從機(jī)且無應(yīng)答時,給出相應(yīng)的提示,跳過該從機(jī)并執(zhí)行其他任務(wù),避免系統(tǒng)因一個從機(jī)的故障而影響其他儀表正常通訊。
以下是通訊時的部分代碼和運行界面,實時采集界面如圖5所示。
Dim iLoop As Integer
Dim iloop1 As Integer
…
cport(1) = "COM2"
…
cmbSerial(0).Clear
vCommPointer = 0
For iloop1 = 0 To UBound(cport)
… //通訊參數(shù)的設(shè)置
cPortSpeedA(9) = "4800,n,8,2"
…
cmbSerial(0).ListIndex = 0
cmbSerial(1).ListIndex = 9
txtRevData.Text = "" //清空接受區(qū)
txtsendData.Text = "" //清空發(fā)送區(qū)
End Sub
Private Sub cmdSend_Click() //通訊開始
…
Timesend = True //Timesend控件使能
…
End Sub
Private Sub timesend_Timer()
Call senddata //調(diào)用發(fā)送程序
End Sub
Private Sub mscCom_OnComm()
…
Select Case mscCom.CommEvent //中斷響應(yīng)事件
…
Case comEvReceive
timRev.Enabled = True
…
End Select
End Sub
4 數(shù)據(jù)的接收和處理
智能儀表回傳數(shù)據(jù)時即刻在主機(jī)上引發(fā)OnComm()事件,在此事件處理函數(shù)中,首先判斷接收數(shù)據(jù)的完整性,然后將數(shù)據(jù)一次全部讀到所定義的變量中,根據(jù)流量計通訊協(xié)議重定義的內(nèi)容分別取出各字節(jié),解析出意義并在屏幕上顯示如圖5所示。同時利用Access數(shù)據(jù)庫,在VB監(jiān)控程序中加入DATA控件,將數(shù)據(jù)存入數(shù)據(jù)庫中,利用數(shù)據(jù)庫報表功能即可產(chǎn)生日、月、年報表,同時,可以通過編程將數(shù)據(jù)發(fā)送到各公司的數(shù)據(jù)庫,實現(xiàn)能源計量數(shù)據(jù)的自動上報。
5 結(jié)束語
利用VB6.0的ActiveX空間實現(xiàn)Windows環(huán)境下,單臺PC機(jī)與255臺用戶表的采集和監(jiān)控,其數(shù)據(jù)傳輸穩(wěn)定可靠,具有擴(kuò)展性好、調(diào)試維護(hù)方便等優(yōu)點,避免人工抄表工作量大、效率低等弊端。
參考文獻(xiàn)
[1]劉萌,周學(xué)明,郭安源.Visual Basic企業(yè)辦公系統(tǒng)開發(fā)實例導(dǎo)航[M].北京:人民郵電出版社,2004.
[2]范逸之,陳立元.Visual Basic與RS-232串行通信控制[M].北京:清華大學(xué)出版社,2002.
————————
作者簡介:賈琦(1989—),男,山西臨汾人,2012畢業(yè)于中北大學(xué)自動化專業(yè),工學(xué)學(xué)士。
〔編輯:李玨〕endprint