Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1882790
  • 博文数量: 496
  • 博客积分: 12043
  • 博客等级: 上将
  • 技术积分: 4778
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-27 14:26
文章分类

全部博文(496)

文章存档

2014年(8)

2013年(4)

2012年(181)

2011年(303)

2010年(3)

分类: C/C++

2011-11-17 09:45:03

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

    为此,我们提出来小型组态软件的概念。所谓小型组态软件,就是指软件只实现通用组态软件的核心功能(包括数据采集、控制、历史数据、事件、脚本 等),然后再根据具体的行业应用适当的增加一些应用功能即可。我们采用面向对象的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

阅读(1382) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~