AGV、机械臂的设计过程中,为了CR或CE或客户要求,通常需要增加急停、使能、保护性停止、速度控制、安全门锁等安全回路,在设计这些回路时,有的单位选择的是施耐德、Sick或西门子的安全PLC,而且可能会进行二次开发,有些单位会使用DSP、ARM、FPGA等芯片自己开发安全控制板或驱动器。
说到这里,不得不说当前行业内存在一个很普遍的问题,即是很多第三方普遍只评估硬件方面是否符合PL的要求(PL计算),对软件方面则不闻不问。这样做其实是有极大的风险,很容易被业主单位或其他第三方机构质疑,而无法满足特定要求。不管二次开发的应用软件还是嵌入式软件,作为安全回路的核心控制逻辑,其软件安全性至关重要。本文将介绍在软件开发中应注意的关键点。
要向各位看官澄清的是安全软件的开发为什么要满足特定的要求?能不能按照企业平常的开发过程开发。众所周知,不管使用什么语言、什么模型、什么算法或者什么人开发,软件内不可避免的会残留很多bug,这些bug只要在特定的条件下,就会导致软件运行产生错误,也叫系统性失效。对于非安全应用来说,只需要及时修复即可,但是,对于安全应用来说,就有可能导致安全功能无法执行或则执行错误,进而引起人员伤亡等事故。因此,安全相关软件的开发必须要慎之又慎,相关安全标准中特定要求其实就是针对软件开发过程的中的要求,目的就是尽可能减少残留在软件中的Bug,以达到提高AGV、机器人安全性的期望。下面将会详细介绍一些其中的关键点,供各位看官理解。
一是适用标准的选择
对于二次开发的应用软件来说,如果业主单位或技术标准中要求达到相应的PL等级,则软件在开发过程中遵循ISO13849-1-2015中4.6节的应用软件相关的要求即可。对于嵌入式软件来说,如果PL的要求在a~d之间,则按照遵循ISO13849-1-2015中4.6节的嵌入式软件开发要求即可;如果PL要求是e,则必须遵守IEC61508-3中的要求开发。此外,对于安全控制板或模块来说,可以单独作为产品售卖或应用在多个系列产品上,一般推荐IEC61508,ISO13849以及IEC62061这几个标准都要满足。
二是开发模型的选择
目前行业内常用的有V模型、瀑布模型、敏捷开发模型、螺旋式开发模型等,但是安全软件的开发是趋向于保守的,它不是以开发效率为目标,而是以开发出安全可靠的软件为目的。因此,目前IEC61508,ISO13849和IEC62061中都是要求开发中使用V模型。V模型最大的益处在于测试的提前介入,即是要求测试工程师需要参与评审需求、架构设计、详细设计等文档,并同步完成测试用例的设计,编辑测试规范。目的是通过测试的人员的参与,及时发现需求或设计中存在缺陷,提高需求或设计的合理性。但是V模型也有一个最大的问题,就是迭代。如果测试发现bug或者后面在进行变更,设计应返回到V模型的左半边的相应阶段,并重新按照V模型执行,这样就会给开发人员带来大量的工作量。
▲图1软件开发的V模型
三是开发工具的选择
对于开发工具的选择,功能安全总的的要求,即是开发过程中必须使用经过工具资质确认的开发工具,所谓的确认有三种可能,一是对于应用软件来说,可以采用PLC供应商提供的开发工具;二是使用经过使用证明的开发工具,即是在行业内或类似产品开发中已被大量使用的工具;三是使用经过功能安全认证的工具,即是有特定第三方团体已对工具进行过认证,例如C++test已经通过了T2类工具的认证,Cantata也是通过认证的。此外,还需要对开发工具的版本、使用手册、注意事项等内容进行确认,编辑工具确认报告。另外,需要注意的一点是,软件在线测试工具,在开发过程中,需要和软件本身执行相同的PL或SIL要求。
▲图2IEC61508标准中对工具的要求及解释
四是开发语言及编程准则的选择
目前常用的软件开发语言分为有限可变语言和全可变语言,有限可变语言指的是梯形图、功能块图和顺序功能图等语言,全可变语言指的是C、C++、C#等,有限可变语言常用在应用软件的开发中,全可变语言常用在嵌入式软件的开发中。在IEC61508的标准中,对语言要求见图3.需要说明的是,虽然ADA、PASCAL和Modul2语言是SIL1和SIL2强烈推荐的,但是由于这些语言已经很老,现在已几乎无人使用。嵌入式软件开发中,目前最常用的是C系列的语言。
▲图3软件开发语言的选择
另外,在利用上述语言进行编程时,编程准则的使用功能安全标准中也是有要求的。下列连接是推荐使用的编程规范,图4、图5和图6是标准中要求的采用的编码准则。实际使用时,通常推荐软件工程师都要采用,并且要按照编程准则,执行静态规则检查或者代码评审。
编程规范举例
http://www.misra.org.uk/
http://java.sun.com/docs/codeconv/index.html
http://www.gnu.org/prep/standards/
▲图4ISO13849中的编程要求
▲图5IEC61508对编程语言的通用要求
▲图6IEC61508面向对象的编程要求
五是开源代码的使用
开源代码是软件开发中很难回避的一个问题,众所周知,为了减少开发的工作量,节省人工成本,提高开发效率,很多企业在开发中都会使用大量的开源代码,这些开源代码有些是软件开发库中提供的,有些是从网上搜集到的。这些代码在功能安全软件开发中是由极大的风险,最大的风险在于这些代码在开发过程中未遵守功能安全开发的流程和要求,有可能存在大量未知的bug,进而引起安全功能失效。不过,IEC61508功能安全标准中也并未完全排除开源代码的使用。标准中提供了三种途径,一是使用完全按照功能安全要求开发的源代码,这个需要提供证明,;二是使用经过使用证明的开源代码,也就是说需要提供该开源代码在类似产品中使用的经典案例,另外也需要做一些额外分析;三是重新对开源代码的开发过程进行正式的评估,也就是说,使用人员需要提供开源代码开发的全过程的设计文件。
此外,还有一个捷径,可以分享给大家,就是开发人员根据开源代码的逻辑,按照功能安全的要求重新编写和测试。这样可以省很多工作量。