一个分布式监控系统的软件设计
2009-05-04
作者:于恒春 杜世伟 汤冬谊 杨 丽
摘要:讨论了一个分布式监控系统的软件设计。给出了系统结构、冗余设计及软件设计要点。
关键词:分布式系统 网络通信 ActiveX自动化
1 系统结构
系统结构见图1,这是一个两级分布式监控系统。在现场级两台互为热备的现场计算机通过现场总线与现场设备相连,实时采集现场数据并向现场设备传送监控级发来的控制指令,同时把各种实时信息发送到监控级。在监控级,各监控计算机通过TCP/IP以太网与各现场计算机相连以获取现场数据,并提供GUI以便操作人员监视及控制现场设备。
2 冗余设计
对于可靠性要求较高的系统,常常采用冗余设计以提高可靠性。本系统的现场计算机为双机热备,监控级计算机也可根据需要进行双机热备。
双机热备必须解决故障识别和状态镜象两个问题,但为实现快速切换,应尽量简化算法,同时尽量减少交换信息,因此如果状态信息不是很重要,则不必随主备信息一起传送。基于上述思想,定义的主备机报文格式见图2,各字段的含义如下:
(1)信息标识:标识报文类型,共定义了三种报文:
a)普通报文:由主备机正常进行交互用的报文,称主机发往备机的报文为请求报文,备机发往主机的报文为应答报文。
b)切换报文:当主机想转为备机时,发送此报文。该报文是非常必要的,一种情况是当现场计算机与现场设备失去联系时,就需要主动进行切换。
c)退出报文:当某一台机器退出时,应发送此报文,否则对方将认为该机故障。
(2)主备标志:指示本站是否为主机,“1”表示主机,“0”表示备机。
(3)判决标志:当主备机的主备标志一致,即两者同时为主机或同时为备机时,应根据判决标志进行切换,该标志可以预先设定为一个值,也可以取IP地址或启动时间作为判决标志。判决条件可以取大于或小于。
具体实现方法为:主机定时向备机发送请求报文,备机收到后就发一个应答报文;同时另设一定时器,当收到对方的一个报文就把该定时器清0,与此同时定时器定时加1。若定时器溢出,则表示对方故障,否则表示对方正常。程序包括定时发送、故障检测及接收处理三部分,它们是并行工作的,流程图见图3。通过对发送定时器及检测定时器定时间隔及检测次数的设定,可以决定切换时间。
3 软件设计
系统软件分为现场级与监控级两部分,其中监控级包括人机接口及监控级自动化服务器两部分,见图4。下面讨论一下软件设计中的关键问题。
3.1 数据传输方式及通信可靠性
本系统的网络操作系统为Windows NT,网络通信协议为TCP/IP,采用Windows Socket进行通信程序的设计。Windows Socket有流式与数据报两种。前者为面向连接服务,后者为无连接服务。考虑到监控系统的数据量较小,而对实时性要求较高,因此采用数据报方式。
采用数据报方式的另一点考虑是,它可以广播。在本系统中,现场工控机采用定时广播的方式传输数据,这种方式有如下优点:
1) 解决了主备机之间的数据镜像问题。
2) 不需设置IP地址。这有两层含义,一方面发送方不需知道接收方的地址,因为IP广播地址是个固定地址;另一方面,各监控计算机也不必知道各现场计算机的IP地址,因为当它收到广播后,就可以获得发送方的IP地址,然后把它存在一张地址表中,以后向该现场计算机发送指令时就可以直接从地址表中取出其IP地址。这种处理方法有点类似于TCP/IP协议地址解析中的动态联编[1]。但数据报方式的可靠性不如流式高。对于现场计算机,因为数据定时广播,这种可靠性的差别并无大碍。但对监控计算机而言,它发出一个请求,必须知道该请求是否被响应。因此采用了异步确认机制(见图5),处理过程为:在发送端设一张表,当发送一个请求时为该请求分配(或预先分配)一个标识,然后把该标识随同请求一起发出去,同时启动超时定时器;接收端响应该请求后,发回一个含有请求标识的应答报文;若接收端收到该应答报文,则删除表中的请求标识,同时定时器停止,否则将发生超时,表示请求未被响应。
3.2 系统信息的处理
监控系统中主要包括如下三种数据:
(1) 现场数据:包括现场信号测量值、设备运行状态、报警信息及其它由现场计算机产生的数据。
(2) 控制指令:如控制数字量输出、模拟量输出及现场设备等的控制字。
(3) 系统信息:主要是一些系统管理信息,如控制权限,监控计算机登录状态等。
这些信息要么由现场计算机采集或产生,要么由监控计算机写入现场计算机,但最终还是要存入现场计算机并向外定时广播。前两种信息由于直接产生于或作用于现场,因此存于各自的现场计算机。但系统信息是全局信息,是所有站共享的信息,这样存在着如下问题:当监控计算机写入系统信息(如登录)时,应把它发向哪个现场计算机呢?如果向所有站广播,就存在着一致性问题。正确的做法是:把一台现场计算机作为系统服务器,系统信息都写入该服务器中,然后由它向其它站广播。那么应选择哪个现场计算机,并且使所有站(包括现场级与监控级)都选择同一个现场计算机?本系统采取一种动态算法实现了这种选择,并且当该现场计算机故障时自动转移到另外的现场计算机。
具体方法参见图6:设一张表及一个定时器组,当收到一个站的信息时就把该站的IP地址存入该表中,同时把相应的定时器清0;若定时器溢出,则将该站的IP地址置为无效值。当各计算机寻找系统服务器时,就顺序搜索该表,找到第一个有效IP地址,就把它作为系统服务器。
3.3 监控级自动化服务器的设计
监控级软件主要是为操作人员提供人机界面,但它同时还要与现场计算机进行通信,为把界面设计分离开来,我们采用了Microsoft ActivX自动化技术实现了这一设计思想。这样,界面设计人员可以采用目前流行的各种可视化开发工具集中精力进行界面设计,而且可以根据需要设计不同的界面,在我们的系统中就有两种界面。
自动化技术是Microsoft ActiveX组件技术中的一种,它包括自动化服务器和自动化控制器两种,其中自动化控制器是指使用和操纵自动化服务器的应用程序(如VBA),自动化技术通常是指自动化服务器。另一种最为常用的组件技术是ActiveX控件,但一个ActiveX控件只能提供一个IDispatch接口,而一个自动化服务器可以提供多个IDispatch接口。通过IDispatch接口,客户程序可以访问该接口的属性和方法。对于VBA客户程序来说,访问IDispatch接口的语法与访问VBA 对象的语法是一样的,因此,对于VBA客户程序而言,一个IDispatch接口就相当于一个对象。
自动化服务器通常采用层次结构来组织对象,Microsoft的许多自动化服务器都是这样组织的,如数据访问对象DAO。本系统的自动化服务器也采用了这样一种结构,见图7, 其中Workstation是指监控级各站,Station是指现场级各站,这只是个示意图。这种结构一方面体现了对象间的层次及包含关系,另一方面对象的创建、删除及组织也比较方便,整个服务器只需一个ProgID来标识。
客户程序创建服务器的过程为:首先利用ProgID创建顶层对象(Application),然后利用该顶层对象提供的方法创建各集合并向其中添加元素,对集合的操作类似于VBA中的collection对象,主要有Count(),Item(),Add()等几种。应当指出,上面所讨论的对象层次结构及集合的概念只是一种设计思想,并非有现成的设计工具,我们采用VC++ 6.0设计了自己的集合类及自动化服务器,客户端采用VB 6.0。
本系统是按照分布式的思想进行设计的。分布式的特点就在于各节点是平等的,在数据传输方式、冗余设计及系统服务器的选择等处理上都体现了这一思想。本文给出的冗余设计,是基于网络的一种方法,其实现不依赖于操作系统、编程语言,是一种比较通用的方法。组件技术是软件发展的方向,本系统利用自动化技术将界面设计与底层设计分离开来,各自进行独立设计,充分体现了组件技术的优越性。
参考文献
1 周明天,汪文勇. TCP/IP网络原理与技术. 北京:清华大学出版社
2 (美)Jerry Anderson. Visual C++5 ActiveX编程指南. 北京:清华大学出版社
3 (美)Peter Norton, Rob McGregor. MFC开发Windows 95/NT4应用程序. 北京:清华大学出版社