最近一段时间有好几个小伙伴问我如何利用CAPL语言开发出ECU与ECU之间的交互通信?今天就给大家简单讲一个例子,有需要做这方面的仿真同学可以参考下
汽车行业的小伙伴都知道,ECU与ECU之间是通过CAN/LIN线信号交互的,从一个ECU端到另一个ECU之间是经过网关转发,基本链路就是 ECU—GW(网关)—ECU。如下如所示
至于如何制作测试面板之类的我就不多加讲了,买本书看,或是百度下,这类的例子还是很多,如果有问题请私信我。
-------------------------------------------------以下内容是重点-----------------------------------------------------
实现步骤:
1.例如:IVI端控制驾驶模式(代码以事件循环型信号为例),VCU监控IVI发送的信号,然后处理后在返回信号,信号链路就是:IVI–GW–VCU
2.IVI端可以自己接一个硬件或是自己开发,我重点讲一下底层对手件是如何获取并处理后转发出去
以下是代码块,大家参考下改改基本上能用
/*@!Encoding:936*/
variables
{
//设置两个变量和一个结构体
message 0xIVI_ID msg;
int EU_VCUPowerMode = 0;
int EU_VCUPowerMode _TEMP;
mstimer timer_0xVCU_ID;
message 0xVCU_ID message_0xVCU_ID;
}
on start
{
message_0xVCU_ID.EU_VCUPowerMode = EU_VCUPowerMode ;//临时变量赋值给VCU,然后外发
settimer(timer_0xVCU_ID, xxx);
}
-----------------------------------------------------------------------------------
该段代码就是通过ON message 来实时监控IVI的信号,如果有变化,会自动将变化的值赋值给VCU
on message 0xIVI_ID
{
msg = this;
// IVIDriveModeSet 就是通过IVI设置驾驶模式,外发的信号,比如IVIDriveModeSet = 2(运动),那么就将2这个值赋值给VCU的值
if(msg.IVIDriveModeSet == 2)
{
message_0xVCU_ID.EU_VCUPowerMode = 1;
}
if(msg.IVIDriveModeSet == 3)
{
message_0xVCU_ID.EU_VCUPowerMode = 3;
}
if(msg.IVIDriveModeSet == 1)
{
message_0xVCU_ID.EU_VCUPowerMode = 2;
}
}
-----------------------------------------------------------------------------------
//on timer内的代码就是VCU将在ON message获取的值进行处理,并对信号进行回复
on timer timer_0xVCU_ID
{
if(message_0xVCU_ID.EU_VCUPowerMode == 1)
{
EU_VCUPowerMode _TEMP= 1;
}
if(message_0xVCU_ID.EU_VCUPowerMode == 2)
{
EU_VCUPowerMode _TEMP= 2;
}
if(message_0xVCU_ID.EU_VCUPowerMode == 3)
{
EU_VCUPowerMode _TEMP = 3;
}
if(message_0xVCU_ID.EU_VCUPowerMode == 0) //因为是信号是CE模式的,所以在信号返回0时在执行IVI端的请求
{
//这意识是将临时存储的值赋值给一个变量EU_VCUPowerMode ,这个变量将会赋值给message_0xVCU_ID.EU_VCUPowerMode ,见on start的代码
EU_VCUPowerMode = EU_VCUPowerMode _TEMP;
}
settimer(timer_0xVCU_ID, xxx);
output(message_0xVCU_ID);
}
以上就是详细的代码了,我在台架已经测试过,收发没有任何问题,基本上实现了利用CAPL语言实现仿真系统的收发功能,至于checksum以及RollingCounter等校验问题我的其他博客内容均有介绍。
如有不正之处或是其他问题,欢迎大家一起交流!