LIN协议的诊断测试(附CAPL自动化代码)

乙乙的车COOL 2024-07-27 09:07:02 阅读 51

文章目录

前言一、概述1.主节点2.从节点

二、从节点诊断测试1.CANoe ISC方式2.CAPL自动化脚本方式

三、主节点诊断测试1.帧超时时间(高低压)&节点丢失2.应答错误故障码

总结


前言

<code>本文暂不谈及3类从节点诊断等LIN诊断协议的具体深入内容,主要了解一下LIN的主从节点诊断如何在CANoe进行测试,以及涉及数据链路层的LIN相关诊断测试实战如何进行CAPL自动化用例编写。


一、概述

1.主节点

主节点通常是高性能ECU,主节点可以用CAN线进行诊断测试。通过节点的CAN diag_req\diag_resp报文进行DTC信息读取。

2.从节点

从节点通常是不参与复杂数据通信的执行器ECU,通常从节点能够传输简单的诊断信息,比如错误信息标志位。LIN从节点诊断使用诊断帧来传输诊断或配置信息,包含8个字节数据。标识符:

a.主机请求帧(主节点发送帧头+主节点发送应答) 0x3C

b.从机应答帧(主节点发送帧头+从节点发送应答) 0x3D

二、从节点诊断测试

1.CANoe ISC方式

需要开启主模式,通过Frames定义3C、3D周期报文,间隔100-150ms。具体报文设置如下图,缺点是每测一个DUT都要新建一次ISC诊断报文。

在这里插入图片描述

因此,该方法适用于节点级手动测试或者回归测试复现相关问题。

2.CAPL自动化脚本方式

LIN网络上新增node,加入CAPL脚本,如下。脚本中发送3C后给一个100ms定时器,时间太短不行(从节点没初始化完成)。

<code>/*@!Encoding:936*/

/*-------------CAPL脚本实现LIN诊断3C、3D报文发送---------------------*/

includes

{

}

variables

{

linFrame *msg;

linFrame *msg1;

msTimer header_msg_send;

}

on timer header_msg_send

{

output(msg1);

}

void LIN_Diag_Simulation()

{

msg.id = 0x3C;

msg.msgChannel = 20;

msg.dlc=8;

msg.rtr = 1;

msg.byte(0) = 0x03;

msg.byte(1) = 0x02;

msg.byte(2) = 0x10;

msg.byte(3) = 0x01;

msg.byte(4) = 0x00;

msg.byte(5) = 0x00;

msg.byte(6) = 0x00;

msg.byte(7) = 0x00;

output(msg);

write("TEST SUCCESS");

msg1.id = 0x3D;

msg1.msgChannel = 20;

msg1.dlc=8;

msg1.rtr = 1;

settimer(header_msg_send,100);

}

on key 'a'

{

LIN_Diag_Simulation();

write("go to");

}

注意:如下图,脚本方式发送诊断命令,从节点不能失效处理,否则没有3D应答帧。原因:从节点失效,LDF文件中定义的3D报文失效,LIN通讯始终是遵循LDF文件调度。(踩坑:不能认为有从节点样件就失效掉该节点)。

在这里插入图片描述

三、主节点诊断测试

主节点的诊断测试数据链路层主要涉及到帧超时时间(高低压)、节点丢失、应答错误故障码等用例,下面将具体节点级测试中脚本优化和需要注意的地方进行说明。

1.帧超时时间(高低压)&节点丢失

脚本核心在于处理仿真从节点的丢失与正常发送。实现方式:在vTESTStudio中使用系统变量,关联至Simulation Setup从节点Node中的CAPL脚本(如下)进行节点的激活与失效,仿真实现节点丢失。

<code>/*--------触发节点丢失及恢复 add qhz 2022.10.15------------------------*/

on sysvar sysvar::LIN_Simulation::linActivate

{

if (@sysvar::LIN_Simulation::linActivate==1)

{

linactivateResps("node name1"); //恢复指定节点

linactivateResps("node name2");

write("仿真节点发送报文,%d",linactivateResps("node name2"); //打印结果

}

else

{

linDeactivateResps("node name1"); //丢失指定节点

linDeactivateResps("node name2");

write("停止节点发送报文,%d",linDeactivateResps("node name2"); //打印结果

}

}

Trace现象:从节点报文先正常发出,linDeactivateResps方法生效后出现错误帧。

在这里插入图片描述

2.应答错误故障码

处理从节点报文应答错误脚本。实现方式:在vTESTStudio中使用系统变量,关联至从节点node中的CAPL脚本(如下)进行仿真实现节点的应答错误响应控制。推荐使用下面的优化方式2代码。

<code>/*原脚本

存在问题:在VTEST中调用linSetRespError不生效,不确定哪个从节点生效?

可以使用SetBusContext(GetBusNameContext("网段name"))函数进行环境通道配置

*/

int count = 1;

for(j=0;j<count;j++) // 1次response_error为1,之后为0

{

linSetRespError(1); // 设置\重置调用从节点的响应错误标志 0:reset 1:set

testWaitForTimeout(200);

}

linSetRespError(0);

/*优化方式1

实现:使用系统变量进行CAPL脚本关联,CAPL脚本加在从节点node中进行调用

缺点:每测一个network都需要加一次CAPL脚本,麻烦

*/

//case脚本通过关联的系统变量去执行Node中的脚本

for(j=0;j<count;j++) // 1次response_error为1,之后为0

{

@sysvar::LIN_Simulation::linSetResp = 1;

testStep("","记录设置响应错误标志时刻,便于trace定位");

testWaitForTimeout(200);

@sysvar::LIN_Simulation::linSetResp = 0;

}

@sysvar::LIN_Simulation::linSetResp = 0;

//Node中的脚本如下:

on sysvar sysvar::LIN_Simulation::linSetResp

{

if (@sysvar::LIN_Simulation::linSetResp==1)

{

linSetRespError(1);

}

else

{

linSetRespError(0);

}

}

/*优化方式2

实现:使用setSignal函数直接改变应答错误信号值,把应答信号name存在配置文件中

*/

for(j=0;j<count;j++) // 1次response_error为1,之后为0

{

setSignal(SignalName,1);

testStep("","记录设置响应错误标志时刻,便于trace定位");

testWaitForTimeout(200);

}

setSignal(RepSignalName,0);

Trace现象:从节点应答报文正常发出后,linSetRespError(1)生效会使得报文中的ErrResp信号置为1,如下图。

在这里插入图片描述


使用CAPL自动化脚本执行过程中,在调用linGotoSleep等CAPL自带函数的时候,可能会存在函数不生效的情况。例如:添加LDF文件后,脚本调用linwakeup()方法trace窗口没有唤醒报文发出。这是需要检查ISC配置,第二个图标不能勾选。

在这里插入图片描述

图标2的含义是:激活或停用CAPL命令过滤,用于控制分配网络的LIN主控功能。如果点击激活,则会忽略linGotoSleep等CAPL函数。

总结

LIN协议相对于CAN协议而言内容较为简单,但实际协议一致性测试过程中,仍然也有很多地方需要去考虑。特别是本文介绍的从节点诊断如何进行测试、主节点的诊断自动化脚本如何合理化、状态管理如何测试以及之前文章提到的休眠唤醒测试细节点等等,都值得设计、推敲来满足测试要求。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。