如何模拟一个具有网络管理功能的被测件的一些思路

news2024/11/16 17:44:05

不知道大家有没有遇到过这个问题?

当我们在学习如何测试网络管理时,难题不在于如何编写测试脚本,而是编写完测试脚本后,没有真实被测件来让我们执行测试脚本,进而调试脚本。这也是我在给大家讲CANoe工具和CAPL编程语言时,很多人会问我的问题:他们没有CANoe硬件,又或者他们没有测试环境,也就是被测件。也就无法确定自己辛辛苦苦敲出的代码,是不是能够顺利运行?

没有CANoe硬件不会成为你学习CANoe工具的障碍,没有真实被测件也不会是你练习CAPL代码的拦路虎。这些我们在《CAPL编程语言系统性课程》里都有过详细的介绍。

今天我们就针对如何让你编写的网络管理的测试脚本顺利运行,聊一聊在CANoe中要如何模拟一个ECU仿真节点,让其具有网络管理功能。

首先,添加一个网络节点:

仿真节点

接着要让ECU在收到外部网络管理报文时唤醒(假设是远程唤醒),唤醒的表现就是自己进入Repeat Message状态时要往外发送自己的网络管理报文和应用报文。

要实现上面的需求并非难事,大家都是使用CAPL的高手,有好几层楼那么高:

on message *
{
  if (this.id == @sysvar::ExtNmMsg::id)//接收到外部网络管理报文,唤醒,往外发送自己的网管报文和应用报文
  {
    setTimerCyclic(t_intNmMsg, @sysvar::IntNmMsg::period);//循环发送自己的网络管理报文
    setTimerCyclic(t_intAppMsg, @sysvar::IntAppMsg::period);//循环发送周期性报文
  }
}

通过上面的代码,仿真节点在接收到外部网管报文后开始循环发送自己的网管报文和应用报文,可以看作是唤醒并进入Repeat Message了。然后呢?什么时候Repeat Message状态结束?如何进入Normal Operation或Ready Sleep?这些要如何通过代码实现?

按照上面的思路走一步看一步写一步肯定是不行的,逻辑太多了,有很多的异步需要处理。

就算是上面的代码,其实也有逻辑上的漏洞。仿真节点在接收到外部网管报文时是不是应该要先判断自己是不是处于Bus Sleep状态,才能决定是否要唤醒呢?所以看似简单的实现,要考虑的因素太多,有个完整的代码结构很重要!

下面我们来聊一聊我在《CAPL编程语言系统性课程》中是如何实现的。

思路

首先,ecu节点的网络管理状态,是互斥的,也就是说同时只能有一种状态,且进入某种状态时会自动触发这个状态的某些行为。比如说进入RepeatMessage时ecu开始发送nm和app报文,所以在capl中我们可以用一个什么东西表示网络管理状态?同时当进入这个状态时能够自动触发操作呢?

答案是系统变量!所以我们定义一个系统变量表示网络管理状态,它就是网络管理状态标志位。它的不同值表示不同的状态。当ecu进入某个状态时,就把这个系统变量值改变为这个状态值,同时用on sysvar事件函数来实现进入这个状态时的行为。

- Sysvar::NmState::Flag = 0 -> BusSleepMode
- ......................= 1 -> RepeatMessage
- ......................= 2 -> NormalOperation
- ......................= 3 -> ReadySleep
- ......................= 4 -> PrepareBusSleepMode

那ecu如何唤醒和如何维持在ReadySleep,这是如何实现呢?

可以通过on message事件函数来接收外部网络管理报文,当接收到外部网络管理报文时,ecu从BusSleepMode唤醒,进入RepeatMessage,那么只需要把网络管理状态标志位,也就是那个系统变量设置为RepeatMessage的值。

当然,不是任何状态下接收到外部网络管理报文都要切状态的,所以还需要判断当前的状态,也就是获取系统变量当前的值。

每个状态的timeout,也就是定时器是如何倒计时的?

这个简单,capl中的timer就是一个定时器,就可以倒计时。那么进入某个状态就
需要启动自己的定时器,当倒计时结束时,就需要离开这个状态,进入下一个状态,也就是把代表网络管理状态标志位的系统变量值改为下一个状态的值。

为了让大家能够运行自己编写的网络管理的脚本,我用这种思路实现了这两条状态切换链路:

  • BusSleepMode -> RepeatMessage -> ReadySleep -> PrepareBusSleepMode

  • BusSleepMode -> RepeatMessage -> ReadySleep -> ReadySleep -> ReadySleep…

最终的代码量其实很少,这里就不放出来了。 感兴趣的可以参加CAPL课程,里面有很多能让你学习的东西。

最后,有人可能会说:“我有测试环境,我干嘛要写一个模拟的网络管理功能的被测件?”

有的时候,写代码是工作,但写一些工作之外的代码,可以是一种兴趣,那才是你前进的动力!

由此深入,要如何模拟一个能够满足以太网测试的被测件呢?我们在《车载以太网通信测试课程》中继续详聊!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1859351.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Media Framework(八)OMXNodeInstance - Ⅰ

OpenMAX框架的学习有两大难点,一是组件的状态切换与buffer的流转过程,这部分内容我们已经在IL Spec中学习过了;二是OMX组件使用的buffer类型与buffer分配过程,这一节我们来重点剖析OMX组件使用的buffer类型。 1、引言 在实际应用…

我原以为政务类网站不追求漂亮,打脸啦,漂亮得颠覆你认知。

我原本以为政务类网站一定时沉稳、工整、信息量大的,这些和漂流都关联不上,直到最近看了一些网站,发现我的认识狭隘了。 政务类网站的设计风格通常需要注重以下几个方面: 稳重和专业感: 政务类网站需要给人以稳重、正…

c++分隔字符串

可以使用getline函数。 有两个版本: 至于为什么可以使用getline函数返回值作为while的判断条件,cprimer中表述如下:

51-60 CVPR 2024 最佳论文 | Generative Image Dynamics

在2023年11月,谷歌研究院发布了一项令人瞩目的研究成果——Generative Image Dynamics(生成图像动力学)。这项技术的核心是将静态的图片转化为动态的、无缝循环的视频,而且更令人兴奋的是,这些生成的视频还具有交互性。…

【Web APIs】JavaScript 事件基础 ② ( “ 事件 “ 开发步骤 | 常见鼠标 “ 事件 “ )

文章目录 一、" 事件 " 开发步骤1、" 事件 " 开发步骤2、完整代码示例 二、常见鼠标 " 事件 "1、常见鼠标 " 事件 "2、鼠标 " 事件 " 代码示例 Web APIs 博客相关参考文档 : WebAPIs 参考文档 : https://developer.mozilla…

计算机组成原理 | CPU子系统(1)基本概述

基本结构模型 运算与缓存部件 数据寄存部件 PSW不是很清楚 存储器是什么?属于那个结构里? 时序处理部件 cpu是大脑,控制器是神经元 ①通过硬件产生控制信号 ②通过软件产生控制信号 外频(系统时钟信号),…

Springboot整合cxf进行WebService发布和WebService调用

import javax.jws.WebMethod; import javax.jws.WebParam; import javax.jws.WebResult; import javax.jws.WebService; /** 测试接口 author Μr.ηobοdy date 2019-12-29 */ WebService(name “UserService”, // 暴露服务名称 targetNamespace “http://servic…

后端数据null前端统一显示成空

handleNullValues方法在封装请求接口返回数据时统一处理 // null 转 function handleNullValues(data) {// 使用递归处理多层嵌套的对象或数组function processItem(item) {if (Array.isArray(item)) {return item.map(processItem);} else if (typeof item object &&…

深入解析 Python dataclass:类属性与类方法解释

文章目录 dataclass实例属性和类属性自动设置属性 实例方法静态方法(staticmethod)和 类方法(classmethod)静态方法类方法 dataclass dataclass 是 Python 3.7 引入的一个装饰器,用于简化类的定义。 使用 dataclass …

Unity的ScrollView滚动视图复用

发现问题 在游戏开发中有一个常见的需求,就是需要在屏幕显示多个(多达上百)显示item,然后用户用手指滚动视图可以选择需要查看的item。 现在的情况是在100个data的时候,Unity引擎是直接创建出对应的100个显示item。 …

0801功率放大问题

3个学时讲一个电路(两个共集共集并联),4个问题,发展线索 丙类放大电路用在高频通讯行业,低频功放是甲类,乙类,甲乙类 PT三极管的损耗 Pv电源提供的功率 现代模电通常使用方法b 只有交流…

聊聊 golang 中 channel

1、引言 Do not communicate by sharing memory; instead, share memory by communicating Golang 的并发哲学是“不要通过共享内存进行通信,而要通过通信来共享内存”,提倡通过 channel 进行 goroutine 之间的数据传递和同步,而不是通过共享…

YashanDB为新质生产力赋能 灌注合肥区域转型源动力

当前,数据要素已成为我国数字经济的“核心引擎”与“关键生产要素”,为全面激发数据要素的价值,各地区正积极探索数据要素交易平台的可行模式,加快在数据要素领域的布局。近日,深圳计算科学研究院崖山数据库系列产品受…

JDBC从入门到精通-笔记(一):JDBC基本概念与开发基础

视频资源:JDBC从入门到精通视频教程-JDBC实战精讲_哔哩哔哩_bilibili JDBC定义与本质 概念 什么是JDBC:Java DataBase Connectivity JDBC本质:SUN公司制定的一套接口(interface),java.sql.*。 面向接口调…

【progressBar-js】优雅的 前端进度条 构建!

progressBar-js JS 前端进度条小工具 您可以通过此工具来构建一个有效的工具条&#xff0c;接下来就是一个示例&#xff01; 使用示例 引入 progressBar-js 库 直接在这里将 css 和 js 文件引入进来就算是成功导入了哦&#xff01;&#xff01;&#xff01; <link href&…

SVN学习(001 svn安装)

尚硅谷SVN高级教程(svn操作详解) 总时长 4:53:00 共72P 此文章包含第1p-第p19的内容 介绍 为什么使用版本控制工具 版本控制工具的功能 版本控制简介 客户端服务器结构 c/s结构 服务端的结构&#xff1a; 服务程序 、版本库(存放我们上传的文件) 客户端的三个基本操作&#…

高考填报志愿,选专业和选学校,哪个优先?

一、 专业优先&#xff0c;还是学校优先&#xff1f; 专业和学校都非常重要&#xff0c;好的学校可以给你提供较高的学习平台&#xff0c;好的专业能够给将来的职业生涯提供便利。高考报考&#xff0c;每一个学校的每一个专业的分数都会不同&#xff0c;热门的专业分数较高&am…

Swift 周报 第五十三期

文章目录 前言新闻和社区苹果公司取得基于波束组合的信道状态信息&#xff08;CSI&#xff09;反馈专利&#xff0c;为 5G 网络中的信道状态信息&#xff08;CSI&#xff09;报告提供新方案关于在欧盟分发 App 的最新信息公司快评&#xff5c;新广告引发不满&#xff0c;苹果也…

大模型揭秘:AI与CatGPT在实体识别中的创新应用

摘要 尽管大规模语言模型 (LLM) 在各种 NLP 任务上已经取得了 SOTA 性能&#xff0c;但它在 NER 上的性能仍然明显低于监督基线。这是由于 NER 和 LLMs 这两个任务之间的差距&#xff1a;前者本质上是序列标记任务&#xff0c;而后者是文本生成模型。在本文中&#xff0c;我们…

被年轻人买爆的转运能量石,戴一天竟等于拍千次胸片?

离谱的事年年有&#xff0c;这几年可以说非常多&#xff01;‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 尤其是这届年轻人&#xff0c;不知道什么时候开始&#xff0c;越来越迷信了&#xff01; 比如去年很…