Как предоставить вход для модели Simulink, не помещая ее в рабочую область - PullRequest
9 голосов
/ 12 марта 2011

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

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

Ответы [ 4 ]

10 голосов
/ 12 марта 2011

Это не очевидно, но вы можете вводить / выводить данные из команды 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" на «текущий», чтобы использовать данные из вашего функция.

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

  1. В более новых выпусках эта опция устарела, потому что она не соответствует с инструментарием параллельных вычислений и PARFOR. Я рекомендую:

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

2 голосов
/ 12 марта 2011

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

0 голосов
/ 04 февраля 2013

Ну, я не знаю, как сделать это из простой функции, но это действительно удобно делать изнутри функции класса (метода).Он отлично работает с версией 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').Вы можете обойти это, передав имя в конструкторе, или вы можете использовать статические переменные и методы, но этот способ не позволит вам динамически изменять входной сигнал.

0 голосов
/ 12 марта 2011

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

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

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

...