推广 热搜: 电机  PLC  变频器  服务机器人  培训  变送器  危化品安全,爆炸  西门子PLC  触摸屏  阀门 

一种基于VC的Modem分布式远程监控系统设计

   日期:2013-03-23     来源:工控之家网    作者:工控之家    浏览:30    评论:0    
摘 要: 针对边远地区光伏电站不易值守的问题,本文设计了一种利用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机可以对接受的电站运行数据实时显示、打印,做下一步处理。


图1 系统框图

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]。


图2 Modem状态转换示意图

  在本系统的设计中,我们采用金浪公司大众Ⅱ型标准外置式56K调制解调器,和大多数外置Modem一样,它提供的是标准的RS-232接口,所以和PC机相连的Modem可以通过串口直接连接,而单片机的串口为TTL电平,它和Modem相连必须进行电平转换,这里我们采用MAX232芯片,连接原理图如图3所示。89C51虽然有串行输入、输出口,但不具备RTS、CTS、DTR等标准接口握手信号线,考虑到单片机和上位机的通信量并不大,所以在连接时采用简单的“三线制”即只通过TXD、RXD和地线GND进行连接,其它信号在对Modem初始化时发送AT指令将其忽略。


图3 Modem和单片机通信接口电路

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

 
打赏
 
更多>同类环保知识
0相关评论

推荐图文
推荐环保知识
点击排行
网站首页  |  免责声明  |  联系我们  |  关于我们  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  RSS订阅  |  违规举报  |  鲁ICP备12015736号-1
Powered By DESTOON