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

Posted 蚂蚁小兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CANoe中XML编程常用标签语法 ——CAN报文周期检测/错误帧检测/信号改变检测。。。相关的知识,希望对你有一定的参考价值。

相关文章

CANoe中XML编程常用标签语法
CANoe中XML编程常用标签语法(2)
CANoe中XML编程常用标签语法(3) —— 变量、系统系统变量的读取


前言

  • 实际工程测试中,我们会去测试一段时间内,报文的周期是否都是符合需求的;一段时间内,某个信号是否发生改变;一段时间内,是否收到了错误帧;一段时间内,某条报文发了几次;等等这一类一段时间内的数据检测,Vector 给我们提供了这一类集的测试方法(XML和CAPL),本节只讲解XML的测试方法

  • 本节内容,只讲解CAN总线方法

  • 下图是测试集合,本博客内容较多,但都是干活,阅读请耐心



报文周期的检测

① 现在我想测试报文 ID = 0x3DD ,cycle 是100ms,在CAN总线中,它的实际周期在90 -110 之间,就是合格的。测试5s时间。

  • Cycle Time Absolute(绝对时间)(优点:可以自由设置最小和最大报文时间)
  • Cycle Time Relative(相对时间)(优点:可以不知道DBC文件中的报文周期,直接设置百分比)
<testmodule title="XML Debug" version="1.0">
	<testgroup title="报文周期检测">
		<testcase ident="tc001" title="报文周期检测——绝对时间">
		  <conditions>
			<cycletime_abs title="Cycle Time" min="90" max="110">
			  <canmsg id="0x4DD"/>
			</cycletime_abs>
		  </conditions>
		 <wait title="Wait" time="5s"/>
		</testcase>
		<testcase ident="tc001" title="报文周期检测——相对时间">
		  <conditions>
			<cycletime_rel title="Cycle Time" min="0.9" max="1.1">
			  <canmsg id="0x4DD"/>
			</cycletime_rel>
		  </conditions>
		 <wait title="Wait" time="5s"/>
		</testcase>
	</testgroup>
</testmodule>

②, 测试报告可以看到测试结果的详细参数


③, 测试报告可以看到测试结果的详细参数


报文数据长度检测

①,检测一段时间内报文的DLC长度是否被改变,被改变则Fail.

  • 为了显示方便,把其它case 去掉了,完整代码,放在结尾
<testmodule title="XML Debug" version="1.0">
	<testgroup title="报文DLC检测">
		<testcase ident="tc001" title="报文DLC检测">
		    <conditions>
				<dlc_ok title="DLC Monitoring">
				  <canmsg id="0x4DD"/>
				</dlc_ok>
			 </conditions>
		  <wait title="Wait" time="5s"/>
		</testcase>
	</testgroup>
</testmodule>

②, 测试报告可以看到测试结果的详细参数


错误报文检测

如果对下面演示的代码有疑问请先仔细读下Help 描述

①,检测一段时间内出现错误报文的个数

  • 为了显示方便,把其它case 去掉了,完整代码,放在结尾
<testmodule title="XML Debug" version="1.0">
	<testgroup title="错误报文检测">
		<testcase ident="tc001" title="错误报文检测">
		    <conditions>
				<error_frame_check max="0" title="Error Frame" bus="CAN"/>
			 </conditions>
		  <wait title="Wait" time="5s"/>
		</testcase>
	</testgroup>
</testmodule>

②, 这次为了更加真实的还原测试,在BUS上我加了个IG模块,并且添加了个ErrorFrame,设置成按键 ‘t’触发,当我们在执行测试的时候,按下 ‘t’触



③, 测试结果如下图。
如果我们在这个时间周期内允许出现2帧错误帧,则xml 改成 <error_frame_check min="2" max="2" title="Error Frame" bus="CAN"/>

④, 如果我们想测试在5s内出现了2帧错误帧,则需要改成下面代码

  • 测试下来,min 和 max 是闭区间
	<testgroup title="错误报文检测">
		<testcase ident="tc001" title="错误报文检测">
		    <conditions>
				<error_frame_check  max="0" title="Error Frame" bus="CAN"  timeout = "5000"/>
			 </conditions>
		  <wait title="Wait" time="5s"/>
		</testcase>
		<testcase ident="tc001" title="指定错误报文数量检测">
		    <conditions>
				<error_frame_check min="2" max="2" title="Error Frame" bus="CAN" timeout = "5s"/>
			 </conditions>
		  <wait title="Wait" time="5s"/>
		</testcase>
	</testgroup>

⑤, 执行过程中,按下两次‘t’,按一次或者三次都会fail.


两条报文之间的时间间隔

如果对下面演示的代码有疑问请先仔细读下Help 描述

①,我选择的两个报文 0x3FC (周期是50ms) 0x4DD(周期是100ms) ,这就说明这两个报文,最大发送的时间间隔最大应该是50ms.最小应该是0ms,根据测试场景,我们设计了两条case,

  • 为了显示方便,把其它case 去掉了,完整代码,放在结尾
  • 我本来行通过IG模块,创建两条报文的,执行报错,编译XML的时候它是去DBC文件去找的报文,找不到就不错
  • 下面代码测试内容当收到0x3FC 报文后,最大允许时间内要收到0x4DD,否则就fail
	<testgroup title="报文之间的时间间隔">
		<testcase ident="tc001" title="报文之间的时间间隔超过最大间隔">
		    <conditions>
				<distance title="Message Distance" min="0ms" max="51ms">
				  <reference>
					<canmsg id="0x3FC"/>
				  </reference>
				  <observed>
					<canmsg id="0x4DD"/>
				  </observed>
				</distance>
			 </conditions>
		  <wait title="Wait" time="5s"/>
		</testcase>
		<testcase ident="tc001" title="报文之间的时间间隔小于最大间隔">
		    <conditions>
				<distance title="Message Distance" min="0ms" max="49ms">
				  <reference>
					<canmsg id="0x3FC"/>
				  </reference>
				  <observed>
					<canmsg id="0x4DD"/>
				  </observed>
				</distance>
			 </conditions>
		  <wait title="Wait" time="5s"/>
		</testcase>
	</testgroup>

②, 测试结果看出超过最大时间间隔的pass了,二小于时间间隔的fail了,这正是符合预期结果的


# 收到没定义的报文

如果对下面演示的代码有疑问请先仔细读下Help 描述

①,在一段时间周期内,检测是否收到了未定的报文,收到了就是fail

  • 为了显示方便,把其它case 去掉了,完整代码,放在结尾
	<testgroup title="未定义报文检测">
		<testcase ident="tc001" title="未定义报文检测">
		    <conditions>
				<messages_known title="Unknown Message Received" bus="CAN"/>
			 </conditions>
		  <wait title="Wait" time="5s"/>
		</testcase>
	</testgroup>

②, 在IG模块中定义一个0x555 报文,执行测试的过程中,按下‘x’触发报文,比对测试结果。


检测节点是否处于激活状态

如果对下面演示的代码有疑问请先仔细读下Help 描述

①,在一段时间周期内,检测是否收到了指定节点的报文,只要收到任何一条报文,都算pass。否则Fail

  • 为了显示方便,把其它case 去掉了,完整代码,放在结尾
	<testgroup title="节点是否处于激活状态">
		<testcase ident="tc001" title="节点是否处于激活状态">
		    <conditions>
				<isalive title="Node Active" time="3s">
				  <node name="IDCU"/>
				</isalive>
			 </conditions>
		  <wait title="Wait" time="5s"/>
		</testcase>
	</testgroup>

②,把需要测试的节点IDCU屏蔽掉,然后再在IG模块中添加一条属于IDCU模块的报文,先设置成不发送


③,测试结果,看出,因为没收到一条来自IDCU节点的报文,所以Fail了


④,我们在执行case的时候,点击周期发送,那么测试case就pass了。


检测节点是否处于非激活状态

如果对下面演示的代码有疑问请先仔细读下Help 描述

①,在一段时间周期内,检测是否收到了指定节点的报文,只要收到任何一条报文,都算Fiail

  • 为了显示方便,把其它case 去掉了,完整代码,放在结尾
  • 这个功能和上面的node active 是相反的。
	<testgroup title="节点是否处于非激活状态">
		<testcase ident="tc001" title="节点是否处于非激活状态">
		    <conditions>
				<goessleep  title="Node Active" time="3s">
				  <node name="IDCU"/>
				</goessleep >
			 </conditions>
		  <wait title="Wait" time="5s"/>
		</testcase>
	</testgroup>

检测信号或者变量值是否被改变

如果对下面演示的代码有疑问请先仔细读下Help 描述

①,在一段时间周期内,检测指定的信号或者变量的值是否被改变,被改变了就fail

  • 为了显示方便,把其它case 去掉了,完整代码,放在结尾
	<testgroup title="检测信号或者变量值是否被改变">
		<testcase ident="tc001" title="检测信号或者变量值是否被改变">
		    <conditions>
				 <novaluechange title="Signal Value Constancy">
				  <cansignal name="ECFail"/>
				</novaluechange>
			 </conditions>
		  <wait title="Wait" time="5s"/>
		</testcase>
	</testgroup>

②,我在测试过程中,连续改变信号 ECFail 值两次,测试结果如下


检测指定报文出现了最多次数

如果对下面演示的代码有疑问请先仔细读下Help 描述

①,在一段时间周期内,检测是指定报文出现的最大次数,也可以指定最大最小次数

  • 为了显示方便,把其它case 去掉了,完整代码,放在结尾
  • 这个报文必须是DBC文件中定义好的,IG模块自己建立的不可以
	<testgroup title="检测指定报文出现了最多次数">
		<testcase ident="tc001" title="检测指定报文出现了最多次数">
		    <conditions>
				<occurrence_count title="Absence of defined message" maxcount="2">
				  <canmsg id="0x3af" bus="CAN"></canmsg>
				</occurrence_count>
			 </conditions>
		  <wait title="Wait" time="5s"/>
		</testcase>
	</testgroup>	

②,把需要测试的节点IDCU屏蔽掉,然后再在IG模块中添加一条属于IDCU模块的报文,先设置成不发送,测试结果是pass的,这里每贴出来,然后再测试的时候,把周期发送选项打勾,则就fail了,如下图


③,这个方法,

以上是关于CANoe中XML编程常用标签语法 ——CAN报文周期检测/错误帧检测/信号改变检测。。。的主要内容,如果未能解决你的问题,请参考以下文章

CANoe中XML编程常用标签语法 —— 变量,系统变量的定义和读取

CANoe中XML编程常用标签语法

CANoe中XML编程常用标签语法 —— 变量,系统变量的定义和读取

CANoe中XML编程常用标签语法 ——控制语句 if else 和 for循环

Capl编程xml标签语法 —— CAN报文周期检测/错误帧检测/信号改变检测。。。

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