分享

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

 ghostvip 2022-09-17 发布于广东

🌎相关文章

🌎前言

  • 🍅 实际工程测试中,我们会去测试一段时间内,报文的周期是否都是符合需求的;一段时间内,某个信号是否发生改变;一段时间内,是否收到了错误帧;一段时间内,某条报文发了几次;等等这一类一段时间内的数据检测,Vector 给我们提供了这一类集的测试方法(XML和CAPL),本节只讲解XML的测试方法
  • 🍅本节内容,只讲解CAN总线方法
  • 🍅下图是测试集合,本博客内容较多,但都是干货,阅读请耐心,一次学不完,别忘了收藏。
    在这里插入图片描述
  • 🍅测试软硬件环境:
  • Win10 x64
  • CANoe 11 SP2 x64>

请添加图片描述

请添加图片描述

🌎报文周期的检测

  • 1️⃣ 现在我想测试报文 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='报文周期检测——绝对时间'>
			<cycletime_abs title='Cycle Time' min='90' max='110'>
			  <canmsg id='0x4DD'/>
			</cycletime_abs>
		 <wait title='Wait' time='5s'/>
		</testcase>
		<testcase ident='tc001' title='报文周期检测——相对时间'>
			<cycletime_rel title='Cycle Time' min='0.9' max='1.1'>
			  <canmsg id='0x4DD'/>
			</cycletime_rel>
		 <wait title='Wait' time='5s'/>
		</testcase>
	</testgroup>
</testmodule>

  • 2️⃣ 测试报告可以看到测试结果的详细参数

在这里插入图片描述


  • 3️⃣ 测试报告可以看到测试结果的详细参数

在这里插入图片描述


🌎报文数据长度检测

  • 1️⃣ 检测一段时间内报文的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>

  • 2️⃣ 测试报告可以看到测试结果的详细参数

在这里插入图片描述


🌎错误报文检测

🍊 如果对下面演示的代码有疑问请先仔细读下Help 描述
在这里插入图片描述

  • 1️⃣ 检测一段时间内出现错误报文的个数

  • 为了显示方便,把其它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>

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

在这里插入图片描述
在这里插入图片描述


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

在这里插入图片描述


  • 4️⃣ 如果我们想测试在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>

  • 5️⃣执行过程中,按下两次't’,按一次或者三次都会fail.

在这里插入图片描述


🌎两条报文之间的时间间隔

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

在这里插入图片描述


  • 1️⃣ 我选择的两个报文 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>

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

在这里插入图片描述


🌎收到没定义的报文

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

在这里插入图片描述

  • 1️⃣ 在一段时间周期内,检测是否收到了未定的报文,收到了就是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 描述

在这里插入图片描述

  • 1️⃣ 在一段时间周期内,检测是否收到了指定节点的报文,只要收到任何一条报文,都算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>

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

在这里插入图片描述


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

在这里插入图片描述


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

在这里插入图片描述


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

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

在这里插入图片描述

  • 1️⃣ 在一段时间周期内,检测是否收到了指定节点的报文,只要收到任何一条报文,都算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 描述

在这里插入图片描述

  • 1️⃣ 在一段时间周期内,检测指定的信号或者变量的值是否被改变,被改变了就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>

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

在这里插入图片描述


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

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

在这里插入图片描述

  • 1️⃣ 在一段时间周期内,检测是指定报文出现的最大次数,也可以指定最大最小次数
  • 为了显示方便,把其它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>	

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

在这里插入图片描述


  • 3️⃣这个方法,更高级的是还可以指定check 报文的内容,也就说说只有收到了指定内容的报文才算有效,

  • 下面代码指定 byte 0 的数值等于1 的0x3af 报文 出现次数不能超过两次,否则就fail了。

	 <testcase ident='tc001' title='检测指定报文出现了最多次数_指定内容'>
		    <conditions>
				<occurrence_count title='Absence of defined message' maxcount='2'>
				  <canmsg id='0x3af' bus='CAN'>
					<byte pos='0'>0x01</byte>
				  </canmsg>
				</occurrence_count>
			 </conditions>
		  <wait title='Wait' time='5s'/>
		</testcase>

  • 4️⃣ 我们让报文周期发送,但是报文内容是不满足xml的,所以,即使一直收到这条报文,也是pass的

在这里插入图片描述


  • 5️⃣我们让报文周期发送,让报文内容是xml,就fail,如下图

在这里插入图片描述


🌎检测case执行的最大允许时间

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

在这里插入图片描述

  • 1️⃣ 指定的casea要再约束条件内设置的时间内执行完毕,否则fail
  • 这个报文必须是DBC文件中定义好的,IG模块自己建立的不可以
	<testgroup title='检测case执行的最大允许时间'>
		<testcase ident='tc001' title='检测case执行的最大允许时间'>
		    <conditions>
				 <withintime title='Timeout' max='1s'/>
			 </conditions>
		  <wait title='Wait' time='5s'/>
		</testcase>
	</testgroup>	

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

在这里插入图片描述


🌎检测值之间的依赖关系

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

  • 这个怎么理解呢?一组值(或信号或变量)被改变了,期望另外一组值也跟着改变到指定的值,这就是所谓的值变化的依赖关系

在这里插入图片描述

  • 1️⃣ 解释下下面的代码
  • 这个报文必须是DBC文件中定义好的,IG模块自己建立的不可以
  • <while joinconditon = 'all'>下面的子标签是输入条件,all 表示下面的两个信号都满足条件时,就退出
    while,时间是5s,自动退出循环
  • <match joincondition = 'any'> 下面的子条件是跟随量,any ,表示任何一个条件满足就是pass
    的,如果再6s内,都没有满足,则fail
	<testgroup title='检测值之间的依赖关系'>
		<testcase ident='tc001' title='检测值之间的依赖关系'>
		  <conditions>
			<valuedependency title='Values Invariant' mintime='5s' timeout='6s'>
			  <while joinconditon = 'all'>
				<cansignal name='ECFail'><eq>1</eq></cansignal>
				<cansignal name='EPBStatus'><eq>1</eq></cansignal>
			  </while>
			  <match joincondition = 'any'>
				<envvar name='env_UDS_TestID'>
				  <range><from>1</from><to>4</to></range>
				</envvar>
				<cansignal name='EPBErrorStatus'><eq>1</eq></cansignal>
			  </match>
			</valuedependency>
		  </conditions>
		 <wait title='Wait' time='10s'/>
		</testcase>		
	</testgroup>	

  • 2️⃣ 测试过程中,我们手动把ECFailEPBStatus 设置成 1(如果手动设置的满,把xml中时间加长),然后在把EPBErrorStatus设置成1,case 就是pass的,如果不设置,则case就是fail的,如下图:

在这里插入图片描述


🌎 检测值是否有效

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

在这里插入图片描述

  • 1️⃣ 下面的代码实现的就是在10内检测 信号EPBErrorStatus值要在1-3,否则就fail了
  • 这个报文必须是DBC文件中定义好的,IG模块自己建立的不可以
	<testgroup title='检测值是否有效的'>
		<testcase ident='tc001' title='检测值是否有效的'>
		  <conditions>
			<value_valid title='Signal Value'>
			  <cansignal name='EPBErrorStatus'>
				<range>
				  <from>1</from>
				  <to>3</to>
				</range>
			  </cansignal>
			</value_valid>
		  </conditions>
		 <wait title='Wait' time='10s'/>
		</testcase>		
	</testgroup>	

  • 2️⃣ 先把把EPBErrorStatus设置成1,然后执行测试 ,case 就是pass的,如果不设置,则case就是fail的,如下图:

在这里插入图片描述


请添加图片描述
23

🌎总结

请添加图片描述

✂️ CSDN源码下载


7

  • 🚩要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多