工控计算机软件抗干扰分析
摘要:软件抗干扰措施是硬件抗干扰措施的一个补充和延伸,运用得法可以显著提高工控系统的可靠性和智能,并且在一定程度上避免和减轻意外事故的发生。本文提出了实时控制软件的自监视法、互监视法和常用方法等等一系列软件抗干扰技术。
关键词:计算机;控制; 抗干扰;可靠性; 软件
0 引言
工业现场各种动力设备在不断地启停运行。使得现场环境恶劣,电磁干扰严重。工业控制计算机在这样的环境里面临着巨大的考验。可以说我们研制的工业控制系统能否正常运行,并且产生出应有的经济效益,其抗干扰能力是一个关键的因素。因此,除了整个系统的结构和每个具体的工控机都需要仔细设计硬件抗干扰措施之外,还需要注重软件抗干扰措施的应用。我们在多年的工业控制研究中,深感工业现场意外因素太多并且危害很大。有时一个偶然的人为或非人为干扰,例如并不很强烈的雷击,就使得我们自认为无懈可击的硬件抗干扰措施无能为力,工控机死机了(即程序跑飞了)或者控制出错了(此时CPU内部寄存器内容被修改或者RAM和I/O口数据被修改)。这在某些重要的工业环节上将造成巨大的事故。使用软件抗干扰措施就可以在一定程度上避免和减轻这些意外事故的后果。软件抗干扰技术就是利用软件运行过程中对自己进行自监视,和工控网络中各机器间的互监视,来监督和判断工控机是否出错或失效的一个方法。这是工控系统抗干扰的最后一道屏障。
1 工控计算机实时控制软件运行过程中的自监视法
自监视法是工业控制计算机自己对自己的运行状态的监视。
某些类型的工控机CPU内部具有Watchdog Timer,例如INTEL8098、80198系列,就可以方便的通过设定Watchdog工作方式以及采用合适的软件编程的配合来达到自监视目的。而没有Watchdog Timer的CPU,例如Z80、8051系列等,当然也可以通过外加Watchdog电路,再配以软件完成自监视目的。这种软硬结合的自监视法通常是很有效的,可以大幅度提高工控机的抗干扰能力。如果Watchdog电路设计得好,并且软件也编制得好的话,不但可以及时发现程序跑飞,而且还可以实现“跑飞”程序修复。这是最好的自监视手段。
然而,这并不等于万无一失。例如,① Watchdog电路本身失效;②设置Watchdog的指令正好在取指令时被干扰而读错;③ Watchdog“发现”程序跑飞之后,其产生的复位脉冲或者NMI申请信号正好被干扰而没奏效等等。虽然以上的导致Watchdog失效的因素的几率很小,但总是存在的。另一个方面,还有相当数量的工业控制计算机没有Watchdog电路。因此,以下重点讨论的软件自监视法就势在必行了。
1.1 随时监督检查程序计数器PC的值是否超出程序区
计算机正常运行,其PC值一定在程序区内。如果PC值跑出程序区,计算机肯定已发生了程序跑飞。检查程序计数器PC值是否在程序区内的方法,是在一个经常要产生外部中断的某个中断服务程序中,读取转入该中断时压入堆栈的断点地址。如果该地址在程序区内,则认为PC值正常,否则一定是程序跑飞了。此时,程序跳转到机器的重启动入口或者复位入口,机器重新启动。于是机器又自救活了。如果没有一个这样合适的中断源,可以专门设置一个定时中断或者几个定时中断,在中断服务程序中检查PC值是否合法,一旦发现不对就立即转入机器的重启动入口。定时器中断的时间常数,可视机器的繁忙程度和重要性设定,一般从几个毫秒到几十毫秒都可以。
这个方法的局限性是不能查出PC值在程序区内的乱跳,即此时PC值虽受干扰却并没有超出程序区,而是错位乱拼指令而构成一些莫名其妙的操作,或者死循环。
1.2 主循环程序和中断服务程序相互监视
每个工控机的主循环程序和中断服务程序都有一定的运行规律可循。因此可以设计出主循环程序与各中断服务程序、各中断服务程序之间的相互监视。每个监视对要定义一个RAM单元,依靠对其计数/清零的方法表达相互监视信息。例如,某工控机的主循环程序循环一次最长时间为80 ms,它的一个定时中断时间常数为10 ms,当我们安排该定时中断监视主循环程序运行时,可以每次10 ms中断对该RAM单元加1计数,而主循环程序每循环一次对该RAM单元清零。因此,正常运行时,这个监视计数RAM单元的计数值不可能≥9,如果10 ms定时中断服务程序发现其计数值≥9,就知道主循环程序已经被干扰跑飞或出现死循环,于是就跳转到机器的重启动入口,重新恢复运行。使用这个方法,如果设计得当的话,是非常有效的。我们多年的经验是:主循环程序被干扰跑飞可能性最大,中断服务程序越短小越不易跑飞。主循环程序和中断服务程序以及中断服务程序之间的相互监视,应当多设计几个监视对会更好。
1.3 随时校验程序代码的正确性
工业控制计算机的实时控制程序代码通常都采用EPROM固化运行,一般不易发生被改写的情况。但成年累月运行,我们有时也会发现极个别的单元出错。其原因可能是芯片质量问题或者因静电、雷击干扰等造成的改写。程序出错了,将直接造成运行错误或者无法运行。校验的方式可以采用累加和校验或者BCH校验(一种CRC校验方法)。当采用BCH校验时,其分组附加的冗余字节可以集中在程序区之外的某个EPROM区域里。校验方法是在某个短小而且经常发生的中断服务程序内安排一个校验模块,可以设计成每次循环校验一部分程序代码,分若干次校验完成;或者当代码少,任务轻松时也可以一次校验完。如果发现校验错,应当立即向工控网络主站报告或者以自身报警的办法告知操作人员,以便及时处理。这个方法的局限性是被损坏的程序代码不是校验程序块,而且以该中断还可以正常响应为前提。由于该中断服务程序短小,通常还是有很大的概率自监视程序代码的正确性。
1.4 随时校验RAM的正确性
RAM成年累月运行,其质量因素和接插件接触因素都将导致其故障。这也将使控制系统发生错误。因此需要经常监视RAM的正确性。监视的办法可以安排在主循环程序,也可以安排在某个经常要发生的中断服务程序里。分几次或者全部一次对RAM进行检查。检查的方法是先把被检查的RAM单元的内容读出,存放在某个通用寄存器里,然后对该单元写入一个特定码,再读出比较,如果不正确就说明该单元可能损坏,此时要及时报告工控网络主站或者自身报警,提醒操作人员处理。这个写入的特定码常用的是55H-AAH法,即写入55H,再读出比较,如果正确,再写入AAH,再读出比较,该组码对每bit都有“0”、“1”写入读出检验,如果不正确时,最好再验证两次才肯定校验结果。不管该单元是否有错,校验之后都应还回它的原始数据,再报警或往下操作。使用这个方法要注意处理好各个中断源的级别关系!
2 实时控制系统的互监视法
一个分布式工控网络或者重要环节的双机热备份运行,都可以构成软件抗干扰的互监视法。主从式的工控网,主站和从站可以相互监视运行状况,环形网的相邻站或者全部站也都可以相互监视运行状况,双机热备份运行的两工控机,更应该相互监视。对于网络型的各站间的相互监视,主要是定时互相询问和按要求回答,如果没有按要求回答,则表示该站可能出问题(当然也可能是网络通信出问题),操作人员应及时前往处理。最简单的询问和回答码的设计是询问方发出一组数字,回答方经过某种简单运算,例如求反,再发回询问方。这种相互监视法可检验被询站是否死机以及校验通信网络完好与否。而重要环节的双机热备份运行的相互监视则可做得很深入,除了这种询问回答方式之外,还应做到控制量是否正常的相互监视,发现问题应当及时报警,通知值班人员处理。
3 其它常采用的软件抗干扰方法
3.1 广布陷井法
以上论述的自监视法和互监视法都是建立在工控机能正确运行全部或部分程序的基础上的。有时一个意想不到的干扰,破坏了中断和所有程序的正常运行。此时PC值可能在程序区内,也可能在程序区之外,要使其能够自恢复正常运行,只有依赖于广布“陷井”的绝招了。
这里所谓的“陷井”,是指某些类型的CPU提供给用户使用的软中断指令或者复位指令。例如,Z80指令RST 38H,其机器码为FFH。CPU执行该指令时,则将当前程序计数器PC的值压入堆栈,然后转到0038H地址执行程序。如果把0038H作为一个重启动入口,则机器就可以恢复新的工作了。再例如,INTEL8098、80198系列的复位指令RST,机器码也为FFH。CPU执行该指令时,其内部进行复位操作,然后从2080H开始执行程序。当然,80198系列还有更多的非法操作码可作为陷井指令使用,这时只需要在2012H的一个字的中断矢量单元里安排中断入口,并且编制一个处理非法操作码的中断服务程序,一遇非法操作码就能进行故障处理。作者多年的经验表明,陷井不但需要在ROM的全部非内容区、RAM的全部非数据区设置,而且在程序区内的模块之间广泛布置。一旦机器程序跑飞,总会碰上陷井,立即就可以振救活机器了。
3.2 重复功能设定法
工控机的很多功能的设定,通常都是在主程序开始时的初始化程序里设定的,以后再也不去设定了。这在正常情况下本无问题。但偶然的干扰会改变CPU内部的这些寄存器或者接口芯片的功能寄存器,例如,把中断的类型、中断的优先级别、串行口、并行口的设定修改了,机器的运行肯定会出错,因此,只要重复设定功能操作不影响其当前连续工作的性能,都应当纳入主程序的循环圈里。每个循环就可以刷新一次设定,避免了偶然不测发生。对于那些重复设定功能操作会影响当前连续工作性能的,要尽量想法找机会重新设定。例如串行口,如果接收完某帧信息或者发送完某帧信息之后,串口会有一个短暂的空闲时,就应作出判断并且安排重新设定一次的操作。
3.3 重要数据备份法
工控机中的一些关键数据,应当有至少有两个以上的备份副本,当操作这些数据时,可以把主、副本进行比较,如其改变,就要分析原因,采取预先设计好的方法处理。还可以把重要数据采用校验和或者分组BCH校验的方法进行校验。这两种方法一并使用则更可靠。
4 结束语
软件抗干扰的内容还有很多,例如,检测量的数字滤波、坏值剔除;人工控制指令的合法性和输入设定值的合法性判别等等,这些都是一个完善的工业控制系统必不可少的。
工业控制是计算机的最重要的应用领域,也是计算机的最艰难的应用环境。我从多年来的研究经验认为:工业控制计算机的抗干扰性能根本在硬件结构,软件抗干扰只是一个补充。硬件的设计应当尽可能的完善,不能轻易降低标准,让软件去补救!而软件的编制则要处处考虑到硬件可能的失效,可能受到的干扰等种种问题,在保证实时性、控制精度和控制功能的前提下,尽力提高系统的抗干扰性能。要考虑得很细致,努力赋予软件高度的智能。这样,软件才是完美的。把硬件和软件有机的结合起来,一个经得起长期现场考验的尽可能完善的工业控制系统才能实现。
关键词:计算机;控制; 抗干扰;可靠性; 软件
0 引言
工业现场各种动力设备在不断地启停运行。使得现场环境恶劣,电磁干扰严重。工业控制计算机在这样的环境里面临着巨大的考验。可以说我们研制的工业控制系统能否正常运行,并且产生出应有的经济效益,其抗干扰能力是一个关键的因素。因此,除了整个系统的结构和每个具体的工控机都需要仔细设计硬件抗干扰措施之外,还需要注重软件抗干扰措施的应用。我们在多年的工业控制研究中,深感工业现场意外因素太多并且危害很大。有时一个偶然的人为或非人为干扰,例如并不很强烈的雷击,就使得我们自认为无懈可击的硬件抗干扰措施无能为力,工控机死机了(即程序跑飞了)或者控制出错了(此时CPU内部寄存器内容被修改或者RAM和I/O口数据被修改)。这在某些重要的工业环节上将造成巨大的事故。使用软件抗干扰措施就可以在一定程度上避免和减轻这些意外事故的后果。软件抗干扰技术就是利用软件运行过程中对自己进行自监视,和工控网络中各机器间的互监视,来监督和判断工控机是否出错或失效的一个方法。这是工控系统抗干扰的最后一道屏障。
1 工控计算机实时控制软件运行过程中的自监视法
自监视法是工业控制计算机自己对自己的运行状态的监视。
某些类型的工控机CPU内部具有Watchdog Timer,例如INTEL8098、80198系列,就可以方便的通过设定Watchdog工作方式以及采用合适的软件编程的配合来达到自监视目的。而没有Watchdog Timer的CPU,例如Z80、8051系列等,当然也可以通过外加Watchdog电路,再配以软件完成自监视目的。这种软硬结合的自监视法通常是很有效的,可以大幅度提高工控机的抗干扰能力。如果Watchdog电路设计得好,并且软件也编制得好的话,不但可以及时发现程序跑飞,而且还可以实现“跑飞”程序修复。这是最好的自监视手段。
然而,这并不等于万无一失。例如,① Watchdog电路本身失效;②设置Watchdog的指令正好在取指令时被干扰而读错;③ Watchdog“发现”程序跑飞之后,其产生的复位脉冲或者NMI申请信号正好被干扰而没奏效等等。虽然以上的导致Watchdog失效的因素的几率很小,但总是存在的。另一个方面,还有相当数量的工业控制计算机没有Watchdog电路。因此,以下重点讨论的软件自监视法就势在必行了。
1.1 随时监督检查程序计数器PC的值是否超出程序区
计算机正常运行,其PC值一定在程序区内。如果PC值跑出程序区,计算机肯定已发生了程序跑飞。检查程序计数器PC值是否在程序区内的方法,是在一个经常要产生外部中断的某个中断服务程序中,读取转入该中断时压入堆栈的断点地址。如果该地址在程序区内,则认为PC值正常,否则一定是程序跑飞了。此时,程序跳转到机器的重启动入口或者复位入口,机器重新启动。于是机器又自救活了。如果没有一个这样合适的中断源,可以专门设置一个定时中断或者几个定时中断,在中断服务程序中检查PC值是否合法,一旦发现不对就立即转入机器的重启动入口。定时器中断的时间常数,可视机器的繁忙程度和重要性设定,一般从几个毫秒到几十毫秒都可以。
这个方法的局限性是不能查出PC值在程序区内的乱跳,即此时PC值虽受干扰却并没有超出程序区,而是错位乱拼指令而构成一些莫名其妙的操作,或者死循环。
1.2 主循环程序和中断服务程序相互监视
每个工控机的主循环程序和中断服务程序都有一定的运行规律可循。因此可以设计出主循环程序与各中断服务程序、各中断服务程序之间的相互监视。每个监视对要定义一个RAM单元,依靠对其计数/清零的方法表达相互监视信息。例如,某工控机的主循环程序循环一次最长时间为80 ms,它的一个定时中断时间常数为10 ms,当我们安排该定时中断监视主循环程序运行时,可以每次10 ms中断对该RAM单元加1计数,而主循环程序每循环一次对该RAM单元清零。因此,正常运行时,这个监视计数RAM单元的计数值不可能≥9,如果10 ms定时中断服务程序发现其计数值≥9,就知道主循环程序已经被干扰跑飞或出现死循环,于是就跳转到机器的重启动入口,重新恢复运行。使用这个方法,如果设计得当的话,是非常有效的。我们多年的经验是:主循环程序被干扰跑飞可能性最大,中断服务程序越短小越不易跑飞。主循环程序和中断服务程序以及中断服务程序之间的相互监视,应当多设计几个监视对会更好。
1.3 随时校验程序代码的正确性
工业控制计算机的实时控制程序代码通常都采用EPROM固化运行,一般不易发生被改写的情况。但成年累月运行,我们有时也会发现极个别的单元出错。其原因可能是芯片质量问题或者因静电、雷击干扰等造成的改写。程序出错了,将直接造成运行错误或者无法运行。校验的方式可以采用累加和校验或者BCH校验(一种CRC校验方法)。当采用BCH校验时,其分组附加的冗余字节可以集中在程序区之外的某个EPROM区域里。校验方法是在某个短小而且经常发生的中断服务程序内安排一个校验模块,可以设计成每次循环校验一部分程序代码,分若干次校验完成;或者当代码少,任务轻松时也可以一次校验完。如果发现校验错,应当立即向工控网络主站报告或者以自身报警的办法告知操作人员,以便及时处理。这个方法的局限性是被损坏的程序代码不是校验程序块,而且以该中断还可以正常响应为前提。由于该中断服务程序短小,通常还是有很大的概率自监视程序代码的正确性。
1.4 随时校验RAM的正确性
RAM成年累月运行,其质量因素和接插件接触因素都将导致其故障。这也将使控制系统发生错误。因此需要经常监视RAM的正确性。监视的办法可以安排在主循环程序,也可以安排在某个经常要发生的中断服务程序里。分几次或者全部一次对RAM进行检查。检查的方法是先把被检查的RAM单元的内容读出,存放在某个通用寄存器里,然后对该单元写入一个特定码,再读出比较,如果不正确就说明该单元可能损坏,此时要及时报告工控网络主站或者自身报警,提醒操作人员处理。这个写入的特定码常用的是55H-AAH法,即写入55H,再读出比较,如果正确,再写入AAH,再读出比较,该组码对每bit都有“0”、“1”写入读出检验,如果不正确时,最好再验证两次才肯定校验结果。不管该单元是否有错,校验之后都应还回它的原始数据,再报警或往下操作。使用这个方法要注意处理好各个中断源的级别关系!
2 实时控制系统的互监视法
一个分布式工控网络或者重要环节的双机热备份运行,都可以构成软件抗干扰的互监视法。主从式的工控网,主站和从站可以相互监视运行状况,环形网的相邻站或者全部站也都可以相互监视运行状况,双机热备份运行的两工控机,更应该相互监视。对于网络型的各站间的相互监视,主要是定时互相询问和按要求回答,如果没有按要求回答,则表示该站可能出问题(当然也可能是网络通信出问题),操作人员应及时前往处理。最简单的询问和回答码的设计是询问方发出一组数字,回答方经过某种简单运算,例如求反,再发回询问方。这种相互监视法可检验被询站是否死机以及校验通信网络完好与否。而重要环节的双机热备份运行的相互监视则可做得很深入,除了这种询问回答方式之外,还应做到控制量是否正常的相互监视,发现问题应当及时报警,通知值班人员处理。
3 其它常采用的软件抗干扰方法
3.1 广布陷井法
以上论述的自监视法和互监视法都是建立在工控机能正确运行全部或部分程序的基础上的。有时一个意想不到的干扰,破坏了中断和所有程序的正常运行。此时PC值可能在程序区内,也可能在程序区之外,要使其能够自恢复正常运行,只有依赖于广布“陷井”的绝招了。
这里所谓的“陷井”,是指某些类型的CPU提供给用户使用的软中断指令或者复位指令。例如,Z80指令RST 38H,其机器码为FFH。CPU执行该指令时,则将当前程序计数器PC的值压入堆栈,然后转到0038H地址执行程序。如果把0038H作为一个重启动入口,则机器就可以恢复新的工作了。再例如,INTEL8098、80198系列的复位指令RST,机器码也为FFH。CPU执行该指令时,其内部进行复位操作,然后从2080H开始执行程序。当然,80198系列还有更多的非法操作码可作为陷井指令使用,这时只需要在2012H的一个字的中断矢量单元里安排中断入口,并且编制一个处理非法操作码的中断服务程序,一遇非法操作码就能进行故障处理。作者多年的经验表明,陷井不但需要在ROM的全部非内容区、RAM的全部非数据区设置,而且在程序区内的模块之间广泛布置。一旦机器程序跑飞,总会碰上陷井,立即就可以振救活机器了。
3.2 重复功能设定法
工控机的很多功能的设定,通常都是在主程序开始时的初始化程序里设定的,以后再也不去设定了。这在正常情况下本无问题。但偶然的干扰会改变CPU内部的这些寄存器或者接口芯片的功能寄存器,例如,把中断的类型、中断的优先级别、串行口、并行口的设定修改了,机器的运行肯定会出错,因此,只要重复设定功能操作不影响其当前连续工作的性能,都应当纳入主程序的循环圈里。每个循环就可以刷新一次设定,避免了偶然不测发生。对于那些重复设定功能操作会影响当前连续工作性能的,要尽量想法找机会重新设定。例如串行口,如果接收完某帧信息或者发送完某帧信息之后,串口会有一个短暂的空闲时,就应作出判断并且安排重新设定一次的操作。
3.3 重要数据备份法
工控机中的一些关键数据,应当有至少有两个以上的备份副本,当操作这些数据时,可以把主、副本进行比较,如其改变,就要分析原因,采取预先设计好的方法处理。还可以把重要数据采用校验和或者分组BCH校验的方法进行校验。这两种方法一并使用则更可靠。
4 结束语
软件抗干扰的内容还有很多,例如,检测量的数字滤波、坏值剔除;人工控制指令的合法性和输入设定值的合法性判别等等,这些都是一个完善的工业控制系统必不可少的。
工业控制是计算机的最重要的应用领域,也是计算机的最艰难的应用环境。我从多年来的研究经验认为:工业控制计算机的抗干扰性能根本在硬件结构,软件抗干扰只是一个补充。硬件的设计应当尽可能的完善,不能轻易降低标准,让软件去补救!而软件的编制则要处处考虑到硬件可能的失效,可能受到的干扰等种种问题,在保证实时性、控制精度和控制功能的前提下,尽力提高系统的抗干扰性能。要考虑得很细致,努力赋予软件高度的智能。这样,软件才是完美的。把硬件和软件有机的结合起来,一个经得起长期现场考验的尽可能完善的工业控制系统才能实现。
文章版权归西部工控xbgk所有,未经许可不得转载。
上一篇:组态软件技术在PLC教学中的应用
下一篇:组态软件的发展展望