分类: C/C++
2011-11-17 09:45:03
为此,我们提出来小型组态软件的概念。所谓小型组态软件,就是指软件只实现通用组态软件的核心功能(包括数据采集、控制、历史数据、事件、脚本
等),然后再根据具体的行业应用适当的增加一些应用功能即可。我们采用面向对象的C++语言设计了一款小型组态软件uScada,它的系统架构如下图。
_此主题相关图片如下,点击图片看大图:
图表 1
uScada的系统结构图中共包括7个部分,其中事件管理和数据库存取部分在实现并没有太多的难度,已经有很多的文章介绍这些部分,本文就不再赘
述。本文重点关注图形界面、设备管理、变量管理、脚本管理、设备驱动等几个部分的设计和实现。其中设备管理和设备驱动作为一个部分来讲述。
2.图形界面
组态软件的图形界面基本上都采用矢量图形系统。对于矢量图形的开发,MSDN中提供的例子已经详细说明了矢量图形的原理和基本设计方法,一个功能
强大的矢量图形系统得基本思路也是如此,只不过是支持更多的功能而已。本文对矢量图形系统的基础知识不做介绍,只是介绍适量图形系统中很多用户比较关心的
两个问题:
1. 如何实现图形的组合功能
2. 如何实现图形的动画效果
2.1 如何实现适量图形的组合功能
图形的组合是指多个图元可以组合在一起作为一个图元来使用。在此基础上,还可以实现图库等功能,就是把组合好的图元保存起来作为一个图形库供组态人员使用。
在矢量图形系统中,一个画面多是由多个图元组成,或者一个画面由多个图层组成,而每个图层中包含多个图元。为简单起见,下面以第一种情况为例,说明如何实现图形的组合。从设计上说组合图元首先是一种图元,同时又是由多个图元组成,所以简单的把矢量图形设计为下图。
_此主题相关图片如下,点击图片看大图:
图表 2
对应上图的设计来实现的C++代码大致如下:
Class CGraph
{
public:
CGraph();
~CGraph();
……
private:
CDrawObjList m_vObjList;
……
};
CDrawObj
{
public:
CDrawObj();
~ CDrawObj();
……
private:
CDrawObjList m_vObjList;
……
};
2.2 图形的动画效果
图形的动画效果主要是通过位置、大小、颜色等的动态变化来实现的。所谓动态变化主要是要根据用户设定的条件来实现动态效果,这些条件一般都是与系统变量相关,包括是由系统变量组成的计算公式,或者是一段包含系统变量的脚本。图形的动画效果的实现原理如下图。
_此主题相关图片如下,点击图片看大图:
图表 3
3.设备管理系统设计
uScada设备管理系统结构整体架构的设计如下图,其中:
设备管理类CDeviceManager:用来管理通道和设备。
通道类CChannel:通道类用来负责通讯控制和管理通讯设备,调用设备类对象发送和接受通讯数据。
设备类CDevice:设备类用来代表一个实际的通讯设备,包括地址和名称等。设备类对象向实际的通讯设备发送数据查询命令,接受通讯设备的响应数据,并
将这些数据放到对应的数据区去。一个CDevice对象可以包含多个数据区对象。数据区类CDdataBlock是用来存储软件采集的设备寄存器内的原始
数据,数据区属于设备类的一部分。
对于不同的通道类型,可以从CChannel类派生出来具体的子类,如CSerial为串口类,CEthernet为以太网通讯口类。
对于不同的设备类型采用的不同通讯协议,只要从CDevice类派生出一个设备驱动类,在该设备类内实现通讯协议的报文组织和解析即可。实现的设备驱动类可以直接在组态软件中编写,也可建立单独的动态链接库来编写。
_此主题相关图片如下,点击图片看大图:
图表 4
通讯控制策略决定了通讯的效率,uScada中设计的通讯控制策略如下图。
_此主题相关图片如下,点击图片看大图:
图表 5
4.变量管理系统设计
变量管理系统是一个简化的实时数据库。uScada组态软件将测点定义为变量,每一个测点是一个变量,然后通过一个变量管理器进行管理。变量管理器的设计如下图。
_此主题相关图片如下,点击图片看大图:
图表 6
在上图中:CBbaseVar类为变量基类。包括变量名等属性。 CDigital是状态量点类,从CBaseVar类派生;CAnalog是模拟量点
类, 从CBaseVar类派生。CVariantsManager是变量管理类,提供了变量刷新的方法,访问数据的方法,包括取状态量变量值的方法和取
模拟量变量值的方法。
变量的组织采用hash表方式,既保证开发简单,又保证了系统具有很高的查询速度。如果使用MFC,就可以使用CMap,如果使用STL,就可以使用std::map。
5. 如何让你的组态软件支持脚本
组态软件的一个重要特点就是灵活性,而脚本功能就是这种特点的一个重要实现。目前实现脚本功能主要有两种方式,一种是开发自己的脚本引擎,另外一
种是使用商用的脚本引擎组件。对于前一种方法,实现起来比较复杂,工作量也比较大,本文就不介绍了。本文只介绍采用微软VBScript脚本引擎来使组态
软件实现脚本功能的方法。
脚本功能的基本功能是脚本包括:
1. 脚本的编辑,管理;
2. 脚本的运行控制;
3. 脚本的执行;
脚本的编辑一般使用一个单独的脚本编辑器,脚本的控制和执行是在组态软件内部中实现的。其中脚本的控制主要是指脚本的执行条件,一般包括条件执行和定时执行,而脚本的执行是由组态软件调用VBScript脚本引擎来具体执行的。
_此主题相关图片如下,点击图片看大图:
图表 7
对于脚本的编辑管理部分,网上有很多不错的开源脚本编辑器,大家可以下载使用。对于使用VB脚本的情况,VBScript脚本引擎是不能识别组态
软件系统变量的,所以在调用VBScript脚本引擎执行脚本前,需要对工程脚本进行预处理,将脚本转换为标准VB脚本。
_此主题相关图片如下,点击图片看大图:
图表8