MBD软件开发之数据管理

news2024/9/27 19:16:28

模块化开发中,模型集成和代码集成是很多工程师非常关心的问题。

常见的代码集成方式有两种,一是单元级模型上生成代码,在代码上做集成,一是模型集成之后,再去生成集成级别的代码。无论采用哪种方式,模型级别的集成测试都是非常有必要的。

也就是说,如果采用第一种方式,那么模型集成测试之后,再回到单元模型上生成代码;而对于第二种方式,则在模型集成测试之后,直接在集成模型上生成代码。

模型集成测试怎么做?或者说为了做集成测试,我们怎么把单元模型集成到一起?目前可能已经很少有人再有这样的疑问,大多数模型开发工程师都知道可以通过模型引用的方式将单元模型引用后在集成模型中进行集成,如下图所示,图中使用了模型引用模块,引用了3个单元模型Unit1、Unit2、Unit3,然后在集成级别上按照输入、输出关系将3个模块连接在一起。

三个单元模型之间有输入、输出关系,那就要考虑模型之间需要传递的数据怎么去定义,比如,Unit1的输出,同时是Unit2和Unit3的输入,这两个信号,应该放在哪里定义?模型中的参数该定义在哪里?我们来看以下几种方式:
 

方式一:单元模型独立生成代码

以Unit1为例,模型中有3个输入,两个输出,以及参数k1、k2,查表函数中还有两个参数TableData1d、BreakPoint1d。

这里将信号和参数定义在两个不同的数据字典中,信号定义在u1dd.sldd,参数定义在param_dd.sldd,对于输入信号,StorageClass设置为ImportedExtern,输出信号的StorageClass设置为ExportedGlobal。

于是代码中就有了对输出信号对应变量的定义:

以及对于输入信号的外部声明:

参数被指定到swc_params.c文件中定义:

这种方式下,对于同一个信号,比如unit1_output_signal1,需要在Unit1的数据字典u1dd.sldd和Unit2的数据字典u2dd.sldd以及Unit3的数据字典u3dd.sldd中定义相应的信号对象,不同的是,unit1_output_signal1作为Unit1的输出信号,StorageClass被定义为ExportedGlobal,而在Unit2和Unit3的数据字典中,StorageClass要被定义成ImportedExtern,这样可以保证变量unit1_output_signal1只被定义一次,不会出现重定义问题。

并且,如果按照单元模型的数据字典中只定义相应单元模块输出变量的规则,在模块化开发中,模块间变量定义问题上不再有沟通成本。

对于参数,可能会有一些麻烦,比如,参数k1,可能用于不同的单元模型,而在哪个模块定义,在哪个模块引用,就是比较麻烦的事情,这里直接把参数指定到统一的文件中,比如swc_params.c,多个单元模块会分别生成这样的文件,可以使用合并工具对这些模块做合并处理。这不一定是最好的方式,但看上去这样做可以避免重定义问题,也可以省去沟通成本。缺点也很明显,违背了修改自动生成代码的基本原则。如果网友更好的方案,也欢迎留言分享。

另外,对于这种方式下生成的函数 Unit1_step()、Unit2_step()、Unit3_step()在调用的时候没有约束,可以放在中断服务程序或者任务中调用,无需考虑中断或者任务之间的中断和抢占行为。

方式二:模型集成,然后生成集成级别的代码

不得不说,这种方式是最省心的方式,不过,省心的前提是单元模块的调度简单,可以通过模型完全实现,模块与模块之间不存在中断和抢占行为。

如上图示,只需在集成模型上对最外层的输入、输出和模型中的参数做定义。

从集成模型的级别上生成了SWC_step()函数,里面有对Unit1、Unit2和Unit3的调用。SWC的最外层输入input_signal1、input_signal2、input_signal3,这里同样设置成外部定义,SWC的最外层输出,在这个集成级别的模型上做了定义,output_signal1、output_signal2。

对于单元模型之间传递的信号,在函数调用之前,被定义成局部变量,分别为rtb_Model_o1、rtb_Model_o2、rtb_Model2,从模型上可以看出,这也就是Unit2的3个输入信号对应的变量。

假如Unit1、Unit2、Unit3三个模块之间的调度关系就如模型描述的那样,不再有中断或者抢占,那么,对这部分算法的调用就只需要调用SWC_step()函数即可。

而如果Unit1、Unit2、Unit3分别被分配不同优先级的中断服务程序中,它们之间只是从数据上有这样的数据传递关系,该怎么办?我们来看方式三。

方式三:模型集成,使用生成的单元模型代码

如果是三个单元模型对应代码之间有抢占或者中断关系,那么方式二中的SWC_step()显然没法直接使用,我们需要把Unit1、Unit2、Unit3对应的函数分别放到3个中断服务程序或者任务中调用,显然它们之间不能再像方式二中通过局部变量传递数据,它们之间需要有全局变量来传递数据。

为减少单元模型对集成模型的依赖,信号对象unit1_output_signal1和unit1_output_signal2的StorageClass设置为ExportToFile,并指定相应的文件名。

而对于Unit2和Unit3,它们的输入信号是Unit1的输出,已经在Unit1模型中做了定义,所以这两个模块的输入无需定义,如下图:

集成模型生成的代码如下:

从生成的SWC_step()函数来看,Unit1、Unit2、Unit3的传递的参数都是全局变量,当然,如前所述,SWC_step()函数不会被集成到软件中,我们只需要使用Unit1()、Unit2()、Unit3()。

以Unit2为例,被引用模型生成的代码包含Unit2.c、Unit2.h、Unit2_private.h、Unit2_types.h四个文件,分析这四个文件不难发现,这四个文件对集成级别模型SWC对应的代码并无依赖。

我们再看Unit2的输出信号对应的变量定义,这两个数据被定义在unit2_output_signals.c文件中,文件中有这样一行代码

#include “SWC_types.h”

显然这个文件对SWC_types.h文件有依赖,SWC_types.h文件内容如下:

这里仅仅定义了一个宏,并不依赖其他文件。

也就是说,我们在对单元模型对应代码的集成中,可以丢弃SWC.c、SWC.h、SWC_private.h等文件,但是,需要SWC_types.h文件。

----------------------------------------------
 

对应方式二和方式三,除第一次需要整个集成模型做代码生成之外,后续的模型变更可以基于单元模型开展,代码生成也可以在单元模型上生成,不过,不能使用Ctrl+B的方式去生成,而是需要专门的命令行生成,命令行如下(以Unit1模型为例):

model_name = 'Unit1';
 

slbuild(model_name,'ModelReferenceRTWTargetOnly');

再对上述内容做一点补充,每个模型对应一个数据字典(sldd文件),参数专门定义了一个数据字典。数据字典中,对应模型的输出被定义到指定的文件,参数也被指定到指定的文件。数据字典之间可以相互引用。

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

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

相关文章

网络端口转发

一. 如图网络拓扑 光猫改桥接之前光猫自身也会有一层局域网,光猫ip为局域网额的192.168.1.1 当改桥接之后,只有一层路由器的局域网,路由器为局域网的192.168.31.1 此时从公网对内网进行访问时,先访问到路由器的公网ip的某个端口…

从零开始搭建监控系统 (二)

从零开始搭建监控系统 (二) 监控系统架构 部署 文件目录 rootchuango:/opt/prometheus# tree -L 1 . ├── docker-compose.yml ├── grafana_data ├── grafana.ini ├── prometheus_data └── prometheus.yml # grafana_data, prometheus_data 2个文件为空目录do…

下载安装ansible后,缺失pyyaml,pip安装时又出错,升级时又由于时Python2.7,不好升级遇到的一系列问题。

经过上一篇文章,我虽然误删了CentOs自带的python和yum,但是我重新将他们恢复了。这里记住默认的python版本是2.7.5。 我使用yum安装好ansible后,检查我的ansible版本的时候,发生了错误,提示没有yaml模块。 1 验证ans…

js事件循环机制(宏微任务队列都是先进先出)

文章目录 1.什么是事件循环2.主线程、任务队列、同步任务、异步任务、微任务、宏任务(1)主线程(2)同步任务(3)异步任务(微任务、宏任务)(4)任务队列 3.执行流…

乔布斯对产品,团队,人才的理解

乔布斯的设计理念和管理理念是他领导Apple取得成功的核心因素。以下是对他在产品设计和团队管理方面理念的详细描述 乔布斯的设计理念 1. 简约主义 简洁与直观:乔布斯强调设计的简约性。他相信产品应该尽可能简单且易于使用,去除一切不必要的复杂性。例如…

AIoT新技术融合基础设计课程开发与运营案例分析

本文来自下面的论文的第4部分:《Research on Basic Engineering Design Course Development and Application of New Technology AIoT (Artificial Intelligence of Things) Convergence Education》,作者是Yunja Hwang,来自韩国檀国大学工学…

IDEA左下角不显示本地修改的localChanges信息-git

IDEA左下角不显示本地修改的localChanges信息-git 取消勾选这个

【RTT-Studio】详细使用教程十:TM1638驱动数码管

文章目录 一、简介二、TM1638地址组三、TM1638的两种数码管使用方式四、TM1638数据格式五、按键扫描和键扫复用六、完整代码 一、简介 TM1638是深圳市天微电子有限公司设计的一款带键盘扫描接口的LED(发光二极管显示器)驱动控制专用芯片,内部…

React18+Vite+Eectron从入门到实战系列之一环境安装篇

如果我们的技术栈是react,也想要用electron来开发一个桌面的多端应用该怎么做呢?这篇文章选择了react的技术栈,讲解了环境的初始化步骤 实现效果 步骤 创建 react 项目 npm create vitelatest my-react-app安装依赖 cd my-react-app npm i…

勒索软件、供应链攻击等带来的思考!

2023年勒索软件、供应链攻击、地缘政治冲突与黑客活动主义、国家黑客间谍与APT组织活动成为网络安全的热点话题,生成式人工智能技术的武器化更是给动荡的全球网络安全威胁态势增加了不确定性、不对称性和复杂性。 即将到来的2024年,随着网络犯罪的规模化…

基于卷积神经网络ResUnet 多模态融合实验、BraTS 3d数据集(nii.gz)4模态融合分割

1、前言 之前介绍了unet对BraTS 3d数据集的2d图片分割,实现思路如下: 1、对BraTS 3d数据集进行切片,沿着某个模态的横断面切割 2、划分数据集、包括训练集、验证集等等 3、网络训练 4、评估模型性能等等 具体的可以参考本文:…

黑丝或者白丝,都可以用LoRA(Stable Diffusion进阶篇:ComfyUI 附加网络)

前言 在学习WebUI的那些基础知识点的时候,有一个东西是每一个初学者都绕不开的大山-附加网络。 这个东西对于每一个接触Stable Diffusion的小伙伴来说就像是小学门口小卖部卖的辣条、初中课本上的涂鸦、高中数学卷解不开的最后一道大题。 学习过WebUI里Stable Di…

基础岛 - 8G显存验证书生·浦语大模型的Demo

因为以前用过LMDeploy,所以本章的内容相对熟悉。 另外,因为教程写的很详细保姆级,所以大多数情况直接复制执行命令即可。开发机的创建略过。 总体验证结论: LMDeploy的模型加载有点慢,但推理速度快,符合预…

将tsx引入vue

按钮 vue <cl-batch-btn >新增批量</cl-batch-btn> import batch from "//modules/ad/components/ uploading/batch.vue" import ClBatchBtn from "/~/crud/src/components/batch-btn"; tsx

从困境到突破,EasyMR 集群迁移助力大数据底座信创国产化

在大数据时代&#xff0c;企业对数据的依赖程度越来越高。然而&#xff0c;随着业务的不断发展和技术的快速迭代&#xff0c;大数据平台的集群迁移已成为企业数据中台发展途中无法回避的需求。在大数据平台发展初期&#xff0c;国内数据中台市场主要以国外开源 CDH、商业化 CDP…

JVM(十二)细谈JVM类加载的各个过程以及如何修改Java原生API

本文深入探讨了Java虚拟机&#xff08;JVM&#xff09;的类加载机制&#xff0c;包括类的加载、验证、准备、解析和初始化等过程。文章首先通过几个高级面试问题引入主题&#xff0c;然后详细解释了JVM类加载的五个阶段及其重要性。接着&#xff0c;介绍了Java的三个主要类加载…

普通话测试前如何抱佛脚拿高分

全国普通话水平测试对很多大学生而言是最好拿证的考试&#xff0c;当然了对于某些专业的考生也会有更高的拿证要求&#xff0c;例如对于需要考教师资格证的同学而言。希望这篇文章可以帮助到各位考生在普通话水平测试中取得高分。 首先我们需要知道考试考什么 一、测试内容 …

M.2接口

接口分类 key-a key-b key-e key-m接口图片

图吧工具箱:硬件检测的一站式解决方案,好用到让同行都点赞!

前言 嘿&#xff0c;各位硬件迷们&#xff0c;小江湖又来啦&#xff01;今天&#xff0c;我手里可是攥着个宝贝&#xff0c;一个能让你们眼前一亮的神秘工具箱&#xff1b;别急着问是啥&#xff0c;我先卖个关子&#xff0c;就说这工具箱啊&#xff0c;简直是硬件界的“八卦炉”…

8.C基础_指针基础

指针概述 指针存放的都是首地址。 1、定义与初始化 形式&#xff1a;<数据类型>* <变量名> <地址>; int a 10; int *p &a; 指针的类型不同&#xff0c;p时的偏移地址量不同&#xff0c;偏移地址 sizeof(类型)Byte 注意点&#xff1a; 指针的…