潘文卿,付雨鑫,任 飞
(潍柴动力股份有限公司,山东 潍坊 261061)
基于J1939协议的多包报文主要有故障诊断相关报文DMx,例如DM1是记录当前故障信息,属于周期发送的报文,发送周期是1s,DM2是记录历史故障信息的报文,属于PGN请求类报文,在收到PGN请求的时候才会发送此报文。其他的报文还有描述发动机配置信息的EC报文,描述缓速器配置信息的RC报文,EC和RC报文的固定周期是5s,其中当转速或者扭矩百分比变化10%的时候会事件触发1次,但是周期不会快于500ms。还有其他PGN请求类的多包报文,例如描述组件信息报文CI、软件信息报文Soft。这些报文都会通过BAM广播报文和PACK数据包报文发送,所以如何实现不丢包有序发送,时序配置管理非常关键。
标准的J1939协议的地址为29bits,扩展帧地址如图1所示,包含P优先级,长度是3bits,优先级范围为0~7,0为最高优先级,7为最低优先级;R保留位1bit,DP为数据页,长度是1bit;PF为PDU格式,长度是8bits;PS为PDU细节,长度是8bits;SA为源地址,长度是8个bit,表示当前报文是哪个控制器发出的,像发动机控制器为0x00,变速器控制器为0x03。当PF的范围在0~239之间,即0x00~0xEF,PS为目的地址,PGN=PF×256;当PF的范围在240~255之间,即0xF0~0xFF,PS为组扩展GE,PGN=PF×256+GE。
图1 J1939协议扩展帧地址格式
以表1为例,报文Msg1和Msg2的PF为0xDA,小于0xF0,所以PGN都是0xDA00,Msg1的目的地址是0xF1,源地址是0x00,表示是控制器0x00发给控制器0xF1的报文,是点对点的报文;Msg2的目的地址是0x17,源地址是0xF1,表示Msg2是控制器0xF1发给控制器0x17的报文,同样也是点对点的报文;Msg3的PF为0xF0在0xF0~0xFF范围内,所以PS的值0x23为组扩展GE,所以PGN为0xF023,源地址SA为0x3D,这是一条广播式报文,发送到总线上,只要有接收需求的控制器节点都可以获取到此报文的信息。
表1 报文地址&PGN
基于标准的J1939协议,每条报文最多发送8个字节的数据,如果报文的内容超过8个字节,需要用多包报文进行传输。多包报文需要2条报文:一个是广播报文BAM,一个是数据包报文PACK。两个报文的定义如表2和表3所示。
表2 BAM报文定义
表3 PACK报文定义
BAM和PACK的报文发送时序为:先发送一条BAM报文广播当前报文的总字节数,接下来要发送PACK的包数,以及此条报文的PGN参数,然后是数据包PACK报文,PACK报文的第1个字节表示当前数据包PACK报文的包数,报文的接收方会根据收到的BAM报文的PGN参数群编号和全部数据包数,有效数据字节数进行校验判断,接收到的数据包数和BAM中声明的是否一致,如果不一致可能会存在丢数据、数据不完整等问题,会提示接收错误。
当前PGN的BAM报文和上一条同PGN的BAM报文的时间间隔为此条PGN多包报文的周期用T表示,BAM和第1条PACK的时间间隔用T表示,数据包PACK之间的时间间隔用T表示。T是报文的周期是固定的,T的时间和T可以通过标定量来实现自主标定,本论文是基于T=T=50ms进行设计的。
多包报文的错误处理机制设定:以DM1报文为例,说明当多包报文出现不同情况下的超时或者丢帧时的处理机制。接收方如果在4个T周期内未收到DM1的BAM报文,就会报出DM1报文超时的故障。如果收到了BAM报文,在4个T周期内如果没有收到T报文,就会报出DM1报文BAM2PACK超时的故障。如果其中一个中间的PACK报文后面4个T周期未收到下一个PACK报文,就会报出DM1报文的PACK2PACK报文超时的故障。如果中间的PACK报文丢了一个或者两个,就会报出DM1报文PACK报文丢帧的故障。如上的故障报出后,都会触发错误处理机制,比如当前报文丢弃,沿用上一个周期的报文数据保持不变。
表4为多包周期报文信息,包含:DM1报文、EC报文、RC报文的报文地址,PGN,周期,字节数和包数。DM1报文按照J1939-73的规定,一个故障码使用4个字节,故障系统中每次最多可以记录20个故障,即82个字节,12包数据,但是一次同时出现20个情况比较少见,论文中以10个故障,42个字节为例。我们看到像DM1报文的地址0x18FECA00是不存在的,多包报文实际上只有BAM报文和PACK报文,接收方按照J1939多包报文的协议进行组合,会显示解析到的0x18FECA00报文以及所有的数据。
表4 多包周期报文信息
DM1报文的周期是1s,EC报文和RC报文的周期是5s。每5个周期,DM1和EC,RC报文就会同时出现在一个周期中。设定EC报文的BAM报文相较于DM1报文的BAM时间间隔为T,用于研究DM1发送完成BAM后间隔多久开始发送EC报文的BAM报文;RC报文的BAM报文相较于DM1报文的BAM时间间隔为T,用于定义RC报文的BAM报文相较于DM1报文的BAM报文后的发送时机。
如图2所示,T为390ms,T为790ms,DM1报文的一帧BAM报文和6帧PACK报文使用300ms即可发送完毕,最后一帧PACK(330.355537s)发送完毕后推迟90ms再发送EC报文的BAM报文(330.445528s),RC报文的BAM报文(330.845486s)与DM1的BAM报文(330.055545s)间隔是790ms,此时RC报文的BAM(330.845486s)与EC报文的最后一帧PACK报文(330.745516s)的时序间隔为100ms,这样EC报文与RC报文的时间间隔有些浪费,可以进一步修正。
图2 DM1&EC&RC报文的时序1
将T设定为310ms,T为620ms,将EC报文的BAM 报 文(2777.021331s)与DM1 最 后 一 帧PACK 报 文(2777.011292s)的 时 间 间 隔 和RC 报 文 的BAM 报 文(2777.021331s)与EC 报 文 最 后 一 帧 的PACK 报 文(2777.011292s)的时间间隔都设定为10ms,这样会减少时序的浪费,如图3所示。在报文都会有序发送的情况下,此方案是对时序的最佳设计,但是如果报文有延时,或者周期任务执行时有延时,对报文时序也会有影响。
图3 DM1&EC&RC报文的时序2
当故障诊断系统出现当前最大故障个数20个故障码的时候,DM1会有82个字节,12包数据,加上EC报文和RC报文的数据总共是21包数据,在1s的DM1时间周期内不能完成数据完整发送,所以,鉴于DM1报文的数据长度不固定性,为了达到时序的最优设置,可以将EC报文和RC报文拆开,分别放到两个DM1周期中,将T设定为600ms,T为1600ms,如图4所示。为DM1报文的可变包数留足空间,发 送 完 第1 个DM1 的BAM 报 文(567.938838s)后,间 隔600ms发送EC报文的BAM报文(568.538814s),在此周期内不再发送RC 报文,在第2 个DM1 报文的BAM 报文(568.938772s)后,间隔600ms再发送RC报文的BAM报文(569.538732s),此时RC报文的BAM报文(569.538732s)与第1个DM1报文的BAM报文(567.938838s)间隔1600ms。这样可以很好地避免DM1突然增加数据包数而导致后面的EC或RC报文丢失的问题,同时还为突然而来的PGN请求的多包报文留下发送的空间,可以达到最优时序配置。
图4 DM1&EC&RC报文的时序3
在DM1报文、EC报文、RC报文周期发送的过程中,如果收到PGN请求报文时,会如何响应,接下来分如下几种情况进行分析。
1)第1种情况:如图5所示,在DM1报文的最后一帧PACK报文(3940.932138s)发送完成后,收到了PGN请求DM2报文(3941.386074s),此时会及时响应DM2报文,后面的EC报文和RC报文就不会再发送了,而是重新发送DM1报文(3941.632075s),再按照时序的设定发送后面的EC报文和RC报文。
图5 DM1报文后面收到PGN请求报文
2)第2种情况:如图6所示,PGN请求报文(5.026737s)在EC报文的BAM报文(4.093637s)之后收到,此时控制器会先回复一个否定响应,然后EC报文废弃,后面的PACK报文不再发送,而是接着发送DM1报文(5.783483s)。在发送DM1报文的第4包PACK报文(5.983489s)和第5包PACK报文(6.033486s)之间收到PGN请求报文(6.101697s),此时影响DM1报文后面的PACK报文继续发送,发送完成DM1后,发送PGN请求的DM2报文(6.103468s),DM2报文发送完成后,会重新发送DM1报文(6.7834132s),然后继续发送EC报文。也就是说,在BAM报文后发送PGN请求报文时,不予响应,废弃当前的多包周期报文,也不响应请求的多包报文,而是从DM1报文重新发送。在DM1报文的PACK报文之间收到PGN多包报文请求时,待DM1报文的PACK报文发送完毕之后,会继续响应被请求的多包报文,被请求的多包报文发送完毕之后,先发送DM1报文再按照时序发送EC、RC周期报文。
图6 BAM之后收到PGN请求报文
3)第3种情况:在非DM1报文的PACK报文之间收到PGN请求报文,如图7所示。此时会回复一个负响应,继续完成PACK报文的发送,不能影响当前的报文有序发送,待报文发送完成后,之前的PGN请求报文也不再发送了,会继续按照设定的多包报文的时序完成DM1报文、EC报文和RC报文的发送。此时序的设置是因为EC和RC的发送都是基于DM1的BAM报文做的时序偏移,不能影响DM1报文的周期发送。
图7 RC报文PACK之间收到PGN请求报文
所以在固定周期的多包报文发送的过程中,不同的时间段收到PGN请求报文会有不同的处理机制,在不影响周期最小的多包报文的前提下完成PGN请求多包报文的发送。
本文基于标准的J1939协议,完成了DM1报文、EC报文和RC报文3条固定周期的多包报文的时序设定机制的研究,考虑到DM1报文的长度是可变的,又考虑到上一个报文的PACK与当前报文的BAM报文的时间间隔最优设定设置了DM1、EC、RC3条报文的最佳时序配置。同时考虑到还有部分PGN请求报文在不同时间段进行事件触发,设定了不同的处理机制。DM1报文是周期最小的多包报文,周期时序的设置和PGN请求的不同处理机制都是以对DM1报文影响最小的前提下做的处理机制设定,为多包报文的有序完整发送提供了理论和实践数据基础。