贴一些资料上来:http://www.chinakong.net/asp/artical/list.asp?owner=3&Curpage=3
容错技术在控制系统软件中的应用
梁立勇(河北科技大学) 刁哲军 艾树峰(河北师范大学电子系)
摘 要:针对控制系统对软件的可靠性的要求,论述了在控制软件设计中几种常用的容错方法。
关键词:容错;冗余;控制系统
实时控制系统要求连续运行,不允许故障停机,也不允许因程序错误而产生错误的控制输出。这就要求系统的可靠性。提高系统可靠性的方法有排错设计和容错设计。排错设计,是指在系统设计时努力消除各种干扰将错误、故障排除在外,使系统失效的概率减少到最小。但排错技术不能将干扰完全解决。而容错就是允许系统发生故障,借助于冗余技术而使其自动抵消,在故障存在的情况下也能使系统正常运行。容错设计采用的是投入超常规设计所需的资源即附加资源来换取常规设计所不能达到的高可靠性。这些附加资源有硬件、软件、时间以及它们的组合等等。这也就是冗余技术。
一、下面介绍一下常用的几种软件容错方法
1、时间冗余
在程序的适当位置设置若干检查点,在每一个检查点保存程序在该检查点之前正确运行而得到的全部信息及标志。如果故障是暂时性的则程序卷回到上一检查点开始重新执行,这样可以完全消除错误。它只能检出而不能消除永久性故障。
正确设置检查点非常重要,设置过多会使计算和检查点信息处理时间增加,设置太少又会使程序卷回太长。此外,对于实时控制系统中只允许执行一次的特殊过程不可重复。例如某些涉及输入、输出的操作。如图1所示。
图1 卷回操作程序框图
2、N版本程序设计
从形式上看,N版本设计与N冗余的容错方式类似
三模冗余(TMR)是最常见的硬件冗余方法,最初是由Von.Neumann提出的,其基本思想如图2所示。
图2 三模冗余框图
其中M为结构、功能完全相同的模块,V为多数表决器。表决器将三个模块的输出做多数表决,其结果作为其输出。设单个模块的可靠度为R,则三模冗余结构的可靠度为:
RTMR=R3M+3R3M(1-RM)=3R2M-2R3M
三模冗余向上推广即为N模冗余,向下可构成双机系统。
在N版本程序设计中,也同样为某一确定功能而独立编制的几个程序同时运行,其结果是通过这些独立程序的运行结果经多数表决而得到的。N版本程序设计中,特别强调N版本因为如果各程序采用了相同的结构、相同的算法,就有可能产生相同的错误而使多数表决失败。
N版本程序设计中包含了程序设计上的冗余,用效率换取可靠性,能容忍设计错误的能力,还能屏蔽某些类型的暂时性硬件故障。
数据的冗余保护也是N版本程序设计思想的应用。将重要数据同时存入几个不相邻的存储单元因干扰而被同时改写的可能性很小,因此即使有一、两个存贮单元出错也能得到正确的数据。
三版本程序结构框图如图3所示。
图3 三版本程序结构框图
下面给出的是PASCAL程序,在程序中,result、result1、result2、result3分别为最终、程序1、程序2、程序3的输出结果,er的值标志着发生错误的程序号,er=0则无错误程序,devla的值是认为程序输出等价的充分相似程度,ERROR为三个输出均不相等时的错误处理模块。
程序:
PROCEDURE TVP(result:real;er:lnteger)
CONST devla=?
VAR er:lnteger
result,result1,result2,result3:real
BEGIN result:=0; er:=0
BEGIN
程序1
END (result1)
BEGIN
程序2
END (result2)
BEGIN
程序3
END (result3)
IF |result1-result2|>devla→
IF |result1-result3|>devla→
IF |result2-result3|>devla→
|result2-result3|<devla→result:=result2;er:=1
ENDIF
|result1-result3|<devla→result:=result1;er:=2
ENDIF
|result1-result2|<devla→result:=result1
IF |result1-result3|>devla→er:=3
|result1-result3|<devla→er:=0
ENDIF
ENDIF
END{result,er}
3、弃权规则
弃权规则就是当程序运行或继续运行的某些必要条件未能具备时,放弃对这些条件的要求,不是产生等待、中断、出错或停机,而是采用跳过、转移、N-1默认等方式保证程序继续运行,这些方法只适用于屏蔽暂时故障,所以要求同时产生报警输出,以便确定是否需要人为干预来消除永久故障。弃权规则首先要不影响程序的正确性和适用性,还应对要求的条件有重试、重读、等待的过程。必要条件是指运行程序所需的资源,包括:外设、存储空间时间、数据信息等。必要条件未能具备包括:一是条件未形成或未出现;二是条件具备了但含有不合理性,如采集到的数据超出允许范围控制台输入了非常操作指令等。
(1)跳过
指在不影响控制系统正常运行的前提下,跳过条件没具备而导致故障的模块向下执行,这是软件失效运行的形式之一。所谓软件失效运行就是在故障发生时先把故障模块从系统中断开,再对系统的其余模块进行重构,使系统能继续运行,但功能降低、即降级运行。可靠性的提高是以某些功能的损失为代价的。例如程序运行到打印输出模块时,而打印机离线,则跳过这一输出模块继续向下运行。
(2)转移
这是在某些未考虑容易设计的软件中,当错误发生后往往会导致机器死锁,需要重新启动及初始化操作。转移可以在错误发生并检测到以后,根据某些标志的取值转不同的错误处理程序或执行后备程序。根据标志实现转移不论是高级语言还是汇编语言都是容易做到的,例如BASIC语言中的ON ERROR语句。
程序:
10 在打印机上列出学生名和成绩
20 ON ERROR GOTO 500
30 LPRINT "NAME"; "GRADE":LPRINT
40 READ S.NAME$,GRADE
50 WHILE S.NAME$ <> "$END$"
60 LPRINT S.NAME$,GRADE
70 READ S.NAME$,GRADE
80 WEND
90 ON ERROR GOTO 2000 '2000语句为程序出口
100 RETURN
500 IF ERROR=24 OR ERROR=27 THEN
INPUT "打印机未打开,打开后请回车。",A$
RESUME
510 ERR=24、27为DEVICE FAULT
520 IF ERR=4 THEN
PRINT "末记录未找到。":RETURN
530 ERR=4 为 OUT OF DATA
540 IF ERR=1000 THEN
PRINT "数据错,跳过这个记录。"
READ A$,B$
RINT A$,B$:RESUME
550 ON ERROR GOTO 2000
1000 DATA Peter,90,Bob,84…,Mary,88,$END$, 0
2000 错误处理语句
(3)N-1方式
N-1方式是基于控制程序的循环执行特性,即采用上一循环(第N-1次)的数据代替本次循环(第N次)所需的却未出现或未具备的数据。这种方法特别适用于缓变的被控对象。例如某次控制输出被判断为不合理,则利用上次循环的输出代替之。
改进的N-1方式增加了趋势补偿,即用N-1次的数据加系统变化的趋势补偿作为采用的数据设第N-1次循环数据为Dn-1,第n-2次循环数据为Dn-2而第N次循环故障,则代用数据为:
Dn=Dn-1+(Dn-1-Dn-2)=2Dn-1-Dn-2
趋势补偿的加入使系统的可靠性和正确性都大大增加了。
(4)默认
默认也是弃权规则的形式之一,与跳过不同的是采用预先置入的合理条件代替未具备的条件,即默认为条件存在。例如将非法输入的操作指令默认为无输入,继续原操作。
总之,弃权规则的目的是使工作在实时方式的控制系统保证连续运行,以确保被控系统的长期稳定工作,虽然系统的功能有可能降低。
4、非正常性规则
实践证明,在工业控制系统中,特别是在环境条件差、系统工作初期或不稳定时,以及操作人员水平尚不高时,系统常常遇到非正常情况,对控制系统造成不利影响,甚至导致灾难性后果。例如非法的控制台操作、非法的数据输入或输出、运算结果及中间数据出现上溢或下溢等。
非正常性规则要求软件设计要充分考虑当非正常条件出现时的容错处理。因为程序员在软件设计中通常会无意识地只考虑正常情况,只有明确提出应严格遵循非正常性规则时,程序员才会自觉地在设计中有针对性地研究对异常情况的容错处理,以避免造成系统的故障与错误。
在工业现场会遇到许多意想不到的情况,采用非正常性规则的容错设计可以有效地屏蔽偶然的故障,提高系统的可靠性。
与非正常性规则类似的是边缘值规则。根据经验,程序往往在处理边缘情况时发生错误。边缘情况指的是输入或输出允许值范围的边界值。例如某数组的上、下边界和循环变量的初值与终值。边缘值规则要求在软件设计中充分考虑处理边界值的情况,在软件测试中采用的边缘值分析法对排错也是非常有效的。
5、失效保险设计
在钢铁冶金、石油化工等生产过程控制系统中,既要求系统能长期稳定地不间断运行,又要求保证系统控制输出的正确性。如果因某一系统或某一模块失效而导致了错误的输出,则一旦被执行将对生产过程构成严重威胁,甚至产生灾难性后果。采用失效保险设计是解决这种问题的方法之一。
失效保险设计是在系统发生故障时,其输出呈现一预定的安全值,从而减少了可能受损失的程度。例如当发生故障时某些阀门被关闭就是取其安全值。
失效保险设计涉及到数据合理性判断的问题。数据合理性判断就是利用检测方法对所处理的数据产生合理性或不合理性判断从而决定接受或不接受该数据的过程。数据有输入数据、中间数据和输出数据;合理性有范围合理性、类型合理性、变化量合理性和逻辑合理性等。
下面是一个输入数据范围合理性判断的QUICK BASIC程序例子。
INPUT "输入数据:", VALUE
DO WHILE VALUE < LOW OR VALUE > HIGH
BEEP
PRINT "数据应在";LOW;"到";HIGH;
"之间。"
INPUT "重新输入:",VALUE
LOOP
有时数据的合理性不能直接判断时,可由附加的检测程序根据几个数据之间的某些关系进行判断。
控制系统常用的容错方法很多,以上介绍的几种常用软件容错方法是作者在长期工作实践中摸索出的一些经验,在此提出供参考。