CAPL脚本DBLookup函数动态访问CAN 报文的属性

Posted 蚂蚁小兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CAPL脚本DBLookup函数动态访问CAN 报文的属性相关的知识,希望对你有一定的参考价值。


📘前言

目录


📙 静态访问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);
   
   //直接访问 2
    write("报文属性-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.idthis.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 test
  char 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 sensitive
    if (strncmp(DBLookup(this).Transmitter, gNodeUnderTest, 30) == 0)
    
      // check if the DLC is correct; if not, remember the minimum
      // or maximum DLC of the received frames
      if (this.dlc != DBLookup(this).DLC)
      
        write("%s 的DLC发送错误,DBC中定义为:%d,实际收到为:%d",this.name,DBLookup(this).DLC,this.dlc);
      
       
       


🌎总结

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

  • 🚩如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。

以上是关于CAPL脚本DBLookup函数动态访问CAN 报文的属性的主要内容,如果未能解决你的问题,请参考以下文章

Capl编程xml标签语法 —— CAN报文周期检测/错误帧检测/信号改变检测。。。

CAPL脚本中关于 局部变量 容易忽略的一点

CAPL脚本中关于相对路径/绝对路径操作的几个傻傻分不清的内置函数

基于CAPL脚本,造一个分割字符串的轮子

Vector - CAPL - 检测报文周期

CAPL 脚本对.ini 配置文件的高阶操作