CAPL中,信号、系统变量和环境变量可以直接被访问和赋值,但赋值方式各不相同。
1 CAPL中访问信号
需要指出的是,signal在CAPL中代表的是总线信号交互层的表示,它不同于message。message是CAPL的数据类型,而signal不是。因此不能再CAPL中定义一个类型为signal的变量。
当用户需要访问信号缓冲区并期望读到最后接收到的信号值时,可以使用$符号。
value=$EngineSpeed;//读取信号EngineSpeed的值
value=$EngineSpeed.raw;//读取信号EngineSpeed的raw数据
$EngineSpeed=550;//将EngineSpeed的值设为550
在一个仿真工程中,信号的定义可能会出现歧义,主要原因是含有多个总线网络,不同数据库中出现相同名称的信号名。为了区别不同的信号,CAPL中需要增加通道(Channel)、网络(Network)、节点(Node)、和报文(Message)的信息。完整版语法格式如下:
[(channel|network)::][node::][message::]signal
注:[]里的内容表示可有可无。
用户可以使用上面的全部或部分的元素,只要能准确的表示出信号的唯一性即可。
$LightSwitch::OnOff //node+signal
$LightSwitch::LightState::OnOFF //node+message+signal
$CAN1::Gateway::Status //channel+node+signal
$PowerTrain::Gateway::Status //network+node+signal
$CAN1::Status //channel+signal
2 CAPL中访问系统变量
用户可以在CAPL中直接访问系统变量而不需要通过函数调用,以下是需要采取的语法格式。
@Namespace::Variable
需要注意的是,对于array和struct类的变量,直接访问方式只能访问单个元素,例如:
intValue=@Namespace1::Parameter2;
@Debug::MotorValues::EngineSpeed=$EngineSpeed;
intValue=@Namespace1::ParameterArray[2]; //访问数组变量的单个成员
@XCP::ECU_2::KL2.Curve2[0]=1.3; //访问结构体中的数组变量的单个成员
比较通用的访问操作方式是使用以sysGetVariable开头和sysSetVariable开头的访问函数。例如:
//字符串修改操作
char demo[20]={'m','u','s','i','c',' ','t','a','g'};
sysSetVariableString(sysvar::IPC::Music_tag,demo);
//long数组类的系统变量读取操作
long lVarArr[10];
sysGetVariableLongArray(sysvar::MyNamespace::LongArrayVar,lVarArr,elcount(lVarArr));
3 CAPL中访问环境变量
与系统变量类似,用户可以不使用函数调用通过同样的格式访问环境变量。语法格式为:
@Variable
intValue=@EnvLightState;
@EnvTurnSignal=$LightState::TurnSignal;
比较通用的访问操作方式是使用函数getValue()和putValue()。