摘 要: 針對邊遠地區光伏電站不易值守的問題,本文設計了一種利用VC開發Modem通信來實施遠程監控的系統。系統按分布式結構設計,可實現對多個電站的實時監控。實踐證明,該系統經濟穩定、操作方便。
關鍵詞: VC;Modem;遠程監控;單片機;串行通信;光伏電站
Abstract: For the problem of operation of Photovoltaic Plant in remote area, the paper design a system of developing modem communication by VC to realize remote control. The system is designed in distributing structure, it can monitor and control a lot of plants at real time. Practices prove that the system is economical and credible and the operation is simple.
Keyword: VC; Modem; Distant monitoring; Single-chip microcomputer; Serial communication; Photovoltaic plant
1 引言
目前,太陽能光伏發電技術已日趨成熟。是最具可持續發展的可再生能源技術之一。截止2004年,太陽能光伏發電的應用領域遍及我們生活的各個方面,如交通、通訊、公共設施(如照明)、家庭生活用電等。尤其是在邊遠地區,太陽能光伏發電更加顯示出它的優勢。但由于供電系統具有站點分散、傳輸距離遠的特點,加上偏遠地區的自然環境比較惡劣,隨著太陽能電源在這些地區的普及,系統的日常維護要耗費大量的人力和物力[1]。針對這個問題,本文基于VC和Modem設計出一種用于光伏電站的分布式遠程監控系統。
2 系統組成和工作原理
對于大多數分布式控制系統,下位機通常是單片機系統,為了實現PC的集中監測、控制和管理,需將下位機的信息傳送到中心管理PC機上來。PC機和單片機之間的信息交換有許多形式,用MODEM通過電話線路實現遠程數據傳輸是一種靈活方便、經濟實用的方案。因此,本文就采用這種方法,系統由一臺PC機和多個Modem通過程控交換網實現對多個光伏電站單片機控制器的遠程監控。系統的框圖如圖1所示。監控中心的計算機和遠端的各個單片機控制器都通過RS-232串口與Modem相連,再接入程控交換網。光伏電站現場數據的采集和處理采用性價比較高、使用方便的89C51單片機[2]來完成,包括A/D模數轉換電路、I/O接口電路、RS232通信電路、液晶顯示電路、鍵盤設定電路、看門狗電路等。監控中心的PC機設計出友好的界面,當需要監控光伏電站的運行狀況時, PC機先通過串口向Modem發送撥號命令,撥打相應電站的電話號碼,與單片機控制器建立握手連接,當連接成功后,兩者就可以通過電話線互傳數據,包含對電站運行參數,如蓄電池電壓,蓄電池溫度,充電電流,環境溫度,風速,光強等的采集,以及對電站單片機控制器的控制指令。PC機可以對接受的電站運行數據實時顯示、打印,做下一步處理。
[align=center]

圖1 系統框圖[/align]
3 Modem通信
Modem通信是利用現有電話網實現計算機之間遠距離通信的一種通信方式。電話網是為傳輸模擬信號而設計的,而計算機和單片機處理的信息都是數字信號。因此計算機和單片機要借助電話網傳送數據時,發送端首先進行調制,將數字信號變成模擬信號。到了接收端,還要有解調裝置將模擬信號還原成數字信號。Modem便是完成這一功能的設備。和其他通信標準一樣,Modem通信也有自己的一套規則和標準,Hayes公司制定的AT命令相當于事實上的業界標準[3],幾乎所有的Modem都支持Hayes的AT命令。在遠程控制中用到的AT命令主要有以下幾條:
(1)ATDTn Modem使用音頻撥號,n為電話號碼。
(2)ATS0=r Modem自動應答方式,收到r聲鈴聲后Modem自動摘機并試圖連接。
(3)+++ Modem從在線狀態切換到在線命令狀態。
(4)ATHn Modem掛機/摘機命令,0:掛機;1:摘機。
為了監測命令的執行情況和電話的線路狀態,Modem接受AT命令后都會返回結果碼,
結果碼的形式可以是字符型或數值型。Modem工作時,除了撥號占據短暫的時間外,它總是處于離線命令狀態、在線命令狀態和在線數據狀態中的一種狀態。當Modem 啟動后,首先處于命令狀態,連接建立后進入在線狀態。在命令狀態下,Modem以AT命令形式接受命令,例如指示Modem去撥號或者當電話響鈴時自動應答。在在線狀態下,Modem與遠端系統通信,此時Modem這幾種狀態的切換如圖2所示[4]。
[align=center]

圖2 Modem狀態轉換示意圖[/align]
在本系統的設計中,我們采用金浪公司大眾Ⅱ型標準外置式56K調制解調器,和大多數外置Modem一樣,它提供的是標準的RS-232接口,所以和PC機相連的Modem可以通過串口直接連接,而單片機的串口為TTL電平,它和Modem相連必須進行電平轉換,這里我們采用MAX232芯片,連接原理圖如圖3所示。89C51雖然有串行輸入、輸出口,但不具備RTS、CTS、DTR等標準接口握手信號線,考慮到單片機和上位機的通信量并不大,所以在連接時采用簡單的“三線制”即只通過TXD、RXD和地線GND進行連接,其它信號在對Modem初始化時發送AT指令將其忽略。
[align=center]

圖3 Modem和單片機通信接口電路[/align]
4 基于VC的串口通訊
在眾多的開發工具中,VC由于具有串行通訊和數據處理的強大功能而成為開發遠程通訊控制的首選開發語言。在Windows環境下完成串口通訊,目前通常有以下幾種方法:
(1) 利用Windows API通信函數。
(2) 利用VC的標準通信函數_inp、_inpw、_inpd、_outpw、_outpd等直接對串口進行操作。
(3) 使用現有的ActiveX控件即MSComm控件來實現。
(4) 利用第三方編寫的通信類即CSerial類來實現。
以上幾種方法中第一種使用面較廣,但由于比較復雜,專業化程度較高,使用困難;使用第二種方法需要了解硬件電路結構原理。在本系統中我們采用第三種方法, MSComm控件是微軟公司提供的一個可實現串行通信的ActiveX控件,擁有完善的串口數據接收和發送功能,并具有很多屬性,它屏蔽了通信過程中的底層操作,只需設置并監視控件的屬性和事件就可完成對串口的初始化和數據的發送接收。
MSComm控件提供了兩種處理通信問題的方法:一種是事件驅動方法,一種是查詢法[3]。其中事件驅動方法響應及時,可靠性高,適用于較復雜的串口通信,本系統的設計就采用這種方法。
5 軟件設計
5.1 初始化程序設計
初始化程序設計主要完成串行口的初始化和Modem的初始化,首先為MSComm控件定義一個變量:CMSComm m_ctrlComm,相應的程序如下:
BOOL CModemDlg::OnInitDialog()
{
……
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(1); //選擇com1
if( !m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//打開串口
else
AfxMessageBox("串口1已被占用,請選擇其他串口");
m_ctrlComm.SetSettings("9600,n,8,1");
m_ctrlComm.SetInputMode(1);
m_ctrlComm.SetRThreshold(1);
m_ctrlComm.SetInputLen(0);
m_ctrlComm.GetInput();
CString strTemp;
strTemp="ATZ0\r\n";//Modem軟件復位
m_ctrlComm.SetOutput(COleVariant(strTemp));
strTemp="ATS0=1\r\n"; //Modem自動等待連接
m_ctrlComm.SetOutput(COleVariant(strTemp));
strTemp="AT&D0&S0&R1\r\n"; //簡化Modem控制方式
m_ctrlComm.SetOutput(COleVariant(strTemp));
……
}
5.2 撥號程序設計
void CModemDlg::OnDial()
{
CString strTemp;
//向Modem發送指令
strTemp = "ATDT" + m_strPhoneNumber + "\r"+"\n"; // m_strPhoneNumber為電話號碼
m_ctrlComm.SetOutput(COleVariant(strTemp));
}
5.3 數據發送程序設計
void CModemDlg::SendData(CString m_strSend)
{
char TxData[100];
int Count=m_strSend.GetLength();
for(int i=0; i
TxData[i]=m_strSend.GetAt(i);
CByteArray array;
array.RemoveAll();
array.SetSize(Count);
for(i=0; i
array.SetAt(i,TxData[i]);
m_ctrlComm.SetOutput(ColeVariant(array));
}
5.4 數據接受程序設計
void CModemDlg::OnComm()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //設置BYTE數組
CString strtemp;
CString strshuzu[100];
if(m_ctrlComm.GetCommEvent()==2) //事件值為2表示接收緩沖區內有字符
{variant_inp=m_ctrlComm.GetInput(); //讀緩沖區
safearray_inp=variant_inp; //VARIANT型變量轉換為ColeSafeArray型變量
len=safearray_inp.GetOneDimSize(); //得到有效數據長度
for(k=0;k
safearray_inp.GetElement(&k,rxdata+k);//轉換為BYTE型數組
for(k=0;k
{BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%02X ",bt);
strshuzu[k]=strtemp;}
……//對接收的數據進行相應的處理,如數據的實時顯示、向數據庫添加等
}
6 結束語
實驗表明,該系統設計成本低,運行穩定可靠,能很好達到遠程監控的預期目的。對邊遠地區的太陽能光伏發電技術的進一步推廣和應用有重大的意義。
本文作者創新點:針對光伏電站的特點,提出了利用VC控制Modem實現遠程監控的方案。
參考文獻:
[1]劉福才,高秀偉等.光伏電站遠程監控系統單片機智能控制器的設計[J].計算機測量與控制2003,11(41):270-272
[2]張毅剛,彭喜元等.新編MCS-51單片機應用設計[M].哈爾濱:哈爾濱工業大學出版社,2003
[3]李現勇.Visual C++串口通信技術與工程實踐[M].北京:人民郵電出版社,2004
[4]喬奕,王超,陶維青.基于MSCOMM控件Modem通信的實現.微計算機信息(測控自動化)2004,20(7):102-103