在capl中,关键字具有特殊的含义和用途,因此,不得将关键字用作变量或函数的名称
1.声明数据类型的关键字:可以用不同的关键字,声明或引用不同类型的数据
2.定义一个结构体或枚举类型
struct Data { int type; long l; char name[50]; };
enum State { State_Off = -1, State_On = 1 };
3.声明消息/信号
1.capl程序要在总线上传输的CAN报文是用关键字message声明的
两种声明方式:
message Ignition_on msg_wakeup; 用dbc里的消息名声明消息 message 0x5f0 msg_wakeup; 用消息id声明消息
linFrame :capl程序要在lin线上传输的lin帧是用关键字linFrame声明的
dbMsg * 声明一个dbc类型的消息
这里有三种使用方式:
1.如果你想传入一个dbc里的message名作为形参,可以使用这种方式,调用时直接把dbc里的消息传进去即可
void function1(dbMsg * dbcmsg)
2.也可以先声明一个dbc消息,然后用=把dbc里的消息EngineData赋值给它
dbMsg * dbcmsg; dbcmsg = EngineData;
3.还可以用函数lookupMessage函数赋值dbc消息,传入的字符串是dbc里消息名
dbMsg * dbcmsg; dbcmsg = lookupMessage("EngineData")
还有dbNode等关键字,用来声明dbc里的其他参数
signal *
这里也提供了一个lookupSignal的方法
signal * dbcsignal; dbcsignal = lookupSignal("EngineSignal");
serviceSignal *
用来声明数据库里SOME/IP服务信号,也有一个lookup的方法
类似的还有很多,比如:serviceSignalData */serviceSignalNumber * /serviceSignalString *
4.声明诊断服务
diagRequest
diagRequest Door.defaultSessionStart req;
diagResponse
diagResponse Door.defaultSessionStart resp
5.声明系统变量或计时器
sysvar * :声明系统变量 类似的还有:sysvarInt */sysvarFloat */sysvarString *等
timer :声明一个定时器,时间单位为秒 类似的还有:msTimer,声明毫秒级定时器
timer t_sendmsg;
6.定义一个test case/test function
定义一个test case
testcase mytestcase() { }
testfunction :定义一个test function,它能被用在test case或test sequence中
7.其他
this :
在接收CAN对象或系统变量或环境变量的回调事件中,可以用this来指定这个接收的对象
on message 100 { byte byte_0; byte_0 = this.byte(0);
$
如果想直接给信号赋值,必须要在信号的前面加一个$符号
$EngineSpeed = 500.0;
.raw :读取信号的原始值 类似的还有.phys,读取信号的物理值
EngineMsg.EngineSpeed.raw
if, else, switch, case, default, for, while, continue, break, return都是关键字