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