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

Программное управление EULER

На этой странице представлены все доступные функции программного управления EULER в Engee.

Чтобы работать с функциями программного управления EULER в Engee, установите пакет поддержки оборудования, как указано в статье. После установки выполните:

using Main.EngeeDeviceManager.EULER_API

Далее необходимо создать объект сеанса:

session = EULER_API.createSession()

Все методы принимают первым аргументом session — объект сеанса.

Коды статуса наружу не отдаются: при ошибке метод выбрасывает исключение с его описанием.

EULER_API.closeProject(session) -> Nothing

Закрывает текущий открытый проект. Освобождает ресурсы проекта, но сеанс остается активным.

При ошибке выбрасывается исключение.

Примеры

Закрытие проекта:

EULER_API.closeProject(session)
println("Проект закрыт")
EULER_API.closeSession(session) -> Nothing

Завершает сеанс работы с ЭЙЛЕР. Освобождает все ресурсы, закрывает решатель. После вызова этой функции объект session недействителен.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

Примеры

Завершение сеанса:

EULER_API.closeSession(session)
println("Сеанс завершен")
EULER_API.createSession(euler_path::String="") -> session

Создает сеанс работы с решателем ЭЙЛЕР. Инициализирует ядро решателя.

Возвращает session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession} — объект сеанса, передаваемый во все остальные методы.

Аргументы

  • euler_path::String: путь к исполняемому файлу ЭЙЛЕР. По умолчанию euler_path="" — автоопределение.

Примеры

Создание сеанса:

session = EULER_API.createSession()
EULER_API.getCurrentTime(session) -> Float64

Возвращает текущее модельное время в секундах.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

Примеры

Текущее модельное время:

t = EULER_API.getCurrentTime(session)
println("Модельное время: $t с")
EULER_API.getLastProject(session) -> String

Возвращает полный путь к .elr файлу последнего проекта ЭЙЛЕР. Полезно для восстановления состояния после перезапуска.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

EULER_API.getRigidBodyCount(session) -> Int

Возвращает количество твердых тел в текущем проекте.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

EULER_API.getRigidBodyPos(session, index=0) -> Vector{Float64}

Возвращает массив из 12 элементов: координаты центра масс (X, Y, Z) и матрица ориентации 3×3 (9 элементов, развернута по столбцам).

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

  • index::Int64: индекс твердого тела; отсчет индексов начинается с 0. По умолчанию 0.

EULER_API.getSensorUnits(session, name) -> String

Возвращает строку с единицами измерения датчика в системе СИ по его имени, например, "Н", "м", "м/с".

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

  • name::String: имя датчика.

Примеры

Чтение датчиков (доступно только в режиме исследования):

EULER_API.setCalcRegime(session)
sensor_val = EULER_API.getSensorValue(session, "X")
sensor_units = EULER_API.getSensorUnits(session, "X")
println("Датчик X = $sensor_val $sensor_units")
EULER_API.getSensorValue(session, name) -> Float64

Возвращает текущее значение датчика по имени в единицах СИ. Значение соответствует последней рассчитанной точке.

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

  • name::String: имя датчика (например, "fx_sensor", "X", "Y").

Примеры

Чтение датчиков (доступно только в режиме исследования):

EULER_API.setCalcRegime(session)
sensor_val = EULER_API.getSensorValue(session, "X")
sensor_units = EULER_API.getSensorUnits(session, "X")
println("Датчик X = $sensor_val $sensor_units")
EULER_API.getUserCommands(session) -> String

Возвращает строку с именами доступных пользовательских команд. Команды разделены символом ";". Доступно в любом режиме после открытия проекта.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

Примеры

Получение списка доступных команд:

commands = EULER_API.getUserCommands(session)
println("Доступные команды: $commands")
EULER_API.getVersion(session) -> String

Возвращает версию решателя ЭЙЛЕР в виде строки (например, "13.05.43").

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

Примеры

Версия решателя:

ver = EULER_API.getVersion(session)
println("Версия ЭЙЛЕР: $ver")
EULER_API.journalLoadPoint(session, index) -> Nothing

Загружает точку журнала по индексу в текущий контекст. После загрузки getSensorValue будет возвращать значения датчиков для этой точки, а не для последней рассчитанной.

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

  • index::Int64: индекс точки (отсчет индексов начинается с 0).

EULER_API.journalSensorValues(session, name) -> Vector{Float64}

Возвращает массив значений датчика во всех точках журнала расчета в хронологическом порядке.

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

  • name::String: имя датчика.

EULER_API.journalSize(session) -> Int

Возвращает количество точек, сохраненных в журнале расчета. Значение 0 соответствует пустому журналу.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

Примеры

Работа с журналом расчета:

n_points = EULER_API.journalSize(session)
println("Точек в журнале: $n_points")

if n_points > 0
    t_last = EULER_API.journalTime(session, n_points - 1)
    println("Время последней точки: $t_last с")
end

x_vals = EULER_API.journalSensorValues(session, "X")
println("Значений датчика X: $(length(x_vals))")
EULER_API.journalTime(session, index) -> Float64

Возвращает модельное время в секундах для точки журнала по индексу.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

  • index::Int64: индекс точки (отсчет индексов начинается с 0).

EULER_API.openProject(session, path) -> String

Открывает проект ЭЙЛЕР (файл .elr). После открытия доступны команды, датчики, параметры. Возвращает путь к загруженному проекту в виде строки; при ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

  • path::String: полный путь к файлу .elr.

Примеры

Открытие проекта:

project = raw"C:\Users\Public\Engee\sample_project.elr"
EULER_API.openProject(session, project)
println("Проект открыт: $project")
EULER_API.runAnyCommand(session, command, step=1) -> Nothing

Запускает пользовательскую команду без ограничения по времени. Расчет выполняется до естественного завершения команды. Доступно только в режиме исследования.

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

  • command::String: имя команды.

  • step::Int64: шаг вывода. По умолчанию 1.

EULER_API.runCommand(session, command, calc_time=10.0, step=1.0) -> Nothing

Запускает пользовательскую команду с ограничением по времени. Расчет остановится при достижении calc_time секунд модельного времени или при завершении команды — в зависимости от того, что наступит раньше. Доступно только в режиме исследования (setCalcRegime).

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

  • command::String: имя команды (из списка getUserCommands).

  • calc_time::Float64: максимальная длительность расчета в секундах модельного времени. По умолчанию 10.0.

  • step::Float64: шаг вывода для этой команды. По умолчанию 1.0 (каждый шаг интегратора).

EULER_API.saveProject(session) -> Nothing

Сохраняет текущий проект. Изменения записываются в исходный .elr файл.

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

EULER_API.saveResults(session, path) -> Nothing

Сохраняет результаты расчета в файл .epp (Euler Project Package).

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

  • path::String: путь для сохранения файла .epp.

EULER_API.setCalcRegime(session) -> Nothing

Переводит проект в режим исследования (расчета). В этом режиме доступен запуск команд (runCommand, runAnyCommand) и чтение датчиков. Изменение скаляров недоступно.

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

EULER_API.setEditRegime(session) -> Nothing

Переводит проект в режим редактирования. В этом режиме доступно изменение параметров (скаляров) через setScalar. Запуск расчета недоступен.

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

EULER_API.setOutputParam(session, step_out=1, time_out=0.0, before_event=false, after_event=false) -> Nothing

Настраивает параметры вывода результатов в журнал расчета.

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

  • step_out::Int64: шаг вывода. Каждая N-я расчетная точка попадает в журнал. По умолчанию 1.

  • time_out::Float64: периодичность вывода по модельному времени в секундах. По умолчанию 0.0 (отключено, используется только step_out).

  • before_event::Bool: сохранять ли точку перед событием. По умолчанию false — не сохранять.

  • after_event::Bool: сохранять ли точку после события. По умолчанию false — не сохранять.

EULER_API.setScalar(session, name, value) -> Nothing

Задает значение скалярного параметра по имени. Доступно только в режиме редактирования (setEditRegime).

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

  • name::String: имя скаляра (например, "FX", "mass").

  • value::Float64: новое значение скаляра.

Примеры

Изменение скалярного параметра (доступно только в режиме редактирования):

EULER_API.setEditRegime(session)
EULER_API.setScalar(session, "mass", 2.0)
println("Скаляр mass = 2.0")
EULER_API.startCalc(session) -> Nothing

Сбрасывает модельное время в 0.0 (стартовая позиция) и инициализирует расчет. Вызывается однократно перед первой командой runCommand или runAnyCommand.

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

Примеры

Запуск команды с ограничением по времени (доступно только в режиме исследования):

EULER_API.setCalcRegime(session)
EULER_API.startCalc(session)
EULER_API.setOutputParam(session, 10, 0.0)
EULER_API.runCommand(session, "RK4_coarse", 15.0)
println("Расчет запущен (с ограничением 15 с)")

Запуск команды без ограничения по времени (команда выполняется до своего естественного завершения.):

EULER_API.startCalc(session)
EULER_API.runAnyCommand(session, "RK4_coarse")
println("Расчет запущен (без ограничения времени)")
EULER_API.stopCalc(session) -> Nothing

Останавливает текущий расчет. Может вызываться в любой момент после запуска runCommand или runAnyCommand. Момент остановки можно получить через getCurrentTime.

При ошибке выбрасывается исключение.

Аргументы

  • session::Tuple{Main.EngeeDeviceManager.EULER_API.EulerSession}: объект сеанса.

Примеры

Остановка расчета:

EULER_API.stopCalc(session)
stop_time = EULER_API.getCurrentTime(session)
println("Расчет остановлен. Время остановки: $stop_time с")

Режимы работы

После открытия проект находится в режиме редактирования — можно открывать/закрывать проект, изменять параметры (скаляры) через setScalar. Запуск расчета в этом режиме недоступен. Чтобы запустить модель, переключитесь в режим исследования (setCalcRegime), после чего становится доступен запуск команд (runCommand, runAnyCommand) и чтение датчиков в процессе расчета (getSensorValue, journalSensorValues), но изменение скаляров будет заблокировано. Переключение между режимами выполняется через setEditRegime и setCalcRegime.

Пример: моделирование броска шара массой 1 кг и диаметром 20 см с визуализацией траектории

После установки пакета поддержки оборудования выполните:

using Main.EngeeDeviceManager
using Main.EngeeDeviceManager.EULER_API
using Main.EngeeDeviceManager.UTILS_API

Создание сеанса:

session = EULER_API.createSession()
ver = EULER_API.getVersion(session)
println("Версия ЭЙЛЕР: $ver")
Версия ЭЙЛЕР: Solver 13.05.43.beta Pro (Windows x64)

Загрузка тестового проекта:

engee.package.getdemos("Engee-Device-Manager")
"/user/Engee-Device-Manager-demos"

Сначала скопируем тестовый .elr файл из демо-папки Engee на компьютер пользователя через модуль Utils:

# Создаем объект Utils для файловых операций
utils = UTILS_API.Utils()

# Определяем пути к демонстрационному проект ЭЙЛЕР в Engee и директории, куда будет скопирован проект
euler_local_project_path = "/user/Engee-Device-Manager-demos/example_euler/sample_project.elr"
host_project_dir = raw"C:\Users\Public\Engee"

# Создаем тестовую директорию и загружаем проект на хост
UTILS_API.createFolder(utils, host_project_dir, "")
UTILS_API.uploadFile(utils, euler_local_project_path, host_project_dir)

println("Проект загружен в $host_project_dir")
Проект загружен в C:\Users\Public\Engee

Открытие проекта и запуск расчета:

# Открываем проект
project_path = joinpath(host_project_dir, "sample_project.elr")
EULER_API.openProject(session, project_path)
println("Проект открыт: $project_path")

# Получаем список доступных команд
cmds = EULER_API.getUserCommands(session)
println("Доступные команды: $cmds")

# Переключаем в режим исследования проекта
EULER_API.setCalcRegime(session)
println("Режим исследования проекта")

# Настраиваем вывод каждого 10-го шага
EULER_API.setOutputParam(session, 10, 0.0)

# Запускаем расчет на 15 секунд
EULER_API.runCommand(session, "RK4_coarse", 15.0)
println("Расчет запущен")
Проект открыт: C:\Users\Public\Engee/sample_project.elr
Доступные команды: RK4_fine;RK4_coarse;
Режим исследования проекта
Расчет запущен

Получение результатов:

# Получаем все точки из журнала расчета
x_vals = EULER_API.journalSensorValues(session, "X")
y_vals = EULER_API.journalSensorValues(session, "Y")

n_points = length(x_vals)
println("Получено $n_points точек")

# Выводим первые и последние точки
println("Первая точка: X=$(round(x_vals[1], digits=2)) м, Y=$(round(y_vals[1], digits=2)) м")
if n_points > 1
    println("Последняя точка: X=$(round(x_vals[end], digits=2)) м, Y=$(round(y_vals[end], digits=2)) м")
end
Получено 1447 точек
Первая точка: X=0.0 м, Y=0.0 м
Последняя точка: X=1019.72 м, Y=-0.0 м

Визуализация траектории:

using Plots

# Получаем время каждой точки (значения датчик "t")
t_vals = EULER_API.journalSensorValues(session, "t")

# График высоты от времени
plot(t_vals, y_vals,
    xlabel = "Время, с",
    ylabel = "Высота Y, м",
    title = "Траектория броска шара
    D = 20 см
    m = 1 кг",
    legend = false,
    linewidth = 2,
    color = :blue,
    size = (600, 400)
)

hline!([0.0], color = :orange, linewidth = 1, linestyle = :dash, label = "Земля")

euler functions 1

Завершение работы:

EULER_API.closeSession(session)
println("Сеанс завершен")
Сеанс завершен