首页 文章

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

提问于
浏览
9

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

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

4 回答

  • 10

    这并不明显,但是您可以输入/输出 sim() 命令中的数据,并且在调用函数之前完成它并在工作中有一个示例但是在周一之前无法到达验证 . 但是,请尝试列出的解决方案on Mathworks's site

    解决方案:在Simulink中使用可变掩码参数时,基本工作空间是Simulink的默认源工作空间 . 但是,通过使用SIMSET命令,可以更改此工作空间 . 然后,SIM将与SIMSET创建的此选项结构一起使用 . 以下是如何执行此操作的示例 . options = simset('SrcWorkspace','current');
    SIM( 'MODELNAME',[],选项)


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

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

    您有2个选项:对于R2009b之前的版本,请查看SIMSET文档 . 它允许您将“SrcWorkspace”属性设置为“current”以使用函数中的数据 . http://www.mathworks.com/support/solutions/en/data/1-1BWDA/?solution=1-1BWDA在较新的版本中,不推荐使用此选项,因为它不符合Parallel Computing Toolbox和PARFOR . 我建议的是:http://www.mathworks.com/support/solutions/en/data/1-ASPEIV/?solution = 1-ASPEIV

  • 0

    您可以使用evalin()函数从您自己的函数中执行特定工作空间中的MATLAB表达式(作为字符串),在您的情况下,SIMULINK的“基础”可以找到它们 . 但是,如果您不想直接使用工作区,则可以使用“从/到文件”块从/向MAT文件加载和保存信号或变量 .

  • 0

    简答:不 .

    I could be wrong ,但是让我给你一些背景知识 . 我的Simulink模型非常庞大,我们已经开发了多年 . 到目前为止,我们仍然通过工作区加载所有必要的变量 . 这已经成为我的抱怨很长一段时间了,MathWorks甚至通过提供Simulink.save_vars功能解决了这个问题 . 听起来你已经用脚本/函数设置了变量,所以Simulink.save_vars对你没用多少 .

    您可以通过使用某些变量的结构来清理工作区,大多数Simulink块不支持结构,但有些可以 . 此外,除了模型所需的变量之外,避免在工作空间中放置任何内容 .

  • 2

    好吧,我不知道如何从一个简单的函数中做到这一点,但从类函数(方法)中做到这一点真的很方便 . 它适用于版本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') . 您可以通过在构造函数中传递名称来解决它,或者您可以使用静态变量和方法,但这种方式不允许您动态更改输入信号 .

相关问题