如何在不将其放入工作空间的情况下为Simulink模型提供输入

时间:2011-03-11 22:48:36

标签: matlab simulink

我有一个Simulink模型,目前正在从脚本(即不是函数)运行。该脚本将变量值写入MATLAB工作空间,运行模型模拟(使用这些值),然后模型将其他值写入工作空间。如果我尝试将脚本转换为函数(即将function [output] = runSim()放在文件的顶部),那么Simulink会抱怨它不知道变量,可能是因为它们不在MATLAB工作区中,但是相反,它们属于功能范围。

是否有一种优雅的方式来提供带有输入的Simulink模型并从Simulink模型中获取输出而不是将它们粘贴到工作区中?

4 个答案:

答案 0 :(得分:10)

这并不明显,但您可以从sim()命令和调用函数的工作区输入/输出数据。我之前做过&在工作中有一个例子但是在星期一之前无法到达那里进行验证。但是,请尝试列出on Mathworks's site列出的解决方案:

  

解决方案:

     

使用变量掩码参数时   Simulink,基础工作区是   Simulink的默认源工作区。   但是,通过使用SIMSET命令,   此工作区可以更改。 SIM是   然后与此选项结构一起使用   由SIMSET创建。以下是   关于如何做到这一点的例子。

  options = simset('SrcWorkspace','current');
  sim('modelname',[],options)

...虽然由于与Parallel Computing Toolbox的不兼容而显然在R2009b中被弃用了:(看起来正确的解决方案是将变量明确地推送到模拟的模型工作空间(不同于基础工作空间),使用{ {3}}

assignin()

  

您有两个选择:

     
      
  1. 对于R2009b之前的版本,请查看SIMSET文档。它允许   您要设置“SrcWorkspace”属性   “当前”使用你的数据   功能
  2.         

    http://www.mathworks.com/matlabcentral/newsreader/view_thread/292544

         
        
    1. 在较新的版本中,不推荐使用此选项,因为它不符合要求   使用Parallel Computing Toolbox   和PARFOR。我建议的是:
    2.         

      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')。您可以通过在构造函数中传递名称来解决它,或者您可以使用静态变量和方法,但这种方式不允许您动态更改输入信号。