摘 要: 本文介紹了污水處理系統(tǒng)中上位機(jī)組態(tài)王軟件和單片機(jī)組成的下位機(jī)控制系統(tǒng)的通訊問題,利用VB通過DDE方式實(shí)現(xiàn)了系統(tǒng)的通信。
關(guān)鍵詞: 組態(tài)王 VB 單片機(jī) 通信 DDE
1、引言
近年來,單片機(jī)在眾多領(lǐng)域中得到廣泛應(yīng)用。許多中小型企業(yè)考慮到投資利潤(rùn)和性能價(jià)格比,常常自行開發(fā)一些小型的單片機(jī)分布式系統(tǒng)作為下位機(jī)數(shù)據(jù)采集與監(jiān)控系統(tǒng),由普通PC機(jī)(或工控機(jī))做上位機(jī),單片機(jī)作為下位機(jī),通過單片機(jī)和PC機(jī)通信,實(shí)現(xiàn)命令、數(shù)據(jù)的雙向傳送,從而實(shí)現(xiàn)對(duì)系統(tǒng)的有效監(jiān)控。
最近,我們開發(fā)了一個(gè)污水處理自動(dòng)控制系統(tǒng),上位機(jī)采用PC機(jī),系統(tǒng)監(jiān)控采用組態(tài)王軟件;下位機(jī)采用單片機(jī),負(fù)責(zé)采集現(xiàn)場(chǎng)數(shù)據(jù)及發(fā)出控制命令。在生產(chǎn)車間,系統(tǒng)將各種采集數(shù)據(jù)存儲(chǔ)在單片機(jī)中,并定期將單片機(jī)的數(shù)據(jù)采集和存儲(chǔ)部分取出,并傳送到裝有組態(tài)王軟件的上位機(jī)。技術(shù)人員通過查看數(shù)據(jù)、曲線、報(bào)表,并對(duì)這些數(shù)據(jù)進(jìn)行詳細(xì)分析,從而設(shè)置運(yùn)行參數(shù)、發(fā)出控制命令,最終實(shí)現(xiàn)對(duì)整個(gè)系統(tǒng)的控制。
2、系統(tǒng)構(gòu)成與特性
該系統(tǒng)中,上位PC機(jī)與單片機(jī)1:N鏈接通信,帶有RS—485接口通信板的單片機(jī)直接掛在RS—485總線上,上位機(jī)通過RS—232C /RS—485轉(zhuǎn)換器與總線相連,這樣即構(gòu)成一個(gè)獨(dú)立的小型分布式監(jiān)控系統(tǒng),其它系統(tǒng)設(shè)備以類似方式與上位機(jī)鏈接。我們利用組態(tài)王軟件包十分方便地構(gòu)成了整個(gè)系統(tǒng)的監(jiān)控畫面,以動(dòng)畫方式顯示控制設(shè)備的狀態(tài)、報(bào)警、實(shí)時(shí)趨勢(shì)曲線。
組態(tài)王能通過串行口與單片機(jī)通訊,訪問單片機(jī)的相關(guān)寄存器,以獲得單片機(jī)所控制設(shè)備的狀態(tài)或修改寄存器的值。也可以組成網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交換,但需要客戶機(jī)與服務(wù)器同時(shí)運(yùn)行組態(tài)王軟件。
2.1 組態(tài)王的DDE特性
組態(tài)王軟件包由TouchMak和TouchViev兩大部分組成。TouchMak為畫面制作系統(tǒng),所有界面設(shè)計(jì),變量和動(dòng)畫連接的定義等均在TouchMak完成。TouchView則用于顯示動(dòng)畫圖形,負(fù)責(zé)數(shù)據(jù)庫(kù)與服務(wù)程序數(shù)據(jù)交換,并把其變化用動(dòng)畫表示出來。
為了建立DDE連接,需要在TouchView的數(shù)據(jù)詞典里建立一個(gè)DDE變量,并登記三個(gè)標(biāo)識(shí)名。組態(tài)王運(yùn)行系統(tǒng)的程序名是“view”,主題規(guī)定為“tagname”,項(xiàng)目是在定義DDE變量時(shí)定義的項(xiàng)目名稱。
2.2 VB的DDE特性
在VB可視化編程工具中,DDE連接是通過設(shè)置控件的屬性和方法來實(shí)現(xiàn)的,對(duì)于作為“顧客”的文本框、標(biāo)簽或圖片框,要設(shè)置Linktopic、linkitem、linkmode三個(gè)屬性,比如:
Control.linktopic=server應(yīng)用程序名|主題名
Control.linkitem=項(xiàng)目名
Control.linkmode=num
其中control是文本框、標(biāo)簽或圖片框控件名稱,num可以是0、1、2、3中的一個(gè)分別代表關(guān)閉DDE、熱連接、冷連接、通告連接。
組態(tài)王與VB的DDE連接是在TOUCHVIEW啟動(dòng)時(shí)自動(dòng)完成的。
2.3 組態(tài)王與單片機(jī)通訊的數(shù)據(jù)流向
用VB編制的服務(wù)程序作為中間傳遞組態(tài)王與單片機(jī)之間的通訊數(shù)據(jù),組態(tài)王中的控制命令按鈕生效時(shí),需將控制命令(如電機(jī)啟動(dòng)、停止等)下行傳到單片機(jī)以實(shí)現(xiàn)遠(yuǎn)程控制。此時(shí),組態(tài)王作為服務(wù)器向VB服務(wù)程序提供數(shù)據(jù),需要在數(shù)據(jù)詞典里定義一個(gè)DDE變量和一個(gè)供VB服務(wù)程序引用的項(xiàng)目名。
[align=center]
圖1 系統(tǒng)數(shù)據(jù)采集與流動(dòng)圖[/align]
2.4 VB服務(wù)程序與MCS51的多機(jī)通訊
在VB通訊中,用通訊控件Mscomm實(shí)現(xiàn)服務(wù)程序與單片機(jī)的多機(jī)通訊。
在現(xiàn)場(chǎng),為提高抗干擾和帶負(fù)載能力以及增加通訊距離,采用RS-485總線的通訊方式,在微機(jī)端,用RS-232/RS-485轉(zhuǎn)換器。
由于各單片機(jī)共享串行總線,為避免競(jìng)爭(zhēng),采用主從方式,微機(jī)服務(wù)程序主叫,單片機(jī)中斷方式響應(yīng)。主機(jī)首先發(fā)送地址幀,各單片機(jī)串行中斷后,將接受的地址與自己的編碼地址比較,不一致則不與理睬,相同則回送本機(jī)編號(hào),主機(jī)接受到正確的回送編號(hào)后,發(fā)送相關(guān)命令,單片機(jī)根據(jù)命令作出相應(yīng)的處理。
在現(xiàn)場(chǎng)調(diào)試過程中,總結(jié)出如下兩點(diǎn):
1. 由于現(xiàn)場(chǎng)對(duì)通訊的干擾,若通訊失敗,系統(tǒng)采用重新發(fā)送,并統(tǒng)計(jì)次數(shù),若失敗次數(shù)超過指定次數(shù),表明通訊失敗。
2. 由于通訊服務(wù)程序?yàn)楹笈_(tái)執(zhí)行,主機(jī)在等待分機(jī)回答時(shí),須將CPU控制權(quán)交出,以免影響組態(tài)王正常運(yùn)行。
3、 通訊軟件設(shè)計(jì)
在污水處理系統(tǒng)通訊設(shè)計(jì)中,用組態(tài)王軟件包構(gòu)成的監(jiān)控畫面中,有各外輸泵電機(jī)的啟/??刂疲瑝毫?、流量、溫度、液位、頻率等數(shù)據(jù)顯示,利用VB編制的服務(wù)程序vbservice.exe通過串行通訊從單片機(jī)得到壓力等顯示數(shù)據(jù),通過DDE交換上傳給監(jiān)控畫picl,在畫面上進(jìn)行動(dòng)態(tài)顯示,電機(jī)啟/停等控制命令由監(jiān)控畫面通過DDE數(shù)據(jù)交換給服務(wù)程序,再下傳給單片機(jī)以控制單片機(jī)的動(dòng)作。具體介紹如下:
3.1 監(jiān)控畫面picl的污水壓力變量設(shè)置:
進(jìn)入組態(tài)王TouchMak,在picl監(jiān)控畫面的數(shù)據(jù)字典中定義變量:pressurel
pressurel表示1號(hào)通道的壓力,定義為DDE模擬。其余各項(xiàng)設(shè)置為:
項(xiàng)目名:VB_pressure1_View
節(jié)點(diǎn)類型:驅(qū)動(dòng)程序
節(jié)點(diǎn)名:node
服務(wù)程序名:vbservice1
話題名:Forml
數(shù)據(jù)交換形式:標(biāo)準(zhǔn)的windows項(xiàng)目交換
在picl監(jiān)控畫面上需顯示pressurel值的地方輸入文本符號(hào)“%%%%”、設(shè)置pressurel的動(dòng)畫連接方式為“模擬值輸出”,就可以顯示1號(hào)通道的水壓力。
3.2 VB服務(wù)程序中的DDE設(shè)置
由于污水壓力是picl監(jiān)控畫面作為客戶向服務(wù)程序請(qǐng)求數(shù)據(jù)交換,因此作為服務(wù)器的服務(wù)程序的設(shè)置如下:
Sub Form_Load()
Linktopic=“forml”
Linkmode=1
End Sub
3.3 服務(wù)程序從各單片機(jī)接受數(shù)據(jù)
VB的MSCOMM控件初始化程序 摘要如下:
Mscomm1.Commport=1 ’ 選擇COM1
Mscomm1.Settings=“9600,N,7,2” ’ 設(shè)置通信參數(shù)
Mscomm1.Inputlen=0 ’ 讀入接收緩沖區(qū)全部字符
Mscomm1.OutbufferSize=256 ’ 設(shè)置發(fā)送緩沖區(qū)大小
Mscomm1.InbufferSize=256 ’ 設(shè)置接收緩沖區(qū)大小
Mscomm1.PortOpen=True ’打開COM1
‘接收數(shù)據(jù)主程序
Private sub Mscomm1_oncomm
Select case NUMBER
Case 1
In_buffer$=接收數(shù)據(jù)(NUMBER)
Call mission2
Case 2
In_buffer$=接收數(shù)據(jù)(NUMBER)
Call mission3
Case 3
In_buffer$=接收數(shù)據(jù)(NUMBER)
…
Call任務(wù)n
Receive Data=Inbuffer
Mscomm1.Receive=False
End Select
…
End Sub
此外, vbservice1.exe在初始化時(shí),設(shè)置Rthreshold屬性為1,接受緩沖區(qū)受到數(shù)據(jù)時(shí)觸發(fā)Oncomm事件以便接受數(shù)據(jù),然后對(duì)接受到的數(shù)據(jù)進(jìn)行分析和處理。
在分析數(shù)據(jù)通訊的準(zhǔn)確性時(shí),我們發(fā)現(xiàn),由于外界干擾或電壓波動(dòng)等原因,PC機(jī)和單片機(jī)之間的通訊可能會(huì)出現(xiàn)錯(cuò)誤,如接收緩沖區(qū)溢出、網(wǎng)絡(luò)端口超速等。這些都可能引起運(yùn)行錯(cuò)誤。為此,在程序中添加錯(cuò)誤處理子程序。通過通訊控件的OnComm事件可以捕捉和處理錯(cuò)誤,具體在通訊過程中所發(fā)生的通訊錯(cuò)誤信息是CommEvent屬性返回的。當(dāng)CommEvent屬性值發(fā)生改變時(shí),表明有通訊錯(cuò)誤,就會(huì)產(chǎn)生OnComm事件。同時(shí),可以利用自動(dòng)引發(fā)OnComm事件的特點(diǎn)在接收過程中加入狀態(tài)顯示碼。這樣可以監(jiān)視通訊線路狀態(tài),得到單片機(jī)和主機(jī)及單片機(jī)和單片機(jī)之間的通訊進(jìn)程。
4、結(jié)束語(yǔ)
本文在項(xiàng)目開發(fā)過程中形成,系統(tǒng)投入運(yùn)行后,效果良好。基于組態(tài)王與單片機(jī)的通訊系統(tǒng),具有較高的使用價(jià)值,值得在工業(yè)控制中推廣。