当前位置: 首页 > news >正文

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

  • 🍅 我是蚂蚁小兵,专注于车载诊断领域,尤其擅长于对CANoe工具的使用
  • 🍅 寻找组织 ,答疑解惑,摸鱼聊天,博客源码,点击加入👉【相亲相爱一家人】
  • 🍅 玩转CANoe,博客目录大全,点击跳转👉

📘前言

目录

  • 📘前言
  • 📙 静态访问CAN报文属性
  • 📙 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);
      }
    }   
  }     
}

在这里插入图片描述

🌎总结

23

7

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

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

相关文章:

  • 整理了100道关于Python基础知识的练习题,记得收藏~
  • 【iOS】设置背景渐变色
  • JUC并发编程——wait-notify
  • PPQ库中KLD算法实现代码解析
  • 我就不信你还不懂HashSet/HashMap的底层原理
  • pytorch学习之pytorch构建模型的流程
  • react-swipeable-views轮播图实现下方的切换点控制组件
  • Java线程知识点总结
  • Android Compose——一个简单的Bilibili APP
  • 世界顶级五大女程序媛,不仅技术强还都是美女
  • 2023年再不会Redis,就要被淘汰了
  • 【学习笔记】深入理解JVM之垃圾回收机制
  • 【数据结构】链式二叉树
  • 自学大数据第三天~终于轮到hadoop了
  • 应用层协议 HTTP HTTPS
  • 分享一款快速APP功能测试工具
  • “大数据应用场景”之隔壁老王(连载四)
  • 03Go 类型总结
  • 2017 年终总结 —— 在路上
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • CentOS 7 修改主机名
  • Java 多线程编程之:notify 和 wait 用法
  • Javascript弹出层-初探
  • jdbc就是这么简单
  • jquery ajax学习笔记
  • leetcode386. Lexicographical Numbers
  • MD5加密原理解析及OC版原理实现
  • miaov-React 最佳入门
  • mockjs让前端开发独立于后端
  • uni-app项目数字滚动
  • unity如何实现一个固定宽度的orthagraphic相机
  • Vue 动态创建 component
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 测试如何在敏捷团队中工作?
  • 批量截取pdf文件
  • 浅谈web中前端模板引擎的使用
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • #HarmonyOS:基础语法
  • #Lua:Lua调用C++生成的DLL库
  • #QT(智能家居界面-界面切换)
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • ${factoryList }后面有空格不影响
  • $redis-setphp_redis Set命令,php操作Redis Set函数介绍
  • (python)数据结构---字典
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (三)mysql_MYSQL(三)
  • (生成器)yield与(迭代器)generator
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)使用VMware vSphere标准交换机设置网络连接
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网