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

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

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

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

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

simout 1

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

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

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

simout 2

Переменная simout формирует DataFrame – структуру данных, представленную в виде таблицы. Ячейки этой таблицы автоматически заполняются данными результатов симуляции. Для удобства сохраните таблицу в формате CSV (в этом примере назвали 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.