C++快速开发小型组态软件

 

1.     小型组态软件系统架构图

组态软件现在的应用已经相当广泛,无论是功能和易用性上都已经达到了一个相当的高度。但对于很多行业用户来说,尤其是对中小自动化集成商来说,很多时候使用的功能并不是特别多,往往就是基本的监控功能。在这种情况下,如果都使用通用组态软件的话,无疑是大大的增加了成本。所以,很多中小自动化企业都希望能开发一些适合自己行业应用的小型组态软件。这种软件不需要太多花哨的功能,主要是以实用、高效、稳定为主。但我们知道组态软件是一个比较复杂的系统,他的设计和开发的工作量相当巨大,一般来说不是个人或几个人能做的事情。

为此,我们提出来小型组态软件的概念。所谓小型组态软件,就是指软件只实现通用组态软件的核心功能(包括数据采集、控制、历史数据、事件、脚本等),然后再根据具体的行业应用适当的增加一些应用功能即可。我们采用面向对象的C++语言设计了一款小型组态软件uScada,它的系统架构如下图。

 

C++快速开发小型组态软件_第1张图片

图表 1

uScada的系统结构图中共包括7个部分,其中事件管理和数据库存取部分在实现并没有太多的难度,已经有很多的文章介绍这些部分,本文就不再赘述。本文重点关注图形界面、设备管理、变量管理、脚本管理、设备驱动等几个部分的设计和实现。其中设备管理和设备驱动作为一个部分来讲述。

2.     图形界面

组态软件的图形界面基本上都采用矢量图形系统。对于矢量图形的开发,MSDN中提供的例子已经详细说明了矢量图形的原理和基本设计方法,一个功能强大的矢量图形系统得基本思路也是如此,只不过是支持更多的功能而已。本文对矢量图形系统的基础知识不做介绍,只是介绍适量图形系统中很多用户比较关心的两个问题:

1. 如何实现图形的组合功能

2. 如何实现图形的动画效果

2.1如何实现适量图形的组合功能

图形的组合是指多个图元可以组合在一起作为一个图元来使用。在此基础上,还可以实现图库等功能,就是把组合好的图元保存起来作为一个图形库供组态人员使用。

在矢量图形系统中,一个画面多是由多个图元组成,或者一个画面由多个图层组成,而每个图层中包含多个图元。为简单起见,下面以第一种情况为例,说明如何实现图形的组合。从设计上说组合图元首先是一种图元,同时又是由多个图元组成,所以简单的把矢量图形设计为下图。

 

C++快速开发小型组态软件_第2张图片

图表 2

对应上图的设计来实现的C++代码大致如下:

Class CGraph

{

public:

       CGraph();

       ~CGraph();

       ……

private:

       CDrawObjList m_vObjList;

       ……

};

 

CDrawObj

{

public:

       CDrawObj();

       ~ CDrawObj();

       ……

private:

       CDrawObjList m_vObjList;

       ……

};

2.2 图形的动画效果

图形的动画效果主要是通过位置、大小、颜色等的动态变化来实现的。所谓动态变化主要是要根据用户设定的条件来实现动态效果,这些条件一般都是与系统变量相关,包括是由系统变量组成的计算公式,或者是一段包含系统变量的脚本。图形的动画效果的实现原理如下图。

 

C++快速开发小型组态软件_第3张图片

图表 3

3.     设备管理系统设计

uScada设备管理系统结构整体架构的设计如下图,其中:

设备管理类CDeviceManager:用来管理通道和设备。

通道类CChannel:通道类用来负责通讯控制和管理通讯设备,调用设备类对象发送和接受通讯数据。

设备类CDevice:设备类用来代表一个实际的通讯设备,包括地址和名称等。设备类对象向实际的通讯设备发送数据查询命令,接受通讯设备的响应数据,并将这些数据放到对应的数据区去。一个CDevice对象可以包含多个数据区对象。数据区类CDdataBlock是用来存储软件采集的设备寄存器内的原始数据,数据区属于设备类的一部分。

对于不同的通道类型,可以从CChannel类派生出来具体的子类,如CSerial为串口类,CEthernet为以太网通讯口类。

对于不同的设备类型采用的不同通讯协议,只要从CDevice类派生出一个设备驱动类,在该设备类内实现通讯协议的报文组织和解析即可。实现的设备驱动类可以直接在组态软件中编写,也可建立单独的动态链接库来编写。

 

C++快速开发小型组态软件_第4张图片

图表 4

通讯控制策略决定了通讯的效率,uScada中设计的通讯控制策略如下图。

 

C++快速开发小型组态软件_第5张图片

图表 5

4.     变量管理系统设计

变量管理系统是一个简化的实时数据库。uScada组态软件将测点定义为变量,每一个测点是一个变量,然后通过一个变量管理器进行管理。变量管理器的设计如下图。

 

C++快速开发小型组态软件_第6张图片

图表 6

在上图中:CBbaseVar类为变量基类。包括变量名等属性。 CDigital是状态量点类,从CBaseVar类派生;CAnalog是模拟量点类, 从CBaseVar类派生。CVariantsManager是变量管理类,提供了变量刷新的方法,访问数据的方法,包括取状态量变量值的方法和取模拟量变量值的方法。

变量的组织采用hash表方式,既保证开发简单,又保证了系统具有很高的查询速度。如果使用MFC,就可以使用CMap,如果使用STL,就可以使用std::map

5.     如何让你的组态软件支持脚本

组态软件的一个重要特点就是灵活性,而脚本功能就是这种特点的一个重要实现。目前实现脚本功能主要有两种方式,一种是开发自己的脚本引擎,另外一种是使用商用的脚本引擎组件。对于前一种方法,实现起来比较复杂,工作量也比较大,本文就不介绍了。本文只介绍采用微软VBScript脚本引擎来使组态软件实现脚本功能的方法。

脚本功能的基本功能是脚本包括:

1.      脚本的编辑,管理;

2.      脚本的运行控制;

3.      脚本的执行;

脚本的编辑一般使用一个单独的脚本编辑器,脚本的控制和执行是在组态软件内部中实现的。其中脚本的控制主要是指脚本的执行条件,一般包括条件执行和定时执行,而脚本的执行是由组态软件调用VBScript脚本引擎来具体执行的。

 

C++快速开发小型组态软件_第7张图片

图表 7

       对于脚本的编辑管理部分,网上有很多不错的开源脚本编辑器,大家可以下载使用。对于使用VB脚本的情况,VBScript脚本引擎是不能识别组态软件系统变量的,所以在调用VBScript脚本引擎执行脚本前,需要对工程脚本进行预处理,将脚本转换为标准VB脚本。

 

C++快速开发小型组态软件_第8张图片

图表 8

 

 


 

www.uScada.com

 

 

 

 

 

 

捷通模拟通讯实验室提供组态软件源代码

提供工业监控系统开发咨询服务

 

 

QQ549325164

Email[email protected]

 

你可能感兴趣的:(C++快速开发小型组态软件)