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

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

当我们在学习如何测试网络管理时,难题不在于如何编写测试脚本,而是编写完测试脚本后,没有真实被测件来让我们执行测试脚本,进而调试脚本。这也是我在给大家讲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.mzph.cn/pingmian/34494.shtml

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

相关文章

08.QT控件:QWidget

一、Widget 简介 Widget 是 Qt 中的核⼼概念.。英⽂原意是 "小部件",我们此处也把它翻译为 "控件"。控件是构成⼀个图形化界⾯的基本要素。 Qt 作为⼀个成熟的 GUI 开发框架, 内置了⼤量的常⽤控件。并且 Qt 也提供了 "⾃定义控件" 的…

《第一行代码 第3版》学习笔记——第十一章 网络技术

1 webview用法 class MainActivity : ComponentActivity() {SuppressLint("SetJavaScriptEnabled")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContent {NetWorkDemoTheme {// A surface container using the bac…

主流MQ对比和选型

在以下几个我们比较关心的维度进行对比 ActiveMQ RabbitMQ RocketMQkafka官网https://activemq.apache.org/https://www.rabbitmq.com/https://rocketmq.apache.org/https://kafka.apache.org/githubhttps://github.com/apache/activemqhttps://github.com/rabbitmqhttps://g…

AI如何让办公更智能?WPS AI海外版给出答案

导读:从语义检查到一键生成PPT,WPS Office海外版如何面向2亿月活用户快速推出AI功能? 近日,WPS Office海外版应用亚马逊云科技Amazon Bedrock等生成式AI技术与服务,在海外正式推出人工智能应用WPS AI海外版&#xff0c…

Postman测试,如何保持用户登录状态?

为了在Postman中保持用户登录状态,我们可以使用以下步骤: 1. 下载和安装Postman 首先,我们需要下载和安装Postman。Postman是一个流行的API开发和测试工具,可以帮助我们发送HTTP请求并测试API的功能。 2. 创建一个新的Postman …

【Vue】vue-router路由使用

前言 Vue Router是Vue框架中非常重要的一个功能。 目标 1 单页面应用与多页面应用的区别; 2 vue-router的具体实现方法; 3 路由模式有哪几种,有什么区别; 4 如何进行路由守卫与路由缓存; 一 路由的概念 概念 Vue Router是Vue提供的路由管理器。将组件与路由一一对应起来,…

6-2 归并排序

6-2 归并排序 分数 10 全屏浏览 切换布局 作者 软件工程DS&A课程组 单位 燕山大学 以下代码采用分而治之算法实现归并排序。请补充函数mergesort()的代码。提示:mergesort()函数可用递归实现,其中参…

Conda创建与激活虚拟环境(指定虚拟环境创建位置)

1.Conda优势 Conda是一个开源的软件包管理系统和环境管理系统,主要用于在不同的计算环境中安装和管理软件包和其依赖项。它最初是为Python而设计的,但现在也可以用于管理其他语言的软件包。 Conda提供了对虚拟环境的支持,这使得用户可以在同…

如何在Java中处理UnsupportedOperationException异常?

如何在Java中处理UnsupportedOperationException异常? 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿! 在Java编程中,我们经常会遇到各…

swiper实例

大家好,我是燐子,今天给大家带来swiper实例 微信小程序中的 swiper 组件是一种用于创建滑动视图的容器组件,常用于实现图片轮播、广告展示等效果。它通过一系列的子组件 swiper-item 来定义滑动视图的每一个页面。 基本用法 以下是一个简单的…

ESAPI.setAttribute设置值前端取不到

我在后端使用java设置email request.setAttribute("email",ESAPI.encoder().encodeForHTML("123456qq.com"))前端jsp页面获取不到&#xff0c; var email"<%ESAPI.encoder().encodeForHTML(request.getParameter("email"))%>"…

web前端——HTML

目录 一、HTML概述 1.HTML是什么&#xff1f; 2.HTML具体化解释 二、HTML基本语法 1.声明 2. Head头标签 3.body身体标签 4.一个html的基本结构 5.标签 6.标签属性 ①属性的格式 ②属性的位置 ③添加多个属性 三、基本常用标签 1.超链接 2.图像标签 ①图像标…

springboot集成JPA并配置hikariCP连接池问题解决

一、引入需要的依赖 springboot版本 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-parent</artifactId><version>2.3.2.RELEASE</version><relativePath/></parent> jpa依赖 <!--…

从零开始做题:会打篮球的鸡

会打篮球的鸡 1 题目 给你password你帮鸡肋找找会打篮球的鸡在哪儿行吗&#xff1f; password:iVBORw0KGgoAAAANSUhEUgAAAgAAAPoCAIAAADCwUOzAAAACXBIWXMAAAsTAAALEwEAmpwYAAB2KElEQVR4nO3dd3xb1f3/8WvLe8QjdpbtxJm2Eyd29t6LJBBWgEICFAqUUmaBlrZ8Ke23fLFUvYsYRQKZScECGQHkpC9…

OpenGL进阶系列1 - OpenGL1.x和2.x功能演进(上古历史)

时间版本功能详细描述1992v1.0 NewList/EndList/CallListglspec10.pdfBegin/Endglspec10.pdfVertex/TexCoord/Color/Normal/Index/Rectglspec10.pdfMatrixMode/LoadMatrix/Multmatrixglspec10.pdfRoate/Translate/Scaleglspec10.pdf

1964springboot VUE小程序在线学习管理系统开发mysql数据库uniapp开发java编程计算机网页源码maven项目

一、源码特点 springboot VUE uniapp 小程序 在线学习管理系统是一套完善的完整信息管理类型系统&#xff0c;结合springboot框架uniapp和VUE完成本系统&#xff0c;对理解vue java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;…

DLS平台:GPT-5预计于2025年底至2026年初发布,将实现“博士水平”智能

摘要 OpenAI首席技术官Mira Murati近日透露&#xff0c;GPT-5可能推迟到2025年底或2026年初发布。这一消息打破了市场对GPT-5在2023年底或2024年夏季发布的预期。尽管推迟&#xff0c;但GPT-5将实现显著的性能飞跃&#xff0c;在特定任务中达到“博士水平”的智能。这标志着人…

Java 8 Date and Time API

Java 8引入了新的日期和时间API&#xff0c;位于java.time包下&#xff0c;旨在替代旧的java.util.Date和java.util.Calendar类。新API更为简洁&#xff0c;易于使用&#xff0c;并且与Joda-Time库的一些理念相吻合。以下是Java 8 Date and Time API中几个核心类的简要概述&…

[modern c++][11/14] 变参模板的使用

前言&#xff1a; c 11 引入和变参模板用来处理任意数量模板参数的场景。 变参模板函数 &#xff08;C11/14 迭代展开 | 一个模板参数和一个模板参数包&#xff09; #include <iostream> #include <string>void MyPrint(){std::cout << " end" …

JDBC的概念 ,核心API的介绍 , 注册驱动介绍

第一章 JDBC 1、JDBC的概念 目标 能够掌握JDBC的概念能够理解JDBC的作用 讲解 客户端操作MySQL数据库的方式 使用第三方客户端来访问MySQL&#xff1a;SQLyog、Navicat 使用MySQL自带的命令行方式 通过Java来访问MySQL数据库&#xff0c;今天要学习的内容 如何通过Java代…