1 引言
RT21 综合监控系统是由国电南瑞科技股份有限公司开发的拥有自主知识产权的国产第一套综合监控系统。目前,RT21 综合监控系统的重要应用场合是轨道交通综合监控。RT21综合监控系统已经中标南京轨道交通二号线,重庆轨道交通三号线以及广州珠江新城线。这些项目将于2010 年先后投入营运。合同额超过2 个亿。轨道交通采用综合监控系统后,实现了车站和控制中心相关功能的自动化系统的集成和互联,提高了设备的技术水准;数据信息的共享,可提高数据的利用率,及实现在不同运营工况下系统间的有机联动,提高了管理的自动化和科学化水平。操作终端的灵活设置CONTROL ENGINEERING China版权所有,为今后优化运营管理体制提供了条件,提高轨道交通运营效率和降低运营成本。
报警窗是综合监控系统人机界面 HMI 的重要组成部分控制工程网版权所有,也是调度员最关心的HMI 之一。它以丰富的方式展现了各个子系统的点的异常情况、调度员的重要的操作以及综合监控系统本身运行的异常情况。另外,报警窗还提供调度员确认报警的功能。
报警窗的首要要求是高可靠性和大容量的实时处理能力。当然,报警窗作为整个综合监控软件的最末端,其他各个组件的可靠性是报警窗可靠性的必要条件。报警窗本身要做的是,提高报警的处理能力,能够吞吐大量、长时间的实时报警。报警窗中的报警是按照过滤和排序条件动态过滤和排序的,在大量报警到来时,是非常消耗CPU 资源的。另外,报警窗的声(报警声音)、光(前景色或背景色闪烁)、动作(推画面)也占用了一定的CPU 资源。另外,各地的业主对报警通知的方式要求各不相同。报警窗必须具有很好的可配置性。比如各个报警等级的颜色配置,报警何时消失,报警返回时是否自动确认等等这些,都需要能够在尽量不修改代码的前提下自由修改。
2 报警窗的架构设计
RT21 报警窗工作流程以最简短的语言概括就是从网络接收报警报文,然后以合适的方式展现在HMI 中。该流程是比较典型的生产者和消费者流程。所以,使用多线程也是情理之中。RT21 报警窗有两个主要的线程,一是生产者线程,二是消费者线程。生产者线程主要负责接收报警报文,解析报警报文。消费者线程负责将报文存储在内存中。
如前言所述,报警如何展示是根据业主的需要定的。而报警内容是相对固定的。这恰恰是Model/View 设计模式擅长处理的领域。所以在RT21 报警窗整体上采用多线程和Model/View 设计架构。
另外,报警类的抽象也是软件设计中重要的一环。我们把报警窗中的报警分为两类,一类是历史报警,一类是摘要报警。历史报警没有报警返回,报警确认后即消失,在报警消失之前不会改变,是“静态”的报警。摘要报警是动态的报警,该条报警反应了系统点的最新状态,有报警,报警返回,报警确认,报警返回和确认和消失五种状态。摘要报警在不同的状态下,对报警确认,报警刷新,报警返回刷新的反应也是不一样的。此时,使用state 模式设计报警类,可以增强代码的可扩展性和可维护性。
3 Model/View 模式的应用
在着名的《设计模式》一书中,Gramma 等写到:MVC 包括三种对象。Model 代表应用对象,View 代表屏幕展现,CONtroller 定义了用户输入的接口。在MVC 模式流行之前,人机界面的设计往往将这些对象混合在一起。MVC 将他们解耦,提高了程序的柔性和可复用性。在Qt 中,将View 和Controller 结合起来,就有了Model/View 设计模式。这样仍然将数据和屏幕展现分开,并且在和MVC 相同的原则下,类库更小,更容易使用。
图 1 中的delegate 主要是为了用户可以定制如何通过View 修改Model 中的数据和View渲染Model 中的数据而提供的类接口。
图1 Qt 的Model/View 模式
在 Qt 的Model/View 模式框架下,View 通过索引访问Model 中的数据,然后将数据展示出来。Model、View 和Delegate 之间通过Qt 的信号与槽机制通讯。
●Model 发出信号通知View,Model 中的数据发生了改变。
● 如果用户通过人机接口操作,View 发出信号,通知哪个显示单元被修改。
● 当编辑器的状态发生变化时,Delegate 发出信号通知Model 和View。
在应用Model/View 模式到具体问题时,首要考虑的问题是数据采用何种数据结构存储。
报警窗采用了boost 库中circular_buffer 存储报警。这是因为,第一报警窗展示报警,需要能够快速随机访问数据结构中的数据。第二,报警窗中的容量不可能无限大控制工程网版权所有,当达到一定容量的报警时,应当以最新的报警替换掉最老的报警。
其次,要考虑在历史报警和摘要报警变化时发出恰当的信号。如果发出的信号不恰当,会严重影响报警窗的效率。
另外,Model 和View 的分离,就可以很容易实现一份数据供几个不同的过滤条件的报警窗同时显示。比如在轨道交通综合监控领域非常流行的最新三条告警,实现时就不需要修改报警窗主体代码,另外添加一个View 搭配一个Proxy Model 就可以了。在Qt 的Model类库中,Proxy Model 是专门用来对数据进行排序过滤用的Model。
4 state 模式抽象Rt21 的报警类
用最简单的话介绍 state 模式就是:允许一个对象在其状态改变时,它的行为也会改变。看起来对象似乎修改了它的类。
在逻辑上报警分为两种,历史报警和摘要报警。历史报警行为比较简单,没有报警返回,报警确认后即从报警窗上删除。摘要报警行为相对复杂,摘要报警反应了报警点最新的状态(报警?报警返回?),有报警返回,报警确认后是否删除要根据该报警点的配置决定。针对摘要报警有三种外部动作,报警返回刷新www.cechina.cn,报警刷新,报警确认。摘要报警有五种状态:报警、报警返回、报警确认、报警返回并确认和报警消失。
重庆、南京和广州不同的业主对报警窗的逻辑提出了不同的要求。比如重庆的业主提出已经确认的报警在报警返回时直接删除。而南京的业主就希望在报警返回后仍需要操作员的确认。以state 模式设计的不同状态的报警耦合度很低,所以修改某一部分不会影响其他部分,这样在修改代码时保证了代码的健壮性。另外,可以增加报警点的配置来满足不同用户的需求。
5 总结
报警窗是现代大型综合监控系统人机界面的重要组成部分。大容量实时处理能力,灵活的配置能力以及高可靠性是报警窗必须具备的性能。我们采用多线程计术,Model/View 的整体架构www.cechina.cn,state 模式设计并实现了Rt21 系统的报警窗。经过与WRSA 公司开发的SystematICS综合监控系统的报警窗比较,Rt21 系统的报警窗在效率和友好度方面更胜一筹。