
一、 全局变量 (Global Variables)全局变量定义在 CAPL 浏览器顶部的variables区域整个脚本包括所有事件处理程序都能访问它。1. 数据类型与 C 语言基本一致常规类型DWORD,LONG,WORD,INT,BYTE,CHAR和 C 语言类似。64位整数QWORD,INT64。浮点数FLOAT和DOUBLE是一回事都是 64 位浮点数。2. 定时器 (Timer) 的特殊规则声明必须用timer关键字。启动条件光声明没用必须调用setTimer()函数才会开始计时。触发时间到了之后会自动去执行on timer事件。⚠️ 坑点定时器变量不能赋初始值。3. 报文 (Message) 的规则用message声明报文对象。默认值如果不显式初始化报文默认的DIR方向是TXREQUEST发送请求。初始化技巧可以在声明时直接指定 DLC数据长度和字节偏移量这样很方便。4. 支持数组 (Arrays)在 CAPL 里你可以声明简单的数组、一维向量、甚至是矩阵多维数组连message类型的变量也可以做成数组。二、 本地变量 (Local Variables)这部分是文档的重点。CAPL 里的“本地变量”和 C 语言里的“本地变量”完全不一样1. 默认是静态的 (Static) —— 记住这个特性C 语言每次调用函数局部变量都会重新创建重新赋初值。CAPL局部变量在程序启动时只创建一次。当你离开这个函数或事件时变量的值会被保留下次再进入时它会带着上次离开时的值。 示例voidmyFunction(){intcount0;// 你以为每次进来都是 0count;write(Current count is: %d,count);}// 第一次调用输出Current count is: 1// 第二次调用输出Current count is: 2 (因为它记住了上次的值)2. 堆栈变量 (Stack Variables) —— 打破静态限制的利器如果你确实需要像 C 语言那样每次进函数都重置变量怎么办从CANalyzer 12.0 SP3开始可以在变量前加stack关键字。加了stack后每次执行函数这个变量都会被重新初始化。注意stack关键字的作用范围是直到遇到分号;为止。如果有多个变量需要栈化每个都需要加或者用逗号隔开并在最后统一加分号详见下方代码。并发测试的神器如果你用testStartParallel并发跑测试用例默认的静态变量是所有线程共用的会打架而用stack声明的变量是每个线程独立的互不干扰。3. 初始化表达式的限制对于普通静态本地变量只能用常量初始化比如int a 5;。如果你用了stack声明从 13.0 版本开始就可以用运行时计算出的表达式来初始化了。三、 官方示例解析简单类型intj,k2;// j 0 (默认自动初始化为0)k 2doublef17.5;// 声明浮点数并初始化// 添加了 stack 关键字每次调用都重新赋值为 1 和 2stacklongl11,l22;msTimer t1;// 定时器变量千万不能赋初值所以后面空着为什么 CAPL 要这么设计CAPL 设计成静态局部变量是为了事件驱动编程准备的。因为在车载网络仿真中函数往往是用来处理报文或定时器事件的。很多时候我们需要在两次事件之间“记住”状态比如上一次收到的报文值或者计数器静态变量天然就充当了这种状态机变量。如果需要临时变量加上stack即可完美解决*** 消息变量的初始化**message100msg{dlc4,word(0)0x1234};*** Arrays:**intlookUpTable[3]{1,2,3};chartext[12]Hello world;intmatrix[2][2]{{11,12},{21,22}};