APP下载

CAN总线的安全性研究进展

2015-07-02杨福宇

单片机与嵌入式系统应用 2015年6期
关键词:断线离线中断

杨福宇

(重庆工业自动化仪表研究所,重庆 401123)



CAN总线的安全性研究进展

杨福宇

(重庆工业自动化仪表研究所,重庆 401123)

给出了CAN总线的假冒错故障的成因与故障率分析,得到Pmasq.11=9.11×10-11和Pmasq.29=1.70×10-10,值得高层协议(如CANopen、J1939等)使用者注意。对于CAN FD的功能安全,2014年最新的改进仍然存在错帧漏检大以及假冒错问题,提出了同时利用CAN总线实现二级中断的想法,使实现自愈总线成为可能。

CAN总线;功能安全;中断;自愈总线

引 言

CAN总线是当前汽车电子控制应用的主力军,虽已有20多年的历史,并且在不断扩展到飞机等其他行业,这个态势还能继续下去吗?为了回答这个问题,必须先了解CAN总线满足应用要求的程度、相对其他方案的优缺点及其在改进方面做出的努力。

1 功能安全的要求

通信协议功能安全的主要要求有:

① 消息的正确传输。残留误差的概率要使系统失效率小于10-9/h,所谓残留误差就是通过了所有检错措施而还留存的错误,比如本来要减速却收到了加速的信号,本来要关阀门却收到了开阀门的信号。

② 消息的及时传输。规定的采样周期内没有收到帧,出现了丢包现象,例如要刹车却丢了刹车信号。

③ 消息的一致传输(所有有关节点时间上的同步正确送达)。有些应用要求各个执行机构协调动作,不能因为局部错误而有的动、有的不动,例如有的轮子刹车、有的轮子不刹车,就可能引起转向力。

④ 没有假冒错。本来是传送给A节点的帧,因为局部错误,B节点收下了形式上合法但内容上错误的帧,例如传送的是几个温度参数,结果在未预料到的节点中被理解为电流值。

现在一些竞争性的通信协议有TTP/C、FlexRay、1553B等,它们在满足上述要求方面各有困难。

TTP/C的组籍算法可能把正确节点的通信阻断,这样就做不到及时送达。组籍向量隐含在CRC检验中,削弱了CRC的检验能力,使错帧漏检率增大[7]。

FlexRay在启动时有形成小集团的可能性,即一个系统分割为两个互相不能通信的逻辑集团[8],做不到正确送达、及时送达,并且时钟算法会单向漂移,使部分节点失效概率增大[9]。

1553B的检错能力比较弱,每个字只有一个奇校验位,如果发生两个错误就要漏检,在BC发送命令字有两个错时,有可能指向别的RT子系统,出现假冒错。

这些协议的局部错误会出现有的节点收下、有的节点拒收,拒收的节点无法及时通知其他节点,不能实现数据的一致性,而且有全局错误时也无法及时纠错。如果采用冗余硬件通道或时间上的冗余,都意味着成本的提高或可用带宽的下降。

2 CAN总线的隐患

CAN总线的报错帧是非常好的机制,有错时它可以及时通知其他节点,从而保证数据的一致性,并实现重发纠错,这是其他协议所没有的,但是由于CAN总线协议设计上的缺陷,还存在不满足上面功能安全要求的隐患。

图1 因位错造成仲裁域与控制域的不同解读

例如规定消极报错帧分界符(delimiter of passive error frame)内的0是错误,而分界符会延伸到新帧开始处(SOF=0),冲突会造成重复出错,节点变为等效离线,发送节点最终真正离线[1-3]。离线的时间可达到数十ms,无法保证消息的及时传输。

CAN总线协议的填充位规则的不对称执行,在数据域与CRC域形成数据流的移位,造成对应位的错误是CRC多项式的倍数,形成错帧漏检[4],漏检率达到Pun=1.37×10-7。假定总线速率为1 Mb/s, 帧长为100位, 总线利用率为40%,系统每小时送 1.44×107帧。假定系统的坏状态概率是Qbad=0.001,此时系统的失效率为0.001×1.37×10-7×1.44×107=1.97×10-3/h >10-9/h。Bosch 原来的数据是Pun=4.7×10-11,产生这样大差异的原因是没有把主要漏检情况考虑进去,同时对考虑进去的情况的出现次数少算了几十倍[6]。

CAN总线协议规定接收节点查错查到EOF6,如果EOF6有局部错误,那么有的节点拒收、有的节点收下。若位速率为1 Mb/s,帧长为110位,总线负载率为90%,误码率为10-4,节点数为32,节点失效率为10-4,则造成的不一致重复为2.84 × 103/h,不一致丢失为3.94 × 10-7/h[5]。

当CAN总线协议的填充位规则的不对称执行发生在仲裁区时,便可能发生假冒错(masquerade error),这是一个以前未讨论过的错误。图1中接收节点本地局部错在ID7处发生,造成了接收节点把Tx的ID4读为填充位,加以剔除,因而接收节点对本帧的ID和帧长度有不同解读。若长帧被读短,例如本例中8字节数据被误读为1字节数据,则Rx的CRC域、ACK域、EOF域都将在Tx的数据域中,总存在一个通过CRC、ACK检验的概率,发生在Rx的ACK分界符、EOF部分的连续8位1也可以由Tx的11(110)111中发生第2个位错实现 (0可以处在括号中的任一位),此时接收节点就会收下帧。如果Tx后续的0破坏了Rx的服务间隔,引起超载帧,而此超载帧又破坏了Tx,导致Tx的重发也没有任何意义,因为那个错的ID帧已经收下了。

这个错误帧是否被接收滤波器拒绝,或者被应用层拒绝,需要对发生错误的所有情景加以检查才能判断。图1原来的ID变成了另一个ID,在高层协议中会有别的解释。如果第一个位错发生在ID4,又是另一种ID,则要逐一检验是否是内容上合法的定义。此例为11位ID的系统,其分析对29位ID的系统也同样适用,所以高层协议(如CANopen、J1939等)的应用者要特别注意。

一个填充位序列有6位,只有第6位是第5位的补码时,才不会被填充位检错发现,发生填充位规则执行条件概率为2-6。每个ID可处在多个填充位序列中,一般来说有000 001和111 110两种填充位序列,但在ID3以下受RTR=0的限制,各ID出现在填充位序列的总和是77种。CRCACKEOF共24位,通过检验的概率为2-24。位错发生在特定位置的概率为2/60/59(假设Rx帧长为60)。长帧读短条件DLC3=1及DLC2=0的概率为2-2,于是假冒错概率Pmasq=3.03×10-11。对Tx中有填充位的情况可作类似分析,此时Tx的r0=0将落入Rx的DLC3,只要Tx的DLC3=1,就能保证长帧读短,假冒错概率Pmasq=6.07×10-11。所以总的假冒错概率Pmasq.11=9.11×10-11。类似地可以算出假冒错失效的概率是0.001×8.64×10-11×1.44*107=1.2×10-6/h>10-9/h。对于CAN2.0B的29位ID系统也可以算出Pmasq.29=1.70×10-10。

3 CAN FD的不足

CAN FD是Bosch在2011年推出的兼容CAN总线的方案,通过在帧数据域提高速率的方法使总的吞吐量提高,满足ECU程序下载的要求,后来也考虑把它用到实时控制之中。

在实时应用上,第1节所述功能安全的要求是不可避免的。但是CAN FD并没有对等效离线的根源和EOF6的局部错误造成的不一致性作任何改进,所以问题仍然存在。

CAN FD仍然采用原来的填充位规则,所以在ID域填充位规则的不对称执行仍然会造成假冒错。

CAN FD在CRC检查上采用了不同的方法,力求减少错帧漏检率。第一个措施是把填充位也算到CRC中,第二个措施是采用了更长的CRC多项式,第三个措施是CRC域用了固定填充位,相当于增加了新的查错机制。

但是CAN FD的可变速率产生了以慢速读高速的可能,出现了新的错帧漏检机制;由于兼容要求,增加了更多的解读选项,也出现了新的错帧漏检机制;由于高/低速转换过程的需要,出现了CRC分界符、ACK位长度是2位也合法的情况,在毛刺引起Tx/Rx错位时仍可以正确接收的情况,这都造成了CAN FD的错帧漏检率相当大,为PunCAN FD=2.3×10-10。这个内容已被写入一个45页的报告,提供给CiA,有需要的读者可以在参考文献[6]的文件中下载。

虽然PunCAN FD=2.3×10-10已经比较小,但须注意的是这个错的发生只要一个或2个位错就会漏检,并不是协议声称的HD=6。一帧中出现1~2个错误的概率要远远大于一帧中出现6个错误的概率。

由此,2014年CiA认为需要改进CRC漏检率,初步决定在CRC的前部增加一个5位的检查内容,其中3位是以Gray码表示的填充位计数器(SBC,模8之后的余数),1位是这3位的奇偶校验位,1位是与数据相隔的固定填充位。这样当填充位规则不对称执行时,Tx/Rx有移位时新增加了3个查错机制,可减少错帧漏检率。

当ID域发生填充位规则不对称执行,出现长帧读短的情况时,新加的填充位计数检查机制则仅仅是增加满足漏检条件的位数,SBC、CRC17、ACK、EOF共36位,要通过检验的概率为2-36。以CAN FD扩展格式帧为例,在Tx无填充位而Rx有填充位时,把Tx的ID17=0误认为基本格式(IDE=0),Tx的ESI=1移位误认为低速格式(BRS=1)的可能性。长帧读短的情况除了这两种之外,还有DLC的移位。Tx有填充位而Rx无填充位时,Tx的ESI=0误认为基本格式(DLC3=0),所以并不能消除假冒错失效。

图2 用2a级中断实现心跳诊断原理图

新的查错机制仍然存在漏检情况,例如Tx 填充位计数域前后是10(00110)1,第一个10是数据的最后二位,最后一个1是CRC的第一个固定填充位,表示Tx有2次计数(Gray码),偶校验为0。Rx填充位计数少1位时,整个填充位计数域将提前一位,该域将收到1(00011)0,表示Rx有1次计数(Gray码),偶校验为1,计数值、前后固定填充位规则都合法。

BRS的1位错仍然会引起错帧漏检,2位及多位错下的漏检概率为Pun=2.8×10-7。该报告已交CiA,读者可以向CiA或本人索要。

4 IntCAN的想法

上述4个CAN总线主要的安全隐患均能解决:去掉了原有的填充位规则与保护帧长度不读错、消除了错帧漏检与假冒错、改变查错与处理错的规则消除等效离线,容错的帧尾设计解决了不一致接收问题。在此基础上,还可添加新的中断功能。

CAN的报错帧可以打断当前的传送,实际上是中断,IntCAN(Interruptible CAN)扩充了CAN的这一特点,引入了二级中断帧,可以为通信系统提供更多有利于功能安全与提高系统响应速度的能力。

例如一级中断为报错,相当于CAN的报错帧,2a级中断作时间同步与心跳。

在通信线路中,电缆连接件由于温度、振动、冲击损伤、腐蚀等原因失效,此时通信系统就会物理失效。为了解决这一问题,可以采取双重或多重系统后备,但是这样成本就会提高,体积、重量、能耗指标会突破,也可采用星形拓扑结构去除受影响部分,但同样会面临上述问题。一个比较经济的解决方案是环形自愈总线,即2a级中断实现诊断与自愈。

图2是使用2a级中断的例子。在单总线时可以用一个主节点发送以2a级中断开始的心跳帧,2a引导后,每一个节点都有发送自己心跳的小窗口。这个窗口是预先组态确定的,心跳小窗口为3位,发送心跳的节点在小窗口的第1、2位置“0”,第3位作分界符“1”。读心跳小窗口的节点只读第2位值,其余忽略,可以防止断线时终端阻抗不匹配引起的振铃波形误差。

节点有故障时,该节点的心跳窗口就没有心跳,在发生通信断线时,会在断线两侧出现不同的心跳状况:与主节点在断点同一段的节点在发生断点后的节点均无心跳,在断点另一侧的节点将发现所有节点没心跳,用定时器可发现主节点缺失心跳的故障。采用中断方式的优点是,占用时间非常少,在上述10个节点的例子里,一次诊断仅需39位。

解决硬件故障的一种简化方法是自愈环网。自愈环网在物理上是一个环,逻辑上是一个总线,主节点可以控制某一段线的开闭,在正常运行时环断开为总线,当该总线有物理断开时,主节点将这一段闭合使之成为新的总线。

这种想法lonworks[10]有过,主从芯片在同一节点内,正常通信时主从芯片收到的数据相同,有错时经专门的查询来发现断开位置,并闭合开关,实现自愈。其不足之处是电缆的匹配用终端阻抗的位置并不在断线最近处,所以信号的质量将大大下降,查询与通信可能失败。

采用2a级中断实现自愈环的原理见图3。

图3 用2a级中断实现自愈

每一个从节点都有控制本地是否添加终端电阻的能力(白圆点)。主节点有A、B两组收发器,除了有添加终端电阻的能力外,还有短接两边收发电缆的能力。正常工作时开关处于断开位置,系统的拓扑是一条总线,终端电阻在主节点两边接入(黑圆点),主节点定时发心跳,诊断网络健康状态。

在非心跳期间也可发现故障:收发器A、B不断比较两边收到的是否为同一位流。如发生断线,收发器A、B处是有终端电阻的,位流是不同的,差别较大,即断线后的第1次传送就能发现故障,与心跳周期无关。

主节点收发器A、B可以同时发送2a级中断的心跳帧,由于诊断信号的容差较大,每个从节点都能收到正确的诊断结果。如果比本节点上游(下游)的节点全无心跳,那么在本节点上游(下游)发生了断线,本节点应控制接入终端电阻。诊断完成后主节点将开关闭合,并去掉本身的终端电阻,网络自愈为新的总线。

从发生故障到自愈的时间取决于设计,可以短到数ms之内(现有的光电子继电器可以在200 μs内切入和断开终端电阻)。对于严酷环境与战场应用,电缆断裂或连接件的故障是无法立即修复的,自愈功能是生存的最好帮手,现有的技术不能很好地满足这种要求。

在用IntCAN实现类似时间触发调度时可以使总线利用率提高,同时对非常紧急的非周期性信号可用中断先导出后传送。例如各种报警消息是非周期性的,越早送达就越有利于事故的后处理,如工业上电网跳闸信号的安全应对、反应堆意外停堆信号的报警处理、飞机的紧急制动或反击,这些信号在为许多分散的子系统协同工作时,也希望通信系统能加以支持。采用2b级中断代替硬接线,2c级中断消息共享,这就提供了在时间触发协议时的紧急事件提前发送机会,也为新应用创造了条件。

一些紧急信号可能在平时优先级不高,也未在故障-容错模型中预先设计,但是由于应急需要,可能由人临时决定,需要直接干预,也可以由2d级中断引领发送特定帧,例如操作员直接开关某阀门、电子或激光的反抑制。

网络控制系统中,在系统平稳时(例如测量值在控制精度范围之内)可以让出通信带宽,从而为其他应用(如诊断、网络上传、云端联系)创造条件,但是在本地紧急状态下又要立即收回带宽,各类二级中断也为这些应用提供服务。

[1] 杨福宇.CAN总线中的一种安全隐患[J].单片机与嵌入式系统应用,2009(1):20-22.

[2] 杨福宇.CAN消极报错发送节点变为离线状态的故障[J].单片机与嵌入式系统应用,2009(5):18-20.

[3] 杨福宇.关于CAN隐患的争辨[J].单片机与嵌入式系统应用,2009(6):5-7.

[4] 杨福宇.CAN协议的错帧漏检率改进[J].单片机与嵌入式系统应用,2011(6):5-7.

[5] Rufino J, Veríssimo P,Arroz G,et al. Fault-tolerant broadcasts in CAN [C]//The 28th IEEE International Symposium on Fault-Tolerant Computing,1998.

[6] 杨福宇.你必须要知道风险的根源[EB/OL].[2015-01].http://forum.eet-cn.com/ BLOG_ARTICLE_20719.HTM.

[7] 杨福宇.TTP/C组籍算法存在的问题[J].单片机与嵌入式系统应用,2014(10):1-4.

[8] Milbredt P.An Investigation of the Clique Problem in FlexRay[C]// Proceedings of the 3th IEEE Symposium on Industrial Embedded Systems,2008.

[9] 杨福宇.FlexRay时钟同步的同向漂移[J].单片机与嵌入式系统应用,2011(4):3-6.

[10] LonWorks.78kbps Self-healing Ring Architecture[EB].Lonworks Marketing Bulletin,1993.

Safety Research on CAN Bus

Yang Fuyu

(Chongqing Industrial Automation Instrument Research,Chongqing 401123,China)

This paper puts forward the cause and fault analysis of fake wrong fault of CAN bus.Pmasq.11=9.11×10-11and Pmasq.29=1.70×10-10are obtained.Higher layer protocol user like CANopen,J1939 should pay special attention to this error.It is pointed that the improvement in 2014 version did not solve the problems and it also faces the masquerade problem about the functional safety of CAN FD.So using CAN bus to realize the idea of two level interrupt is proposed,which can achieve the possibility of self-healing bus.

CAN bus;functional safety;interrupt;self-healing bus

TP302.8

A

士然

2015-01-06)

猜你喜欢

断线离线中断
断线的珍珠
异步电机离线参数辨识方法
浅谈ATC离线基础数据的准备
FTGS轨道电路离线测试平台开发
基于FPGA的中断控制器设计*
一起10kV开关控制回路断线故障分析及回路完善
离线富集-HPLC法同时测定氨咖黄敏胶囊中5种合成色素
跟踪导练(二)(5)
千里移防,卫勤保障不中断
断线的风筝