国家兴亡匹夫有责,从神九用到CAN总线讲起(6)方法很关键
我们很多应用选用CAN总线是因为它特别可靠,按CiA的宣传资料是一千年才会发生一次错帧残留,按Bosch CAN2.0规范是帧出错率*4.7*10-11。其中4.7*10-11是错帧漏检率Pun,而帧出错率*Pun是错帧残留率Pres。一千年一次在我们有生之年是碰不到的,自然非常好,不过它这个值错了,错误的数据会导致盲目乐观的态度。
它的计算过程是:假定误码率为每0.7秒有1位错,当位时间为2us时,有ber= 1/(0.7*106/2)=2.8*10-6并以此来计算公式中的error rate。这是简化的情况,与Bosch 分析时采用的方法不同,在那里error rate相当于bad状态概率,例如分析时采用的为10-3,在帧长为100bit时,它的计算偏小了约3倍。
假定总线工作于500kbps,总线负载率为40%,平均帧长为100 bit,那么每小时送7.2×106个帧。按我的计算结果(见以后博文),错帧漏检率Pun=1.15*10-7,在bad状态概率为1*10-3时错帧残留率是1.15*10-10,每小时的失效率是8.82×10-4/h。也就是每1200小时=50天要失效一次。如果像上面CiA介绍总线负载率为100%时,就会是每20天失效一次。
有人会说,我的系统从来没有失效过。说到数值问题,第一是你的系统可能干扰较少,在单帧长度为统计误码率时遇到的最坏情况远小于1*10-3,但是你不能否定别人的最坏情况可能达到1*10-3;第二,许多应用属于闭环控制,由于对象的响应比较慢,即使有错帧漏检,其引起的扰动刚开始就被新来的正确数据纠正了,你就没有感觉,但是你不能否定存在无法及时更新的可能性;第三,也许你在应用上还有别的纠错措施使错帧的影响减弱了,例如各种滤波算法,所以你感觉不到,但是你已经付出了相应的代价,例如降低了系统的动态指标。
现在说可信赖性分析方法。对整个国家而言,平均概率是重要的。但是最坏情况发生时,人身和财产损失对当事人是百分之百地已经发生。所以要按最坏概率作出发点。例如一,人的价值是无价的,所以欧美各国已进入到目标为交通零伤亡的时代,如果你的车不以此为目标,你就会在竞争中失败;例如二,有的项目全国都只有有限的数量,一次失效都是难以承受的,例如火箭卫星**之类。所以无论民用或军工都该以最坏情况作出发点。
关于错帧漏检的分析方法,据我所知大致有几种方法:第一是用软件仿真的方法,可以有控制地注入位错,然后按协议的规定检查,错帧是否溜过去,不过一般采取随机注入位错的方法,即一般随机测试的Monte Carlo方法;第二种是用分析方法,构造出会溜过去的帧,然后统计这种帧的个数,我就是用这种方法;也许还有第三种,用形式逻辑的方法来分析,不过我还不懂,不知道是否走得通。
Bosch采用的是第一种方法。( J. Unruh, H.J. Mathony, K.H. Kaiser: "Error Detection Analysis of Automotive Communication Protocols". SAE Int. Congress, No. 900699, <?xml:namespace prefix = st1 />Detroit, USA, 1990.)
Bosch对造成错帧漏检的二种原因均有论述,第一种原因是CAN位填充规则时出错发生部分数据流相位移动,第二次是出错又使相位又对上了,在有相移的部分造成收发数据比较时有大量差,超出了CRC检出错的能力;第二种是在定义帧长度的位中出了错,收发二边对帧长度有了不同理解,碰巧后边又发生位错,使变形后的帧通过了CRC检验和格式检验。关于这二种情况我后面都要用到,到时候详细介绍。
采用软件仿真的办法要求概率的分布是均匀的,而且样本的量较大,正是在这二点细节上这种办法是有缺点的,从而导致结果的准确度低。
首先出现漏检事件的出错位分布不是均匀的,发生在标识位等处的错会因数据移相,造成帧长变化而较易检测出来,不易漏检;而发生在数据域内的错则除了CRC检验没有其他检验可发现,易漏检;发生在帧尾部的错立马就被视作格式错,不漏检。
其次是样本的大小,Bosch文章中针对的是80~90位的帧,CRC检验的覆盖面为58~66位,这样帧本身就有258=2.88×1017种,注入的位置有58×57/2组,全部实例有4.76×1020个。每一个帧在注入错前后要算二次CRC,还要做其他格式检查。例如有没有发生填充位错,有没有发生帧长变化导致格式错等。现仅就CRC检验来说:每个学过CRC计算的人都知道它要分很多步骤,1989年左右还是16位机的时代(例如VAX11系列),假定累加器由A构成,生成多项式为立即数G,步骤有
1.如A15=0跳到第3步,否则进到2,
2.A与G异或,
3.进位位设新数据,
4.A与进位位左移一位,
5.判CRC覆盖区是否结束,如否则回到1,如是就结束。
一位要循环5步,就算用机器代码,那时的计算机还只在10M左右,即0.5us。完成58位循环要29us,验算一条帧需58us。于是可以算出不停机运行一年可检验365*24*3600*106/58=5.43*1011条帧。全部实例有4.76×1020个,可见测试的样本还不到实例的10-8。即使当时的计算机速度估计不准,仍然是样本太小了。
样本小要作结论是无法置信的,例如100万辆车你遇到1辆性能很好就说车好,或者你遇到1辆车坏了就说车一塌胡涂都是偏颇的。
虽然CiA一方面推荐Bosch的残差值:出错率*4.7*10-11,实际上CiA还给出了另一个更大的残差值:CiA, CiA Draft Standard 304 V1.0.1 “CANopen framework for safety-relevant communication”,第26页:The worst case residual error probability of the CAN protocol is PRe st = 7*10-9,它来自一篇Joachim Charzinski的论文,在那里有:Pres<7.2*10-9*qbad。所以他们自己已否定了Bosch的残差值。只是CANopen中的值还是比我的数据1.15*10-7小了很多。
自做自受 2015-11-26 14:05
用户1678053 2015-11-23 08:58
用户1454308 2015-11-23 08:18
自做自受 2015-11-19 14:50
忆轻狂 2015-11-19 08:47
用户1154067 2013-5-2 11:38
不错.值得借鉴.
用户1584366 2013-4-15 11:14
ssyniuej_957112275 2013-4-8 09:36
用户1494370 2013-4-7 14:26