我有一个Simulink模型,目前正在从脚本(即不是函数)运行。该脚本将变量值写入MATLAB工作空间,运行模型模拟(使用这些值),然后模型将其他值写入工作空间。如果我尝试将脚本转换为函数(即将function [output] = runSim()
放在文件的顶部),那么Simulink会抱怨它不知道变量,可能是因为它们不在MATLAB工作区中,但是相反,它们属于功能范围。
是否有一种优雅的方式来提供带有输入的Simulink模型并从Simulink模型中获取输出而不是将它们粘贴到工作区中?
答案 0 :(得分:10)
这并不明显,但您可以从sim()
命令和调用函数的工作区输入/输出数据。我之前做过&在工作中有一个例子但是在星期一之前无法到达那里进行验证。但是,请尝试列出on Mathworks's site列出的解决方案:
解决方案:
使用变量掩码参数时 Simulink,基础工作区是 Simulink的默认源工作区。 但是,通过使用SIMSET命令, 此工作区可以更改。 SIM是 然后与此选项结构一起使用 由SIMSET创建。以下是 关于如何做到这一点的例子。
options = simset('SrcWorkspace','current'); sim('modelname',[],options)
...虽然由于与Parallel Computing Toolbox的不兼容而显然在R2009b中被弃用了:(看起来正确的解决方案是将变量明确地推送到模拟的模型工作空间(不同于基础工作空间),使用{ {3}}
您有两个选择:
- 对于R2009b之前的版本,请查看SIMSET文档。它允许 您要设置“SrcWorkspace”属性 “当前”使用你的数据 功能
醇>http://www.mathworks.com/matlabcentral/newsreader/view_thread/292544
- 在较新的版本中,不推荐使用此选项,因为它不符合要求 使用Parallel Computing Toolbox 和PARFOR。我建议的是:
醇>http://www.mathworks.com/support/solutions/en/data/1-1BWDA/?solution=1-1BWDA
答案 1 :(得分:2)
您可以使用evalin()函数从您自己的函数中执行特定工作空间中的MATLAB表达式(作为字符串),在您的情况下,SIMULINK的“基础”可以找到它们。但是,如果您不想直接使用工作区,则可以使用“从/到文件”块从/向MAT文件加载和保存信号或变量。
答案 2 :(得分:0)
简短回答:不。
我错了,但是让我给你一些背景知识。我的Simulink模型非常庞大,我们已经开发了多年。到目前为止,我们仍然通过工作区加载所有必要的变量。这已经成为我的抱怨很长一段时间了,MathWorks甚至通过提供Simulink.save_vars功能解决了这个问题。听起来你已经在使用脚本/函数设置变量了,所以Simulink.save_vars对你没什么用处。
您可以使用某些变量的结构来清理工作区,大多数Simulink块不支持结构,但有些则支持结构。另外,除了模型所需的变量之外,避免在工作区中放置任何内容。
答案 3 :(得分:0)
我不知道如何从一个简单的函数中做到这一点,但是从类函数(方法)中进行它真的很方便。它适用于版本2009b。
将代码放在文件Test.m中:
classdef Test < handle
properties
mdl
% Default input signal
t = [0 1 1 2]'
u = [0 0 1 1]'
end
methods
function this = Test(mdl) % Constructor
this.mdl = mdl;
end
function sim(this)
% Load model
load_system(this.mdl);
% Prepare model configuration
conf = getActiveConfigSet(this.mdl);
cs = conf.copy();
set_param(cs, 'StopTime', '4');
set_param(cs, 'LoadExternalInput', 'on');
set_param(cs, 'ExternalInput', '[test.t test.u]'); % <-- 1
% Run simulation
simout = sim(this.mdl, cs);
% Plot results
tout = simout.find('tout');
yout = simout.find('yout');
plot(tout, yout(:,1), 'b--');
end
end
end
然后只是:
>> test = Test('TestSim');
>> test.sim();
会发生什么?您创建了对象测试,它定义了字段t和u。然后在方法sim()中你说Simulink寻找输入'[test.t test.u]'。 Simulink和方法sim()都可以访问这些变量(我相信这是最重要的)。
好吧它仍然有一个标有数字1的大缺点。您必须明确知道如何在工作空间中命名类实例的引用(在本例中为'test')。您可以通过在构造函数中传递名称来解决它,或者您可以使用静态变量和方法,但这种方式不允许您动态更改输入信号。