Как экспортировать данные simulink в рабочую область во время моделирования?

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

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

enter image description here

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

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

enter image description here

enter image description here

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

enter image description here

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

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

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

нашел на этой странице может быть полезно, но я все еще не знаю, как непрерывно экспортировать данные во время моделирования.

3 ответов


использовать get_param для чтения данных только в настоящее время. Также отправить данные обратно в Simulink с set_param усиления или другого блока.

пример of get_param

первый загрузить и старт моделирование:

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

для чтения данных в любой строке вашей модели simulink:

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

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

    time = rto.OutputPort(1).Data;
    

вы можете сделать чтение, в обратном вызове таймера.

также это может быть полезно: функциональность командной строки для Simulink


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

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


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

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

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