李桂伟,丁健,蔡永祥
(中汽研(天津)汽车工程研究院有限公司,天津 300300)
CAN总线是一种串行总线通信协议,目前在汽车的电子控制单元中应用十分广泛,能够有效实现汽车上不同控制器之间的数据交互。CANoe软件是德国Vector公司推出的一款专业CAN/LIN等总线网络开发和测试软件,利用该软件可以实现整车的网络建模、仿真和测试等工作。目前CANoe软件已在汽车行业内广泛使用。CAPL(CAN Access Programming Language)语言是CANoe软件自带的一种类C编程语言,使用CAPL语言能够扩展CANoe软件功能,实现对软件功能的二次开发。
本文针对于控制器功能逻辑验证中CAN总线网络仿真需求,利用CANoe软件的CAPL编程语言结合Interaction Layer(以下简称IL)交互层的方式,搭建整车总线网络仿真模型,帮助测试人员更快速更高效地完成整车不同控制器的功能逻辑验证工作。
控制器功能逻辑验证处于整车开发V模型的右边,主要包括了硬件在环测试、黄板车台架测试、实车测试等(图1)。在功能逻辑验证中对于不同的被测件,测试人员需要模拟不同的总线环境、发送事件报文、注入总线故障等,因此待开发的网络仿真模型应同时具有以下功能。
图1 整车开发V模型
1)能够快速配置总线环境,灵活切换控制器报文的发送/停止,最大程度上满足不同被测件的总线环境要求。
2)能够在模型运行过程中动态改变仿真报文的周期,满足故障注入的测试要求。
3)网络仿真模型应具有事件报文发送能力。
4)网络仿真模型应能够方便测试人员改变信号的信号值。
5)网络仿真模型应包含CheckSum和Rolling Counter等校验算法,避免因不正确的算法引入非预期的总线故障。
整车网络数据库利用CANoe软件提供的CANdb++数据库编辑工具结合汽车研发过程中的整车通信矩阵进行创建(图2)。在整车通信矩阵中,定义了网络上所有的报文信息(报文ID、报文发送类型等)、信号信息(信号长度、信号起始位、真值表等)以及报文的发送和接收节点。使用CANdb++编辑工具可以将整车通信矩阵在CANdb++编辑器中创建相应的网络节点对象、报文对象、信号对象,对象创建完成之后,再依次建立节点与报文、报文与信号之间的所属关系。
图2 编辑网络数据库
由于搭建网络仿真模型需要使用CANoe软件IL交互层,因此在创建网络数据库时对数据库的信息完整度要求较高,因此除了建立网络节点、报文和信号等对象外,还需要为节点、报文和信号定义属性,如图3所示。为了满足IL交互层使用要求,设置的节点属性应包括:ILUsed、NodeLayer-Modules,报文 属性应包括:GenMsgILSupport、GenMsgCycleTime、GenMsgSendType等。
图3 节点、报文属性设置
其中NodeLayerModules属性定义了IL交互层使用的动态链接库,即“CANoeILNLVector.dll”,该动态链接库是实现IL交互层报文仿真的主要部分,在CAPL程序实现的逻辑控制中也会用到动态链接库中定义的函数。
CAPL程序是网络仿真模型中逻辑控制的核心部分,利用系统变量和不同类型的CAPL事件,同时结合CANoeILNLVector.dll动态链接库提供的IL交互层控制函数,共同完成CAPL程序编写,实现网络仿真模型逻辑控制功能。
在编写CAPL程序之前,首先需要创建模型需要的系统变量。系统变量搭建起控制面板和CAPL程序之间的桥梁,测试人员可以通过控制面板上关联了系统变量的控件控制CAPL程序中事件程序的执行。为了满足逻辑验证对网络仿真模型的功能需求,模型需要使用的系统变量如图4所示,其中NODES组中定义的变量是为了实现节点报文的发送/停止功能,EventSend组中的变量实现事件报文控制功能,CyclicSet组、EnableCyclic组和SelectedPeriod组中的变量共同组合实现报文周期的动态更改及控制功能。
图4 创建系统变量
系统变量创建完成之后,可以利用系统变量、CAPL事件和IL交互层控制函数构建仿真模型的CAPL程序。在CAPL程序中用到的主要事件是on start事件和on sysvar事件,用到 的IL交 互 层 控 制函 数 分 别为:ILDisableMsg()、ILEnableMsg()、ILSetMsgEvent()、ILFaultInjectionSetMsgCycleTime()、ILFaultInjectionResetMsgCycleTime()、ILControlStart()。以BCM节点为例,CAPL程序如下。
on start
{
//IL交互层控制初始化
ILControlStart();
ILDisableMsg("BCM1");
ILDisableMsg("BCM2");
}
on sysvar(IL::NODES::Enable_AllNodes|IL::NODES::Enable_BCM)
{
//控制报文发送/停止
if(@sysvar::IL::NODES::Enable_AllNodes&&@sysvar::
IL::NODES::Enable_BCM)
{
ILEnableMsg("BCM1");
ILEnableMsg("BCM2");
}
else
{
ILDisableMsg("BCM1");
}
}
on sysvar(IL::EnableCyclic::IL_BCM::BCM1|IL::SelectedPeriod::IL_BCM::BCM1|IL::CyclicSet::IL_BCM::BCM1)
{
//设置报文的发送周期
if(@sysvar::IL::EnableCyclic::IL_BCM::BCM1&&@sysvar::IL::SelectedPeriod::IL_BCM::BCM1)
{
ILFaultInjectionSetMsgCycleTime(BCM1,@sysvar::IL::CyclicSet::IL_BCM::BCM1);
}
从国内需求端来看,根据记者调查,东北地区生产企业的采购在持续进行,大型复合肥企业的生产也未间断,大型流通企业也在有节奏地进行储备。短时间来看,尿素市场供需平稳。
else
{
ILFaultInjectionResetMsgCycleTime(BCM1);
}
}
on sysvar(IL::EventSend::IL_BCM::BCM1|IL::EventSend::IL_BCM::BCM2)
{
//事件报文控制
if(@sysvar::IL::EventSend::IL_BCM::BCM1==1)
ILSetMsgEvent(BCM1);
if(@sysvar::IL::EventSend::IL_BCM::BCM2==1)
ILSetMsgEvent(BCM2);
}
上述程序实现了网络仿真模型中BCM节点报文发送/停止功能、报文周期改变功能、事件报文发送功能等。对于报文中包含的Rolling Counter信号和Checksum校验信号,为了避免引入不必要的总线故障,可以通过调用如下的两个自定义函数实现Rolling Counter信号和Checksum校验信号的正确发送。
CLOCK_Signal(signal*sig,int Maxvalue)
{
//CLOCK函数
(getSignal(sig)==Maxvalue)?$sig=0:$sig++;
}
CRC8_Signal(signal*sig,message*msg)
{
//CRC算法函数
byte value[7];
byte crc=0xFF;
byte poly=0x1D;
int byte_flag=0,bit_flag=0,num=0;
for(num=0;num<7;num++)
{
value[num]=msg.byte(num);
}
for(byte_flag=0;byte_flag<7;byte_flag++)
{
crc^=value[byte_flag];
for(bit_flag=0;bit_flag<8;bit_flag++)
{
if(crc&0x80)
{
crc=(crc<<1)^poly;
}
else
{
crc=(crc<<1);
}
}
}
$sig=crc;
}
为方便测试人员操作,控制面板上的控件需直观体现仿真模型的主要功能,例如面板上应包括节点报文发送/停止控件、信号控件、报文周期更改控件等,如图5所示。在编辑控制面板时,信号对应的控件需要与数据库中的信号进行关联,而控制报文发送/停止、周期更改等的控件需要与已创建的系统变量进行关联。通过控制面板,测试人员可以在面板上进行勾选、设置等操作,实现快速便捷的仿真控制。
图5 编辑控制面板
在网络仿真模型搭建完成后,利用CANoe软件运行仿真模型,以验证仿真模型的功能是否符合功能逻辑验证的需要。
1)节点报文发送/停止控制:操作模型控制面板选择Enable IL前面的复选框和Enable IL of Node区域内任意网络节点前面的复选框,可以在CANoe软件的Trace界面上看到选择节点的报文已经正常发送,报文发送的周期与DBC数据库中定义的周期一致,并且若该报文包含Checksum信号和Rolling counter信号,可以看到信号值随着报文的发送正确改变(图6)。
图6 报文发送/停止验证
2)报文周期动态调整:选择模型控制面板IL Control区域内任意正在发送的网络节点,打开报文周期控制面板。在控制面板上同时选择Enable和User前面的选择框,在报文周期输入框中设置不同的报文周期,可以看到Trace界面上正在发送的报文的发送周期变成设置的周期值(图7)。
图7 测试系统运行效果截图
图7 报文周期改变验证
3)信号值操作/事件报文控制:选择TX Signals区域内仿真发送的节点,打开报文控制面板,操作更改面板上任意信号的信号值,可以看到Trace界面上该报文发送的信号值按照面板上的改变值更改(图8)。同时在控制面板上的Event Timing区域,可以找到Send Once按钮,每点击一次,可以在Trace界面上看到报文发送一次。
图8 信号值改变/事件报文验证
网络仿真模型在汽车功能逻辑验证中具有十分重要的作用,一个功能完善的仿真模型不仅能够帮助测试工程师提高工作效率,而且可以实现很多手动操作难以实现的功能。虽然Vector公司的CANoe软件为用户提供了多种仿真报文方式,例如利用CANoe软件中的IG节点实现、CANoe软件的IL交互层实现或者CAPL编程实现,但是使用这些方式中的任何一种搭建的仿真模型要么开发难度大,要么扩展能力差,都有一些不足的地方存在。为了避免上述问题,本文选择以CAPL编程和IL交互层相结合的方式搭建网络仿真模型,模型编程难度较低,开发时间短,扩展能力强,并且模型操作简便,更能够满足现在测试快速迭代的要求。