转自:http://yleesun.blog.163.com/blog/static/2941340220094695359894/
组态软件部分作为自动化网络平台客户端的实现部分,仅仅是其中的一小部分,即HMI界面部分,也只有这部分是基于Qt实现的,所以这个帖子主要介绍的就是这一部分,当然先就整体部分做个介绍
1、 本系统目的是建立一个通用SCADA系统平台。
2、 本系统(自动化网络平台系统),主要由实时数据库、参数数据库、组态软件等几个部分。
a) 面向服务设计,实时数据库、参数数据库等作为一个个服务存在于系统中,添加一个服务所需要作的仅仅是定义接口(类似于idl),实现你的接口即可。可以在线添加服务、在线删除服务,不需要重启整个系统。
b) 单个服务支持主备冗余,对于使用服务的程序来说则完全是透明的,其仅仅需要知道服务名(标识)即可,一个服务不可用时自动切换到另一个服务。
c) 实时数据库提供了python接口,支持python表达式,效率相当高。支持数十万数据点,同时支持插件,即当对于实时数据有不同的处理要求时,可以加载自己写的插件,比如处理最大最小值,越限告警等等,使用插件而不是接口的原因当然是效率,因为在同一个进程,数据处理速度更快。
d) 实现了一个系统级的参数数据库,非常灵活。所有的数据类型都是可以配置的,更改一个表结构所需要做的仅仅是更改配置,而配置文件本身就是作为参数的一部分。支持具有任何数据结构的参数表,你也可以把exe文件保存在参数数据库,应用的时候再取出来,当然主备冗余、数据同步是不可少的。
e) 本系统的设计目的:实现一个自动化网络监控平台,可以用于电力、锅炉、自来水等等所有的自动监控系统。曾经接触过一家国内非常有名的仿真系统平台,本系统不做任何修改即可胜任,呵呵,并且配置非常方便,比较麻烦的则是很多仿真模块的具体实现,一个仿真模块其实就是对实时数据库若干点的输入、处理后若干点的输出,其实现可以通过python表达式,也可以通过插件实现。
f) 最后如果您的企业在开发类似的东西,并且对这套系统感兴趣,欢迎和我联系,当然如果您个人在做类似的工作,期望您的交流。
组态软件本质上就是实现一个矢量图形编辑器,实现若干个基本图元,例如矩形、圆、线、多边形、位图、连接线,然后基于这些基本图元可以组合为任意的新的图元,即组合图元(group);组合图元本身也是图元,这正是经典的组合模式。每个图元一般会关联到实时数据库中的一个点或者一个对象,然后定时或者其它方式刷新这些值,根据这些值的不同图元则显示为不同的形状或颜色或其它,此所谓的监视,而控制的实现一般为当点击某按钮时向实时库或者前置机发送一个命令。软件一般分为两个部分,即编辑器部分和运行态部分,编辑器支持基本的编辑功能,例如移动、选中、copy-cut-paste、成组、放大缩小、旋转、等等,经编辑后,保存为某种格式,而运行态组件多实现为dll,其加载编辑器生成的文件,显示运行,没有编辑功能,当然也是不允许编辑的。一般组态软件都包含一个脚本系统,以应对很多个性化的东西,有了脚本系统,组态软件通常看起来都很强大,可以做一些简单的游戏,等等等等,实际上其实现往往并不复杂。
选择Qt做组态软件的原因:
1、 天然的跨平台,目前很多监控软件都要求运行于Unix系统,尤其是在电力行业。
2、 Qt提供的Graphics View模块好像为组态软件的实现量身定做,呵呵,应用该模块,效率非常高,支持数十万级别的item。
3、 QSA脚本,与Qt的天然集成,太完美了。
4、 Qt提供的undo模块,经典的命令模式的实现,用在组态软件的undo、redo不费吹灰之力。
5、 这些还不够吗,以上任何一点都够一个开发小组工作一段时间,更重要的是重复发明*的意义到底有多大?*也未必正常行驶,呵呵
设计时几个主要的环节:
1、 组合模式,即若干图元的组合还是一个图元,这个有QGraphicsItemGroup这个类,基本上工作量小的多了
2、 命令模式,即undo/redo的实现,当然有了QUndoStack这些类,就容易的多
3、 图元大小的改变,即可以由鼠标的拖动改变一个图元的大小,这个相对难一点,因为矩形、椭圆、线处理方式不一样,要分开处理
4、 QGraphicsItem的扩展,由于所有的item都是基于这个类的,但是我们在实现的时候往往需要更多的虚函数,这个实现可以说是必须的,在实现的时候也想到的几种方法,比如扩展某一个虚函数,比如多继承,或者修改Qt这部分的源代码,最后采用的是一种非继承的组合方法即MyItem基类,包含一个QGraphicsItem *成员,这个是目前个人感觉最好的办法。
5、 模版实现,即若干图元组合后的新图元可以保存到模版,用的时候拖放过来即可。
6、 保存格式,一般由二进制、xml文件,这两种各有优缺点,我则直接保存为qsa脚本,load进来后页面也建立了,兼两种格式的优点。
呵呵,其实、参数库、实时数据、包括各个服务等等都可以做成可组态的,系统可以面向服务,而针对于各个组成部分的实现可以基于组件,比如一个客户端程序,菜单、工具栏、各个widget都是可配置的,这对于一个可复用、通用程序来说是必要的。