2015-03-10 12 views
0

Я ученик, который учится использовать MATLAB. Для задания мне нужно создать простой конечный автомат и собрать некоторые результаты. Я привык использовать Verilog/Modelsim, и я хотел бы собирать данные только тогда, когда изменяется выход конечного автомата, что не обязательно каждый раз/период выборки.Как я могу сохранить вывод из Simulink?

Сейчас у меня есть модель, которая выглядит следующим образом:

RequestChart ----> ResponseChart ----> Unit Delay Block --> (Back to RequestChart) 
       |     | 
       ------------------------> Mux --> "To Workspace" Sink Block 

Я попытался установить раковину блок для сохранения в формате «Array», но он сохраняет только 51 значений. Я попытался установить его в «Timeseries», но он сохраняет тонны нулевых значений.

Может ли кто-нибудь дать мне несколько предложений? Как я уже сказал, MATLAB для меня новичок, пожалуйста, дайте мне знать, если мне нужно уточнить мой вопрос или предоставить дополнительную информацию.

Edit: Вот снимок экрана моей модели: enter image description here

+0

Блок 'to workspace' должен делать трюк. Не могли бы вы добавить скриншот (часть) вашей модели, где переменные (ы) были сохранены, поэтому мы можем убедиться, что сам блок прав? –

+0

@WouterKuijsters - это изображение полезно? – John

ответ

1

В окне Simulink, убедитесь, что относительная толерантность мала, так что вы можете создать гораздо больше точек между началом и время окончания. Нажмите на опцию Simulation в верхней части окна, затем нажмите «Параметры конфигурации модели».

enter image description here

Оттуда, изменить относительную терпимость к чему-то небольшой ... как 1e-10. После этого попробуйте снова запустить симуляцию. У вас должно быть намного больше очков в вашем массиве вывода, который вы теперь можете сохранить.

enter image description here

+0

Я изменил относительный допуск на «1е-10» и сохранил формат сохранения блока раковины как «Массив». Я повторно запускал симуляцию (с «500» и «5000» для времени остановки моделирования) и получил только 51 значение. В рабочей области отображается переменная «simout» со значением «51x8 double» и min «0» и max «1». – John

+0

@John - Weird ... можем ли мы получить копию вашей модели Simulink, чтобы мы могли попробовать? – rayryeng

+1

Поскольку у вас есть дискретная модель времени, изменение относительного допуска не будет иметь никакого эффекта. Вы получаете 51 выходную точку, потому что по умолчанию максимальный размер шага (который в этом случае будет приниматься моделью) равен (Stop Time - Start Time)/50, т.е.В этом случае Simulink жестко закодирован, чтобы выполнить 50 шагов (давая вам 51 временной момент, включая t = 0). Чтобы получить больше очков (в этой конкретной модели), либо выберите решатель фиксированного шага, либо укажите подходящую частоту дискретизации, либо выберите любой решатель (хотя для скорости вы хотите фиксированный шаг дискретный) и установите соответствующую частоту дискретизации в задержке блока блок. –

2

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

  • Запустите вывод конечного автомата в блок обнаружения обнаружения (из Logic and Bit Operations)
  • Запустите этот сигнал в порт триггера под управлением.
  • Запустите вывод конечного автомата в порт данных триггерной подсистемы.
  • внутри запущенной подсистемы, запустите сигнал данных в блок рабочей области.

Данные сохраняются только в момент времени, в течение которого происходит сбой, то есть когда ваши данные изменяются.

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