Как обеспечить ввод модели Simulink, не помещая ее в рабочую область

У меня есть модель Simulink, которая в настоящее время выполняется из скрипта (т. е. не функция). Сценарий записывает значения переменных в рабочую область MATLAB, запускает моделирование модели (которое использует эти значения), а затем модель записывает дополнительные значения в рабочую область. Если я попытаюсь преобразовать скрипт в функцию (т. е. путем размещения function [output] = runSim() в верхней части файла), то Simulink жалуется, что он не знает о переменных, предположительно, потому что они не находятся в рабочей области MATLAB, но скорее они находятся в области видимости функции.

есть ли элегантный способ предоставить модель Simulink с входами и взять выходы из модели Simulink, кроме как вставлять их в рабочую область?

4 ответов


это не очевидно, но вы можете вводить / выводить данные из sim() команда и рабочее пространство вызывающей функции. Я делал это раньше и есть пример на работе, но не могу попасть туда до понедельника, чтобы проверить. Однако попробуйте решение, указанное на сайте Mathworks:

устранение:

при использовании переменных параметров маски в Simulink, базовое рабочее пространство исходное рабочее пространство Simulink по умолчанию. Однако с помощью команды SIMSET, это рабочее пространство можно изменить. SIM затем используется с этой структурой параметров создано SIMSET. Далее пример того, как это сделать.

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

...хотя, по-видимому, это устарело в R2009b из-за несовместимости с Parallel Computing Toolbox >:( похоже, правильное решение-явно толкать переменные в рабочую область модели моделирования (отличную от базовой рабочей области), используя assignin().

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

у вас есть 2 варианта:

  1. для выпусков до R2009b посмотрите документацию SIMSET. Это позволяет вам установить "SrcWorkspace" собственность to "current", чтобы использовать данные из вашего функция.

http://www.mathworks.com/support/solutions/en/data/1-1BWDA/?solution=1-1BWDA

  1. в более новых выпусках эта опция устарела, потому что она не совместима с помощью Parallel Computing Toolbox и ПАРФОР. Что я рекомендую:

http://www.mathworks.com/support/solutions/en/data/1-ASPEIV/?solution=1-ASPEIV


вы можете использовать функцию evalin () для выполнения из вашей собственной функции выражения MATLAB (в виде строки) в определенной рабочей области, в вашем случае "база" для SIMULINK, чтобы найти их. Однако, если вы не хотите использовать рабочую область напрямую, вы можете загрузить и сохранить сигналы или переменные из / в файлы MAT, используя блоки из / в файл.


короткий ответ: Нет.

Я могу ошибаться, но позвольте мне дать вам немного фона. Я работаю над моделью Simulink, которая очень большая, мы работаем над ней в течение многих лет. По сей день мы по-прежнему загружаем все необходимые переменные через рабочую область. Это была моя жалоба в течение длительного времени, так много, что MathWorks даже решил эту проблему, предоставив Simulink.функция save_vars. Похоже, вы уже настраиваете переменные с помощью скрипт / функция, поэтому Simulink.save_vars не будет много пользы для вас.

вы можете очистить рабочую область, используя структуры для некоторых переменных, большинство блоков Simulink не поддерживают структуры, но некоторые из них. Кроме того, не помещайте в рабочую область ничего, кроме переменных, которые нужны вашей модели.


Ну, я не знаю, как это сделать из простой функции, но это очень удобно делать изнутри функции класса (метода). Он отлично работает с версией 2009b.

поместите код в файл test.м:

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-критерий.у.'] И Simulink, и метод sim () имеют доступ к этим переменным (I поверьте, это самое главное).

OK он по-прежнему имеет большой недостаток, который отмечен номером 1. Вы должны явно знать, как будет называться ссылка на экземпляр класса в рабочей области (в этом случае "тест"). Вы можете обойти его, передав имя в конструкторе, или вы можете использовать статические переменные и методы, но этот способ не позволит вам динамически изменять входной сигнал.