simulink怎么生成vxworks的执行程序_从EPB模型谈谈Simulink代码生成

674a9cc9ef73600a142f2d4809707929.png

前段时间有读者朋友问代码生成的例子,说他正在做EPB的仿真模型,但总是和应用串不到一块去,我这里就从一个简单EPB控制模型来谈谈simulink代码生成,总结代码生成方法的同时也顺便回答他的问题。

1.EPB模型准备

用来举例说明的模型很简单,就是EPB(电子驻车,Electrical Parking Brake)中的手动夹紧功能,即驾驶员操作EPB按钮实现电子卡钳夹紧从而驻车的功能

如果你开过车,应该会知道EPB就是下面这玩意。

ecc1457b619bc683a7c8577cc46fdf99.png

EPB的功能很多,我们只拿其中最简单的EPB Switch Apply功能来说明,要使电子卡钳夹紧,同时满足下面四个条件即可:

(1)EPB未处于工厂转毂模式;

(2)EPB开关被拉起;

(3)EPB卡钳锁止功能正常;

(4)车辆静止;

分别用四个flag信号表示这四个状态量:

93b155dc674a59f79bc71f3e5695bf9f.png

虽然只有简单四个信号,在实际开发中每个信号又要再根据很多条件做判断,比如工厂转毂模式是一种整车厂用来检测驻车制动力是否合格的测试模式,要根据车速轮速做综合判断;又例如车辆静止的判断条件,并不是简单的车速为0,而是要判断四个轮速传感器的脉冲信号;这里就不做详细展开。

根据以上的触发条件可以建立该功能的Simulink模型:

d6dd03917457bacc6f3540efd4a2bf52.png

2.代码生成前的准备

打开Model Settings会话框,在Solver选项中,选择Fixed-Step(固定步长)和discrete(非连续解算器),这主要是因为我们面向的主要是嵌入式开发,而嵌入式开发的板子都是靠晶振或者外部时钟电路来计时的,采样时间一般是固定的。

8e68648e94db00fb5523def25b605b06.png

在Code Generation选项中,System target file(生成目标文件)选ert.tlc,即embedded coder嵌入式代码生成。

865107e98be209e3adb68914ab781d4b.png

在Report选项中,勾选Create code generation report和Open report automatically,生成代码后可以方便查看相关报告及详细代码。

8eec4e3d8f97f95b793d9bfeeda8ab50.png

3.代码生成及优化

上面准备工作完毕后,点击下图蓝色Generate Code按钮或者快捷键Ctrl+B,即可自动生成代码。

dea0ce400801df9e231ab9652af4c927.png

生成的代码如下,结构类似S-function:

初始化(EPB_model_20201123_initialize)→ 程序执行(EPB_model_20201123_step)→ 程序终止 (EPB_model_20201123_terminate)

备注:terminate在实际开发中用不到,因为程序在板子上都是循环跑的,不会终止,这里主要是仿真时间选择了有限值。

4372de5a630850cd1f72b9e27fe3fad6.png

截取主要的代码看一下,是不是看起来很不舒服?这是因为设置没有进行优化,生成的代码都是按照simulink内部默认方式进行变量命名和算法转写,不是我们熟悉的C语言表示方法。

35	/* Model step function */
36	void EPB_model_20201123_step(void)
37	{
38	  /* Outport: '<Root>/EPB_Caliper_apply_request_f' incorporates:
39	   *  Constant: '<S1>/Constant'
40	   *  Constant: '<S2>/Constant'
41	   *  Inport: '<Root>/EPB_RollerTest_Status_f'
42	   *  Inport: '<Root>/EPB_Switch_Status_f'
43	   *  Inport: '<Root>/EPB_lockfuntion_Status_f'
44	   *  Inport: '<Root>/Vehicle_Standstill_Status_f'
45	   *  Logic: '<Root>/Logical Operator'
46	   *  RelationalOperator: '<S1>/Compare'
47	   *  RelationalOperator: '<S2>/Compare'
48	   */
49	  EPB_model_20201123_Y.EPB_Caliper_apply_request_f =
50	    ((EPB_model_20201123_U.EPB_RollerTest_Status_f == 0.0) &&
51	     EPB_model_20201123_U.EPB_Switch_Status_f &&
52	     (EPB_model_20201123_U.EPB_lockfuntion_Status_f == 0.0) &&
53	     EPB_model_20201123_U.Vehicle_Standstill_Status_f);
54	
55	  /* Matfile logging */
56	  rt_UpdateTXYLogVars(EPB_model_20201123_M->rtwLogInfo,
57	                      (&EPB_model_20201123_M->Timing.taskTime0));
58	
59	  /* signal main to stop simulation */
60	  {                                    /* Sample time: [0.2s, 0.0s] */
61	    if ((rtmGetTFinal(EPB_model_20201123_M)!=-1) &&
62	        !((rtmGetTFinal(EPB_model_20201123_M)-
63	           EPB_model_20201123_M->Timing.taskTime0) >
64	          EPB_model_20201123_M->Timing.taskTime0 * (DBL_EPSILON))) {
65	      rtmSetErrorStatus(EPB_model_20201123_M, "Simulation finished");
66	    }
67	  }

那该怎么优化设置?

首先可以优化信号线,在信号线的properties菜单中,将要定义的变量填入Signal name,然后在Code Generation选项中选择ExportedGlobal(定义为全局变量)

94ec2cf388b90037c34996e24e6e2bda.png

修改完的模型就变成如下的样子:

55193f6b691ec715ebbd435793efde67.png

生成的代码可以看到已经出现我们熟悉的变量定义,主要的代码也变得清爽易读

6d910c2fa6aa0d06245b90c568bb8020.png
52	  EPB_Caliper_apply_request_f = ((EPB_RollerTest_Status_f == 0.0) &&
53	    EPB_Switch_Status_f && (EPB_lockfuntion_Status_f == 0.0) &&
54	    Vehicle_Standstill_Status_f);
55	
56	  /* Outport: '<Root>/EPB_Caliper_apply_request_f' */
57	  EPB_model_20201123_Y.EPB_Caliper_apply_request_f_j =
58	    EPB_Caliper_apply_request_f;

其次可以单独管理变量,在M文件中批量定义程序用到的变量并初始化,这里变量不多就直接在命令窗口演示,Initial value设置为0,Storage class设置为ExportedGlobal:

4539124668ee5c68e78f673d32b61727.png

然后在模型中绑定已经在workspace中定义的变量,信号线的properties中勾选Signal name must resolve to Simulink signal object:

0b1a6b74a35b463a08562dc71e14ae4a.png

修改后的信号线旁边会出现叉子标志,表示信号绑定成功:

7547f0fca92d153a6cb331ab0f7d5ffe.png

4.代码生成后能干什么?

本来到上面本文就结束了,但之前和刚接触MBD开发流程的童鞋交流过程中,发现大家对整个开发过程不是很熟悉,或者说不知道生成代码后能做什么,这里简单介绍下MBD开发。

MBD是Model Based Design基于模型开发的缩写,本质上是将原本文字描述的技术需求文档以及测试说明文档转化成便于理解的可视化模型,将重复且易出错的代码编写过程交付给计算机软件完成,按照事先定义好的编程规则自动生成代码,目的是提高开发效率,减少错误。

fac9daa9ac65c2e88870177d1982077f.png

自动生成的代码一般需要导入到芯片厂家开发的专用IDE(集成开发环境)中,进行检查编译后,下载到指定硬件中即可完成嵌入式开发。

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

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

相关文章

通过Socket实现文件上传/上传文件

文章目录整个功能的实现步骤客户端的实现步骤服务端的实现步骤示例代码整个功能的实现步骤 1.客户端使用本地的字节输入流读取被上传的文件数据 2.客户端使用网络字节输出流&#xff0c;将读取到的文件数据发送给服务端 3.服务端使用网络字节输入流读取客户端发送过来的文件数…

构造函数调用默认构造函数_显式无参数构造函数与默认构造函数

构造函数调用默认构造函数大多数不熟悉Java的开发人员都会Swift了解到&#xff0c;如果他们没有指定至少一个显式构造函数&#xff0c;则会为Java类隐式创建一个“ 默认构造函数 ”&#xff08; 由javac进行创建&#xff09;。 Java语言规范的 8.8.9节简要指出&#xff1a;“如…

Artifact到底是什么

将项目构建成一个可以在服务器部署的文件包&#xff08;如&#xff1a;war 包或者 exploded 的文件包&#xff09;&#xff0c;或者构建成的 jar 包&#xff08;这些 jar 包通常是某些模块程序文件&#xff0c;也可以是某些插件程序文件&#xff09;&#xff0c;这些都叫 Artif…

python win10 桌面_Python3如何实现Win10桌面自动切换

得空写了个自动切换桌面背景图片的小程序。再不写python就要扔键盘了&#xff0c;对vue还有那么一点好感&#xff0c;天天php真是有够烦。准备工作准备个文件夹放在桌面上&#xff0c;平时看到什么高清好图就拽进去。运行脚本脚本如下&#xff1a;#!/usr/bin/pythonimport ctyp…

java中抽象类继承抽象类_用Java中的抽象类扩展抽象类

java中抽象类继承抽象类示例问题 当我创建Java :: Geci抽象类AbstractFieldsGenerator和AbstractFilteredFieldsGenerator我遇到了一个不太复杂的设计问题。 我想强调一下&#xff0c;这个问题和设计对于某些人来说似乎很明显&#xff0c;但是在我最近与一位初级开发人员&#…

pb90代码如何连接sql2008r2_如何使用 HTTP Headers 来保护你的 Web 应用

众所周知&#xff0c;无论是简单的小网页还是复杂的单页应用&#xff0c;Web 应用都是网络攻击的目标。2016 年&#xff0c;这种最主要的攻击模式 —— 攻击 web 应用&#xff0c;造成了大约 40% 的数据泄露。事实上&#xff0c;现在来说&#xff0c;了解网络安全并不是锦上添花…

Servlet配置初始化参数/配置参数

文章目录给某个Servlet配置初始化参数配置全局的参数ServletConfig给某个Servlet配置初始化参数 也可以通过注解的方式来配置初始化参数&#xff1a; 在 Servlet 中获取针对 Servlet 的参数值&#xff1a; String version getInitParameter("version");配置全局的…

poi动态创建文档_POI创建的文档具有不同条件的灵活样式

poi动态创建文档介绍 这篇文章解释了基于各种标准将样式应用于文档的困难并提供了解决方案。 Java编程中的常见任务之一是根据存储在数据库中的数据创建Excel报告。 在这些情况下&#xff0c;Java程序员使用POI :-)。 这些报告通常对样式和数据格式有严格的规定。 数据通常是SQ…

python编码程序_python 编码

网页的编码方式是简体中文gb2312 (查看网页源码&#xff0c;可以看到)&#xff0c;而python内部的编码方式为unicode&#xff0c;之前的代码是这样的&#xff1a;contentAll urllib.urlopen(urlLink).read()soup BeautifulSoup.BeautifulSoup(contentAll) #生成BeautifulSou…

比特(bit)_二进制数

二进制数位&#xff0c;也叫比特位&#xff0c;其实就是指位置&#xff0c;是指二进制数的位置。例如&#xff0c;0101 这是二进制数&#xff0c;而且是 4 位的二进制数&#xff0c;因为有 4 个位置&#xff0c;每个位置放一个二进制数&#xff0c;确切的说是每个位置放一个二进…

javax线程池超时结束_没有Javax的Jakarta EE:这次世界也不会结束

javax线程池超时结束如果您错过了新闻&#xff0c; Oracle将向Eclipse基金会捐赠Java EE规范 。 这个决定是在规范过程中进行了相当长时间的Hibernate之后&#xff0c;人们理所当然地怀疑Oracle丧失了对Java EE的战略兴趣。 首先&#xff0c;Java EE和更广泛的Java社区很好地满…

Final Cut Pro X如何去视频水印/视频去水印

先剪辑好视频(比如把不要的段切掉)&#xff0c;然后选中视频&#xff0c;把它复制一份到另一个轨道(按住option键&#xff0c;用鼠标左键拖放即可复制)点击右下角的 效果(Effect)→ 模糊(Blur)→ 高斯模糊(Gaussian)&#xff0c;把高斯模糊拖入上边那条轨道再次选择效果(Effect…

为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...

我还记得大学实习面试时&#xff0c;被问到什么是线程池这个问题&#xff0c;因为这个题我被录取了&#xff0c;原因就是我背出来了&#xff0c;而另外一个面试的没背出来&#xff0c;说实话当时还真不知道它是干什么的&#xff0c;就是看面试题给背下来了&#xff0c;在之后就…

java中两任务并行运行_Java并行编程中的“可调用”与“可运行”任务

java中两任务并行运行当我们用Java编写多线程应用程序时&#xff0c;我们倾向于使用“ Runnable ”接口来实现线程类。 您的类必须简单地实现此接口并覆盖run方法。 对于琐碎的用例&#xff0c;我们可以通过调用“ start”方法直接启动线程&#xff0c;结果将控制流委托给run…

Servlet中的监听器

文章目录什么是监听器如何写监听器配置监听器统计在线人数的案例什么是监听器 Servlet 规范当中定义的一种特殊的类&#xff0c;作用是监听容器当中产生的一些事件并进行相应的处理。 容器产生的事件指的是两大类事件&#xff1a; 第一大类 生命周期相关的事件&#xff0c;指…

python调用百度接口实现ocr识别_Python调用百度OCR实现图片文字识别的示例代码

百度AI提供了一天50000次的免费文字识别额度&#xff0c;可以愉快的免费使用&#xff01;下面直接上方法&#xff1a;首先在百度AI创建一个应用&#xff0c;按照下图创建即可&#xff0c;创建后会获得如下&#xff1a;创建后会获得如下信息&#xff1a;APP_ID ******API_KEY …

selenium 替代品_每个人都在谈论Selenium替代品-明智地选择!

selenium 替代品什么是Selenium&#xff1f; Selenium是一套Web浏览器自动化工具&#xff0c;用于跨多种平台实现浏览器自动化。 尽管Selenium工具具有更多功能&#xff0c;但出于测试原因&#xff0c;它们仍被用来自动化Web应用程序。 Jason Huggins于2004年创建了Selenium&am…

Maven构建Artifact时,不会创建空目录

Maven 构建的 Web 项目中&#xff0c;你在 Web Resource Directories&#xff08;默认名称是webapp&#xff09;下创建的空目录&#xff0c;在构建Artifact 时&#xff0c;并不会在构件中也创建该空目录。 下图所示的四个空目录 upload&#xff0c;在构建 Artifact 时都不会创…

通用数据保护条例_欧盟《通用数据保护条例》——2019年的形势

“自欧盟《通用数据保护条例》(GDPR)生效以来&#xff0c;很多公司企业都忙于实行全新的数据保护标准。一个完善的数据保护管理系统比以往任何时候都要重要。我们可以参考一下其他公司在GDPR方面的一些初步经验。”自2018年5月25日GDPR生效以来&#xff0c;它在某些情况下引发了…

【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能AI、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推荐--…