simulink模块里的参数随时间变化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了simulink模块里的参数随时间变化相关的知识,希望对你有一定的参考价值。

例如三相电源three-phase source中,想让功率随时间变化,前10秒100MW,后10秒200MW这样子

Simulink对信号和参数的区分就是,信号是随着时间变化的,参数不随着时间变化。如果是自己搭建的模型,某一个参数要随着时间变化比如Gain模块的增益,那么方法就是把这个参数变成信号也就是把Gain模块变成product模块,让增益变成模块的一个输入。
背景废话说了一堆,那么,你的这个模块是库里自带的,要在某一个时刻修改参数值,显然不能修改模块内部框图。
办法之一就是使用脚本来进行时间分段仿真。
可以查一下sim命令的用法。
第一段仿真结果状态作为第二段仿真的初始状态,这个可以查看configuration菜单的data export页面。
参考技术A 在基于模型开发的过程当中,除了模型本身之外,模型的参数也是开发成果的一个重要部分,笔者总结了几种基于纯Matlab/Simulink环境下的参数管理方法,与大家分享一下(TargetLink的数据管理方法不在本文讨论范围之内)。

以某电机FOC控制的仿真模型为例:

点击进入看图评论

整个模型由测试用例、FOC控制算法和PlantModel三部分组成,而具体到模型的参数,又有以下几种:

仿真环境参数:比如各子模块的不同仿真周期;

测试用例:测试用例中电机转速值和电机力矩指令值;

PlantModel参数:被测电机的参数(电阻电感等),供电电压,环境温度等等;

ECU硬件参数:ECU数据采集及功率输出的相关电路参数;

ECU控制参数:FOC控制算法的参数,如PI值等等;

为了统一集中的对这些参数进行管理,可用到如下的方法:

M文件:

将所有文件定义在一个m文件中,再开始仿真前自动运行或手动运行该m文件。

点击进入看图评论

Mat文件

将工作空间中的相关参数保存为一个Mat文件,在开始仿真前自动或手动Load该mat文件。

点击进入看图评论

Simulink callback function

点击进入看图评论

如上图,将相关参数的定义写在仿真开始之前的四个CallBack函数中,区别是写在后面两个的话,由于每次仿真callback函数都会重新执行一遍,因此在Matlab工作空间对参数的修改就会无效。因此,可以将不同的参数特性(是否允许在工作空间被更改?)放在不同的callback函数内。

Simulink Data Dictionary

SimulinkDataDictionary是在Matlab 2014a以后才引入的功能。链接方法(第一次可通过该操作从工作空间创建一个DD):

点击进入看图评论

点击进入看图评论

点击进入看图评论

使用DD的好处是:

模型与DD的链接建立好以后,可自动运行,可以在ModelExplorer中对DD进行编辑,设定最大最小值,显示哪些值被修改过,查找该参数被那些simlink模块所使用,比较两个不同的DD的差异等等。

关于版本管理:

点击进入看图评论

假设模型和参数的版本号经历了如上图的变迁,使用方法(1)(2)(4),因为模型文件和参数文件是两个独立的文件,只要在标定配置文件中标明该版本所对应的模型版本号,就能按图索骥。而采用方法(三),以模型V0.2为例,其最新的状态对应的是参数V0.2,而如果要追溯到该版本模型对应参数版本V0.1的状态,则需要费一些周章。

Simulink 代码生成:来自 Function Caller 模块的函数存根及其返回值/参数

【中文标题】Simulink 代码生成:来自 Function Caller 模块的函数存根及其返回值/参数【英文标题】:Simulink code generation: function stubs from Function Caller blocks and their return values/arguments 【发布时间】:2021-10-14 03:42:00 【问题描述】:

在我的 Simulink 模型中,我有几个 Function Caller 模块,如下所示: Simple Function Caller block

函数原型就是y = someFunction()。输出参数使用自定义枚举类型,并以someEnum(1) 形式给出。

输出信号被定义为一维的。

当从模型生成代码时,这些函数调用者总是产生一个预期形式的函数存根

extern someEnum someFunction(void);.

然而,在最近发生了很多变化之后,我刚刚注意到代码生成现在突然产生了形式为

的函数存根

extern void someFunction(someEnum *rty_y);

对于一些(不是全部!)Function Caller 块。

我已经比较了有关函数调用程序块的每个参数以及我能找到的相关输出信号,但我找不到受影响的那些与当前版本中按预期工作的那些或以前版本中的相同块之间的任何区别.所有函数和信号都已重命名,但对于那些不受影响的 Function Caller 块也是如此。

代码生成选项也相同。

我试图从帮助文件中了解什么可能导致编码器使用指针参数而不是函数存根的直接返回值,但找不到任何东西。

任何可能导致代码生成器使用指针的提示将不胜感激。

【问题讨论】:

【参考方案1】:

发现问题。一些受影响的块在其“配置 C/C++ 函数接口”对话框中将其 C/C++ 返回参数设置为“void”。

一些受影响的块(不幸的是,我之前检查过的两个块)仍然在这里设置为“y”,我不得不将设置更改为“void”并返回到“y”,然后它才产生想要的结果。

【讨论】:

以上是关于simulink模块里的参数随时间变化的主要内容,如果未能解决你的问题,请参考以下文章

simulink模块参数不能设置

simulink逆变器模块参数怎么调

Simulink 代码生成:来自 Function Caller 模块的函数存根及其返回值/参数

如何在 simulink 中为模块创建自己的参数或属性?

怎么在simulink里面实现参数回调?

怎样使delphi里的控件随窗体的大小变化而变化