Vector - CAPL - 数据库和CAPL_02

news2024/11/26 18:43:06

 DBLookup 动态读取数据库中的信息

//Transmitter 属性以及数据库属性只能通过 DBLookup 动态读取。
//返回数据库中存储的 DLC
on message *
{
    int myAttributeValue;
    myAttributeValue = DBLookup(this).MyAttribute;
    write(this.Transmitter); // compiler error
    write(DBLookup(this).Transmitter); // OK
}

//返回特定消息的当前值
on message EngineData
{
    int myDLC;
    myDLC = DBLookup(this).DLC;
}


myDLC = EngineData.DLC;

        它们可能会有所不同,因为 DLC 可以更改,例如 在 CAPL 程序中。

        在数据库中动态搜索消息可能需要一些时间,尤其是对于大型数据库。 因此,如果消息类型已知,最好静态访问属性。

// 检查特定节点的所有消息,表明 DLC 正确。
// 在测量结束变量的表中总结不正确 DLC 的 DLC 信息
{
  // system under test
  char gNodeUnderTest[30] = "Gateway";
  // max DLC, min DLC, counter, channel; key is always the id
  int gFrameMaxDLC[long];
  int gFrameMinDLC[long];
  int gFrameCounter[long];
  byte gFrameChannel[long];
}
on message *
{
  // 检查来自一个节点的所有帧是否有正确的 dlc 并对其进行计数
  // 框架是在数据库中定义的吗?
  if (DBLookup(this))
  {
    // 被测节点的帧是否定义为 Tx-Frame?
    // 注意:比较区分大小写
    if (strncmp(DBLookup(this).Transmitter, gNodeUnderTest, 30) == 0)
    {
      // 检查DLC是否正确; 如果没有,请记住最小值
      // 或接收帧的最大 DLC
      if (this.dlc < DBLookup(this).DLC)
      {
        gFrameCounter[this.id]++;
        gFrameChannel[this.id] = this.can;
        if (!gFrameMinDLC.containsKey(this.id) || this.dlc < gFrameMinDLC[this.id])
          gFrameMinDLC[this.id] = this.dlc;
      }
      else if (this.dlc > DBLookup(this).DLC)
      {
        gFrameCounter[this.id]++;
        gFrameChannel[this.id] = this.can;
        // 注意:第一次访问映射元素返回 0,它总是较小的
        if (this.dlc > gFrameMaxDLC[this.id]) gFrameMaxDLC[this.id] = this.dlc;
      }
    }   // else: another node, not interesting
  }     // else: event is not defined in the database
  output(this);   // 仅当节点位于测量设置中时使用
}
on stopMeasurement
{
  message * m;
  for (long currentId : gFrameCounter)
  {
    m.id = currentId;
    m.can = gFrameChannel[currentId];
    write ("Frame %s[%d]:", DBLookup(m).Name, currentId);
    write ("    Incorrect count: %d", gFrameCounter[currentId]);
    write ("    DLC as in DB: %d", DBLookup(m).DLC);
    if (gFrameMinDLC.containsKey(currentId))
      write ("Actual min DLC: %d", gFrameMinDLC[currentId]);
    if (gFrameMaxDLC.containsKey(currentId))
      write ("Actual max DLC: %d", gFrameMaxDLC[currentId]);
  }
}

Access to Node

        对于某些应用程序,了解特定节点发送或接收哪些消息非常有用。 可以通过专门的预定义字段访问特定节点的所有消息的 ID,并特别迭代这些字段的内容。

以下字段可用:

        Nodename.Tx:包含节点发送的所有消息
        Nodename.Rx:包含节点接收到的所有消息
        Nodename.ALL:包含节点发送和接收的所有消息
        如果多个数据库中包含同名节点,则可以使用数据库名称对其进行限定:        DBName::Nodename.Tx。

// 检查节点的所有消息,表明 DLC 正确。
// 在测量结束时在表中汇总消息的 DLC 信息。
// 仅在测量之前或之后使用数据库查找
variables
{
  // max DLC, min DLC, counter, channel; key is always the id
  int gFrameMaxDLC[long];
  int gFrameMinDLC[long];
  int gFrameDefaultDLC[long];
  dword gFrameCounter[long];
  dword gFrameIncorrectCounter[long];
}
on preStart
{
  dword i;
  message * m;
  m.can = 2;
  
  // 使用 DB 中定义的默认 DLC 初始化 DLC 映射
  for (i = 0; i < elcount(PowerTrain::Gateway.TX); ++i)
  {
    m.id = PowerTrain::Gateway.TX[i];
    gFrameMaxDLC[m.id] = gFrameMinDLC[m.id] = gFrameDefaultDLC[m.id]
      = DBLookup(m).DLC;
  }
}
on message *
{
  // is the frame one of those transmitted by the node?
  if (gFrameDefaultDLC.containsKey(this.id))
  {
    gFrameCounter[this.id]++;
    // check if the DLC is correct; if not, remember the minimum
    // or maximum DLC of the received frames
    if (this.dlc != gFrameDefaultDLC[this.id])
      gFrameIncorrectCounter[this.id]++;
    if (this.dlc < gFrameMinDLC[this.id])
      gFrameMinDLC[this.id] = this.dlc;
    else if (this.dlc > gFrameMaxDLC[this.id])
      gFrameMaxDLC[this.id] = this.dlc;
  } // else: another node, not interesting
  output(this);   // 仅当节点位于测量设置中时使用
}
on stopMeasurement
{
  message * m;
  m.can = 2;
  for (long currentId : gFrameDefaultDLC)
  {
    m.id = currentId;
    write ("Frame %s[%d]:", DBLookup(m).Name, currentId);
    write ("    Received count: %d", gFrameCounter[currentId]);
    write ("    Incorrect count: %d", gFrameIncorrectCounter[currentId]);
    write ("    DLC as in DB: %d", DBLookup(m).DLC);
    write ("    Actual min DLC: %d", gFrameMinDLC[currentId]);
    write ("    Actual max DLC: %d", gFrameMaxDLC[currentId]);
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/718473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AR试穿试戴相关SDK或平台

1.火山引擎 链接 咨询过平台收费比较高几十万一年而且还是起步价 2.Geenee 链接 geenee在衣服、裤子、头饰以及鞋子方面可以实现试穿。 3.Wanna 链接 Wanna 试衣、试包、试鞋及手表都可以&#xff0c;我试过鞋子的试穿效果还不错 4.DeepAR …

sqlite维护命令复习学习

前面已经看了一些sqlite命令&#xff0c;例如查看表名&#xff0c;查看表结构等&#xff1b;下面继续看一下&#xff1b; 查看全部表名&#xff1b; 查看单个或全部的表结构&#xff1b; 输出表结构和数据&#xff1b; 使用.output 把查询结果定向到1.txt&#xff1b; 重新定向…

Java设计模式系列--观察者模式写法2:JDK

原文网址&#xff1a;Java设计模式系列--观察者模式写法2&#xff1a;JDK_IT利刃出鞘的博客-CSDN博客 简介 说明 本文用示例介绍观察者模式的一种写法&#xff1a;JDK。 JDK的观察者模式简介 在 Java 中&#xff0c;java.util.Observable 类和 java.util.Observer 接口定义…

Elsevier: Expert Systems With Applications 经验分享

目录 序时间线投稿返稿录用模板下载链接 序 这是一篇Elsevier旗下Expert Systems With Applications(ESWA)期刊的投稿经验分享。虽然是ESWA&#xff0c;但对于Elsevier旗下的其它期刊也适用&#xff0c;他们都可以用一套模板。 需要注意的是不同期刊会有一些特别的要求&#…

13 直接存储器访问DMA(基于STM32HAL库)

目录 DMA-直接存储器访问控制器 DMA概览 DMA的作用 DMA框图 DMA外设要点概括 DMA功能对比 STMF10x DMA具体内容 DMA主要特性 DMA中断 DMA请求映像 DMA的使用步骤 HAL库中的DMA功能实例 句柄结构体介绍&#xff08;以DMA为例&#xff09; 外设初始化结构体介绍 具体…

多元回归预测 | Matlab基于粒子群算法优化深度置信网络(PSO-DBN)的数据回归预测,matlab代码回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于基于粒子群算法优化深度置信网络(PSO-DBN)的数据回归预测,matlab代码回归预测,多变量输入模型,多变量输入模型 评价

聊聊不同集群的微服务如何通过feign调用

前言 之前业务部门的某项目微服务调用关系如下图 后因业务改造需要&#xff0c;该项目需要将服务A部署到另外一个集群&#xff0c;但服务A仍然需要能调用到服务B&#xff0c;调用关系如下图 之前调用方式是负责服务B的开发团队提供相应的feign客户端包给到服务A开发团队&…

三种Linux内核代码在线阅读工具

记录一下 1 . 可在线阅读uboot&#xff0c;kernel&#xff0c;busybox(rootfs)&#xff0c;可搜索字符串&#xff0c;函数跳 https://lxr.missinglinkelectronics.com/ 界面如下&#xff1a; 2. 显示界面跟代码编辑器很像&#xff0c;同样可以函数跳转 https://elixir.boot…

如何让罗技29方向盘像视频中的那样转动起来?

​​​​​​​[vlog]Autoware Carla G29 自动驾驶仿真_哔哩哔哩_bilibili 话接上文&#xff0c;在我之前一篇博客中已经讲解了如何给罗技29方向盘装上力反馈&#xff0c;也就是在拨动方向盘的时候感觉有一个力组织你过度的拨动方向盘&#xff0c;其实它真正的用处是用于实现对…

【Web3】认识区块链

目录 区块链特征 区块链类型 区块链的概念 区块链特征 去中心化&#xff1a;区块链是由一个分布在多个参与者之间的网络组成&#xff0c;没有中央机构或中介控制整个系统。所有参与者共同维护和验证账本的完整性&#xff0c;减少了单点故障和集中式控制的风险。共识机制&…

【HTTPS】采用的加密策略, 什么是中间人攻击? 什么是证书?

文章目录 前言一、认识 HTTPS 协议1, 对称加密2, 非对称加密 二、HTTPS 加密策略1, 只采用对称加密 : 不安全2, 引入非对称加密3, 中间人攻击之偷梁换柱4, 引入证书4.1 什么是证书4.2, 证书如何能解决"中间人攻击" 总结 前言 各位读者好, 我是小陈, 这是我的个人主页…

日历与时钟

目录 公历 黑色星期五 生物韵律 公历 在公历中&#xff0c;当年份为4的整数倍&#xff0c;但不是100的整数倍时&#xff0c;会出现闰年的现象。 y40 mod(y,4) 0 && mod(y,100)||mod(y,400)0 输出当时的年、月、日、时、分、秒 f%6d %6d %6d %6d %6d %9.3f\n cclock …

MySQL学习基础篇(八)---聚合函数

MySQL学习基础篇(八)—聚合函数 聚合&#xff08;或聚集、分组&#xff09;函数&#xff0c;它是对一组数据进行汇总的函数&#xff0c;输入的是一组数据的集合&#xff0c;输出的是单个值。 1. 聚合函数介绍 什么是聚合函数&#xff1a;聚合函数作用于一组数据&#xff0c;…

前端实战——尚品汇(网页开发)

/* 基础设置 */ .container {width: 1190px;margin: 0 auto; } /* #region顶部导航条start */ .topbar {height: 30px;background-color: #ececec; } .welcome {height: 30px;line-height: 30px;font-size: 0;color: #666; } .welcome span,.welcome a {font-size: 12px; } .we…

AIGC - Stable Diffusion WebUI 图像生成工具的环境配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131528224 Stable Diffusion WebUI 是一款基于深度学习的图像生成工具&#xff0c;根据用户的输入文本或图像&#xff0c;生成高质量的新图像&…

关于VMware虚拟空间的创建、Linux系统的安装

文章目录 前言一、Windows用户安装VMware软件1.1 下载VMware1.2 正常安装VMware后&#xff0c;该软件是要收费的&#xff0c;但是下面的链接可以让你使用很久 二、Mac用户安装VMware软件2.1 下载macOS版本&#xff1a;VMware Fusion2.2 正常安装VMware后&#xff0c;该软件是要…

「2024」预备研究生mem-形式逻辑强化:推矛盾

一、推矛盾 易错题&#xff1a;重点 重点&#xff1a; 二、课后题 三、每日一练

新版本vscode使用配置文件功能,解决不同项目使用不同的插件

如果你同时有vue2,vue3的项目。一定会遇到插件的问题。因为vue2项目插件是使用vetur的&#xff0c;vue3是使用volar的。 以前vscode为了在不同项目中能使用不同的配置文件&#xff0c;是使用工作区的概念去解决的&#xff0c;但是比较复杂而且不好用。 现在新版本的vscode&…

【温故而知新】Android架构模式

Android项目工程中常用的架构模式有MVC, MVP, MVVM以及现在新出的MVI。 下面一起温故而知新。 MVC MVC&#xff08;Model-View-Controller&#xff09;是一种在Android应用程序中使用的架构模式&#xff0c;用于实现松耦合、可测试和可维护的应用程序。 MVC架构模式包括三个…

高级篇十六、多版本并发控制(重要)

目录 1、什么是MVCC2、快照读与当前读2.1 快照读2.2 当前读 3、复习3.1 隔离级别3.2 隐藏字段、Undo Log版本链 4、MVCC实现原理之ReadView4.1 什么是ReadView&#xff1f; 1、什么是MVCC MVCC &#xff08;Multiversion Concurrency Control&#xff09;&#xff0c;多版本并…