CAPL脚本DBLookup函数动态访问CAN 报文的属性
- 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
- 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
- 🍅 玩转CANoe,博客目录大全,点击跳转👉
📘前言
📙 静态访问CAN报文属性
在CANoe工程中,只要加载了dbc文件,那么dbc文件中定义的报文属性都是可以直接获取的
大致分为3种类型:属性,信号和id/dlc/txnode
-
属性在DBC文件中的定义如下图:
-
简单代码演示:
on key 'b'
{ message EngineState msg;//用变量的方式直接访问write("报文属性-id :0x%x",msg.id);write("报文信号-DLC :%d",msg.dlc);write("报文属性-周期:%d",msg.GenMsgCycleTime);//直接访问 2write("报文属性-id :0x%x",EngineState.id);write("报文信号-DLC :%d",EngineState.dlc);write("报文属性-周期:%d",EngineState.GenMsgCycleTime);
}
输出:
Program / Model 报文属性-id :0x123
Program / Model 报文信号-DLC :2
Program / Model 报文属性-周期:100
Program / Model 报文属性-id :0x123
Program / Model 报文信号-DLC :2
Program / Model 报文属性-周期:100
📙 DBLookup 动态访问CAN报文属性
- 在测试过程中,可以通过DBLookup函数来搜索DBC中报文的信息
- 注意这个
DBLookup
函数只是访问DBC中的报文信息,而this.id
或this.dlc
是总线上获取的报文信息。对于仿真节点,CANoe按照加载的DBC发送报文信息,但是对于真实ECU,它不一定按照DBC中定义的数据长度,属性发送。这在实际工程项目中正是我们需要测试的一个测试点 DBLookup
能够访问的属性如下图所示
- 代码演示
on message *
{if(this.id == 0x123){write("msg.ID :%s",DBLookup(this).Name);write("msg.DLC :%d",DBLookup(this).DLC);write("msg.DLC :%s",DBLookup(this).Transmitter);write("msg.DLC :%f",DBLookup(this).GenMsgCycleTime);}
}
- 下面带式我官方实例中利用
DBLookup
函数检查选择节点的所有报文的发送的DLC是否正确(真实ECU测试才有意义) - 为了方便理解,我简化了官方实例的代码
// checks for all messages of a specific node that the DLC is correct.variables
{// system under testchar gNodeUnderTest[30] = "EngineState";}
on message *
{// check all frames from one node for the correct dlc and count them// is the frame defined in the database?if (DBLookup(this)){// is the frame defined as Tx-Frame for the node under test?// note: compare is case sensitiveif (strncmp(DBLookup(this).Transmitter, gNodeUnderTest, 30) == 0){// check if the DLC is correct; if not, remember the minimum// or maximum DLC of the received framesif (this.dlc != DBLookup(this).DLC){write("%s 的DLC发送错误,DBC中定义为:%d,实际收到为:%d",this.name,DBLookup(this).DLC,this.dlc);}} }
}
🌎总结
- 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。