CAN总线的功能安全问题

摘要:汽车的功能安全是当前汽车技术发展的重点之一,也是车厂竞争的利器。安全的实现与通信有关,现在90%以上的车用CAN总线来实现控制用的通信。已经发现CAN总线有高错帧漏检和长的等效离线与真正离线的机制性隐患,本文对这2种隐患的发生概率及其后果作了进一步分析,漏检的错帧可能最多是原数据的33倍或1/33,等效离线造成的失效概率在误码率为10-5时可达到16.8/h(总线利用率40%,速率500 kbps、平均帧长100位)。如先发生错帧漏检,应用收下错帧,又发生离线,阻断正确帧的改正作用,应用将长时间工作于错误状态下,是十分危险的。
关键词:CAN;错帧漏检;离线;功能安全

引言
    ISO26262道路车辆的功能安全国际标准已经通过。车企实施这项标准是自利的事,因为可以减少出事故后的赔偿损失,同时也是争取客户的竞争手段之一。所以,回顾已有的实践是非常必要的。参考文献指出,ISO26262强调了安全的管理与安全的文化理念。安全不再仅是一种事后的风险评估,他还建议用参考文献系统原理性过程的风险分析方法(system theoretic processhazard analysis method)实施ISO262 62。在这种方法中人、组织、机器等相互之间信息传递出错的过程及其风险都要加以评估。作为车辆控制设备间的信息传递,当前的车辆中主要是CAN总线,CAN总线帧的丢失、错帧漏检、送达次序的错误、超过时限等带来的风险均应定量地分析。
    笔者在本刊就CAN总线的隐患发表过若干文章,简单地讲,主要有2个致命的隐患:非常大的错帧漏检率,比Bosch公司声称的大几个数量级;由于协议规则间的不匹配,连续出错造成的等效离线,可能的持续时间很长。这2种错误单独发生就会影响安全性,如果连着发生风险就更大:发生第1个故障时应用会收下错误的原始数据,接着发生的第2个故障将阻断数据刷新,从而使应用的错误持续一段时间,造成系统的安全事故。

1 错帧漏检造成的值域失误
   
图1是发生位错(bit flip)而产生错帧漏检的2个例子,具体构造方法可见参考文献。它们都满足差错Ec=U·G,其中G是CAN总线的CRC生成多项式G=(110o,0101,1001,1001)。图中,Ec=U·G=(1000,0010,0001,1100,1110,1001)。由于Ec是G的倍数,所以CRC检验不出错。

CAN总线的功能安全问题

    构造错帧漏检的例子时,第1个1的作用是确保填充规则在第6位后发生,这个1既可以是发生在DLC中的代码,也可以视为数据域中填充进来的1。所以它的值可以不考虑作Tx与Rx的值。在此种情况下,如果第1个位错发生在Tx的第2位,收到的Rx值将是Tx的33倍,或者1/33。如果将第1次位错发生在1后面几位,Rx值也会比Tx变化很多倍。

2 等效离线发生的概率
   
等效离线的发生有3个条件:①节点已经在消极报错状态(error passive status);②该节点发生了局部错;③由于在消极报错帧分界符内遇到其他节点挂起待发帧的发送而造成连续出错。要考虑的是由于误码而报错的概率与处于总线峰值负载的概率。
    消极报错帧规定:在发送连续隐位时读回6个连续的相同位时视为报错标志发完,然后开始发隐位,读回隐位时作为消极报错帧分界符开始,开始后必须有连续7个隐位,如内又有显位,就作为新错,节点要重发消极报错帧。
    对于消极报错发送节点,发生局部错的位置有2种。在ACK分界符前时,消极报错标志的连续隐位会被接收节点以填充规则检验、CRC检验发现有错,引起接收节点报错。它们的主动报错帧的连续6个显位决定了发送节点消极报错帧报错标志结束时间的同步,不会发生分界符内出错的情况。
    在ACK及分界符后到EOF第3位间有局部错时,消极报错标志(P.E.Flag)的6个隐位会被接收节点认为是正常的发送帧结尾部分和2位服务间隔(I.M.)。别的节点所发新帧开始位(SOF),将落入发送节点消极报错帧分界符(P.E.Del)内,形成新错,如图2所示。发送节点新的消极报错帧将在新帧的ACK分界符处开始。然后,只要有挂起待发帧,这种出错状态就重复下去。而EOF第4~7位发送节点发的消极报错帧由于未见到连续的6个相同位,发送节点要等待别的节点所发新帧的ACK分界符处开始才有机会见到,等同于在ACK分界符处开始的消极报错帧。由此可知,产生等效离线错误的位置数为9位,其概率为9·BER。

CAN总线的功能安全问题

    在消极报错状态的发送节点遇到16次重复错后,会进入真正离线状态,所以要求取有16帧挂起待发的机会。这与ECU的设计有关,较难分析。我们以仿真来求取,底盘CAN总线系统内一般有6个节点,约有60个左右的消息要传送,则每个节点平均有10条消息,假定周期为10 ms、20 ms、50 ms、100 ms、1 000 ms等各有2条,每条帧长为97位,在500 kbps下6个节点的总线负载率总计43.4%。当一个节点等效离线后,还有约50条消息要发。在时钟差的影响下,可以构成一个峰值,节点在相对频差-0.2、0.4、0.6、0.8×100 ppm下的仿真结果如图3所示。其中队长度每0.2 ms统计一次,累计出该队长在整个仿真时间内的出现次数。

CAN总线的功能安全问题

    为了便于ECU编程,采样与写CAN总线控制器在一个任务中完成,所以假定10条消息在4 ms内就绪。仿真开始时是最坏情况:所有节点同时开始写CAN总线控制器任务。在上述频差下,节点1、2经500 s差10 ms,也就是说2个节点的10ms周期的消息就绪时间又重合了,其他节点与节点1的组合各为250 s、166 s、125 s。由于较长周期消息对挂起队长的影响较小,所以仿真的时段取得较短。以600 s的结果计算,挂起长度为16以上的情况有3 590次,占600 s内传送的1.2×10-3。需要特别注意的是,挂起队长的分布不是均匀的,因此处于等效离线而转为真正离线的机会也不是均匀分布的。由上述仿真60 s、600 s的结果看,挂起长度为16以上的情况都是3 590次,如果在最坏情况60 s内遇上了的机会便是1.2×10-2。如果在最坏情况6 s内遇上挂起长度为16以上的情况有1 005次,机会便是3.3×10-2 。
    图中队长度18的出现数比队长度17次的多,解释如下:虽然每个18队都要经过17队而下降,但是处于18队时仍可能增长到19队或更长,它们退下时又要经过18队状态。而在某时,由于同时就绪的消息多于2个,所以使队长度直接由小于17而跳到18,从而使18队的出现次数多于17队。
    于是,消极报错发送节点发生等效离线而进入真正离线的概率是P=BER×9×1.2×10-3 ,其中BER为误码率。这是一个乐观的估计。
    对消极报错接收节点,发生在帧内任一位的局部错均可能产生类似的情形,即消极报错帧分界符内遇到其他节点挂起待发帧的发送,造成再出错的情形。假定帧长为135位,那么其等效离线的概率是P=BER×1 35×1.2×10-3。

3 离线的时间
   
发生等效离线的节点不再能发送,所以应扣除消息源是该节点的那些帧。此时的分析方法可以参考CAN总线的传统调度分析方法,最坏的情况是最低优先级消息的送达时间。这样分析的结果与应用的具体配置有关,对每一个节点是不同的。
    假定挂起待发的消息有4字节数据,采用11位ID,平均填充位取8位,再加3位服务间隔,那么16帧导致的等效离线为16×(84+3)=1 392位,真正离线的时间为128帧,最坏情况为帧间有10位的空闲。所以真正离线将有128 x(84+3+10)=12 416位。二者相加,消极报错发送节点出错后会有总计13 808位的不能服务的时间,在500 kbps速率下,这相当于27.6 ms。如果采用29位ID,填充位也增加,帧长变为105位,此时消极报错发送节点出错后不能服务的时间将达34.5 ms。有的车采用250 kbps速率,那将有69 ms不能服务的时间。

4 2个隐患在应用上的影响
   
隐患实际发作时就表现为系统内的故障。
4.1 错帧漏检的影响
   
在单一接收节点的情况下,错帧传递的信息值域的变化很大,有些应用算法加有绝对值的限幅器,或者变化速度的限幅器,可以减少这一故障的危害性。但是这些措施有时是不可行的,或者以降低系统的动态性能为代价,显然是应用设计部门不希望的。
    在有多个接收节点的情况下,这一故障就造成数据完整性问题,例如在油门、离合器和刹车系统中油门的开度有不同的解释,系统就难以协调工作。
    在冗余系统中,如果没有表决机制,就可能收下错误的数据,就必须增加软件及时间资源来解决问题。
4.2 离线的影响
   
如上所述,消极报错发送节点出错后不能服务的时间将达34.5 ms,这在一些应用中是不能接受的,例如电子稳定控制系统(ESP)中,Bosch ESP8要求信号更新周期最小20 ms。消极报错接收节点出错后不能服务的时间较短,但是其发生的概率远大于消极报错发送节点出错后不能服务的概率(15倍),其影响尚未充分研究。
    车辆以100 km/h速度运行时,延迟34.5 ms开始刹车意味着已运动0.94 m,对驾驶员来说是不能接受的。2010年丰田公司Prius的刹车能量回收软件有0.06 s延迟,造成刹车距离长了0.6 m,进行了召回。
4.3 2个故障先后发生
   
应用收下了一个错误的数据,然后又发生了第二个故障,无法改正第一个错误,就非常危险。例如向内道运动时转向角是5°,但是由电动助力转向ECu发往ESP-ECU的帧被读错为30°,则ESP帮助实现30°转向,如ESP-ECU或电动助力转向ECU发生离线故障,34.5 ms内仍保留这30°的错误命令,就会冲向隔离带或对方车道。
    下面分析其概率:假定总线工作于500 kbps,总线负载率为40%,平均帧长为100位,那么每小时送7.2×106帧。笔者对参考文献作了新的修正,得到错帧漏检概率为Pud=1.67×10-7,仍比Bosch的(Pud=4.7×10-11)高几个数量级,与Tran的结果相近(Pud=1.3×10-7)。
如考虑通道错概率=0.001(它考虑了误码率的不均匀分布,例如每1000帧错1帧),那么可算出残差率为Pres=1.67×10-10。可算得第1个故障造成的失效率Pfailure1=1.2×10-3/h。当ber=0.001时第2个故障出现的概率P2nd=1×10-5,造成的失效率为Pfailure2=72/h。由此推断2个故障先后出现时的失效率Pfailure1+2=1.1×10-3/h。
    CAN总线已经使用于安全攸关的系统中,例如电子稳定控制系统(ESP)。按照道路车辆的功能安全国际标准ASIL-C的要求,系统的故障率应小于10-7/h。这包括许多可能失效的因素,例如传感器失效、CPU失效、接插件失效、电源失效等,甚至镙钉未拧紧。通信系统分配的份额一般为1%,即要求达到小于10-9/h。由表1可知,错帧漏检与离线的故障都达不到。即使在ESP中,因连续发生2种故障而产生失效的概率也相当大,只有在误码率小于10-4的情况下才能达到安全要求。实际的车内环境很差,有的车厂为了节省费用,对电磁干扰源头处理就不足,干扰可能引起较大的误码率。还有车外环境的影响,高压线、大功率电台、雷达站等附近的干扰就大。这都可能造成误码率大于10-4,使系统失效。

5 软件补丁方案实现难点
   
在参考文献中提出过添加额外的CRC检验来改善错帧漏检,对已有的应用难以执行。它要占用数据域,由应用软件生成和检验,这要耗费一定的时间,检验出错误后要另外发帧通知别的节点,以及要求重发。所有节点为取得一致性都得有计时器,大大延迟整个接收过程。出错重发的时间也大于原CAN总线的时间,破坏了原调度分析的结果,因此需要重新进行认证。
    已有的应用已经采用8字节数据的,就需要拆分成2帧。需要增加标识符,这要在接收节点增加或修改滤波的设置,还要增加合并机制。这都增加了软件工作及其正确性的验证工作,特别是涉及不同厂家的ECU时就更复杂了。
    对等效离线问题,除了修改消极报错帧分界符长度外,还可以用完全取消消极报错状态的方法:例如用市售CAN总线芯片出错计数器达到96时的中断,由应用决定如何修改工作模式。新的模式可以是认为通信已失效,便进入降额使用状态,同时复位通信,等一段时间再投入正
常运行。这种方案是将离线的时间变为常量,并让应用知道。它并没有减少离线的概率,只是可能减少一次离线的时间。
    这种方案的问题是,从开始降额到实现降额的过程并不安全(没有刹车,车并不立即降速)。另外,频繁地在正常/降额模式间切换会引起消费者的不安,失去对车可靠性的信任感,对车厂是极为不利的。
    由此可见,软件补丁的方案对现有车的改进极为有限。
    以上分析的CAN总线隐患完全是协议设计不周造成的,因此协议要改。把CAN总线的优点继承下来,物理层仍可沿用,线缆也不用改,甚至印刷版都不用改,用到安全攸关的场合仍可能是合适的。

  • CAN总线的功能安全问题已关闭评论
    A+
发布日期:2019年03月10日  所属分类:汽车电子