关键字:组态软件,串口设备通信,VC++6.0
1、前言:
工业控制组态软件的开发和使用已经有几十年的历史,现在很多从事工业控制的公司都在使用甚至开发自己的组态软件。在开发组态软件的过程中,组态软件的通信是一个非常重要的模块,使用组态软件设计出显示画面以后,要接收现场的采集数据,形成动态画面,反映工业现场的各种状态,并能够对现场设备进行控制,这些都依赖于组态软件的通信模块。现场的测控设备大多都采用标准的通信接口,而串行接口是测控设备所采用的最常见的一种通信接口。本文首先分析了开发组态软件串口设备通信的方法,然后提出了一种使用VC++6.0开发组态软件串口设备通信模块的具体实现方法。
2、组态软件与测控设备的通信原理
组态软件通过I/O驱动程序从现场测控设备获得实时数据,对数据进行加工处理后,一方面以图形方式显示在计算机屏幕上,来反映现场设备的运行状况;另一方面按照组态要求和操作人员的指令将控制数据送给I/O设备,对执行机构实施控制或调整控制参数。
一般情况下,I/O驱动程序是与设备相关的,即一种设备的驱动程序只能驱动该类的设备。设备制造商会提供PC与设备间进行数字通信的接口协议和物理接口标准。物理接口标准规定使用何种通信介质、链路层的接口标准,如RS232、RS485、以太网等;接口协议规定通信双方约定的命令及数据响应格式、数据校验方式等。I/O 驱动程序主要是按照接口协议的规定向设备发送数据请求命令,对返回数据进行拆包,从中分离出所需数据(即组态的数据连接项和设备状态数据)。多数设备的通信接口协议都有若干条读写命令,分别用来读写设备上不同类别的数据,而每一条命令又可以读写同类别的多条数据,具体能读写几条是由接口协议规定的。使用组态软件做I/O数据连接的工程技术人员不必了解这些细节,只需按照I/O 驱动程序的说明书组态数据库变量与设备数据项的对应关系即可。I/O 驱动程序主要以数据包为单位进行数据处理,这样会大大提高通信效率。通信过程如图1所示:
图1、组态软件通信原理框图
3、组态软件中串口设备通信方法设计
在工业控制领域,常把现场测控设备分成3种类型,一种是可独立工作、能够完成特定数据输入输出功能的设备,如用于模拟量输入输出、数字量输入输出的各种板卡;另一种设备是本身不直接处理数据输入输出,但起到管理其它设备工作的设备,如串行口设备;第三种设备是本身具有处理数据输入输出的功能,但只有和第一种设备一起才构成完整工作系统的设备:如PLC设备、智能仪器仪表等;不同类型的设备的工作方式有所不同,其对应的通信方法的设计也有所不同。而第三种设备是最常用的一种设备,他们的通信方式,主要是对串行口进行操作,因此在这里把他们叫做串口设备,下面结合实例给出用VC++6.0设计组态软件串口设备通信的方法。
选用VC++来开发,是因为使用VC++开发的软件运行效率高,程序代码较短,运行速度快,能够充分利用32位操作系统多任务多线程的优势。利用VC++6.0开发串口通信一般有两种方法,一种是直接使用Windows API函数进行编程,另一种是使用MSCOMM控件来进行串口编程,采用后一种方法在程序实现上相对第一种方法比较简单,因为MSCOMM控件封装了大量Windows API函数,使用MSCOMM控件进行编程,用户只需考虑如何使用MSCOMM控件所提供的属性和事件,以驱动API函数的接口来完成工作。
在组态软件中实现串行设备的通信实际上就是开发不同串行设备的驱动程序,它一般分为两个部分,一是对串行口的设置、初始化、以及读写操作,二是根据不同设备的通信协议对从串行口读写的数据帧进行处理,取出其中的有用数据。
3.1串口属性设置对话框设计
新建一个工程,在该工程中插入MSCOMM控件,建立一个对话框,(set_com)加入以下控件:
该对话框用于对串口的属性进行设置,但是这里并不是对串口进行真正的设置,而只是把一些参数保存到变量当中。在实际的应用中可能会用到其他更多的属性,但以上属性是最常用的几个属性,为了简化说明,在本设计中,只对以上一个属性进行设置,其他属性都采用默认的属性设置。MSCOMM控件有两种通信方式-事件驱动方式和查询方式,为了简化说明,在这里也只采用其中的一种通信方式-事件驱动方式。
3.2打开串口及数据处理设计
在这一步骤里应该包括以下功能:
(1) 用户能够选择所要使用的串行设备
(2) 根据3.1中设置的参数,对串口进行设置
(3) 打开串口,对数据进行处理,保存到缓冲区
为了简化说明,在这里省略功能(1)的设计,假设我们所设计的组态软件只与一种设
备进行通信(我们采用OMRON PLC,以C200HE PLC为例,通信协议采用上位机链接通信)
3.2.1串口属性设置及打开串口
新建一个支持Activex控件的对话框(test_com),从控件工具栏中把MSCOMM控件拖到该对话框中,并为该控件添加控制变量:m_ctrlComm。在test_com::OnInitDialog()函数中设置串口属性,程序如下所示:
//把set_com对话框中设置的串口属性赋值给para
para=btl+”,”+jojy+”,”+sjw+”,”+tzw+”,”;
//打开串口
if(m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(FALSE);
m_ctrlComm.SetCommPort(selcom); //选择串口
if( !m_ctrlComm.GetPortOpen())
m_ctrlComm.SetPortOpen(TRUE);//打开串口
else
AfxMessageBox("cannot open serial port");
//设置串口属性
m_ctrlComm.SetSettings(para); //波特率,校验,数据位,停止位
m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据
m_ctrlComm.SetRThreshold(1);
//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0
m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
return TRUE;
3.2.2响应串口事件,对数据进行处理
上位机发送数据到PLC的过程实际上就是根据该PLC的通信协议,把命令字符串发送到串行口,上位机接收PLC数据的过程实际上是把接收到的数据根据PLC通信协议里规定的帧格式,把有用数据取出来的过程。
(1)OMRON PLC(C200HX)的通信协议
本文的通信协议采用的是上位机链接通信。上位机链接通信通过在上位机与PLC之间交换命令和应答实现的。在一次交换中传输的命令和应答数据称为一帧,一个帧最多可包含131个数据字符。
命令帧格式如下:
识别码和正文取决于传输的上位机链接命令。当传送一个组合命令时,还将有第二个识别码(子识别码)。FCS(帧检查顺序)码由上位机计算,并设置在命令帧中,命令帧最多可以有131个字符长,一个等于或大于132字符的命令必须分成若干帧。命令分段,使用回车定界符(CHR$(13)),而不是终止符。终止符必须用在最后帧的末尾。
应答帧格式
识别码和正文取决于接收到的上位机链接命令,结束码表示命令完成的状态(即是否有错误发生),当应答超过132字符,它必须分成若干帧。在每个帧的末尾将自动设置一个定界符(CHR$(13))代替终止符。终止符必须设置在最后帧的末尾。
(2)响应OnComm事件,对数据进行处理
// 发送事件
void test_com::OnSend ()
{
// 根据(1)中的命令帧格式,写出需要传出的命令码字符串CString m_send
// 将这个字符串发送到串行口
m_ctrlComm.SetOutput (COleVariant (m_send));
}
// 接收事件
void test_com::OnComm ()
{
if (m_ctrlComm.GetCommEvent () = 2) //事件值为2表示接收缓冲区内有字符
{
COle Variant m_input = m_ctrlComm.GetInput ();
//m_input中的数据即为接收到的数据,根据应答帧格式取出其中的有效数据
UpdateData (FALSE);
}
}
4、结论
通过在实际开发中的具体应用,提出组态软件中串口设备通信模块的具体实现方法,在实际应用中具有重要的应用价值。
参考文献
[1] 马国华 《监控组态软件及其应用》清华大学出版社 2001.8
[2] 王亚民 陈青刘畅生 王水平 《组态软件设计与开发》2003.4
[3] 李现勇 《Visual C++串口通信技术与工程实践》 人民邮电出版社 2002.5