王 晶
SCADA系统即数据采集与监视控制系统,是由调度中心(MS)、通讯网络和控制终端(RTU)3大部分构成的计算机集群实时控制系统,是实现高速电气化铁路电力调度自动化的主要装备。
近年来,随着铁道电气化行业的发展,对于SCADA系统可扩展性、承载大容量数据处理的要求越来越高,既有SCADA系统暴露出下述弊端:既有SCADA系统形式上采用分布式架构,但大多数厂商开发的SCADA系统通常简单地将服务器划分为应用服务器和数据服务器,通讯模块与实时数据库模块紧密耦合在一起构成数据服务器,没有实现真正的分布式计算。一方面,使得远动系统扩展性差;另一方面,使得数据服务器端负载较重,服务器在运行时可能出现由于崩溃导致的服务中断问题,无法实现远动业务连续性。另外,分布式的系统构架必然涉及到进程间通讯的问题。进程通讯是一切分布式系统的核心。大多数SCADA系统通常采用远程过程调用(RPC)、远程对象调用(RMI)以及消息中间件(MOM)这3类中间件服务作为系统进程间通讯机制,面对大数据量的服务器节点数据交互,这些机制已不能完全满足SCADA系统对于实时性的要求。
因此,本文从上述问题出发,研究基于组播通讯的SCADA系统,力求实现真正意义上的分布式的、松散耦合的SCADA系统。
在分布式系统中,通常需要将一个节点的信号传送到多个节点,这时,无论采用广播方式,还是采用重复点对点的通讯方式(即单播方式),都会严重浪费网络带宽,只有组播才是最好的选择。因此,在分布式系统中较为推崇的通讯方式是组播。组播通讯是指组成员之间以点对点、点对多点的方式进行通讯,其中:成员是组的一部分,成员是节点,而组是集群。节点是一个主机上的一个进程,一个集群可以有一个或多个节点,一台主机也可以有一个或多个节点,这些节点可以全部属于一个集群,也可以部分属于一个集群。
目前,组播通讯中应用的比较多的是JGroups技术。JGroups是一个纯JAVA编写的可靠的群组通讯工具,其工作模式基于IP多播,但可以在可靠性和群组功能上进行扩展。其中,可靠性包括:消息不丢失、大消息拆分和重组功能、保证消息有序性、消息原子性(某条消息要么全部成员都收到,或都收不到);群组功能包括:群组成员知晓群组内所有其他成员,当新成员加入群、旧成员离开群或某现有组成员意外脱离群时,所有群组成员都能收到通知。JGroups在结构上设计灵活,提供了一种灵活兼容多种协议的协议栈,该协议栈可以让用户根据不同的可靠性指标,在对可靠性高但速度慢和可靠性差但速度快的效果之间作出折衷的量化选择。基于上述特点,JGroups多应用在服务器集群、多服务器通讯、分布式缓存、服务器复制等场合。目前在JBoss Application Server Clustering,OSCache Clustering Jetty HTTP session replication,Tomcat HTTP session replication中都使用了JGroups,但国内对于该技术的研究、应用较少。
根据SCADA系统的业务及性能需求,本文基于JGroups技术设计了图1所示的系统架构。该架构采用模块化的设计方式,将系统总体实现划分为4个模块的实现,各模块间松散耦合,通过消息管理模块实现数据交互,如图1所示。
图1 基于组播通讯的电铁SCADA系统体系框架图
(1)消息管理模块(GroupsManager)提供消息管理服务,作为系统其他模块间交互的媒介,以高效的消息交互机制提供其他各模块间以单播、组播的方式进行交互的功能。该模块是独立的,可以将其部署在各服务器节点上,使得其他各模块通过所在节点的GroupsManager模块进行消息交互。这样,可以根据需要将系统服务器端划分成多个节点,有效减轻服务器端负载,实现真正意义上的分布式的、松散耦合的系统架构。
(2)通讯模块(COMMServer)提供与子站通讯服务,一方面,根据子站上传的报文类型解析报文,将解析结果通过封装的GroupsManager模块发布给所有节点;另一方面,为人机界面提供远程调用接口,向子站发送命令。
(3)实时数据库模块(RTDBServer)主要负责接收通讯原始数据信息,处理数据,并通过封装的GroupsManager模块实时发布数据处理结果。
(4)人机界面(MMI)是人机交互的接口。界面实时数据的刷新同样依赖 GroupsManager模块实现。
容错性是衡量系统性能的关键指标。容错主要依靠冗余设计实现,它以增加资源的办法换取可靠性。软件冗余的基本思想是用多个不同软件执行同一功能,利用软件设计差异实现容错。该系统冗余设计的典型部署结构如图2所示。其中,D1和D2互为主备,Server1和Server2互为主备,D1、D2、Server1、Server2分别部署在不同的服务器上,COMMServer、RTDBServer、MMI分别部署在不同的节点上。
图2 系统部署结构示意图
SCADA系统容错性通过部署在各节点上的GroupsManager模块实现。GroupsManager模块通过使用Jgroups技术的发现、检测故障等功能,提高了系统的容错能力。具体而言,GroupsManager模块通过下述3个步骤实现系统容错性:
(1)自动侦测。在组成员改变(节点加入、离开或意外脱离)时,组中其他成员可以得到视图改变通知。
(2)自动切换。当确认某一节点离开时,或当故障节点恢复后加入组,组内同类正常节点以及新加入的节点需要根据相应的逻辑进行主备切换。
(3)自动恢复。故障节点被替换后,进行故障隔离,离线进行故障恢复,恢复后主动加入组。
消息管理模块的性能优劣是能否有效解决既有SCADA系统模块紧耦合、扩展难、数据处理效率低等问题的关键。高性能的消息管理模块应建立在高效的进程通讯机制的基础上。本文采用JGroups技术设计了符合远动业务及性能需求的通讯机制,并描述了基于该通讯机制的消息管理模块的模块化设计结果。
使用分布式进程间通讯方法时,总是要创建一个相应的用于通讯的数据结构。发送数据时,系统按照该结构组织消息;接收数据时,系统根据该结构解析消息,获取需要的数据实体。考虑到远动系统各节点间有大量的消息交互,并且消息类型各异,设计的消息格式需要有一定的灵活性,因此设计了如图3所示的消息实体格式,该设计结构使得消息接收者可以方便地获取需要的数据。
图3 消息实体格式框图
(1)消息类型标识:用以唯一标识一种消息类型。本文把消息类型大致划分为系统消息与视图消息2大类:为实现远动系统业务功能,系统节点间需要有点对点、点对多点的消息交互,该类消息称之为系统消息,系统消息可以根据参与交互的节点类型进行细划;视图消息使用了JGroups群组功能的思路,包含所有组成员的一个组称为一个视图,当视图因为某成员状态改变而改变时,视图其他成员可以得到通知,该类消息主要用于系统容错实现。
(2)参数个数:数据实体所包含的信息量。
(3)参数类型标识:用以唯一标识一种参数类型,用于数据解析时获取参数值。
(4)参数长度:某参数在数组中所占的位数。
(5)参数值:某参数的字符型数值。
GroupsManager基于JGroups技术实现,封装了JGroups的消息收发功能,采用JGroups的组播方式传播消息。模块划分如图4所示。
图4 系统消息管理模块划分示意图
(1)消息过滤模块。因为系统某些节点之间不存在消息交互、或者存在部分消息交互,而系统当前的消息机制是组内所有成员均可发布、接收消息,因此设计了消息过滤模块,该模块封装了消息发送和接收过滤的方法,使得所在节点只发送和接收相关的消息。
(2)消息监听模块。消息监听模块负责接收集群中视图消息以及各个节点发送的系统消息。
(3)组消息模块。JGroups提供了专门的Message类,通过JGroups传播的消息需要封装成Message对象。组消息模块负责将待发送数据组织成2.1节的消息格式,然后封装成Message对象进行发送。
(4)状态机模块。状态机模块针对系统容错性能而设计,考虑主用节点退出时,以及当退出的节点再次加入集群时,如何进行状态转换。
(1)消息定义。JGroups提供了专门的Message类,通过JGroups传播的消息需要封装成特定的消息类型,即:
Message message = new Message(Address dest,Address src,Serializable obj);
其中,dest是接收端地址,src为发送端地址,obj为封装成2.1节的消息格式的消息实体。
(2)会话通道连接。
JChannel channel = new JChannel(new File("conf/protocol.xml")); //会话通道创建
channel.connect(clusterName); //会话通道连接
(3)消息接收。消息接收主要通过扩展JGroups中的ExtendedReceiverAdapter类实现:
public void viewAccepted(View new_view); //视图消息接收处理
public void receive(Message message); //系统消息接收处理
(4)消息发送。
channel.send(new Message(Address dest,Address src, Serializable obj)); //消息发送
系统测试的硬件架构如图5所示。SCADA系统采用分布式架构,服务器端采用JAVA语言开发,因此系统具有良好的松散耦合性以及扩展性。从负载均衡考虑,将系统各模块部署在2台服务器以及2台PC机上。其中,通讯模块部署在通讯服务器上,系统数据库及实时数据库模块部署在数据库服务器上,调度员工作站1及调度员工作站2负责系统人机界面的部署、显示。各台服务器均部署在Linux平台下运行。
本文对大数据量下的系统实时性进行了严格测试,同时模拟了各同类服务器节点相互切换的情况。近2个月的测试结果表明,系统运行稳定,可以平稳地显示和控制实时的供电系统运行状态,具有良好的实时性与可靠性。
图5 系统测试硬件结构图
针对既有SCADA系统紧耦合、扩展难、数据处理效率低的问题,本文提出了建立基于JGroups技术的消息处理机制的解决方案,并在该基础上实现了分布式的、松散耦合的SCADA系统。测试结果表明该系统具有良好的实时性与可靠性,可以作为电铁SCADA系统的主站解决方案。另外,本文所采用的架构在国内SCADA系统中还很少见,可供对分布式的SCADA系统的研究与应用借鉴。
[1] 钱清泉. 电气化铁道微机监控技术[M]. 北京: 中国铁道出版社, 2000.
[2] (英) Ian Sommerville. 软件工程[M]. 北京: 机械工业出版社, 中信出版社, 2003.
[3] Eckel B. Thinking in Java[M]. 北京: 机械工业出版社,2006.