2013-06-09 53 views
7

Я хочу получить данные от simulink во время моделирования и использовать функцию последовательной сети для отправки этих данных в другую программу. Потому что мне нужно использовать другую программу для выполнения некоторых трюков и отправить команду обратно в simulink, поэтому мне нужно получить данные из simulink во время выполнения, чтобы другая программа могла сделать правильную команду.Как экспортировать данные simulink в рабочее пространство во время моделирования?

Я попытался использовать блок рабочей области для экспорта данных.

enter image description here

Однако, я могу только получил значение в самом начале моделирования.

И еще я попытался использовать область действия и изменить некоторые свойства: установите флажок Сохранить данные в рабочее пространство и снимите данные Limite с Last.

enter image description here

enter image description here

Во-первых, я начал моделирования, и я обнаружил, что ScopeData не появляются в рабочей области. Только когда я прекращу симуляцию, ScopeData появится в рабочей области.

enter image description here

И после этого, я могу использовать ScopeData.signals.values ​​для получения значений.

Но я хочу: когда я начну моделирование, ScopeData появится в рабочей области, чтобы я мог отправлять эти данные в другую программу.

Кто-нибудь знает, как этого достичь?

Возможно, мне было найдено this page, но я до сих пор не знаю, как постоянно экспортировать данные во время моделирования.

+0

Вы отправляете данные в программу Matlab или другую программу, например Excel или что-то в этом роде? Если да, то какая другая программа? –

+0

Я отправляю данные в Proteus, потому что я хочу написать некоторые команды на микрочипе для управления блоками в simulink. –

+0

Я знаю, что вы можете получить данные по линиям simulink с помощью ['get_param'] (http://www.mathworks.com/help/simulink/slref/get_param.html) cammand, когда для simulink установлено значение ** external mode ** во время моделирования (не уверен в других режимах). Вы можете настроить таймер (с той же частотой вашего simulink) и сделать это в своем «обратном вызове». – pm89

ответ

10

Используйте get_param, чтобы читать данные только в текущее время. Также отправить данные обратно в Simulink с помощью set_param коэффициента усиления или другого блока.

Пример из get_param

Первая нагрузка и начала Имитационной:

load_system('myModel') 
set_param('myModel','SimulationCommand','Start'); 

Для считывания данных на любую линию вашей модели Simulink:

  1. Получить блок-схему simulink а (давайте попробуем часы с именем Clock):

    block = 'myModel/Clock'; 
    rto = get_param(block, 'RuntimeObject'); 
    
  2. Затем получить данные о его первой (или любой другой) выходной порт (или вход) этого блока.

    time = rto.OutputPort(1).Data; 
    

Вы могли бы сделать чтение, в функции обратного вызова таймера.

Кроме того, это может быть полезно: Command Line Functionality for Simulink

+3

Хотя это даст вам некоторые данные, таймер работает в MATLAB и имеет не имеет никакого отношения к времени моделирования Simulink, поэтому нет гарантии получения данных в моменты моделирования, которые могут вам понадобиться. –

+0

Я согласен с вами @PhilGoddard, но я нашел, что это единственный способ. Однако есть некоторые обходные пути и грязные трюки, чтобы предотвратить отсутствие данных, например увеличение частоты таймера (чтобы уменьшить вероятность потери данных) и настроить счетчик в simulink (чтобы не допустить получение одинаковых данных дважды и сканирование, если какие-либо данные потеряно или нет). – pm89

+0

Обходные пути не мешают вам отсутствовать данные. Они могут помочь в недостатке данных, но они не могут гарантировать, что вы не пропустите никаких данных. –

3

Во время моделирования Simulink хранит зарегистрированные данные во внутреннем буфере и записывает данные только в Рабочую область, когда симуляция приостановлена ​​или остановлена. Звучит так, как будто вам действительно нужно написать S-функцию (которая будет получать значения сигнала по времени по времени) и взаимодействовать с Proteus таким образом.

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

+0

Я хочу управлять роботом в simulink (simmechanics, на самом деле), используя микрочип в Porteus в качестве контроллера. Так это не достижимо? Я не понимаю, что Simulink - это не-реальный симулятор ~ –

+2

Ни одна из ОС, с которыми MATLAB/Simulink работает в режиме реального времени. Помимо всего прочего, это означает, что 1 единица времени моделирования (почти наверняка) не равна 1 единице реального времени. Часы в Simulink могут сказать, что он работает в течение 10 секунд, но часы на вашей стене могут сказать что-то меньше 10 или более 10 секунд (в зависимости от сложности вашей модели). Если вам не нужны только медленные частоты дискретизации и не заботятся о гарантированной производительности, то для управления в реальном времени вам необходимо преобразовать модель в C (используя Simulink Coder), а затем скомпилировать и запустить этот код в ОС реального времени. –

+0

Вы всегда можете проверить свою логику с помощью симуляционных потоков живых данных на контроллер, просто учтите, что это не в режиме реального времени. Основная логика может быть протестирована, но критические задачи таймингов будут невозможны (например, время реакции в микросекундах события, которое происходит через прерывание или что-то подобное) – Karim

2

В любое время в процессе моделирования вы можете заставить Simulink писать выходные моделирования данных в рабочей области:

set_param(bdroot,'SimulationCommand','WriteDataLogs'); 

Я обнаружил, что эта команда довольно нестабилен в моей Matlab 2010a для Win64. В частности, я должен избегать этого, когда симуляция остановлена ​​(т. Е. Сначала проверит get_param(bdroot,'SimulationStatus')), в противном случае Matlab покажет ошибку и попросит перезапустить.

+0

Это то, что я искал! Также работает во время моделирования в реальном времени. –

Смежные вопросы