2007-11-11
图1 执行流程框图
4、画面构成
一般的工程监控画面有:文字显示,生产工艺流程显示(包括动画,柱状图显示等),报警,人员操作,趋势曲线等等。我们的系统架构是做一个基于主对话框的程序。再将这些不同的画面用子对话框表现出来。
主对话框负责初始化串口,打开串口,启动读串口线程等;而各子对话框则定时或根据需要向串口发送各种命令,通过主对话框的线程读回命令的应答,再在子对话框中以一定的形式提供给用户,以供监控现场作业。这其中主要的技术就是串口通讯。下面我们重点讲述通讯的实现。
5、通讯实现
人机界面提供的串口是符合通用标准的。WinCE.net下的串口通讯与Windows下的串口通讯原理相同。都是应用程序不直接控制硬件,而是通过操作系统提供的设备驱动程序,来进行数据传递。
WinCE.net 是Win 32编程。串口在Win 32中是作为文件来进行处理的,不是直接对端口进行操作。对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数。
但是也要注意WinCE.net所能支持的API函数只是Window API函数的子集。Windows有的,WinCE.net下不一定能使用。同时,WinCE.net字符集类似于Windows NT而不同于Windows 9x,它是基于Unicode的。这也是开发程序过程中从WINDOWS转到WinCE.net的程序员遇到问题最多的地方。另外在Windows下常用的一些通讯控件如MSComm等在WinCE.net下就不能正确使用了。
本监控系统采用API函数实现串口通讯。以下分几个问题介绍串口通讯及整个系统的实现。
5.1 打开串口
首先是打开串口,这是串口通讯的第一步。其代码为:
BOOL CMainDlg::OnInitDialog()
{
......
m_hComm=CreateFile(_T("COM1:"),GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0); //打开串口的操作,需要注意
WinCE.net系统与Windows系统表达方式的细微不同,WinCE.net需要在串口后加上冒号;
SetupComm(m_hComm,1024,1024); //初始化串口的输入,输出缓冲区参数;
SetCommState(m_hComm,&m_dcb) ; //配置串口参数;m_dcb为设置好的参数结构;
......
SetCommTimeouts(m_hComm,&timeout); //设置通讯超时时间参数;
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
//清空输入,输出缓冲区的字符,为开始接受数据,进入监控状态做好准备;
void 子对话框1类::OnTimer(UINT nIDEvent)
{
......
strcpy(m_szCmd,"@00RR00000001"); //OMRON PLC的命令字符串;
GenXor(m_szCmd,result); //进行校验码计算,调用 GenXor 函数;
sprintf(szTailer,"%02X*\r",result); //OMRON PLC通讯协议以“*\r”结尾;
strcat(m_szCmd,szTailer); //形成完整的通讯协议命令字符串;
WriteFile(m_hComm, m_szCmd, strlen(m_szCmd),&dwWriten,NULL);
//将命令字符串写入串口;
......
}
以下为上面所调用的计算校验码的代码:
void GenXor(LPCSTR strSource,char& result) //为计算校验码的函数,进行异或运算:
{
result=0; //为校验码赋初值;
int len=strlen(strSource); //命令协议字符串的长度;
for(int i=0;iresult^=strSource[i]; //按位进行异或;
}
5.4 显示界面处理
最后,读线程读到的数据,交由对应的子对话框进行处理。要对这些数据进行分析,并以动画,柱状图,趋势曲线等表现出来。以所连接的为OMRON PLC为例,其代码为:
void子对话框1类::ProcData(char *buffer, int len)
{
......sscanf(buffer+7,"%04X",&wData); //根据OMRON PLC的命令规约,从应答中将需要的数据取出到变量wData中;
....... //对获得的变量值根据需要进行处理,如以文字或动画等形式在子对话框中进行显示;
}
在进行界面处理时,有一些技巧,如动画显示时,可以用一个定时器控制图片的轮番显示。(在本系统中动画是通过CbitmapButton这个控件进行显示的。)
switch(m_iImage) // m_iImage为定义的动画显示标志;
{
case 1: //显示第一幅图片,同时将动画显示标志置为2;
CBitmapButton控件变量.LoadBitmaps(图片标志1);
m_iImage=2;
break;
case 2: //显示第二幅图片,同时将动画显示标志置为1;
CBitmapButton控件变量.LoadBitmaps(图片标志2);
m_iImage=1;
break;
}
在显示实时曲线时,采用循环数组的方式,在内存中开辟一定大小的空间,使读上来的数形成一个循环数组,在界面上动态的显示出来。
本系统中以20个模拟量为一个数组大小,也就是实时趋势曲线一直显示20个点的信息,但因为使用了循环数组的技术,所以看上去很有动感。
void 子对话框类::循环数组函数(int iValue) // iValue为从命令应答中解析出来的有效数据;
{
int index=(m_iBegin+m_iCount)%20; //计算循环数组的下标,初始从0开始;
m_aryValue=iValue; //为循环数组赋值;
m_iCount++; //循环数组的个数加1;
if(m_iCount>20) //判断个数是否超过20个,如是,将下一个数组下标从1开始,依此类推;
{
m_iCount=20;
m_iBegin=(m_iBegin+1)%20;
}
......
}
通讯是本系统的关键。我们的实践证明,以上四步是实现整个监控系统基本之要点。
6、结论
总之,本监控系统软件的基本架构可以以下面这幅图直观的表示出来:
图2 监控系统软件的基本架构
随着嵌入式操作系统的兴起,各组态软件的开发商也纷纷开发出了嵌入式版的组态软件。但在实际应用中我们发现有许多企业,他们的生产控制流程比较固定,需要的人机界面的数量又比较大,对他们来说,按这里介绍的方法,针对企业自身的生产工艺特点进行开发,提供给用户的是最终的运行系统,不需要用户再进行组态的二次开发。这样的系统对这样的用户来说,从时间,价格或性能上来说都比较适合。本系统在鹭岛公司研发的LEODO嵌入式工业控制人机界面上经过了测试运行,证明其运行速度较快,比较稳定。效果很好,比较适合工业现场使用。当然LEODO品牌的人机界面也内置了一套简明实用,画面资源丰富的ET组态软件,用户可根据实际情况决定自己用高级语言开发,还是用组态软件开发。
总之,可以看出,人机界面利用Microsoft eMbedded C++开发应用程序,与在Windows系统下用Microsoft Visual C++开发程序,有许多相象的地方。借助这个软、硬件平台,多数用户完全可以开发出适合自己需要的应用程序。
评论1
楼主 2007/11/11 1:00:10