在仿真和代码执行期间在参数值集之间切换

news2024/11/24 16:34:18

目录

浏览模型示例

将参数值存储在结构体数组中

创建变量以在参数集之间切换

使用总线对象作为结构体数组的数据类型

使用枚举类型切换变量

向数据字典添加新对象

仿真期间在参数集之间切换

生成和检查代码


        要存储相同模块参数的多个独立值集,可以使用结构体数组。要在参数集之间切换,请创建一个变量作为数组的索引,并更改该变量的值。可以在仿真期间更改变量值,如果变量可调,还可以在生成的代码执行期间更改变量值。

浏览模型示例

        打开示例模型。

open_system('sldemo_fuelsys_dd_controller')

        此模型代表一台汽油发动机的供油系统。模型的输出是流向引擎的燃油速率。

        导航到 switchable_compensation 嵌套子系统。

open_system(['sldemo_fuelsys_dd_controller/fuel_calc/',...
     'switchable_compensation'])

如图所示:

        此子系统对喷油量信号中的噪声进行校正和滤波。该子系统基于燃油供给模式使用不同滤波器系数,从而根据引擎中的传感器故障控制逻辑更改。例如,控制算法在正常运行期间激活 low_mode 子系统。它激活 rich_mode 子系统以响应传感器故障。

        打开 low_mode 子系统。

open_system(['sldemo_fuelsys_dd_controller/fuel_calc/',...
     'switchable_compensation/low_mode'])

如图所示:

        Discrete Filter 模块对喷油量信号进行滤波。在模块对话框中,分子参数设置滤波器的分子系数。

        同级子系统 rich_mode 还包含 Discrete Filter 模块,该模块使用不同系数。

        更新模型图以显示信号数据类型。该模块的输入和输出信号使用单精度浮点数据类型 single。

        在模型的左下角,点击模型数据标记,然后点击数据字典链接。此模型的数据字典 sldemo_fuelsys_dd_controller.sldd 在模型资源管理器中打开。

        在模型资源管理器的模型层次结构窗格中,选择设计数据节点。

        在目录窗格中,查看 Simulink.NumericType 对象的属性,如 s16En15。所有这些对象当前都表示单精度浮点数据类型 single。该模型使用这些对象来设置信号数据类型,包括 Discrete Filter 模块的输入和输出信号。

        假设在仿真和执行生成的代码的过程中,您需要其中每个子系统都基于您控制其值的变量在不同分子系数之间切换。

将参数值存储在结构体数组中

        将现有的分子系数集存储在其值为结构体的 Simulink.Parameter 对象中。该结构体的每个字段存储一个 Discrete Filter 模块的系数。

lowBlock = ['sldemo_fuelsys_dd_controller/fuel_calc/'...
    'switchable_compensation/low_mode/Discrete Filter'];
richBlock = ['sldemo_fuelsys_dd_controller/fuel_calc/'...
    'switchable_compensation/rich_mode/Discrete Filter'];
params.lowNumerator = eval(get_param(lowBlock,'Numerator'));
params.richNumerator = eval(get_param(richBlock,'Numerator'));
params = Simulink.Parameter(params);

        将 params 的值复制到临时变量中。修改此临时结构体中的字段值,并将修改后的结构体指定为 params 的第二个元素。

temp = params.Value;
temp.lowNumerator = params.Value.lowNumerator * 2;
temp.richNumerator = params.Value.richNumerator * 2;
params.Value(2) = temp;
clear temp

        params 的值是一个包含两个结构体的数组。每个结构体存储一个滤波器系数集。

创建变量以在参数集之间切换

        创建名为 Ctrl 的 Simulink.Parameter 对象。

Ctrl = Simulink.Parameter(2);
Ctrl.DataType = 'uint8';

        在 low_mode 子系统的 Discrete Filter 模块对话框中,将分子参数设置为表达式 params(Ctrl).lowNumerator。

set_param(lowBlock,'Numerator','params(Ctrl).lowNumerator');

        在 rich_mode 子系统的 Discrete Filter 模块中,将分子参数的值设置为 params(Ctrl).richNumerator。

set_param(richBlock,'Numerator','params(Ctrl).richNumerator');

        表达式使用变量 Ctrl 选择 params 中的一个结构体。然后表达式解引用结构体中的一个字段。该字段值设置分子系数的值。

        要在系数集之间切换,只需将 Ctrl 的值更改为结构体数组中的对应索引。

使用总线对象作为结构体数组的数据类型

(可选)创建一个 Simulink.Bus 对象,用作结构体数组的数据类型。可以:

  • 控制结构体的形状。

  • 对于每个字段,控制数据类型和物理单位等特性。

  • 在生成的代码中控制 struct 类型的名称。

使用函数 Simulink.Bus.createObject 创建对象,并将对象重命名为 paramsType。

Simulink.Bus.createObject(params.Value)
paramsType = slBus1;
clear slBus1

        可以使用数据字典中的 Simulink.NumericType 对象来控制结构体字段的数据类型。在总线对象中,使用数据类型对象的名称来设置每个元素的 DataType 属性。

paramsType.Elements(1).DataType = 's16En15';
paramsType.Elements(2).DataType = 's16En7';

        使用总线对象作为结构体数组的数据类型。

params.DataType = 'Bus: paramsType';

使用枚举类型切换变量

        (可选)使用枚举类型作为切换变量的数据类型。您可以将每个参数集与一个有意义的名称相关联,并限制切换变量的允许值。

        创建一个名为 FilterCoeffs 的枚举类型。为 params 中的每个结构体创建一个枚举成员。将每个枚举成员的基础整数值设置为 params 中的对应索引。

Simulink.defineIntEnumType('FilterCoeffs',{'Weak','Aggressive'},[1 2])

        使用枚举类型作为切换变量的数据类型。将变量的值设置为 Aggressive,它对应于索引 2。

Ctrl.Value = FilterCoeffs.Aggressive;

向数据字典添加新对象

        将创建的对象添加到数据字典 sldemo_fuelsys_dd_controller.sldd。

dictObj = Simulink.data.dictionary.open('sldemo_fuelsys_dd_controller.sldd');
sectObj = getSection(dictObj,'Design Data');
addEntry(sectObj,'Ctrl',Ctrl)
addEntry(sectObj,'params',params)
addEntry(sectObj,'paramsType',paramsType)

        也可以在数据字典中存储枚举类型。但在这种情况下,您无法导入枚举类型,因为您无法保存对 sldemo_fuelsys_dd_controller.sldd 的更改。

仿真期间在参数集之间切换

        打开示例模型 sldemo_fuelsys_dd,它引用控制器模型 sldemo_fuelsys_dd_controller。

open_system('sldemo_fuelsys_dd')

        将仿真停止时间设置为 Inf,以便您可以在仿真期间与模型交互。

        开始仿真运行并打开 Scope 模块对话框。示波器显示,在引擎正常运行期间,燃油流量(fuel 信号)大幅波动。

        在模型资源管理器中,查看数据字典 sldemo_fuelsys_dd_controller.sldd 的内容。将 Ctrl 的值设置为 FilterCoeffs.Weak。

        更新 sldemo_fuelsys_dd 模型图。示波器显示,喷油量振荡的振幅由于滤波器系数减弱而降低。

        停止仿真。

生成和检查代码

        如果有 Simulink Coder 软件,您可以生成代码,使您能够在代码执行期间在参数集之间切换。

        在模型资源管理器中,查看数据字典 sldemo_fuelsys_dd_controller.sldd 的内容。在目录窗格中,将列视图设置为 Storage Class。

        使用 StorageClass 列将存储类 ExportedGlobal 应用于 params,以便结构体数组在生成的代码中显示为可调全局变量。将相同的存储类应用于 Ctrl,以便您可以在代码执行期间更改切换变量的值。

        或者,要配置对象,请使用以下命令:

tempEntryObj = getEntry(sectObj,'params');
params = getValue(tempEntryObj);
params.StorageClass = 'ExportedGlobal';
setValue(tempEntryObj,params);

tempEntryObj = getEntry(sectObj,'Ctrl');
Ctrl = getValue(tempEntryObj);
Ctrl.StorageClass = 'ExportedGlobal';
setValue(tempEntryObj,Ctrl);

        从控制器模型生成代码。

slbuild('sldemo_fuelsys_dd_controller')




### Starting build procedure for: sldemo_fuelsys_dd_controller
### Successful completion of code generation for: sldemo_fuelsys_dd_controller

Build Summary

Top model targets built:

Model                         Action           Rebuild Reason                                    
=================================================================================================
sldemo_fuelsys_dd_controller  Code generated.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 33.598s

        在代码生成报告中,查看头文件 sldemo_fuelsys_dd_controller_types.h。代码定义枚举数据类型 FilterCoeffs。

file = fullfile('sldemo_fuelsys_dd_controller_ert_rtw',...
    'sldemo_fuelsys_dd_controller_types.h');
rtwdemodbtype(file,'#ifndef DEFINED_TYPEDEF_FOR_FilterCoeffs_',...
    '/* Forward declaration for rtModel */',1,0)
#ifndef DEFINED_TYPEDEF_FOR_FilterCoeffs_
#define DEFINED_TYPEDEF_FOR_FilterCoeffs_

typedef enum {
  Weak = 1,                            /* Default value */
  Aggressive
} FilterCoeffs;

#endif

        代码还定义结构体类型 paramsType,它对应于 Simulink.Bus 对象。这些字段使用模型中的单精度浮点数据类型。

rtwdemodbtype(file,'#ifndef DEFINED_TYPEDEF_FOR_paramsType_',...
    '#ifndef DEFINED_TYPEDEF_FOR_FilterCoeffs_',1,0)
#ifndef DEFINED_TYPEDEF_FOR_paramsType_
#define DEFINED_TYPEDEF_FOR_paramsType_

typedef struct {
  real32_T lowNumerator[2];
  real32_T richNumerator[2];
} paramsType;

#endif

        查看源文件 sldemo_fuelsys_dd_controller.c。代码使用枚举类型来定义切换变量 Ctrl。

file = fullfile('sldemo_fuelsys_dd_controller_ert_rtw',...
    'sldemo_fuelsys_dd_controller.c');
rtwdemodbtype(file,'FilterCoeffs Ctrl = Aggressive;',...
    '/* Block signals (default storage) */',1,0)
FilterCoeffs Ctrl = Aggressive;        /* Variable: Ctrl
                                        * Referenced by:
                                        *   '<S12>/Discrete Filter'
                                        *   '<S13>/Discrete Filter'
                                        */

        代码还定义结构体数组 params。

rtwdemodbtype(file,'/* Exported block parameters */',...
    '/* Variable: params',1,1)
/* Exported block parameters */
paramsType params[2] = { {
    { 8.7696F, -8.5104F },

    { 0.0F, 0.2592F }
  }, { { 17.5392F, -17.0208F },

    { 0.0F, 0.5184F }
  } } ;                                /* Variable: params

        模型的 step 函数中的代码算法使用切换变量对结构体数组进行索引。

        要在存储在结构体数组中的参数集之间切换,请在代码执行期间更改 Ctrl 的值。

        关闭与数据字典的连接。此示例丢弃未保存的更改。要保存更改,请使用 '-save' 选项。

Simulink.data.dictionary.closeAll('sldemo_fuelsys_dd_controller.sldd','-discard')

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

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

相关文章

局部变量,全局变量与内存

本文会使用IDA分析局部变量&#xff0c;全局变量在内存的存储 目录 使用IDA分析局部变量 使用IDA分析全局变量 总结 使用IDA分析局部变量 #include <stdio.h>int main() {int nNum 1;float fNum 2.5;char ch A;printf("int %d, float %f, char %c", nNu…

华为云云耀云服务器L实例使用教学

随着云计算时代的进一步深入&#xff0c;越来越多的中小企业企业与开发者需要一款简单易用、高能高效的云计算基础设施产品来支撑自身业务运营和创新开发。 基于这种需求&#xff0c;华为云焕新推出华为云云服务器实例新品。 华为云云服务器具有智能不卡顿、价优随心用、上手更…

Python+Django前后端分离

程序示例精选 PythonDjango前后端分离 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjango前后端分离》编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与应…

《语义增强可编程知识图谱SPG》白皮书

语义増强可编程图谱框架&#xff1a;新一代知识图谱语义框架/引擎、SPGLLM双驱架构及应用相关进展和应用。《语义增强可编程知识图谱SPG》白皮书 v1.0.pdf: https://url39.ctfile.com/f/2501739-941002398-f8f1f0?p2096 (访问密码: 2096) 参考文献&#xff1a; [1]《语义增强可…

JavaScript学习笔记04

JavaScript笔记04 方法 定义方法 当一个函数是一个对象的属性时&#xff0c;称之为方法。例&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script>let p…

“Vim 退出”使百万程序员无所适从

“程序员一旦进入 Vim &#xff0c;就再难以脱身。”这听起来像是一个恐怖故事&#xff0c;但是却真实的发生在程序员的身上&#xff0c; Stack Overflow 上关于如何退出 Vim 的问题&#xff0c;其点击量已有上百万次了。 问题原文为&#xff1a; Im stuck and cannot escape.…

springboot整合返回数据统一封装

1、MagCode&#xff0c;错误码枚举类 package com.mgx.common.enums;import lombok.*; import lombok.extern.slf4j.Slf4j;/*** 错误码* author mgx*/ Slf4j NoArgsConstructor AllArgsConstructor public enum MsgCode {/*** 枚举标识&#xff0c;根据业务类型进行添加*/Code…

ClickHouse进阶(十八):clickhouse管理与运维-用户配置

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术,IT贫道_大数据OLAP体系技术栈,Apache Doris,Kerberos安全认证-CSDN博客 &#x1f4cc;订阅…

ABB机器人如何修改num数据类型的参数?

ABB机器人如何修改num数据类型的参数? 在实际的生产项目中,机器人中可能会声明一些num数据类型的变量,作为相关的生产参数,例如:生产计数、等待时间、吹气时间、电磁阀动作时间等, 那么,如何在必要时对这些参数进行修改呢? 具体的方法和步骤可参考以下内容: 如下图所示…

《金字塔原理》阅读笔记

我们都希望在思考、沟通交流和解决问题时&#xff0c;重点突出&#xff0c;思路清晰&#xff0c;层次分明。我们评价人时&#xff0c;有一个标准是逻辑思维能力&#xff0c;而逻辑思维能力的标准又是什么&#xff1f;我们指导别人“要逻辑清晰、条理分明”&#xff0c;可怎样才…

JavaWeb 学习笔记 3:Servlet

JavaWeb 学习笔记 3&#xff1a;Servlet 1.简介 Servlet 是 JavaEE 定义的一套 Web 应用开发标准&#xff08;接口&#xff09;&#xff0c;实现了该技术的 Web 服务器软件&#xff08;如 Tomcat&#xff09;上可以运行一个 Servlet 容器&#xff0c;只要我们使用 Servlet 技…

【Kubernetes二进制安装】

Kubernetes二进制安装 cluster-health&#xff1a;检查etcd集群的运行状况也就是说 kubelet 首次访问 API Server 时&#xff0c;是使用 token 做认证&#xff0c;通过后&#xff0c;Controller Manager 会为 kubelet 生成一个证书&#xff0c;以后的访问都是用证书做认证了。在…

RS485以及MODBUS学习

学习目的&#xff1a; 1、什么是485&#xff1f; 2、485如何通信&#xff1f; 3、如何使用熟能生巧&#xff1f; RS485是一种四总线通信&#xff0c;分别是VCC、GND、485_A、485_B。两根负责通信&#xff0c;两根负责进行供电。 RS485通信 硬件层&#xff1a;解决的是数据传输问…

【ELFK】之消息队列kafka

一、kafka的定义 Kafka 是一个分布式的基于发布/订阅模式的消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xff0c;主要应用于大数据实时处理领域。Kafka 是最初由 Linkedin 公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff0…

Arduino程序设计(十)8×8 LED点阵显示(MAX7219)

88 LED点阵显示 前言一、MAX7219点阵模块二、点阵显示实验1、点阵显示部分图形2、点阵显示数字 0 ~ 9 及 26 个英文字母 总结 前言 本文主要介绍88 LED点阵显示实验&#xff0c;分别是&#xff1a;1、介绍MAX7219点阵模块&#xff1b;2、点阵显示部分图形&#xff1b;3、点阵显…

探索以太坊 Layer 2 解决方案的后起之秀——Starknet

作者: stellafootprint.network 数据来源: Starknet Dashboard “区块链三难题”&#xff0c;或“可扩展性三难题”&#xff0c;强调了区块链平台想要去平衡安全性、去中心化和可扩展性将面临的挑战。通常情况下&#xff0c;区块链架构只能有效地优先考虑其中两个难题。例如&…

蓝牙核心规范(V5.4)10.2-BLE 入门笔记之CIS篇

LE CIS 同步通信 同步通信提供了一种使用蓝牙LE在设备之间传输有时间限制的数据的方式。它提供了一个机制,允许多个接收器设备在不同的时间从相同的源接收数据,以同步它们对该数据的处理。LE AUDIO使用同步通信。 当使用同步通信时,数据具有有限的时间有效期,在到期时被认…

Nacos服务注册中心

1.引入依赖 <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency> 2. application.properties中配置 #-------------- Nacos配置 spring.cloud.nacos.…

项目开发过程中,客户提出了新的需求,怎么办?

由于用户已经签署用户需求报告&#xff0c;面对他们提出的新需求&#xff0c;要初步评估判断是否涉及相关需求的变更&#xff0c;作为项目经理&#xff0c;我会采取以下步骤&#xff1a; 1. 与客户进行沟通&#xff1a;首先&#xff0c;我会与客户进行进一步的沟通和讨论&…

【视觉SLAM入门】9.1 建图1---SLAM任务,稠密地图构建,立体视觉,RGBD,八叉树,点云地图等各种不同地图

"讷为君子&#xff0c;寡为吉人 ” 1. 立体稠密地图1.1 地图构建1.2 分析立体相机稠密建图效果 2. RGB-D稠密地图2.1 地图对比2.1.1 八叉树地图 3. 建图&#xff1f;定位&#xff1f;孰轻孰重3.1 鬼影问题3.2 三维重建 4. 总结 SLAM的功能&#xff1a; 直到现在我们可以知…