高可靠系统中软件容错技术的应用
本文首先阐述了关键设备的嵌入式系统选择容错技术的情况,从实现成本和性价比方面考虑,采用恢复块方法,实现了测量的可靠性,同时也说明了服务端和PDA使用了防卫式程序设计的情况,然后从可靠性和实时性方面分析了容错技术的应用效果。
【关键词】软件 容错技术 N版本方法 恢复块技术
2012年底,我参与了中国石油某分公司MSES项目,项目全称是生产安全受控系统,作为石化特殊行业软件,MSES对软件可靠性有很高的要求,我作为项目负责人承担了设计工作。项目实施的目的是在各炼厂推行生产受控管理,减少生产过程中的违规操作,石化公司炼厂类型多,流程复杂,为了使项目达到适应炼厂各种作业需求,开发组用了一个月在各炼厂调研,经过分析,总结出个炼厂共同需求,将整个业务流程统一在"制定工作流程、获取流程、依据流程作业,返馈作业数据、工作汇总分析"五个流程中。
项目的作业流程在服务端制定,使用移动终端(PDA)在现场进行作业,同时我们针对一些关键作业点开发了嵌入式测量系统。具体来说,MSES是面向石化的特殊行业软件,有以下一些特点:
(1)项目要求使用经中石油能源一号网认证的防爆设备,即行业移动终端,以下简称PDA,运行wincw系统。
(2)由于石化炼厂有各种易燃、易爆产品,对安全性有很高的要求,关键作业点设备数据的采集不能使用带电测量,必须用无电的光纤测方式,且光纤具有抗雷电和磁场干扰,传输距离远的特点。
(3)公司生产管理部需要对作业流程进行管理,对作业完成率进行汇总,需提供中心服务器,由PDA将所有作业数据上传到服务器。
石化违规操作造成的损失是巨大的,如2012年3月,中石化某公司合成橡胶厂碳四抽提装置由于违规操作发生火灾事故,造成几千万元的损失。实施MSES的目的就是在根本上保证生产过程的可靠,从作业数据的可靠性、作业流程的可靠性和作业数据汇总分析这三方面杜决事故的发生。保证MSES项目软件的可靠性是受控管理的前题,因此我们在软件设计阶段用对嵌入式软件、PDA软件、服务端软件进行了分析,针对三类软件设计了保障软件可靠性的手段。
提高计算机可靠性的技术分为避错技术和容错技术,避错是预防和避免系统在运行时出错。实践证明保障软件可靠性最有效最经济最重要的手段是在软件设计阶段釆取措施进行可靠 性控制。可靠性设计其实就是在常规的软件设计中,应用各种方法和技术,使程序设计在兼顾用户的功能和性能需求的同时,全面满足软件的可靠性要求,即采用一些技术手段,把可靠性"设计"到软件中去。软件可靠性设计技术主要有容错设计、检错设计和降低复杂度设计等技术,由于石化行业对软件高可行的要求,我们把容错技术作为MSES的主要可靠性设计方法。
嵌入式软件是用于关键设备的数据采集,设备使用光纤测量方式。光纤末端连接温度、压力光栅探头,安装在设备上,经过长距离传输(l公果以上),将光信号引入控制室的嵌入系统上。嵌入式系统将光信号转化为两种电信号,一种是光栅的脉冲,一种是光纤的数字信号。由软件对电信号分析测量,得到需要的数据。我们在设计嵌入式软件可靠性时,对使用N版本程序设计和使用恢复块方法有过比较和选择。
N版本程序设计是一种静态故障屏蔽技术,采用前向恢复策略,其设计思想是用N个具有相同功能的程序同时执行一项计算,结果通过多数表决来选择。 其中N份程序必须由不同的人独立设计,使用不同的方法,不同语言,不同的开发环境和工具来实现。我们考虑到这种方式需要大量的开发人员,MSES项目涉及几种类型的关键设备,这样的可靠性开发成本太高,且这种可靠度性价比也不合算,因此我们考虑使用恢复块方法。
恢复块是一动态故障屏蔽技术,采用后向恢复策略,它提供功能相同的 主块和多个后备块,一个块就是一个执行完整的程序段,主块首先投入运行,运行结束后进行验证测试,如果没有通过验证测试,系统经现场恢复后由一后备块运行。我们从光纤信号转换成的电信号分析,第一种信号是脉冲,脉冲的宽度显示了数据的变化,这种信号精确,处理简单,实时性高,但光栅容易失效;第二种信号是数字信号,需要用数字信号处理方式作大量滤波,这种方式处理复杂,但不容易失效。我们用两个程分别实现了这种采集方式,用光栅测量作为主块,用数字信号测量作为备用块。
嵌入式软件使用C语言编写,主块在运行时,备用块停止运行,软件使用周期测量方式,测量周期是500毫秒,主块发生故障时,在5个周期内即可判断出来,在5个周期内切换到备用块,5个周期内数据即可稳定,所以出现故障后,软件可在7.5秒内正常运行;验证程序完成程序的故障功能,它本身的故障对恢复块方法而言是共性,要保证验证程序的正确性,在这个软件中,验证程序用数据是否在范围内来判断程序是否正常,如油罐内温度一般在负30度到120度之间,所以验证程序比较简单,不易出现问题。
PDA使用.net技术(csharp语言)、服务器端使用J2EE技术(java语言)设计,在这两个软件中我们使用了防卫式程序设计,防卫式程序设计的思想是在程序中包含错误检查代码和错误恢复代码,使得错误一旦产生,程序可以恢复到一个己知的正确状态中去,利用高级程序语言本身的容错能力,采用相应的策略,也是可行的办法,如java语言的try/catch处 理方法和try/finally中止方法。我们针对两个程序中的作业操作,设计了对象缓存机制,用防卫式程序设计对缓存处理进行保护。
PDA作业操作中,会在第一次处理时把涉及的对象加载到缓存,在内存中构建对象树,如轮次、巡检点、巡检点记录,这样做的目的是提高程序响应速度。如果作业操作程序处理时发现内存中还没有对象树,会抛出异常,在异常处理中,重新构建对象。这样处理的好处是对象树只有在需要时才构建,节省空间;构建对象涉及到数据库操作,一旦构建成功,作业操作中可以不用再访问数据库,提高处理速度。服务端也用缓存保存经常访问对象,用防卫式程序设计进行异常处,和PDA上类似,这里不再讨论。
通过在三类程序中使用软件容错技术提高了可靠性,从最终使用情况看,最明显的是嵌入式软件,用恢复块技术对光纤信号处理,我在20余个关键设备上安装的测量软件,从安装运行至今,从末发生过数据测量问题,从实时性来看,嵌入式软件使用恢复块方法,故障判断、程序切换、故障恢复这一系列过程需要7.5秒,满足行业要求的10秒的要求,PDA和服务端使用防卫式程序设计处理对象缓存,运行稳定,提高了处理速度。
MSES项目历时9个月开发完成,于2013年9月交付,目前在30个分厂使用。项目在设计阶段对三类程序进行分析,分别设计了不同的软件容错,经运行情况来看,项目满足了石化行业对高可靠性软件的要求,达到了关键设备测量的实时性要求。但在MSES系统维护阶段中发现了设计的一些不足,比如,由于PDA内存有限,如果一个作业流程过大,流程涉及的对象全部加载到内存有可能出现溢出,后来将缓存异常响应处理作了修改,对作业流程对象分级别加载,运行到哪一级加载这级的对象树,解决了问题。这些不足说明我对软件可靠性设计细节把握不足,需要在今后的工作中加强。
作者单位
甘肃长风电子科技有限责任公司制导技术研究所 甘肃省兰州市 730070