Решение не в реальном времени:
Если вы хотите установить параметры в графическом интерфейсе, смоделировать модель с этими параметрами, а затем отобразить результаты моделирования в графическом интерфейсе, есть хороший учебник на blinkdagger.com . Одно решение, которое они описывают, использует функцию SIMSET , чтобы определить, с каким рабочим пространством взаимодействует модель Simulink. Вы должны иметь возможность заменить базовое рабочее пространство , чтобы вместо этого данные отправлялись в рабочее пространство и из рабочего пространства функций графического интерфейса, которые вызывают модель Simulink.
Решение в реальном времени
Как предлагает MikeT , вы можете использовать RuntimeObject . Сначала вы должны использовать функцию get_param , чтобы получить RuntimeObject из блока:
rto = get_param(obj,'RuntimeObject');
Где obj
является либо путевым именем блока, либо дескриптором объекта блока. Вы можете получить путь к последнему выбранному блоку, используя функцию GCB (в этом случае вы можете заменить obj
на gcb
). Затем вы можете получить выходные данные блока следующим образом:
blockData = rto.OutputPort(1).Data
Еще одна оговорка из документации:
Чтобы убедиться, что поле данных содержит
правильный выход блока, выключите
опция повторного использования хранилища сигналов (см.
Повторное использование хранилища сигналов) на
Оптимизация панель в диалоговом окне Параметры конфигурации .
Скорее всего, в вашем графическом интерфейсе будет выполняться цикл или подпрограмма таймера, которая будет непрерывно получать выходные данные из RuntimeObject в течение всего времени, пока выполняется симуляция. В документации также говорится:
Объект времени выполнения существует только тогда, когда
модель, содержащая блок
работает или остановился. Если модель
остановлено, get_param
возвращает пустое
справиться. Когда вы останавливаетесь или приостанавливаете
модель, все существующие ручки для
объекты во время выполнения становятся пустыми.
Таким образом, ваша процедура цикла или таймера должна будет сначала проверять, существует ли RuntimeObject, и либо останавливаться (если он не существует), либо получать данные из него (если он делает). Я не уверен в точно как проверить наличие RuntimeObject, но я полагаю, что вы либо проверите, если объект пуст, либо свойство объекта BlockHandle пусто:
isempty(rto) % Check if the RuntimeObject is empty
%OR
isempty(rto.BlockHandle) % Check if the BlockHandle property is empty