Vector - CAPL - 检测报文周期

Posted 车载网络测试

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vector - CAPL - 检测报文周期相关的知识,希望对你有一定的参考价值。

CAN作为当前车上最重要的通信协议之一,总线上报文的周期状态可以说对于各个ECU之间的协调工作,起到了相当重要的作用,因此无论是在网络管理测试中、还是在通信层测试中,都会涉及到总线报文的周期测试;我看到蛮多人直接使用on message CAN1.*这种方式,而且在脚本工程中大量使用同一个on message,很多时候这种方式不易维护,而且易出现调用混乱的情况;那有没有一种办法能够减少on message的使用,并且能够准确的测出报文的周期呢?答案是肯定的,今天就来介绍下报文的周期测试。

ChkStart_MsgAbsCycleTimeViolation

功能:

检查循环消息的出现情况。

如果消息发送之间的时间小于aMinCycleTime或大于aMaxCycleTime,则会生成事件。

不需要检查的限制设置为0;必须至少指定一个限制。

只能在CAPL的“启动时”部分或测量过程中启动。

参数为“slotID”的数字构造函数只能应用于FlexRay总线。

对于FlexRay,只有有效的数据帧和PDU被识别为通信,空帧和错误帧被忽略。

注意:

根据使用的参数类型,如果相应的数据库对象不明确(dbc存在同名ID报文),则只需在调用函数之前设置多总线环境中的适当总线上下文。

aObservedMessage:存在于添加到工程dbc的报文

aMinCycleTime:

0:未设置检查限制

0<x<aMaxCycleTime:报文两次出现在CAN总线的时间间隔

默认单位[ms],可通过函数ChkConfig_SetPrecision进行更改。

aMaxCycleTime:

0:未设置检查限制

aMinCycleTime < x < ∞:报文两次出现在CAN总线的时间间隔

默认单位[ms],可通过函数ChkConfig_SetPrecision进行更改。

aCallback:在模拟节点中,必须设置此参数;在测试模块中,此参数是可选的。

slotID:此数字指定特定的FlexRay插槽;其值必须介于1和2047之间。

cycleOffs:这个数字表示基本周期,该值必须小于重复因子,并且在0和63之间的范围内。该值与重复因子可在FlexRay框架的“循环复用”

cycleRep:此数字表示循环重复系数,该值必须介于1和64之间,并且是2的倍数(例如1、2、4、8、16、32或64)。该值与基本周期一起决定FlexRay帧的“循环复用”。

channelMask:标识通信控制器的FlexRay通道。值1将检查通道A上的帧,2将检查通道B上的帧以及3将检查任何通道(A/B)上的帧。

aSourceAddress:J1939参数组的源地址。

可能的值:

0–253、255:观察从该地址发送的参数组。

254:观察从任何地址发送的参数组。

-1(或0xFFFFFFFF):观察从数据库中参数组指定的源地址发送的参数组。

aDestinationAddress:J1939参数组的源地址。

可能的值:

0–253、255:观察从该地址发送的参数组。

254:观察从任何地址发送的参数组。

-1(或0xFFFFFFFF):观察从数据库中参数组指定的源地址发送的参数组。

aSendNode:J1939参数组的发送节点。

aReceiveNode:J1939参数组的接收节点。此参数仅用于目标特定参数组(PDU1格式)。

MessageId:A429的报文ID

返回值:

0:无法创建检查,且不得引用

>0:已成功创建检查,可以使用返回的(handle-)值进行引用

常见问题:

数据库中不存在消息对象

两个相对限值均为0

CAPL回调不存在

代码示例

// 检查报文周期在90ms - 100ms之间
checkId = ChkStart_MsgAbsCycleTimeViolation (MsgToObserve, 90, 110);
TestAddCondition(checkId);
// 不同动作的顺序和等待条件
TestWaitForTimeout(1000);
TestRemoveCondition(checkId);

ChkStart_MsgRelCycleTimeViolation

ChkStart_NodeMsgsRelCycleTimeViolation

功能:

检查循环消息的出现情况。

如果消息发送之间的时间小于minRelCycleTime*GenMsgCycleTime(DB属性)或大于maxRelCycleTime*GenMsg CycleTime,则会生成事件。

不需要检查的限制设置为0;必须至少指定一个限制。

只能在CAPL的“启动时”部分或测量过程中启动。

参数为“slotID”的数字构造函数只能应用于FlexRay总线。

对于FlexRay,只有有效的数据帧和PDU被识别为通信,空帧和错误帧被忽略。

说明:根据所使用的参数类型,如果相应的数据库对象不明确,则只需在调用函数之前设置多总线环境中的适当总线上下文。

aObservedMessage:存在于添加到工程dbc的报文

aMinRelCycleTime:

0:未设置检查限制

0<x<1:限制检查条件

aMaxRelCycleTime:

0:未设置检查限制

1 < x < ∞:限制检查条件

aCallback:在模拟节点中,必须设置此参数;在测试模块中,此参数是可选的。

slotID:此数字指定特定的FlexRay插槽;其值必须介于1和2047之间。

cycleOffs:这个数字表示基本周期,该值必须小于重复因子,并且在0和63之间的范围内。该值与重复因子可在FlexRay框架的“循环复用”

cycleRep:此数字表示循环重复系数,该值必须介于1和64之间,并且是2的倍数(例如1、2、4、8、16、32或64)。该值与基本周期一起决定FlexRay帧的“循环复用”。

channelMask:标识通信控制器的FlexRay通道。值1将检查通道A上的帧,2将检查通道B上的帧以及3将检查任何通道(A/B)上的帧。

aSourceAddress:J1939参数组的源地址。

可能的值:

0–253、255:观察从该地址发送的参数组。

254:观察从任何地址发送的参数组。

0xFFFFFFFF:观察从数据库中参数组指定的源地址发送的参数组。

aDestinationAddress:J1939参数组的源地址。

可能的值:

0–253、255:观察从该地址发送的参数组。

254:观察从任何地址发送的参数组。

-0xFFFFFFFF:观察从数据库中参数组指定的源地址发送的参数组。

aSendNode:J1939参数组的发送节点。

aReceiveNode:J1939参数组的接收节点。此参数仅用于目标特定参数组(PDU1格式)。

返回值:

0:无法创建检查,且不得引用

>0:已成功创建检查,可以使用返回的(handle-)值进行引用

常见问题:

数据库中不存在消息对象

两个相对限值均为0

CAPL回调不存在

报文不是周期报文

代码示例:

// 检查周期报文的状态
checkId = ChkStart_MsgRelCycleTimeViolation (MsgToObserve, 0.9, 1.1);
TestAddCondition(checkId);
// 检查报文周期的时间
TestWaitForTimeout(1000);
TestRemoveCondition(checkId);

TestAddCondition

功能:添加事件对象或事件文本作为条件。测试服务库中的检查适合作为事件对象。

此功能可以在测试用例中使用,也可以在主测试级别上使用。

aAuxHandle:事件对象,例如来自测试服务库的检查,指定的是创建检查时返回的句柄。

aEventText:应监视其发生的事件的文本名称,此事件可以通过函数TestSupplyTextEvent触发

aBehavior:通常情况下,在条件损伤的情况下,只在测试报告中进行相应的输入,并且将活动测试用例的判决设置为“失败”。在特殊情况下,可以以其他方式设置此行为:

0

默认行为、测试报告中的条目以及将判决设置为“失败”

1

只在测试报告中输入一个条目,结果保持不变

2, 3

保留值

返回值:

0:已成功添加条件

<0:无法添加条件

代码示例

添加检查作为条件

dword checkId;
dword numCheckEvents;

// 开始“错误帧”观测
checkId = ChkStart_ErrorFramesOccured();
//添加检查作为条件,
//这意味着违反检查规定的行为会被报告
//测试用例的判决被设置为“失败”
TestAddCondition(checkId);
//不同动作的顺序和等待条件
TestWaitForTimeout(1000);
//删除检查作为条件
TestRemoveCondition(checkId);

// 停止检查
ChkControl_Stop(checkId);
// 重置检查的存储值
ChkControl_Reset(checkId);
//在不添加作为条件的情况下再次开始检查,
//这意味着观察到错误帧,但违反了
//未报告,也未将测试案例的判决设置为“失败”
ChkControl_Start(checkId);
//不同动作的顺序和等待条件
TestWaitForTimeout(1000);
// 停止检查
ChkControl_Stop(checkId);

// 分析数据
numCheckEvents = ChkQuery_NumEvents(checkId);
if (numCheckEvents > 0)
TestStepFail("Error Frame occurred!");
// 删除检查数据
ChkControl_Destroy(checkId);

添加文本事件作为条件

// 用于检查是否出现错误帧的测试用例
testcase CheckErrorFrameReceived ()

   TestAddCondition("ErrorFrameReceived");
   // 不同动作的顺序和等待条件
   TestWaitForTimeout(1000);
   TestRemoveCondition("ErrorFrameReceived");


// 提供文本事件的处理程序
on errorFrame

   TestSupplyTextEvent("ErrorFrameReceived");

TestRemoveCondition

功能:删除作为条件添加的事件对象或事件文本。

此功能既可以在测试用例中使用,也可以在测试模块级别上使用。

注意:条件只能在测试用例中或在添加了条件的测试模块级别上删除。如果一个测试用例被放弃,那么在这个测试用例中创建的约束将被自动删除。类似地,随着测试模块的结束,所有约束都会自动删除。

aAuxHandle:事件对象,例如来自测试服务库的检查。指定的是创建检查时返回的句柄。

aEventText:应监视其发生的事件的文本名称。此事件可以通过函数TestSupplyTextEvent触发。

返回值:

0:已成功移除条件

<0:无法移除条件

代码示例

同上

以上即为检查报文周期的函数,通常来说,如果是知道报文的周期,我们可以使用ChkStart_MsgAbsCycleTimeViolation函数将待检查报文加入进去,然后把周期检查范围作为参数输入,然后通过函数TestAddCondition将句柄加入,等待检查时间,通过函数TestRemoveCondition移除检查条件;最终输出测试结果。

如果是不知道报文周期,那使用函数ChkStart_MsgRelCycleTimeViolation加入检查事件,更方便点;特别是在网络管理或者通信层的测试中,我们一般要求报文周期偏差在10%或者20%以内,通过这种方法最是方便,然后同样通过函数TestAddCondition、TestWaitForTimeout、TestRemoveCondition共同使用,最省事的输出测试结果。

以上是关于Vector - CAPL - 检测报文周期的主要内容,如果未能解决你的问题,请参考以下文章

CAPL脚本DBLookup函数动态访问CAN 报文的属性

CAPL函数Test Node中,关闭总线,关闭节点,停发报文应该怎么做?

CAPL函数Test Node中,关闭总线,关闭节点,停发报文应该怎么做?

CANoe中XML编程常用标签语法 ——CAN报文周期检测/错误帧检测/信号改变检测。。。

CANoe中XML编程常用标签语法 ——CAN报文周期检测/错误帧检测/信号改变检测。。。

Vector - CAPL - 等待并获取LIN数据