Документация Engee

Программная обработка результатов симуляции в Engee

В этой статье мы расскажем, как сохранять результаты симуляций с помощью переменной simout. Рассмотрим работу с переменной на основе простого примера — вывода синусоиды при помощи блока Sine Wave.

По умолчанию переменная simout не создается после завершения симуляции модели. Для ее появления поставьте галочку Сохранять результаты симуляции в рабочую область в окне настроек debug article icon 1:

simout open 1

Переменная simout в Engee: интеграция и взаимодействие

Создайте модель, используя блоки Sine Wave и Terminator. Для этого разместите их на рабочей области, соедините сигнальной линией и включите запись сигнала с помощью контекстного меню сигнальной линии. (см. здесь).

simout 1

В этом примере все параметры (решатель и параметры блока Sin Wave) — остаются по умолчанию. График симуляции синусоидального сигнала отобразится в окне графиков.

Включите запись сигналов signal logging 1 при соединении блоков на тех выводах, для которых требуется получить информацию.

Если схема собрана правильно, то результат симуляции будет отображен на графике. После окончания симуляции переменная simout будет автоматически создана в рабочей области Engee.

simout 2

Переменная simout формирует DataFrame – структуру данных, представленную в виде таблицы. Ячейки этой таблицы автоматически заполняются данными результатов симуляции. Для удобства сохраните таблицу в формате CSV (в примере названа result.csv).

К переменной simout можно обратиться двумя способами:

  • Напрямую к DataFrame переменной simout через вызов столбцов time (время) и value (значение).

  • Используя команду collect для сохранения результатов симуляции в новую переменную и обращение к ней.

Рассмотрим оба варианта. Для обращения к переменной напрямую, используем следующий код и поочередно вызовем значения и время из таблицы DataFrame:

simout["newmodel_1/Sine Wave.1"].value[:] # выведет все значения таблицы из DataFrame
Вывод
1001-element Vector{Any}:
0.0
0.009999833334166664
0.01999866669333308
0.02999550020249566
0.03998933418663416
0.04997916927067833
0.059964006479444595
0.06994284733753277
0.0799146939691727
0.08987854919801104
0.09983341664682815
0.10977830083717481
0.11971220728891936
⋮
-0.44862125384280294
-0.4575358937753214
-0.4664047804997409
-0.4752270271347798
-0.48400175146312646
-0.49272807601966023
-0.5014051281791974
-0.5100320402437544
-0.5186079495293108
-0.527131998452086
-0.5356033346142913
-0.5440211108893698

После обращения к значениям simout напрямую, аналогично обратитесь к значениям времени:

simout["newmodel_1/Sine Wave.1"].time[:] # выведет все значения времени из таблицы DataFrame
Вывод
1001-element Vector{Any}:
  0.0
  0.01
  0.02
  0.03
  0.04
  0.05
  0.06
  0.07
  0.08
  0.09
  0.1
  0.11
  0.12
  ⋮
  9.89
  9.9
  9.91
  9.92
  9.93
  9.94
  9.95
  9.96
  9.97
  9.98
  9.99
 10.0

Прямое обращение к simout полезно, когда значение переменной нужно просто получить или использовать в выражениях без дополнительной обработки или изменения.

Теперь рассмотрим обращение через collect и создание новой переменной. Команда collect сохраняет результаты симуляции в оперативную память Engee. collect собирает данные с переменной simout и сохраняет их в новую переменную. Для выполнения команды создайте переменную (в этом примере result) и сохраните результаты симуляции, введя следующий код в командную строку:

result = collect(simout["newmodel_1/Sine Wave.1"])

где:

  • result – имя переменной, в которую сохраняются данные о симуляции (может быть переименована).

  • newmodel_1 – имя текущей модели.

  • Sin Wave – имя блока, который выдает данные.

  • 1 – номер порта, с выхода которого считываются значения для переменной simout и к которому добавлена запись сигнала.

Полученный результат можно наблюдать в виде таблицы в командной строке.

simout 4

Далее запишите данные о проведенной симуляции в файл формата CSV. Данные внутри переменной result сохраните в CSV-файл result.csv с помощью следующих команд:

using CSV
CSV.write("result.csv", result)

где:

  • using CSV – строка, указывающая, что код будет использовать функциональность из библиотеки CSV. В Julia ключевое слово using используется для импорта функций и типов из пакетов.

  • CSV.write("result.csv", result) – выполняет запись данных в файл формата CSV. Функция CSV.write принимает два аргумента: файл в формате CSV "result.csv" и переменную result. В итоге код берет переменную result и записывает ее содержимое в файл "result.csv" в формате CSV.

Полученные результаты сохранены в файле "result.csv", который отображается в файловом браузере.

simout 5

В полученном CSV-файле представлены численные результаты работы блока Sin Wave с заданными параметрами (в этом примере по умолчанию). Результаты представлены в виде столбцов time и value, где к каждому моменту времени соответствует значение симуляции блока Sin Wave.

CSV-файл с результатами симуляции также можно получить с помощью блока To CSV.

Можно убедиться в корректности сохранения данных в переменной simout визуально, отобразив график в командной строке или редакторе скриптов:

using Plots
plot(result.time, result.value)

Полученный график будет совпадать с тем, что был получен ранее в окне графиков:

simout graph result

Таким образом, статья демонстрирует как легко сохранять результаты симуляций помощью переменной simout и нескольких строчек кода. Такой подход прост в применении и обеспечивает сохранность данных симуляции в удобном и универсальном формате CSV.