CAPL语言

news2025/2/24 6:53:38

 1. CAPL简介

  • CAPL,Communication Access Programming Language,即通信访问编程语言
  • 类C语言

2. CAPL主要用途

  • 仿真节点或模块
  • 仿真时间报文、周期报文或者附加条件的重复报文
  • 使用PC键盘模拟操作按钮等人工操作事件
  • 仿真节点的定时或网络事件
  • 仿真多个时间事件,每个事件都有自己特定行为
  • 仿真普通操作、诊断或生产操作
  • 仿真物理参数或报文的变化
  • 生成错误帧,评估模块和网络软件处理机制
  • 仿真模块或网络错误来评估相关的防错机制
  • 提供网络测试、诊断等功能测试库函数

3. CAPL浏览器

CANoe自带的CAPL Browser是CAPL程序的开发环境。学习CAPL基本语法之前,先来认识下CANoe是如何创建CAPL程序。

3.1 创建CAPL程序文件

1)进入CAPL浏览器:CANoe主界面Tools → CAPL Browser

CAPL程序的文件后缀为.can

3.2 浏览器功能区

1)Home功能区:提供CAPL编译常用功能,包括代码编译以及编译等操作

2)Filter功能区:管理CAPL函数库,可在函数浏览器中屏蔽掉不需要的函数库

3)Debug功能区:提供CAPL编程常用功能,包括代码编译以及变异操作等

注:断点组件智能在debug模式开启的情况下进行操作

4)Layout功能区:设置各子窗口的显示模式

4. CAPL基础语法

基本上学习所有的语法思路都是差不多的,首先是变量与全局变量、数据类型、支持的运算符、流程控制语句以及函数等。

4.1变量的声明与定义

  • 只能使用字母字符、数字和下划线
  • 名称的第一个字符不能是数字
  • 区分大小写字符
  • 不能将CAPL关键字用作名称
  • 不能将CAPL的函数名和对象名用作变量名
  • 变量名的字符长度最好不要超过32个(编译系统只能识别前32个字符)
  • 变量名最好具有易读性,“见名知意”

注:CAPL关键字分类

  • 数据类型关键字:int, byte, long etc.
  • 控制语句关键字:if, else
  • 存储类型关键字:static, extern
  • 其他关键字:const, message

4.2 全局变量与局部变量

全局变量

  • 在variables部分声明全局变量
  • 可通过直接赋值进行初始化,如果没有初始化,编译器自动初始化为0
  • 全局变量的作用域:整个CAPL文件以及与此文件有链接的其他CAPL文件

局部变量

  • 局部变量被静态地创建,初始化只在程序体启动时执行,再次进入程序,局部变量被假定是上一次跳出程序时的值。
  • 局部变量的作用域仅限于当前函数体范围内

4.3简单变量

  • 整型:byte(0-255),word, dword, gword, int, long, int64
  • 字符:char, 可以和byte类型直接转换
  • 浮点型

4.4 复合类型

结构 struct

  • 结构名在程序中必须唯一
  • 简单类型、枚举类型或者其他的结构都可以作为结构的成员

枚举 enum

  • 枚举的成员名必须唯一(否则将有可能代替隐藏数据库中同名的报文和信号)
  • 如果没有在声明枚举的同时对成员进行赋值,编译器将按照成员声明的顺序对成员进行初始化(第一个为0,往后依次加1)

数组 Array

  • CAPL直接用字符串初始化字符数组的行为
  • CAPL也支持多维数组
  • CAPL通过内建函数elCount(数组名)来获得数组成员的个数

4.4 特殊类型

报文

  • 使用关键字message来声明一个报文变量,默认是CAN报文
  • 声明报文变量,有数据库支撑时,完整的声明应包含message ID or message name
  • Message ID以x结尾的ID表示扩展帧
  • *表示这条报文在声明时还不含有CAN ID

诊断报文

  • 通过诊断请求和诊断响应两个对象来实现和ECU之间的诊断服务交互
  • 在声明诊断对象时进行初始化

 diagRequest ServiceQualifier request;

 diagResponse ServiceQualifier response;

注:1)以上语句声明了队形request 和 response,通过给出诊断服务ServiceQualifier进行初始化;2)使用*代替ServiceQualifier,可用于初始化未添加诊断描述的空对象,但是在发送之前对象的数据必须完成具体设置

系统变量

  • 系统变量用来描述某种特殊状态(eg.某种事件的触发)或者记录测量数据
  • 可通过系统定义和用户自定义系统变量
  • 系统变量的作用域在其命令空间内

定时器

  • CAPL提供了两种定时器变量:timer和msTimer
  • timer基于秒
  • msTimer基于毫秒

6. 流程控制

6.1 if语句

If (表达式) 语句;

If (表达式) 语句1; else 语句2

6.2 switch语句

Switch (表达式):

{

Case 常量表达式1: 语句1;

Case 常量表达式2: 语句2;

……

Case 常量表达式n: 语句n;

Default:  语句n+1;

}

6.3 while语句

  • While(表达式) 语句;
  • Do-while语句:

Do

循环语句;

While(表达式)

6.4 for语句

For (<初始化>; <条件表达式>; <增量>) 语句;

  • 初始化:为一赋值语句,给循环变量赋初始值
  • 条件表达式:关系表达式,决定退出循环的条件
  • 增量:定义循环控制变量 变化/单次循环
  • 以上三者可省略,但是;不能少

6.5 break语句

  • break语句用于跳出循环体
  • 在多层循环中,一个break语句之能向外跳出一层

6.6 returen语句

  • 格式: Return 语句;
  • 一般放在函数体的最后
  • 一个函数中可以有多个return语句,但实际运行时只能有一个return语句起作用

7.CAPL程序结构

7.1头文件

Includes

{

}

  • {}中一般放.cin文件,该文件一般是一些可复用的代码段构成

includes

{

  #include "CommonFunction.cin"

  #include "BaseServices.cin"

}

  • 用户可以通过.cin文件搭建自定义的测试框架
  • cin文件中可包含其他的.cin文件,可形成多层的引用结构
  • cin文件中一般存放可复用的代码

7.2 全局变量的声明

Variables

{

}

  • 在此部分声明的全局变量生命周期从仿真开始持续到仿真结束,作用域为整个CAPL文件

variables

{

  int i =0;

  message 100 msg;

  msTimer myTimer;

  byte ECU_Serical_Number[3]= {0x31, 0x32, 0x33};

}

7.3 事件处理 event handler

CAPL采用面向事件的机制满足CANoe对于CAN通信网络建模、仿真、测试和开发。

事件起始关键字on *

On *     /On 后加条件语句,比如message XXX或者是Timer XXX等

{

语句; /实现接下来要含完成的操作

}

关键字this

在CAN报文事件或者变量事件中,用this访问数据内容,

on message 100

{

  byte byte_0;

  byte_0 = this.byte(0);

}

这里的this指代的是前面说的报文100,总之this指代的就是前面提到的事件或者数据。

系统事件

  • 主要用于处理CANoe测量系统的控制功能
  • 常见的系统事件:
  • On prestart:仿真测量初始化
  • On start:CAPL程序开始
  • On prestop:仿真测量停止
  • On stopMeasurement:仿真测量结束

CAN控制器事件

  • 对硬件接口设备中CAN控制器状态变化事件的响应
  • CAN控制器事件有:

CAN报文事件

  • 在CAN总线上有指定的或任意报文出现时调用CAN报文事件
  • 格式为: on message xxx

CAN信号事件

  • CAN总线上出现指定的信号时调用该事件(需要配合DBC文件使用)
  • 格式为:on signal xxx (指定信号的值发生变化时调用)

或者 on signal_update xxx(每次接收到指定信号时均被调用)

定时事件

  • 定时器变量用来创建一个定时事件
  • SetTimer函数用来设定时间间隔
  • 定时器运行到达设定时间间隔触发定时事件 on timer {}
  • 周期性触发需要每次触发结束后使用SetTimer复位
  • cancelTimer函数用来在定时器运行中需要取消计时

variables

{

  message 0x555 msgl;  //将报文0x555起名为msgl

  msTimer myTimer;     //声明一个毫秒计时器

}

on start

{

  setTimer(myTimer,100);    //将定时值设置为100ms并启动

}

//定时器超时,触发以下事件

on timer myTimer

{

  serTimer(myTimer, 100);  //复位定时器

  msgl.byte(0) = msgl.byte(0) +1;  //报文0x555的第一位上数据增加1

  output(msgl);    //发送报文0x555

}

键盘事件

这个事件是用来定义一些在键盘上输入某些字母或者数字,来实现快捷操作的目的。

格式为:On key xxx

//以下事件定义了在键盘上敲击S,write窗口会打印语句“Logging Starts"

on key 's'

{

  write("Logging Starts");

}

错误帧事件

  • 总线上出现错误帧或者过载帧时,错误帧事件将被调用,以进行错误帧处理
  • 格式:on errorframe {}

系统变量事件

  • 该事件是对系统变量发生变化的响应,我们写面板的时候这个语句用的最多

//以下语句定义了系统变量DI_O改变时,触发以下事件

on sysVar IO::DI_O

{

  $Gateway::IOValue1 = @this;  

}

//以下语句定义了系统变量DI_O更新时,触发以下事件

on sysvar_update IO::DI_O

{

  $Gateway::IOValue2 = @this;

}

诊断事件

  • 诊断事件是在诊断请求或诊断响应发生时产生
  • 常用诊断事件

7.4 函数

CAPL其实自身有一个很强大的函数库,几乎可以满足用户绝大部分的需求,包括一些:

  • 计算函数
  • 字符串函数
  • CAN总线函数
  • LIN总线函数
  • 诊断函数
  • 通用函数

同时,用户可可以根据自己的需求,自定义一些满足自己独特需要的函数

  • CAPL函数致力于定义接口,形成模块化的代码以提高代码的重用性
  • 与C的区别有以下几点:1)当返回类型省略时,被默认解释为void类型;2)允许函数包含一个空的形参列表;3)允许重载函数;4)函数可用实参进行类型检查,如果类型不同则检查是否能够通过隐式类型转换,如不能,则无法通过编译; 5)任意维度或大小的数组都可被作为函数参数传递; 6)大部分CAPL支持的数据类型都可以直接声明为函数参数

8. 访问信号和变量

CAPL因为支持总线数据库,所以可以直接访问数据库已定义的报文(message)名称、类型和标识符等属性。访问语法如下:

on message 数据库中报文的名字

{

  此处写要执行的动作;

}

刚开始看CAPL代码对于一些XXX::XXX以及@XXX以及$XXX的表述感觉很奇怪,看不进去。后面才搞清楚了这是CAPL访问数据的特殊表达方式,今天就在这里好好总结一下:

信号、系统变量和环境变量都可以被直接访问和赋值,只是方式稍微有些不同

访问信号

虽然不能通过CAPL定义一个信号,但是却可以通过CAPL访问信号的值,只是我们访问信号的值一般在信号名字前面加上$符号,比如:

a = $EngineSpeed;   //将信号EngineSpeed的值赋给变量a

b = $EngineSpeed.raw;   //将信号EngineSpeed的物理值赋给变量b

$VehicleSpeed = 80;   //将信号VehicleSpeed的值设置为80

有时候也见过这种表达:

$Gateway::VehicleData::VehicleSpeed

这也是信号的一种表达方式,即 节点::报文::信号,这是为了避免重名的信号出现,在前面加上节点、报文也是为了更精确的引用。比如一个学校有好几个叫小明的,你指定是六年级::一班::第三排::王小明,一般就不会找错了。

完成的引用格式是:

channel::Node::Message::Signal

顺便介绍以下这种格式输入的好用的方法:

在要输入信号的CAPL程序位置,点击右键,如下操作,会跳转至数据库文件,找到自己要引用的信号,这样就不用手输入了。变量也是同理。

还有一种常用的又不会出错的引用信号的方式是:

VehicleData.VehicleSpeed = @this;   //VehicleData报文底下的信号VehiclSpeed

访问变量

格式:@变量空间名字::变量名

if((@Engine::Gear ==2)&&(@Power::KeyState==2))

a = @EngineSate;   //直接访问

环境变量也是如此,不过我们也可以用getValue()和putValue()访问变量的值,比如:

a = getvalue(EngineSpeed);   //读取变量EngineSpeed的值并将其赋值给变量a

b = putvalue(EngineSpeed);  //输出变量EngineSpeed的值并将其赋值给变量b

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

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

相关文章

从编译器角度理解C++代码的编译和链接原理

在本文中&#xff0c;我们将探讨C代码的预处理、编译和链接过程。我们将详细介绍每个过程的作用和步骤&#xff0c;并通过代码演示来解释这个过程。 预处理 C代码预处理是将源代码转换为另一个源代码的过程&#xff0c;其中包括宏展开、条件编译、头文件包含等操作。预处理器…

Level3题目整理

文章目录L3-001 凑零钱L3-002 特殊堆栈L3-003 社交集群&#xff08;并查集vector暴力⭐&#xff09;L3-004 肿瘤诊断(三维bfs)L3-005 垃圾箱分布&#xff08;多次dijkstra&#xff09;L3-008 喊山&#xff08;邻接表bfs&#x1f53a;&#xff09;L3-010 是否完全二叉搜索树&…

C++ STL学习之【list的模拟实现】

✨个人主页&#xff1a; 夜 默 &#x1f389;所属专栏&#xff1a; C修行之路 &#x1f38a;每篇一句&#xff1a; 图片来源 A year from now you may wish you had started today. 明年今日&#xff0c;你会希望此时此刻的自己已经开始行动了。 文章目录&#x1f307;前言&am…

零售数据分析之操作篇12:子查询的应用

各位数据的朋友&#xff0c;大家好&#xff0c;我是老周道数据&#xff0c;和你一起&#xff0c;用常人思维数据分析&#xff0c;通过数据讲故事。 上期内容与作业 上一讲讲了占比相关内存计算的应用场景&#xff0c;包括占比、TOP占比、累计占比等&#xff0c;不同的占比&am…

sinGAN论文笔记

Background Knowledge 基于推理的视觉理论&#xff1a; 只根据图像数据本省不能对相对应的物体空间结构提供充分的约束&#xff0c;也就是说这是一个约束不充分的问题&#xff0c;因此为了理解图像的内容必须要有附加的约束条件&#xff08;例如知道图中是哪一类物体的知识&am…

帮助中心能帮助企业解决什么问题?

帮助中心是企业在网站、应用程序或其他数字渠道上提供的一种资源&#xff0c;旨在帮助客户解决问题、回答常见问题并提供支持。一个完善的帮助中心可以为企业带来很多好处&#xff0c;包括提高客户忠诚度、提高满意度、降低客户支持成本等。 帮助中心能帮助企业解决的问题 提…

为什么会有JMM?从0到1一次性说清楚

JMM&#xff08;Java Memory Model&#xff09;是一种规范&#xff0c;定义了在多线程环境下Java程序中的内存访问行为。JMM保证了在多线程环境下程序的正确性&#xff0c;同时也允许编译器和处理器对指令进行优化&#xff0c;以提高程序的性能。 Java线程之间的通信由Java内存…

网络编程套接字(一)

学习任务&#xff1a; 我们先来认识端口号&#xff0c;区分好主机IP和端口号的区别&#xff0c;以及涉及到进程PID和端口号的区别。 然后简单认识一下TCP协议和UDP协议&#xff0c;这两个协议都是传输层的。接着了解什么是网络字节序&#xff0c;它有什么作用。然后是网络编程的…

Windows搭建Typecho个人博客并发布公网访问【内网穿透】

文章目录前言1. 环境安装2. 安装Typecho3. 安装cpolar内网穿透4. 固定公网地址5. 配置Typecho前言 本文小新为大家带来windwos系统搭建typecho博客cpolar内网穿透工具将博客发布到公共网络环境教程。 Typecho是一款PHP语言编写的开源博客程序&#xff0c;它是一个轻量级的内容…

某某客户的一次勒索病毒应急响应

Lockbit勒索病毒应急响应背景1、应急处理排查2、勒索病毒来源分析3、勒索病毒分析4、勒索病毒解密5、主机分析分析6、后续安全加固和改进措施结论背景 美好的周六刚开始&#xff0c;眼睛一睁&#xff0c;领导就发消息&#xff0c;说某客户中了勒索病毒&#xff0c;特别着急&am…

测评了100款零售软件,选出5个最好用零售软件分享给你!

满大街的各种服装店、便利店、百货店、母婴店...... 每天都要处理大量的订单&#xff0c;使用传统的人工开单记账&#xff0c;效率低下、客户体验差、而且容易出现&#xff0c;需要耗费很多时间来回对账&#xff1b; 聪明的零售店老板都已经开始使用零售软件来管理门店&#xf…

[C++]list类的模拟实现和相关函数的详解(正反向迭代器)

文章目录架构代码实现listNode正向迭代器框架迭代器函数重载*&#xff08;解引用&#xff09;->&#xff08;箭头指向&#xff09; -- ! 反向迭代器框架*&#xff08;解引用&#xff09;->&#xff08;箭头指向&#xff09; -- ! list默认成员函数构造函数拷贝构造赋值重…

QT学习笔记2

1.重载自定义信号与槽&#xff1a; 定义天黑类&#xff1a;里面有一个有参数的信号和没有参数的信号 tianhei.h #ifndef TIANHEI_H #define TIANHEI_H#include <QObject>class Tianhei : public QObject {Q_OBJECT public:Tianhei(); //构造函数声明signals:void tia…

Linux 用户的特殊shell与PAM模块

文章目录Linux 用户的特殊shell与PAM模块特殊的shell&#xff1a;/sbin/nologinPAM模块简介PAM模块设置语法常用模块简介login的PAM验证机制流程其他相关文件limits.conf使用案例/var/log/secure、/var/log/messagesLinux 用户的特殊shell与PAM模块 你想过吗&#xff1f;如果我…

无向连通图中长度为 n 的循环

给定一个无向连通图和一个数字 n,计算图中长度为 n 的循环总数。长度为 n 的圈简单地表示该圈包含 n 个顶点和 n 条边。我们必须计算所有存在的此类循环。 示例: 输入:n = 4 输出:总周期数 = 3 解释 :遵循 3 个独特的循环0 -> 1 -> 2 -> 3 -> 0 0 -> 1 …

【一起啃书】《机器学习》第一章 绪论 + 第二章 模型评估与选择

第一章 绪论 1.机器学习&#xff1a;研究如何通过计算的手段&#xff0c;利用经验来改善系统自身的性能。在计算机系统中&#xff0c;”经验“通常以“数据”的形式存在&#xff0c;所以机器学习研究的主要内容也是如何通过这些数据产生一个模型&#xff0c;进而通过这个模型为…

基于SpringBoot+Vue毕业生信息招聘平台系统【源码+论文+演示视频+包运行成功】

您好&#xff0c;我是码农飞哥&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通 ❤️ 2.网上优质的Python题库很少…

Hello之CJavaPython

​ 前言&#xff0c;原来是java程序员&#xff0c;最近学习了一段时间发现&#xff0c;java只关注业务逻辑的开发&#xff0c;封装了很多的东西&#xff0c;导致底层的许多东西不是太了解&#xff0c;突然某一天&#xff0c;灵光凸现&#xff0c;既然语言都是相通的&#xff0c…

工业机器人远程监控解决方案

一、项目背景 随着我国科技不断进步发展和产业升级的不断进行&#xff0c;现阶段机器人应用在生产制造行业以及运输行业已经变得越来越广泛。工业机器人机构复杂、维护成本高&#xff0c;机器人应用的这一行业现状&#xff0c;对工业机器人生产企业的产品高品质服务能力提出了…

Samba共享

关闭selinux跟防火墙 setenforce 0 systemctl stop firewalld 安装samba以及客户端 yum install samba samba-client -y 创建共享目录 mkdir -p /data/share1 mkdir -p /data/public 添加samba用户并配置权限 useradd zsuser smbpasswd -a zsuser 修改配置文件并重启服…