本帖最后由 yfy812 于 2020-6-5 10:07 编辑
CAN错帧漏检率达不到功能安全的要求v2 2019-9-2 错帧漏检是指帧内发生了错误但是没有被协议的所有检错机制查出来。这样的帧就被接收节点收下,就会引起应用使用错误数据,导致功能性错误或失效。
CAN的主要查错机制是CRC检验,在CAN 中CRC校验失效的2个原因是: 1.由于填充位规则的非对称执行,收发帧的有效数据位产生了错位,在进行CRC计算时相当于引入了大量的错,错的数目超过了CAN的CRC的检验能力(HD=6),造成CAN的错帧漏检率很高。 2.CAN的CRC多项式支持的数据字(word code)的长度不够,只有112位,不能把可能的填充位都包括进去。例如CAN扩展帧的8字节数据的data word 最少长度为39+64=103,最多可以有103/4=25个填充位,data word多达128位。所以不得不把填充位剔除在外,无法加以改进。 图2是发生填充位机制不对称执行的情况
图2A中第3位传送中出了错,发送节点在第5位见到5个连续相同位时添加了填充位,但是接收节点在第5位处没有见到5个连续相同位,所以它认为这里不应有填充位,它把发送节点添加的填充位作为信息位收下。图2B中也是第3位发生了传送错,发送节点没有添加填充位,而接收节点由于第3位的错而见到5个连续相同位,所以它把发送的第6位作为填充位删去了。 于是,在有填充位不对称执行时便有发送节点计算CRC时的位流与接收节点计算CRC的位流的错位。 填充位不对称执行时有二种帧结束的可能:1CRC计算结束时没有对齐,此时因为CRC错或其它格式检查而发现错/或者漏检;2 CRC计算结束时是对齐的,此时不会受到其它格式检查影响,但此时因为CRC计算时位流的错位而造成漏检,这是影响CAN错帧漏检率高的主要因素,因为只要发生2个填充位不对称执行时错就可以形成对齐而错位的情形。
CRC检验的方法是把数据字的位流除以生成多项式,其余数便是CRC校验和。在发送方Tx(x)=Ut(x)*g(x)*x15+Tcrc(x),在接收方Rx(x)=Ur(x)*g(x)*x15 +Rcrc(x)。当Rcrc(x)= Tcrc(x)时CRC检验就通过了。 当发生传送错时可以将Rx(x)表示为Rx(x)= Tx(x)+Ex(x)。那么只要Ex(x)=U*g(x),就会有Rcrc(x)=Tcrc(x),即发生漏检错。所以只要找出填充位不对称执行时满足Ex(x)=U*g(x)的概率便可以确定错帧漏检率。
图1是重构出的一个错帧漏检代码的片断。最高部分是满足漏检的一种Ex,它被下面用来重构出Tx。具体的U的选择方法不在本文中叙述。这个例子中,本来只有发生在第4、21位的2个位错(中间例),由于填充位的不对称执行,变为CRC计算中Ex有10个错(>HD=6)的漏检错。漏检共4种状况(图中的2种把1/0互换又有2种)。所以此类片断在所有23位的片断中占2-21=4.76*10-7。此片断在帧CRC域前面的103位中可处于任何位置,即可能发生的片断有103-23=80处。所以一帧的漏检片断出现概率为P1=80*4.76*10-7=3.81*10-5。2个错出现在片断特定位置的概率为P2=1/103/102*2=1.9*10-4。漏检错率为Pun=P1*P2=7.25*10-9。仅这一种片断就200倍大于CAN声称的Pun=4.7*10-11。
填充位不对称执行时造成错帧漏检的情况是Bosch自己已经发现了的。(参见J.Unruh, H.J. Mathony, K.H. Kaiser: "Error Detection Analysis of AutomotiveCommunication Protocols". SAE Int. Congress, No. 900699, Detroit, USA,1990.)。但是他们没有找到正确的计算方法。把造成错帧漏检代码的片断取长了,丢失了错帧漏检率的主要贡献者。
因为没有从根本机理上进行分析,所以就导致归纳上的错误。错帧漏检代码的片断在该文中用critical sequence(CS)表示。从截图(图)上可以见到长度的范围为30~80bit。这一限定就把许多短的CS排除在外了,例如长度23~29的CS是非常主要的错帧漏检实例的贡献者。CS的长度越短,贡献越大,这有二方面的原因,一是特定CS实例在L长的所有可能位流中占的比率是与长度有关的,一个23位CS实例占的比率是2-23,而一个30位实例占的比率是2-30,也就是讲,一个23位长度CS实例对漏检的贡献是一个30位实例CS对漏检的贡献的128倍;其次,简化分析时只须考虑CAN的数据域和CRC域,这里没有其他的格式检验。CS可以在64位数据域与15位CRC域中的任何地方,一个23位的CS可出现的位置有57种,而一个30位的CS可能出现的位置有50种。所以Bocsh的数据漏掉了主要贡献者。 其次归纳上的错误还表现在Estuff(L)上。因为CS漏检的根本机理是:特定位出错后,收发位流的移相造成的误差流是CRC生成多项式的倍数,而与一帧中出现填充位的概率是无关的。Estuff(L)是对实例数的一种修正,就像上段所讲同一CS可以在不同位置上,所以Estuff(L)是低估许多了。对于CS长度为30~80的实例发生在特定位置时,漏检的比率与我的推导是一致的,即15*2-25=4.47*10-7~Bocsh的constk,但由于Estuff(L)的低估,造成即使在CS长度为30~80时Bocsh的漏检率也有很大低估。
错帧漏检有什么后果?
理论上讲,漏检的错帧可以使数据变大或变小、逻辑值变反。直到现在我们还经常听到汽车变速箱的各种投诉,其中有一些是可以用CAN错帧漏检来解释的。
上图可见到跳档的投诉,当错误的数据例如油门踏板的位置传到变速箱时,便有可能跳档。而且服务无法解决此类问题。
网上见到的噪声、抖动、顿挫的投诉屡见不鲜,而厂家的回音往往是含糊其词、蒙混过关。 但是由于错帧漏检本身是无法检测出的(如果可检测出就可以设计出不漏检的规则),所以也不会有出错代码保存,发生漏检事件是不会留下证据的。这造成了“没有留下出错码就没有发生CAN错帧漏检“抗辩不成立的理由。 但是CAN漏检是完全可以说明出现故障的因果关系的。例如2013年大众双离合器召回事件中与失去动力故障不同的是有更多的抖动、异响、顿挫的投诉,他们均未被细究,但又是可以用CAN错帧漏检来分析的。为此我们要先看DSG的特性,简单地说,DSG控制器通过二个离合器来选择所需要的齿轮啮合对,当一对齿轮组在工作时,另外一对抽空已经啮合好,所以换档只是松开一个离合器+合上另一个离合器,所需的时间很短。当然由于防止打齿,啮合过程有专门的同步器实现,因为车轮带着车厢惯性大,发动机侧惯性小,同步器在升降档时需要的时间是不同的,特别是降档时要求发动机侧的齿轮要稍加速才行,所以还有自动给发动机加油的命令。Direct-Shift Gearbox -Wikipedia, the free encyclopedia上提到DSG升档的时间可达到8ms,降档时为600ms。另外,DSG有跳档的功能,当油门踏板踩地板油(kick-down function)时可根据当时车速、油门开度自动选合适的档位。注意这一句:This kick-down may beengaged by any increased accelerator pedal opening,跳档可以因任何踏板开度的增加引起。
DSG是根据车速、油门开度及变化来决定档位的,油门开度的信号是通过CAN总线送到DSG控制器的。而在干扰下CAN有错帧漏检的可能性,假定油门开度为50%,但是在干扰下,这个信号被DSG读为80%,DSG自然会认为驾驶员要加速(实际上驾驶员什么也没做),便很快升档,甚至跳档,假定发动机传给DSG信号的周期是20ms,那么就可以跳2~3档。假定下一20ms到达的刷新信号是正确的,仍是50%,那么DSG认为应回到原档位,就执行降档,由于降档时间长,需要1200~1800ms,在这一段时间里发动机的功率实际没变化,而档位经历了升档,当然就会使车速下降,使人感到有1~2秒的失去动力。急促升降档就会引起噪声、抖动、顿挫的体验。
从这样的例子可以看到错帧漏检不但对功能安全有极大的影响,而且对用户体验有极大的影响-这个影响涉及的用户数要远远大于发生安全事故的用户数。而且错帧漏检是无法设计出故障诊断方法的,车厂用无故障诊断码可以糊弄用户,但是无法改变用户的口碑,改变这一局面的唯一办法是不发生错帧漏检:或者改进电磁环境,或者改进CAN的错帧漏检率。设计时的电磁环镜在应用中恶化了,这是不可控的,但改进CAN的错帧漏检率是可以做到的。
|