capl编程中有三种比较特殊的变量。
(1):系统变量
(2):环境变量
(3):DBC信号变量(其中也包括,ARXML,LDF,ODX/cdd等数据库中定义的变量)
这三种变量不需要在variables中声明,就能直接使用。
(1):系统变量
定义方式:在CAPL主界面中定义。
点击System Variables 得到如下界面
首先看最前面:User-Defined (客户定义),System-Define(系统定义),Name-Display(姓名展示)。
客户定义,就是可以自定义完成的,用户可以按照工程需要,自己定义的变量。
我们点击这个NewSystemVariable 就得到如下界面
我将这个设置界面,分为三部分。
我们先看部分1:
Namespace
Name
Comment
DataType
首先我们需要添加命名空间( NameSpace):这个namespace相当于代表一系列系统变量的集合,可以类比于C++中的namespace。我们需要知道的是,我们在使用系统变量时,一定要加上@+命名空间+::+信号名,如我们需要创建一个Door模块的系统变量合集,我们将这个namespace命名为:DoorModuleSysVars。另外namespace还是可以嵌套的。
第二个选项是:name,也就是我们定义的信号,如我们定义一个DoorStus的系统变量,唯一需要注意的就是需要符合自定义标识符命名规则,即只能使用字母,数字,下划线,且开头第一个字符只能使用字母和下划线,同理namespace名称也要符合上述要求。下面这张图就是个错误示范:
commment ,在需要的时候,可以对变量用途进行标注,但是通常情况下。我们建议在命名阶段,在name阶段,就需要尽量把信号的含义尽量表达出来。
DataType这个很关键,必须要非常注意,注意根据我们需要定义的信号合理选择信号的类型。注意两点 (1:信号是否存在负数,2信号的取值范围与数据类型一定要匹配)
* CAPL系统变量(sysvar),是可以设置为Integer类型,但是需要注意的是,系统变量中的Integer分为4Byte(32bit)和8Byte(64bit)位两种类型。
*double 没有什么特别的地方,默认为有符号,不能把系统变量定义为无符号类型。
*Data 不限制数据长度,但是必须 两个数字来表示,如 4A FF .. .. .. .. 需要注意的是,不同的二进制数字之间,必须用空格符给隔开。
string,字符串型变量,这里有一个知识点,我们需要知道定义的string是否和c一样,字符串的最后一位是“\0”,我们先来定义一个string类型的系统变量。
这里我们定义了一个系统制造商的信息,注意初始值定义时,不需要加""双引号。如果加上了双引号"bosch",就相当于c中的 char EngineManufacture[]=""bosch"",这一点需要注意。
我们写这样一段代码:for(i=0;i<6,i++) write("%c",EngineManufacture[i]),我们看看最后一位,结果又得到另外一个知识点
编译后直接报错:原因是:CAPL中只能引用integer或者类型变量。我直接就麻掉了。这啥破玩意,但是吐槽归吐槽,我们现在还只能接受它的这种设定。但是实测发现double类型数据,包括integer array 整形数组 和 double array双精度数组,如果系统变量定义为这两种数据类型,也是不可以直接访问的。
如果系统变量被定义为数组类型,我们在定义的时候,需要对其进行初始化操作,每个成员之间需要使用封号“;”进行隔离,且如果定义数组实际长度小于我们定义的长度,则后面的数值默认为0。但是如果实际长度超过定义长度,那么将会报错。如下图所示:
这里我们设置Array Size为3,然后在初始值我们设置了1;2;3;4四个数字,此时就会报错,另外需要注意的一点就是,每个元素都要用";"封号隔开。
最后一个元素,不能添加封号;不然也会报错
接下来,看Minimum/Maximum/Unit/ValueTable
Minimum/Maximum,最大最小值设定,在单个变量中,很好理解。就是限定了这个变量最小和最大能赋值的极限。但是对于数组该怎么理解这个最大最小值?这里的最大最小值,就是对每一个元素都加以同等的限制。如:
如上图,就是1<=每一个元素变量<=5。Unit也是一样,是每个元素的单位。
接下来看看ValueTable,点击这个按钮
得到如下界面:整体界面分为左右侧。左侧分为Template,我们可以看到已存在的模板,鼠标右键单击底下空白处,可以新建(new),Delete(删除),Duplicate(复制)
单我们新建一个ValueTable后,右侧会默认出现一组0,直接右键双击,选中框内,可直接编辑。当我们选中第二行,添加Value=1,Description编辑完成后,底下会自动生成另外一个编辑框,如下图所示:
接下来,看第三部分:
第三部分:主要是设置系统变量的使用场景,使用模式等。
第一条OnlyUsed in Analysis Mode 勾选之后,表明该系统变量只仅仅使用在Analysis模式下使用。对于这一条的作用:我摘抄了一段CANoe自带文档,方正我是没看懂,(本人是使用机翻)
“如果变量在测量设置中用作辅助变量,则应选择“仅用于分析”。
然后,测量设置中程序节点对变量的更改不会转发到实时区域,而是会立即进行处理。结果,变量变化接收当前模拟时间的时间戳。否则,只在实时区域中处理更改,这会导致一定的延迟。
如果该设置既没有打开也没有关闭,则只要测量设置中的程序节点(在运行时)更改了变量,就会自动定义该变量,仅用于分析目的。只有在该选项存在之前的早期程序版本中定义了系统变量,系统变量才具有此未定义状态。
用于分析的系统变量仍然可以由CANoe的实时区域使用。但是,写入窗口中会显示一条警告,表示分析区域中的值更改将不再传输到实时区域。
在脱机模式下,不使用CANoe的实时区域。因此,系统变量只能在测量设置中更改,要直接处理这些更改,您必须将变量定义为“仅用于分析”。”
(2):环境变量
之前很长一段时间内,我都搞不懂“环境变量”和“系统变量”之间的区别和联系。我查阅了不少资料,总结如下:
环境变量(EnvironmentVariable)是vector早期推出来的,一种变量,需要定义在DBC文件中(多说一句,现在版本的CANdb++中只有选取专门的模板,才能添加环境变量)。
环境变量和系统变量的相同点:
1、都可以作为ECU、面板和CAPL程序相连接的媒介。例如,在CAPL程序中,通过改变或监控某一环境变量的值可以触发特定的动作,同样,环境变量的值也可以与面板上控制控件或显示控件相关联。
2、环境变量和系统变量在CAPL程序中的使用时的相同点和不同点:
相同点:直接引用时都要添加“@”符号
不同点:系统变量有命名空间的概念,而环境变量则没有这种概念
环境变量:@envKL30
系统变量:@sysvar::EngineModule::EngineSpeed(注意系统变量其实可以理解为sysvar,是一个命名空间,然后又嵌套了一个名为EngineModule的命名空间)
接下来我们具体的看,环境变量的具体性质,又因为本人使用的是CANoe15,3版本,而12版本之后,就不在兼容创建新的环境变量,但是可以打开存在环境变量的DBC文件。
如下图所示,就存在两个系统变量:
看看详细的设置,情况
同样的,可以设置信号名称,变量类型(),单位,以及数值表。这些属性和系统变量其实都差不多。
环境变量还有个Access属性比较特别
(1:unrestricted:无限制)
(2:read 只读属性)
(3:wirte)
(4:read和write)
最后需要再啰嗦一遍,目前是极不推荐,继续使用环境变量的。道理很简单,现在版本已经不支持,创建新的环境变量。