当前位置: 首页 > article >正文

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共同使用,最省事的输出测试结果。


http://www.kler.cn/a/2863.html

相关文章:

  • Vue axios 异步请求,请求响应拦截器
  • 跟我学c++中级篇——C++中的缓存利用
  • 【路径规划】原理及实现
  • matplotlib pyton 如何画柱状图,利用kimi,直接把图拉倒上面,让他生成
  • PH热榜 | 2024-12-26
  • 施耐德变频器ATV320系列技术优势:创新与安全并重
  • Vue2.x源码:new Vue()做了啥?
  • 给程序加个进度条吧,1行Python代码,快速添加~
  • c++ 一些常识 2
  • XILINX关于DDR2的IP的读写控制仿真
  • 【Spring Cloud Alibaba】2.服务注册与发现(Nacos安装)
  • 部署私有npm 库
  • 水文-编程命令快查手册
  • 支持RT-Thread最新版本的瑞萨RA2E1开发板终于要大展身手了
  • 学习 Python 之 Pygame 开发魂斗罗(十)
  • 如何系统型地学习深度学习?
  • Python日志logging实战教程
  • 利用Cookie劫持+HTML注入进行钓鱼攻击
  • 服务端测试知识汇总
  • 基于原生Javascript的放大镜插件的设计和实现
  • 贪心算法(一)
  • 蓝桥杯刷题冲刺 | 倒计时18天
  • MD5加密竟然不安全,应届生表示无法理解?
  • Java每日一练(20230324)
  • hive之视图
  • 手写一个Promise