一、概述
上一篇文章提到如何通过CANoe创建CAN网关实现报文转发(包含对部分报文的值修改后再转发,文章链接:https://blog.csdn.net/Richy_Lai/article/details/130529603#comments_26357921),本篇文章将继续讲解如何实时(不中断工程)修改转发报文的信号值。
二、方法
实时修改报文的信号值一般有两种办法:(1)通过键盘快捷键修改(on key+键盘按键);(2)通过面板(Panel)按钮修改。这两种办法都需要对原先的CAPL脚本进行修改才能实现。
(1)通过键盘快捷键修改(on key+键盘按键)
/*@!Encoding:936*/
includes
{
}
variables
{
/创建全局变量,用于实时传递报文信号值//
int flag =0; // switch
int msg2_506_INS_Pos=0;
int msg2_506_INS_Heading=0;
int msg2_506_INS_Status=0;
}
on message CAN1.* //将CAN1的报文全部透传给CAN2
{
message CAN2.* m;
if(this.DIR==RX) // if it is a received frame
{
if(this.CAN==1)
{
m=this;
output(m); // send it to the other channel
}
}
}
//on message CAN2.* //将CAN2的报文全部透传给CAN1,此处不考虑
//{
// message CAN1.* m;
// if(this.DIR==RX) // if it is a received frame
// {
// if(this.CAN==2)
// {
// m=this;
// output(m); // send it to the other channel
// }
// }
//}
on message CAN1.0x506 //从CAN1传入CANoe的报文
{
message CAN2.0x506 msg2_506; //命名CAN2 ID为506的报文
//this is an example for a message that will be manipulated before it is sent on CAN2
if (this.DIR==RX) // if this message is received
{
if(this.CAN==1)
{
msg2_506=this;
if (flag == 1) //如果flag=1,则修改信号值
{
msg2_506.INS_Pos.phys = msg2_506_INS_Pos;
msg2_506.INS_Heading.phys = msg2_506_INS_Heading;
msg2_506.INS_Status.phys = msg2_506_INS_Status;
}
output(msg2_506); //输出报文
}
}
}
on key 'a' //按下a,flag值=1,触发修改信号值
{
flag = 1;
msg2_506_INS_Pos=16;
msg2_506_INS_Heading=50;
msg2_506_INS_Status=2;
}
on key 'z' //恢复透传
{
flag = 0;
}
(2)通过面板(Panel)按钮修改
在修改CAPL脚本之前,需要先定义系统变量、设计Panel,如下图:
对应的CAPL脚本:
/*@!Encoding:936*/
includes
{
}
variables
{
/创建全局变量,用于实时传递报文信号值//
int flag =0; // switch
int msg2_506_INS_Pos=0;
int msg2_506_INS_Heading=0;
int msg2_506_INS_Status=0;
}
on message CAN1.* //将CAN1的报文全部透传给CAN2
{
message CAN2.* m;
if(this.DIR==RX) // if it is a received frame
{
if(this.CAN==1)
{
m=this;
output(m); // send it to the other channel
}
}
}
//on message CAN2.* //将CAN2的报文全部透传给CAN1,此处不考虑
//{
// message CAN1.* m;
// if(this.DIR==RX) // if it is a received frame
// {
// if(this.CAN==2)
// {
// m=this;
// output(m); // send it to the other channel
// }
// }
//}
on message CAN1.0x506 //从CAN1传入CANoe的报文
{
message CAN2.0x506 msg2_506; //命名CAN2 ID为506的报文
//this is an example for a message that will be manipulated before it is sent on CAN2
if (this.DIR==RX) // if this message is received
{
if(this.CAN==1)
{
msg2_506=this;
if (flag == 1) //如果flag=1,则修改信号值
{
msg2_506.INS_Pos.phys = msg2_506_INS_Pos;
msg2_506.INS_Heading.phys = msg2_506_INS_Heading;
msg2_506.INS_Status.phys = msg2_506_INS_Status;
}
output(msg2_506); //输出报文
}
}
}
on sysvar SwitchButton::Switch_Flag //开关按钮系统变量
{
flag = sysGetVariableInt(sysvar::SwitchButton::Switch_Flag);
write("Now flag = %d!",flag);
}
on sysvar CAN2_msg506_Signal::CAN2_msg506_Pos //INS_Pos
{
msg2_506_INS_Pos = sysGetVariableInt(sysvar::CAN2_msg506_Signal::CAN2_msg506_Pos);
}
on sysvar CAN2_msg506_Signal::CAN2_msg506_Heading //INS_Heading
{
msg2_506_INS_Heading = sysGetVariableInt(sysvar::CAN2_msg506_Signal::CAN2_msg506_Heading);
}
on sysvar CAN2_msg506_Signal::CAN2_msg506_Status //INS_Status
{
msg2_506_INS_Status = sysGetVariableInt(sysvar::CAN2_msg506_Signal::CAN2_msg506_Status);
}
三、结果展示
如果还有其他方法,欢迎一起交流。