Как получить данные из блока Simulink в графический интерфейс MATLAB? - PullRequest
2 голосов
/ 07 августа 2009

У меня есть модель Simulink, которая использует встроенную функцию MATLAB для блока, и я не смог выяснить, как перемещать данные между встроенным блоком MATLAB и графическим интерфейсом пользователя в режиме реального времени (то есть, пока модель Бег). Я пытался реализовать блок "в рабочее пространство" в моей модели, но я не знаю, как правильно его использовать.

Кто-нибудь знает, как перемещать данные из блока Simulink в графический интерфейс в режиме реального времени?

Ответы [ 2 ]

1 голос
/ 07 августа 2009

Решение не в реальном времени:

Если вы хотите установить параметры в графическом интерфейсе, смоделировать модель с этими параметрами, а затем отобразить результаты моделирования в графическом интерфейсе, есть хороший учебник на 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
0 голосов
/ 08 августа 2009

Судя по вашим ответам, вы хотите увидеть результаты во время симуляции, это правильно? Учебное пособие blinkdagger.com позволяет просматривать результаты моделирования после его завершения, но не во время его выполнения. Вы в основном хотите встроить что-то вроде блока области видимости в свой графический интерфейс?

Есть несколько способов сделать это, лучше всего, вероятно, использовать объект времени выполнения блока EML . Если вы используете это, вы сможете увидеть вывод блока EML во время его работы.

...