什么是IL
简单来讲,IL层主要是描述了信号及报文的行为方式,如发送方式,周期,而这些都定义在DBC中
DBC设置
跟IL层有关的DBC属性有GenMsgILSupport,GenMsgSendType,GenSigSendType,NodeLayerModules等,那么如何在DBC中使用这些属性呢?
1. 没有DBC:File-Create Database-Template:Vector_IL_Basic Template.dbc,这样新建好的DBC就会自动带有跟IL层相关的属性值
2. 已有DBC:File-Import Attribute Definitions,如果有带有IL层属性的DBC,可以直接导入;如果没有,可以选择Vector自带的模板:C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 14.0.83\CAN\MoreExamples\Modeling_Vector_IL\candb
完成之后,可以观察到Network Node,Message,Signal的属性里都有IL层相关的
Node,Message,Signal的关系为:
1. Signal与Message对应,一条message里有多个signal,一个signal只属于一条message
2. Message与Node对应,一个node里有多条message,一个message如果属于一个node的Tx message,则会同时属于另一个node的Rx message
3. 整个CAN网络分为多个Node,message是总线上传输的最小单位(不涉及物理层),signal的发送方式和message的发送方式会相互影响
CANoe设置
1. 新建网络节点(Network Node)
Simulation-Simulation Setup-右键-Insert Network Node
2. 选择新建的节点,右键-Configuration...
Common-Network node选择对应的DBC中存在的Network Node,如果DBC中不存在有关的节点,需先在DBC中创建
Common-Node specification选择对应的CAN文件,CAN文件自己编写,主要是存放一些跟IL层有关的CAPL函数
Components-Add-IL层dll文件,路径在:C:\Program Files\Vector CANoe 14\Exec32
3. 选择新建的节点,右键-Open IL Configuration...
下图圈出来的一些属性都是IL层比较常用的属性,跟DBC中的属性是对应的,当DBC中的属性发生变化时,下图中的属性会跟着变化,但下图中的属性变化时,DBC不会跟着变
4. 选择新建的节点,右键-Open Node Panel...
当Start Measurement之后,如果想要手动发送的报文经过IL层,可以在下图panel中操作
5. 选择新建的节点,右键-Edit...
编辑节点对应的CAN文件,即上面第2点中的CAN文件,IL层有很多capl函数,下面就两三个做简单说明,注意IL层的函数只会作用于经过IL层发送的报文,如果我们用其他方式如IG发送,是不受影响的
1)ILControlInit(): 阻止IL层自动启动,IL默认是打开的(当start measurement之后,支持IL层的报文会在DUT上电后自动发出),只能在on preStart中使用,使用后,报文不会在上电后发出,要想报文发出就要用到ILControlStart(),之后要想再停止发送报文要用到ILControlStop()
2)ILControlStart(): 将报文按照DBC中设置好的属性发送到总线上
ILControlStop(): 停止报文发送到总线上
通常是满足某个条件(事件驱动)时,使用该函数,比如某个系统变量等于1时,ILControlStart();该系统变量等于0时,ILControlStop();或者按下某个按键,ILControlStart();按下另一个按键,ILControlStop()
还有很多其他的函数,小伙伴们可以自行查阅help文档
IL层相关属性设置
信号的发送方式(GenSigSendType):
GenSigSendType有下面几种情况
1. Cyclic:按照GenMsgCycleTime周期发送(假设GenMsgSendType=NoMsgSendType/not_used)
总线上signal是依赖message进行传输的,所以周期定义在message属性GenMsgCycleTime里
在CANoe Trace窗口观察,该报文确实是按照20ms周期发送:
2. OnWrite:设置信号就发送,无论信号值有没有变化(假设GenMsgSendType=NoMsgSendType/not_used)
默认总线上没有报文,信号值不变(无论是不是默认值),手动发送一次,报文就会在总线上出现一次
3. OnChange: 信号值发生变化才发送(假设GenMsgSendType=NoMsgSendType/not_used)
默认总线上没有报文,一开始当信号值等于默认值,手动发送多次,报文不会在总线出现;当信号值改变,报文只有在第一次信号值改变时在总线上出现一次,改变之后再改成默认值也可以出现
4. IfActive:当信号不等于GenSigInactiveValue时按照GenMsgCycleTimeFast周期发送(假设GenMsgSendType=NoMsgSendType/not_used)
下图GenSigInactiveValue=0,GenMsgCycleTimeFast=40,默认总线上没有报文,当信号值等于默认值时,手动发送多次,报文不会在总线出现;当信号值不等于默认值时,报文会以40ms周期发送,直到报文恢复默认值,报文停止发送
5. xxxWithRepetition:按照GenMsgCycleTimeFast发送GenMsgNrOfRepetition次
1)OnWriteWithRepetition:基本规则与OnWrite一致,发送次数为GenMsgNrOfRepetition
2)OnChangeWithRepetition:基本规则与OnChange一致,发送次数为GenMsgNrOfRepetition
3)IfActiveWithRepetition:基本规则与IfActive一致,当恢复成默认值时发送次数为GenMsgNrOfRepetition
6. NoSigSendType/not_used:不指定信号发送方式,取决于报文的发送方式
报文发送方式(GenMsgSendType):
1. Cyclic:按照GenMsgCycleTime周期发送(假设GenSigSendType=NoSigSendType/not_used)
2. IfActive:当报文某一个或多个信号值不等于GenSigInactiveValue时按照GenMsgCycleTimeFast周期发送,当所有信号值等于GenSigInactiveValue,停止发送(假设GenSigSendType=NoSigSendType/not_used)
3. NoMsgSendType/not_used:不指定报文发送方式,按照GenSigSendType发送
结合发送方式(Combined Send Type):
从上述可知,报文和信号的发送方式是相互影响的,下面我们结合来看几种情况:
1. Cyclic and OnChange: 报文按照GenMsgCycleTime周期发送,当信号值改变时,立刻发送一帧,下一帧与信号值未改变时的最后一帧间隔GenMsgCycleTime,之后仍按照GenMsgCycleTime周期发送
下图GenMsgCycleTime=20ms
2. Cyclic and OnChangeWithRepetition: 报文按照GenMsgCycleTime周期发送,当信号值改变时,立刻发送一帧,然后按照GenMsgCycleTimeFast发送GenMsgNrOfRepetition-1次,发完下一帧与上一帧间隔GenMsgCycleTime,之后仍按照GenMsgCycleTime周期发送
GenMsgCycleTime=2000ms, GenMsgCycleTimeFast=40ms, GenMsgNrOfRepetition=3
3. Cyclic and IfActive: 报文按照GenMsgCycleTime周期发送,当信号值不等于GenSigInactiveValue时,立刻发送一帧,之后按照GenMsgCycleTimeFast周期发送,当报文里所有信号值恢复成GenSigInactiveValue后,等待GenMsgCycleTime发送一帧,之后仍按照GenMsgCycleTime周期发送
下图GenMsgCycleTime=2000ms, GenMsgCycleTimeFast=40ms, GenSigInactiveValue=0
4. Cyclic and OnWrite, Cyclic and OnWriteWithRepetition, Cyclic and IfActiveWithRepetition:与上方列举的类似,区别在于信号发送方式
以上如有问题,请指出,谢谢~~