宋晓玉 施 波 马建新
(杭州和利时自动化有限公司,浙江 杭州 310018)
分布式控制系统(distributed control system,DCS)通常由现场控制站、服务器、工程师站、操作员站和网络组成,现已广泛应用于核电、火电和化工等工业自动化控制领域。在这些领域里,现场生产中发生的异常工况和DCS系统本身出现的故障都要实时上报,提醒操作人员及时处理,避免发生大的安全事故。DCS报警系统可以自动监视电站工况,并吸引操作员的注意力,它能提醒操作员电站发生的重大变化,需要操作员进行评估或者采取行动[1-2]。
报警系统是报警数据处理的中心环节,其能力和效率的高低直接影响着整个DCS系统的性能指标。因此,报警系统需要保证具有极高的实时性和可靠性,不允许缺漏或重复记录[3],并能够及时响应报警信息的查询和确认等操作。
报警是一条诊断的、预测的或指导的信息,用来提醒操作员并促使其注意到过程或系统偏差[4],操作员需要响应以保证系统的正常运行[5]。报警处理技术是工控系统中实时服务的核心部分,承担着维护系统稳定和安全的艰巨使命。大多国内外DCS系统都具有报警处理过程,支持报警判断、报警存储、报警查询和报警确认等功能。报警判断是根据用户组态的报警参数,对现场测点实时数据进行逻辑判断,确定其是否发生报警[6]。报警存储是将判断出的报警信息写入报警表进行有效管理,同时将报警信息进行磁盘存储,以方便故障分析。报警查询是按照指定的查询条件(如报警级、开关量/模拟量等)和查询顺序(如时间顺序和点名顺序)从报警表中读取报警信息,当瞬间发生多起报警时,操作员可按照报警的条件进行查看,快速识别出最危险的报警事件。报警确认是操作员站对已经接收到的报警信号进行确认,将确认指令发送给报警处理系统。
国内外大型DCS系统都已经从早期的模拟式、单点式发展为现今流行的报警列表处理方式,并且都具有完备的报警处理功能。但是,由于采用的技术和实现的方式不同,每一个DCS厂家的报警系统达到的技术和性能指标也各不相同。目前,传统的报警列表处理方式仍是大多数DCS厂家处理报警的主流技术。然而随着DCS系统对报警技术要求的不断提高,传统技术越来越无法满足实时处理和快速查询等需求。
报警事件处理通常包括报警发生、报警恢复和报警删除。其中,报警发生和报警恢复属于同类事件,同类事件不可能同时存在于报警表中。在报警处理过程中,如果报警表中已经存在一个点的报警发生事件,那么当该点的报警恢复时,报警恢复事件将覆盖报警发生事件。传统的报警处理流程是:查找同类事件记录——删除同类事件记录——移动后面事件记录——添加新事件记录。传统流程的缺点在于事件记录的无序查找和数据的频繁移动。这些无疑都降低了系统的高效性和稳定性;同时,其在支持报警确认功能和按点名顺序的报警查询功能上也有着极大的局限性。
单报警表结构只包括一张用于处理报警事件的表格,报警信息按报警事件发生的先后顺序存放于报警表中。查询报警记录时必须从前向后依次比较每一条记录,直到找到相同的报警信息为止。写入新报警事件时,如果不存在同类事件,只需简单地将新记录添加到表的末尾;如果存在同类事件,则需将同类事件从报警表中删除,并将其后所有记录向前移动,最后在表的末尾添加新事件。
单报警表结构非常简单,且易维护。但是,其查询效率很低,在添加和删除报警记录时可能会移动大量记录。因此,单报警表的结构设计根本无法满足大型DCS系统对报警事件处理的实时、高效和可用等要求。
虽然单报警表的结构很简单,但在报警事件处理和查询上存在致命的缺陷,为此设计了带点名索引的报警表结构。这种结构除包括一张用于处理报警事件的表格外,还包括一张点名索引表。
点名索引表是在处理新报警事件过程中建立的,且以点名的顺序排列。当查询某一报警记录时,首先采用二分查找法,在点名索引表中快速查找报警点,然后按照点名索引表所指向的报警表中的记录位置查找出报警记录。当产生一个新报警事件时,先判断点名索引表中是否存在此报警点的同类事件,如果不存在,则将报警点插入到点名索引表中,同时将报警记录添加到报警表的末尾;如果报警点存在,则按照点名索引表中的记录位置查找报警表中的记录,将其从报警表中删除,同时向前移动后面的所有记录,再将新报警事件添加到报警表的末尾。
带点名索引的报警表结构也比较简单,查询效率比单报警表高出许多,但是同样存在大量且频繁移动报警记录的问题,极大地影响了报警处理的速度。
随着国际核电标准的不断完善,大型DCS系统对报警子系统的可用性和可靠性提出了更高的要求,国外一些DCS厂家在新一代报警处理技术上也已做了很大改进[7],这也促使国内DCS厂家对报警系统进行新一轮的研发和创新。为了弥补单报警表和带点名索引的报警表存在的技术缺点,本文对报警表进行改进,提出了带双索引的报警表处理技术。
带双索引的报警表主要由表头、点名索引表、时序索引表和报警记录区组成,其结构如图1所示。其中,表头包括空闲单元个数、空闲单元首址、点名索引表首址、时序索引表首址和报警记录区首址。
图1 报警表结构Fig.1 Structure of the alarm table
空闲单元首址指向报警记录区中首个空闲单元的位置。所有空闲单元的位置不一定是连续的,它们之间的链接依赖于报警记录区中每一个记录单元的“链接下一个空闲单元”信息。
点名索引表包括点名信息以及点的时序号,即该点的报警信息在时序索引表中的位置。点名索引表中的点名按从小到大的次序排列,这有助于使用高效的查找算法快速定位点的位置。点名对应的时序号表示该点报警发生的时间顺序,通过时序号能对应到时序索引表中的时序信息。
时序索引表包括报警点在点名索引表中的位置和在报警记录区中的位置,时序索引表的每组信息都按时间顺序排列。通过时序索引表中的点位置可以对应到报警点在点名索引表中的位置,通过报警记录位置可以定位报警事件在报警记录区中的位置。
报警记录区中记录着每一条报警记录的详细信息,包括报警时间、报警点名、报警级、报警状态、报警描述以及“链接下一个空闲单元”等。值得注意的是,每一个报警记录单元都具有“链接下一个空闲单元”的信息,它仅用于指向下一个空闲单元并且仅在记录单元为空闲单元时才有效。在报警表初始化时,每一个记录单元的“链接下一个空闲单元”均指向此记录单元的下一个记录单元位置。
报警发生是现场生产发生异常状况或DCS系统出现故障时发出的报警。在报警发生之时,可能存在该点的恢复事件并未被确认的情况,按照一个点的同类事件不能同时存在于报警表的原则,在新报警写入时应删除存在的同类事件。因此,在新报警信息写入之前要在点名索引表中查找报警点,确定是否存在同类事件。现分别以同类事件不存在和同类事件存在的两种情况介绍报警发生时的处理过程。
3.2.1 同类报警不存在时
以报警点PN3’为例,同类报警不存在时报警发生的处理过程如图2所示。
图2 同类报警不存在时处理报警发生的过程Fig.2 Alarm occurrence processing when no similar alarm exists
同类报警不存在时的处理过程有以下几个步骤。
①在点名索引表中找到新报警点的插入位置;同时,将新报警记录添加到空闲单元首址所指向的报警记录区中的记录位置,并将空闲单元首址修改为该记录单元的“链接的下一个空闲单元”,如图2(a)所示。
②在时序索引表的空闲位置追加一条时序记录,其记录位置为报警点在报警记录区中的记录位置,点位置为报警点在点名索引表中的插入位置,如图2(b)所示。
③在点名索引表中将插入位置及其后的所有记录向后移一位,同时这些记录的时序号所指向的时序索引表中的记录的点位置都加1。将新报警记录的点名写入点名索引表的插入位置,其时序号为时序索引表中新追加的时序记录的时序位置,如图2(c)所示。
3.2.2 同类报警存在时
以报警点PN3为例,同类报警存在时报警发生的处理过程如图3所示。
图3 同类报警存在时处理报警发生的过程Fig.3 Alarm occurrence processing when similar alarm exists
同类报警存在时的处理过程有以下几个步骤。
①在点名索引表中找到报警点位置;根据报警点位置在点名索引表中获取该报警点的时序位置;在时序索引表中根据时序位置获得报警记录位置,如图3(a)所示。
②在时序索引表中删除时序位置的记录,且其后所有时序记录中的点位置所指向的点名索引表中的记录的时序号都减1;同时,在报警记录区中修改处于记录位置的报警记录的内容,如图3(b)所示。
③在时序索引表中追加一条记录,该时序记录中的记录位置为报警信息在报警记录区中的记录位置,点位置为报警点在点名索引表中的位置(报警点位置)。同时,在点名索引表中将该点记录的时序号修改为时序索引表中追加的时序位置,如图3(c)所示。
报警删除是删除报警表中存在的报警记录。以删除PN3的报警记录为例,删除过程有以下几个步骤。
①在点名索引表中找到删除报警点的位置;根据报警点位置在点名索引表中获取该报警点的时序位置;在时序索引表中根据时序位置获得报警记录位置。
②在报警记录区中,将记录位置的单元信息中“链接下一个空闲单元”修改为表头的空闲单元首址指向的位置,将表头的空闲单元首址修改为此报警记录位置。同时,在时序索引表中删除该记录,并且其后所有时序记录中的点位置所指向的点名索引表中的记录的时序号都减1。
③删除点名索引表中的报警点位置的记录,同时被删除记录之后的所有记录的时序号所指向的时序索引表中的记录的点名位置都减1。
报警删除后的结果如图4所示。
图4 删除报警事件后的结果Fig.4 Result after deleting alarm events
报警恢复是在报警发生后现场生产或DCS设备等异常状况消失时发出的事件。
基于上述介绍的传统报警处理技术和带双索引的报警处理技术,本文通过试验对其进行对比,并给出了分析结果。
验证传统报警处理技术和带双索引的报警处理技术的基本思想是:在同样的试验环境下,采用同样的实例对比单报警表、带点名索引的报警表和带双索引的报警表的优缺点。试验环境:CPU为Intel Pentium E2160.1.8 GHz,内存为1 GB ,操作系统为 Windows XP,开发平台为VC6.0。试验数据:准备4 000个产生报警事件的报警点(AlarmA[0 ~160]、AlarmB[0 ~160]、AlarmC[0~160]、…、AlarmY[0~160])。下面以两个实例对比不同报警技术在处理报警事件时的情况。
① 以 AlarmA0、AlarmB0、…、AlarmY0,AlarmA1、AlarmB1、…、AlarmY1…的顺序分别产生 500、1 000、1 500、2 000、2 500、3 000、3 500 和 4 000 个报警事件。单报警表、带点名索引的报警表和带双索引的报警表在添加新报警事件的耗时情况如图5所示。
图5 添加新报警事件的耗时情况Fig.5 Time-consuming for adding new alarm events
② 在实例①的基础上,以AlarmA0、AlarmB0、…、AlarmY0,AlarmA1、AlarmB1、…、AlarmY1…的顺序添加同样数量的同类报警事件。添加同类报警事件时记录移动规模的试验结果如图6所示。其中,每条报警记录大小为200 B,每个点名索引记录为34 B,每个时序索引记录为4 B。
图6 记录移动的规模Fig.6 Scale of moving records
在实际过程中,我们也做了大量且不同情况的试验,得出的结果和上述实例基本一致。
4.2.1 时间复杂度
添加新报警事件的时间主要耗费在查找同类报警记录和移动记录上。带点名索引和带双索引的报警表可以采用二分法在点名索引表中查找同类报警,其时间复杂度为O(log2n);而单报警表需要逐个比较已产生的事件,其时间复杂度为O(log2n)。在移动记录上由于移动数据的空间不同,带双索引的报警表也将比传统技术要省时。
4.2.2 查询报警信息的效率
传统的报警记录是按时间顺序排列的,而带双索引表的报警表中虽然报警记录不是按时间排序的,但是其具有时序索引表。因此,在按时间顺序查询上,传统方法和双索引表结构方法效率基本相同;在按点名顺序查询效率上,由于带点名索引和带双索引的报警表具有点名索引表,因此它们支持按点名顺序的快速查找方式,而单报警表的点名顺序查找就极其低效。
4.2.3 报警记录的移动规模
对比一个点名索引信息和一个时序索引信息所占的内存空间,一条报警记录所占的内存空间要大许多倍。在双索引表结构中,报警处理过程中只需要移动点名索引表和时序索引表中的信息。相比传统方法移动大量报警记录而言,带双索引结构的报警表需要移动的数据量小,直接效果就是报警处理的速度非常高效。
本文在传统报警处理技术的基础上,对报警表进行了改进,实现了双索引结构的报警处理技术。试验证明,与传统的报警处理技术相比,带双索引的报警处理技术在处理效率上更加高效,在提供的功能上更加完善。该技术目前已应用于大型核电站和火电站的自动化控制系统中。
[1]The Engineering Equipment and Materials Users Association.EEMUA 191:2007 Alarm systems-a guide to design,management and procurement[S].London UK,1999.
[2]张淑慧.报警系统设计方法综述[J].核科学与工程,2008,28(3):273 -279.
[3]马旭东.DCS系统异常事件管理实时软件设计[J].计算机应用研究,1995,12(2):50 -51.
[4]International Electrotechnical Commission.IEC 62241:2004 Nuclear power plantsmain control roomalarm functions and presentation[S].Germany,2004.
[5]马国华.监控组态软件及其应用[M].北京:清华大学出版社,2001.
[6]董艳,陆会明,张东练.RTDB报警与事件的订阅/发布研究[J].电子测量与仪器学报,2008,22(z1):247 -250.
[7]陈浩,郑明光.核电站诊断与报警系统的发展[J].上海铁道大学学报:自然科学版,2000,21(6):108-113.