这篇的前提是你创建了一个工程,并且导入了DBC文件
1. 关闭CANoe IL 层自动发送
有两种方法,
① 右键CAPL所在节点,点击IL 配置选项,进入后把你要关闭自动发送的报文取消勾选,如下图所示:


② 在on preStar 事件中关闭CANoe IL 层自动发送,代码如下:
on preStart{
ILControlInit(); //初始化CANoe的IL交互层
ILControlStop(); //禁止CANoe的IL交互层作用
}
2. 定义CAN报文变量
因为有了DBC,我们可以使用DBC中的报文类型来定义报文,当然同时也可以用ID的形式定义。
如何查看DBC中的报文类型呢,如下图,可以看到报文类型名以及里面的信号名。

以这个ENG_26C 为例,声明变量,并写一个发送函数,如下:
variables
{
//定义一个ID为0x222 名称为msg0x222的CAN报文帧变量
message 0x222 msg0x222; //报文不在DBC中,只能以ID形式声明CAN报文
message ENG_26C _ENG_26C; //声明一个 ENG_26C类型的报文,
//这里的报文长度,以及数据定义都在DBC文件里设定好的,
msTimer timerSend0x26C; //声明一个发送定时器
}
on preStart{
ILControlInit(); //初始化CANoe的IL交互层
ILControlStop(); //禁止CANoe的IL交互层作用
}
on timer timerSend0x26C{
//在timer中发送报文
sendMsg_ENG_26C();
//write("0x26C,send"); 调试的时候可以像这样加一些打印,正式发布的时候记得注释掉
//在timer中设置该timer,确保循环发送
setTimer(timerSend0x26C,500);
}
//26C 的发送函数
void sendMsg_ENG_26C(){
byte countENG26C = 0,checkSUM,i;
//发送前先给信号赋值,
//phys是物理值的意思,直接赋物理值就可以,不用算精度偏移量这些了
_ENG_26C.ENG_PWECLMT.phys = 1000;
_ENG_26C.ENG_F_ECONRQ.phys = 1;
_ENG_26C.COMP_FAULT_CLEAR_RQ.phys=0;
//计数器
if(countENG26C > 3){
countENG26C = 0;
}
_ENG_26C.ENG_ALIVE_COUNTER_26C.phys = countENG26C;
//校验和计算,请根据具体需求进行修改
checkSUM = 0;
for(i=0;i<_ENG_26C.DataLength-1;i++)
checkSUM += _ENG_26C.byte(i);
_ENG_26C.ENG_CHECKSUM_26C.phys = checkSUM & 0x0F;
countENG26C++;
output(_ENG_26C); //发送报文
}
这样就完成了CAPL发送报文,这里就先写这么多,有时间再写如何获取panel中的数据并通过报文发出。
1509

被折叠的 条评论
为什么被折叠?



