我们在用
CANoe
进行CAN总线的测试时,会发现CAN报文的
发送类型
有很多种,有些类型不太容易理解,有些类型之间又容易混淆,一不小心就会用错,今天我们就来介绍下CAN报文的发送类型。
CAN报文的发送类型分为
基本
发送类型和
混合
发送类型两大类。
基本
发送类型包括
Cyclic
周期发送、
OnChange
变化时发送、
OnWrite
写入时发送和
IfActive
有效时发送。
基本发送类型中的Cyclic称为
周期型
,而其他3个类型称为
事件型
(
event)。
混合
发送类型就是指基本类型中的
周期
型与
事件
型的
组合
,包括
Cyclic and OnChange
、
Cyclic and OnWrite
、
Cyclic and IfActive
。
1.
基本发送类型
1.1
Cyclic周期发送
周期发送
是指报文
独立
于
信号
,按照
固定
的周期发送,也就是报文的发送与报文中的
信号
变化
没有
关系。
周期性发送报文是我们最常用的报文,这类报文中包含的通常都是需要经常使用或者变化频率
较高
的信号,比如车速、转速等信号。
Cyclic周期性发送报文示例
如上图示例所示,ID为201的报文按照
200ms
的
固定
周期发送
车速信号
,车速信号在这个期间会有些变化,从52->51->52->53>,但是
无论
信号如何变化,报文周期都是6.8-6.6=7.0-6.8=7.2-7.0=
200ms
。
周期型报文就像大城市的公交汽车,报文中的信号就像是乘车的人员,一旦公交汽车发车周期确定了,比如10分钟,则每间隔10分钟都会有一辆车从始发站启动后发出,无论车上有几个人,都会按时发送。
周期型报文(公交车)按固定时间发送,即使信号为0(空车)也要发送
1.2
OnChange变化时发送
变化时发送
是指当报文中的
信号变化
时,报文才会发送。
这类报文中包含的通常都是变化频率
不高
的信号,比如通过中控屏进行的按键调节信号,
OnChange报文的
目的是为了
节省
总线资源。
OnChange变化时发送报文示例
如上图示例所示,ID为368的报文为OnChange变化时发送的报文,假如
当前
的背光亮度为30,此时总线上
没有
368报文;
此时通过中控屏的触摸按键将背光设置
改为32
,则中控屏会发出
一帧
ID为
368
,背光信号为
32
的报文。
1.3
OnWrite写入时发送
写入时发送
是指当报文中的信号被
重新写入
时,报文才会发送。这里的重新写入主要是指在测试软件中对信号的
重新设置
写入,在ECU中也可以认为是
应用层
对
底层
通信信号的写入。
OnWrite与OnChange的主要区别是OnWrite重新写入
不一定
就是数值的
改变
,也
可以
保持
不变
。
还是以中控屏的背光设置为例,比如背光原来为30,可以再次设置为
32
,设置后又
继续
设置
了两次,但都是
32
,并没有改变这个值。
OnWrite写入时发送报文示例
以上示例中,最后两帧的背光信号都是32,对比第2帧并
没有
改变,但是中控屏依然会
发出
这两帧,因为都是
写入
的操作。
这里要注意的是发送时间都是
实时随机
的时间(中控按键确认的时间),并没有固定发送周期。
1.4
IfActive有效时发送
有效时发送
是指当报文中的信号为
有效值
时,报文会以一个
快速的周期
(cycle time fast)发送,当信号变为
无效时
,报文就
不再发送
。
无效值
Inactive Value也就是
默认值
,
比如BCM的报文ID是380,其中的
DoorOpen
门开信号的
无效值
是
0
,表示门关,
有效值
是
1
表示门开,
快速周期
为
100ms
。
开始状态为
门关
,总线上
没有
报文,当门开有效,即
门开
信号为
1
时,380报文立即以100ms为周期发送报文;当
门关
后,即门开信号为
0
时,报文立即
停发
。
IfActive有效时发送报文示例
以上示例中,报文是以
快速周期100ms
发送的,不发送时就表示门开信号为
0
(无效)。
OnChange
、
OnWrite
和
IfActive
都
属于
事件型
报文,这类报文就像在出租车站点等待的出租车,没人打车的时候不需要上路,只有乘客打车时才会上路,否则大量的空载出租车在道路上行驶,不仅没有作用,反而容易挤占道路资源,造成道路拥挤。
事件型报文(出租车)没有信号触发(无人打车)时不需要发出
1.5 Repetitions重复发送参数
对于
基本型
中的
OnChange
、
OnWrite
来说,它们虽然
不是
周期发送,但是并
不是
说只能发一次,也
可以
发送
多次
。对于
IfActive
来说,也可以按快速周期发送的同时
限制
发送次数
。而发送次数是通过定义
Repetitions
重复次数来实现的。
所以基本型中又衍生出
3
个子类型
OnChangeWithRepetition、OnWriteWithRepetition和IfActiveWithRepetition。
比如在
OnChangeWithRepetition
子类型中,如果设置了
Repetitions
=
3
,则报文会连续发送
三次
,三次之间的时间
不小于
最小报文发送的
延迟时间Delay time
。
OnChangeWithRepetition示例
注意连续发送报文的时间间隔都比较短,但是也不能小于最小报文发送的延迟时间Delay time,示例中的间隔为100ms。
再比如在
IfActiveWithRepetition
子类型中,Repetitions=
2
,快速
发送周期cycle time fast=100ms,
则报文只发送
两帧
。
IfActiveWithRepetition示例
注意此时报文的发送周期是按照cycle time fast
快速周期时间
100ms发送,虽然与上面的
间隔时间
100ms相等,但是含义不同。
2.
混合型
2.1
Cyclic and OnChange
周期和变化时发送
是指报文平时是周期性发送,当报文中的信号变化时,此报文会额外的发送一次,原来的周期不变。
Cyclic
and OnChange示例
如上图示例所示,其中的
第3帧
就是
额外
发送的帧,它的发送时间为
6.920
s,是个实时的
随机
时间,不是按照周期发送的。
2.2 Cyclic
and OnWrite
周期和写入时发送
是指报文
平时
是周期性发送,当报文中的信号被重新写入时,此报文会
额外
的发送一次,原来的周期不变。
Cyclic
and OnWrite示例
如上图示例所示,其中的
第3帧
和
第5帧
就是写入时
额外
发送的帧,它们的发送时间分别为
6.920s
和
7.110s
,都是实时的
随机
时间,不是按照周期发送的。
注意第5帧的重新写入数据
仍然
是32,没有改变,这也是
OnWrite
与
OnChange
的主要区别。
2.3
Cyclic and IfActive
周期和有效时发送
是指报文
平时
是按
正常周期
cyclic time发送,当报文中的信号为
有效值
时,报文会按IfActive报文的
快速周期cyclic time fast
发送,等到信号变为无效值时,报文又会
恢复
到原来的
正常
周期
发送。
Cyclic
and IfActive示例
如上图示例所示,其中
前4帧
是按正常周期1s发送,信号为
无效值0
;从第5帧开始,当信号变为有效值1时,则按照快速周期100ms发送,所以
中间4帧
是快速发送。后面4帧,
信号又恢复为
无效值0,
周期也恢复为
正常周期1s。
快速周期时间
cycle time fast
这个参数仅在
IfActive
及其组合的类型中使用。
混合型的报文就像旅游景点的接驳班车,平时人少时(基本不变),可以
慢周期
发车;等到节假日乘客突然很多(变化)时就临时改为快速发车。这样平时可以较少的占用道路资源,假日期间又可以解决临时客流量大的问题。
混合型的报文(接驳班车)发送周期平时慢,紧急时快
信号触发(人流量变化)时需要快速的把消息发送出去
3应用实例
在实际使用时,有些信号涉及到
相互同步
的问题,比如
仪表
和
中控
的
背光
设置。
传统产品中,
仪表
的按键可以设置
仪表屏
的背光亮度,
中控
按键可以设置
中控屏
的背光亮度。在智能座舱的架构中,希望仪表和中控的背光能
一体化
联动,同步变化。也就是通过仪表或中控
都
可以设置
车内屏幕
的统一亮度,这时就需要仪表和中控信号
同步
,互相
发送
背光亮度信息。
如果仪表和中控都按
周期
报文发送,两者是可以实时同步,一方发现对方的需求与自己不同时,与对方同步即可。
但这种方式也有缺点,就是对
软件处理
的时序要求很高,比如在中控系统上进行手动设置后,在中控发出新的报文给仪表时,仪表在
未收到
新报文前已经将包含
旧数值
的报文发给中控系统,而中控系统
误以为
这个旧报文是仪表的
新设置
,就会导致仪表和中控两者
不停
地向对方同步,陷入
死循环
,背光一直在跳变,无法达成稳定状态。