1 應(yīng)用背景
本系統(tǒng)用來監(jiān)控杭州、溫州、寧波等城市的微波站,主控站在城市機(jī)房,受控站則在內(nèi)地或海邊的山頂,環(huán)境比較惡劣。共有6個主控站,每個主控站帶1個受控站,采用總線型的主控機(jī)和受控機(jī)兩級結(jié)構(gòu),通過微波信道(圖1粗黑線所示)在主控機(jī)之間傳送數(shù)據(jù),但在某一時刻只有一臺主控機(jī)Polling所屬受控機(jī),被Polling受控機(jī)作應(yīng)答處理,其余主控機(jī)處于偵聽(Listen)狀態(tài)。主控機(jī)Polling完所屬受控機(jī)后,轉(zhuǎn)移Polling權(quán),由下一臺主控機(jī)接管Polling權(quán)……如此循環(huán)。監(jiān)控內(nèi)容主要包括柴油發(fā)電機(jī)、開關(guān)電源、市電、蓄電池等的工作狀態(tài)、環(huán)境溫度、濕度、防盜等。系統(tǒng)結(jié)構(gòu)如圖1所示。
2 硬件設(shè)計(jì)
油機(jī)監(jiān)控器是與大型柴油發(fā)電機(jī)配套的專用監(jiān)控器,采用雙機(jī)熱備;1600與2800也是與原設(shè)備配套的專用監(jiān)控器,其中1600主要用來監(jiān)控市電和環(huán)境參數(shù),2800對兩組蓄電池(各12節(jié))進(jìn)行監(jiān)控;報警開關(guān)量(遙信)輸入模塊采用7041,控制開關(guān)量(遙控)采用7067模塊,受控機(jī)的主控模塊則選用7188。7188有四個串行口,其中兩個RS232(僅含Rx、Tx、GND信號線),一個RS485,一個9針全信號RS232口(通過內(nèi)部跳線,可將此口改變?yōu)镽S485口)。7188模塊接口多,抗惡劣環(huán)境,同時,提供豐富的內(nèi)部函數(shù),有利于快速開發(fā)出性能可靠的下位機(jī)監(jiān)控系統(tǒng)程序。受控站系統(tǒng)的硬件結(jié)構(gòu)見圖2所示。由于各監(jiān)控模塊均使用RS485接口,所以需要兩個RS232/RS485轉(zhuǎn)換接口。COM1口為全信號RS232,連接專用Modem,從而進(jìn)入微波信道進(jìn)行數(shù)據(jù)的傳輸。主控站通過RS232接口與專用Modem連接,進(jìn)入微波信道。
3 軟件實(shí)現(xiàn)
3.1 主控機(jī)部分
主控機(jī)部分采用組態(tài)王5.1來實(shí)現(xiàn)。該系統(tǒng)可運(yùn)行于Win98/NT平臺,真正32位程序,實(shí)時多任務(wù)、多線程,采樣速度快,可靠性高,同時,支持分布式歷史數(shù)據(jù)庫及撥號網(wǎng)絡(luò),具有豐富的ActiveX控件,廣泛應(yīng)用于鋼鐵、化工、環(huán)保、國防、航空航天等重大領(lǐng)域。
利用組態(tài)王開發(fā)實(shí)時計(jì)算機(jī)監(jiān)控系統(tǒng)方便快捷。首先,定義設(shè)備,加載通訊驅(qū)動程序。如對于本系統(tǒng),是利用RS232接口來與受控機(jī)通訊的,其定義設(shè)備時選取的順序如下:智能模塊—I-7000系列—I-7188—Modbus RTU Extention。然后,再規(guī)定RS232的工作參數(shù)。其次,定義數(shù)據(jù)詞典,規(guī)定變量名、數(shù)據(jù)類型、寄存器之間的關(guān)系。數(shù)據(jù)詞典中的變量可以根據(jù)原始數(shù)值自動計(jì)算所對應(yīng)的線性目標(biāo)值。最后,根據(jù)組態(tài)王提供的圖元控件設(shè)計(jì)用戶界面,無論是字符串還是圖元,均可建立“動畫鏈接”,從而,將數(shù)據(jù)變量和數(shù)據(jù)的顯示結(jié)合起來。數(shù)據(jù)顯示包括兩種形式,一是數(shù)據(jù)的文本格式的顯示,二是數(shù)據(jù)的動畫表示,如對于報警量,正常顯示綠燈,報警顯示紅燈等。如此三步,主控機(jī)軟件開發(fā)基本完工。
3.2 受控機(jī)部分
3.2.1 受控機(jī)主程序設(shè)計(jì)
7188提供了豐富而方便的庫函數(shù),其中包括關(guān)鍵的看門狗、相關(guān)的數(shù)據(jù)發(fā)送和接收函數(shù)、時鐘中斷函數(shù)等等,同時,還提供了豐富的例程,因而,使得受控機(jī)軟件邏輯簡捷,開發(fā)極其迅速可靠,與其它廠家的模塊也能極其友好地連接。7188的一個串口控制兩臺智能設(shè)備,這是通過地址來區(qū)分的。對于泓格產(chǎn)品的7000系列模塊,其工作參數(shù)及模塊地址是可調(diào)的,可在系統(tǒng)組裝之前對其進(jìn)行設(shè)置。而其它智能模塊的工作參數(shù)和地址則是由廠家設(shè)定的,不可更改。
由于7188內(nèi)嵌基本的DOS環(huán)境,因而,采用TC2.0來編寫受控機(jī)程序。主程序首先初始化系統(tǒng),包括對各串口的初始化及系統(tǒng)運(yùn)行參數(shù)的初始化,并安裝用戶時鐘中斷。由于該用戶中斷固定為1ms,因而,在中斷程序中應(yīng)避免接收和發(fā)送數(shù)據(jù),因?yàn)楸O(jiān)控系統(tǒng)中的波特率一般不超過9600(太高可能導(dǎo)致數(shù)據(jù)傳輸?shù)牟豢煽?,而對于9600的波特率,傳輸1個字節(jié)的數(shù)據(jù)大約需要1ms,一般情況下,所選擇的波特率低于9600,而且,一次發(fā)送和接收的數(shù)據(jù)一般超過2個字節(jié),因而,會引起DOS重入,從而使系統(tǒng)不可靠。所以,時鐘中斷程序應(yīng)盡量簡捷,主要完成各個工作節(jié)拍之間的協(xié)調(diào)問題,主要工作在主程序中進(jìn)行,即輪詢時間或節(jié)拍到,即向智能模塊或設(shè)備發(fā)送查詢命令,而當(dāng)有數(shù)據(jù)返回時,再去讀取數(shù)據(jù)并處理。其軟件系統(tǒng)框圖如圖3所示。
3.2.2 通訊問題及解決方案
對于計(jì)算機(jī)監(jiān)控系統(tǒng),最關(guān)鍵的問題是數(shù)據(jù)通訊的可靠性。泓格產(chǎn)品的I/O設(shè)備數(shù)據(jù)傳輸平穩(wěn),能與7188可靠地連接,但其它廠家模塊的數(shù)據(jù)傳輸并不象所想象的那么連續(xù),因而,應(yīng)該根據(jù)所接收的數(shù)據(jù)的不連續(xù)性作相應(yīng)的等待,時間太短,數(shù)據(jù)將可能丟失,時間太長,則可能造成死機(jī)或?qū)⑾乱慌臄?shù)據(jù)也一塊接收進(jìn)來。數(shù)據(jù)接收程序見算法1中的ReadDataDelay子程序。經(jīng)過反復(fù)調(diào)試,對于本系統(tǒng),發(fā)現(xiàn)延時數(shù)據(jù)大于0x0140即可,小于0x0130則數(shù)據(jù)錯誤率達(dá)1/4左右,并且,主要是每次丟失1~2個字節(jié)的數(shù)據(jù)。0x0130與0x0140之間為臨界值。數(shù)據(jù)發(fā)送也用一個統(tǒng)一的子程序來完成,見算法1中的SendData子程序,數(shù)組中第一個字節(jié)用來存放收到的字節(jié)數(shù),其后為數(shù)據(jù)內(nèi)容。以下算法對嵌入式模塊的程序設(shè)計(jì)具有通用性,其基本原理可以廣泛使用。
/****************************************************/
/* ReadDataDelay:讀取串口nPort中的數(shù)據(jù),放入 */
/* bData中,nDealy為需要等待的節(jié)拍數(shù) */
/****************************************************/
void ReadDataDelay(int nPort, unsigned char *bData, int nDelay)
{
int nData=0; /*接收到的字節(jié)數(shù)*/
int iCount=0; /*等待計(jì)時*/
while(iCount < nDelay)
{
if(IsCom(nPort)==QueueIsNotEmpty) /*nPort口有數(shù)據(jù)*/
{
nData++;
bData[nData] = ReadCom(nPort); /*讀取一個字節(jié)的數(shù)據(jù)*/
iCount = 0; /*有數(shù)據(jù),計(jì)時清零*/
}
else iCount++; /*沒有數(shù)據(jù),則等待計(jì)時*/
}
/*bData數(shù)據(jù)中第一個字節(jié)地址存放收到的字節(jié)數(shù),其余為字節(jié)內(nèi)容*/
bData[0] = nData;
ClearCom(nPort); /*清除串口數(shù)據(jù)內(nèi)容,為下次數(shù)據(jù)接收作準(zhǔn)備*/
}
/*********************************************************/
/* SendData:nPort為串口號,ComData為需要發(fā)送的數(shù)據(jù) */
/*********************************************************/
void SendData(int nPort, unsigned char *ComData)
{
int nlength, i;
nlength = ComData[0];
if(2 == nPort) Set485DirToTransmit(nPort);
for(i=0; i
{
ToCom(nPort, ComData[i+1]);
if(2 == nPort) WaitTransmitOver(nPort);
}
/*Com2為485口,應(yīng)調(diào)整其數(shù)據(jù)傳輸方向*/
if(2 == nPort) Set485DirToReceive(nPort);
return;
}
4 調(diào)試及結(jié)論
泓格產(chǎn)品的7000系列組合方便,而且,7188有四個RS232/485串口,價格卻非常便宜,一塊7188主控模塊只要2000多元,且同樣抗惡劣環(huán)境,曾用電吹風(fēng)對其連續(xù)勁吹,使其表面發(fā)燙(溫度在50℃以上),卻依然可靠地工作。由于上位機(jī)提供了組態(tài)軟件,因而,上位機(jī)程序開發(fā)迅速,性能可靠;下位機(jī)提供了豐富的庫函數(shù)和例程,使得下位機(jī)軟件的邏輯簡捷,編程靈活而迅速,看門狗功能又能使其自動恢復(fù)。
作者長期從事計(jì)算機(jī)監(jiān)控方面的項(xiàng)目與研究工作,設(shè)計(jì)了“通用多功能計(jì)算機(jī)監(jiān)控系統(tǒng)測試軟件”,專門用來通過RS232或RS485測試監(jiān)控系統(tǒng)或相應(yīng)的智能設(shè)備 [1] 。該軟件既能充當(dāng)受控機(jī)用來測試主控機(jī)程序,又能充當(dāng)主控機(jī)用來測試受控機(jī)程序,并在多個監(jiān)控系統(tǒng)中得到驗(yàn)證。在測試過程中發(fā)現(xiàn),7000系列的模塊數(shù)據(jù)傳輸平穩(wěn),并且,連續(xù)測試48小時(5秒測試1次),非泓格產(chǎn)品的監(jiān)控器平均發(fā)生25次數(shù)據(jù)傳輸錯誤,而對于7000系列的模塊卻沒有一次錯誤記錄;用該測試軟件模擬受控機(jī)對主控機(jī)(組態(tài)軟件)進(jìn)行測試,也沒有錯誤記錄。目前,該系統(tǒng)已經(jīng)在實(shí)驗(yàn)室調(diào)試通過,效果良好。由于采用了泓格產(chǎn)品的組態(tài)軟件及7000系列的模塊,該系統(tǒng)開發(fā)迅速,性能可靠,因而,極有推廣價值(onspring@sina.com)。
參考文獻(xiàn)∶
[1] 馬玉春, 宋瀚濤. 串行通訊協(xié)議的研究與應(yīng)用. 計(jì)算機(jī)應(yīng)用研究, 2004.4, p228