Пакет поддержки ЭЙЛЕР
Пакет поддержки ЭЙЛЕР обеспечивает работу Engee с решателем ЭЙЛЕР с помощью DLL-библиотеки обмена, которая работает в контексте решателя ЭЙЛЕР и обменивается сигналами с Engee.
Пакет поддержки работает в контексте подсистемы Engee.Интеграции.
Порты приема и передачи сигналов задаются пользователем в параметрах блока EULER Cosimulation на стороне Engee и зеркально записываются в файл settings.cfg для чтения в DLL из ЭЙЛЕР.
Значения по умолчанию не зафиксированы — для каждой пары Engee ↔ ЭЙЛЕР выбирается свободная пара UDP-портов, уникальная в пределах локальной машины.
Требования
-
Установлена и запущена подсистема Engee.Интеграции.
-
Установлено ПО ЭЙЛЕР.
-
Локально доступны UDP-порты, указанные в настройках блока EULER Cosimulation (не заняты другими приложениями, разрешены правилами ОС/Firewall).
Подготовка settings.cfg
Перед тем как создавать объект косимуляции в ЭЙЛЕР, необходимо подготовить settings.cfg для загружаемой DLL в ЭЙЛЕР.
-
В Engee добавьте на холст блок EULER Cosimulation и задайте в его параметрах пару UDP-портов приема и передачи — они будут использоваться для обмена сигналами между Engee и ЭЙЛЕР. Укажите имена, количество и единицы измерения входных и выходных сигналов — см. раздел Описание settings.cfg ниже.
-
В параметре Путь к Эйлер: блока EULER Cosimulation укажите абсолютный путь к папке, в которой нужно сгенерировать файл
settings.cfg. Затем нажмите кнопку Сгенерировать конфигурационный файл. Engee сгенерирует файлsettings.cfgв эту папку на основе параметров блока.Также получите библиотеку
Engee_Euler.dllс помощью следующей команды:engee.package.getdemos("Engee-Device-Manager")После выполнения команды библиотека будет доступна в Engee по пути
/user/Engee-Device-Manager-demos/integrations/Euler. Скачайте файлEngee_Euler.dllиз указанной папки на свой компьютер и сохраните его в любой удобной директории локальной файловой системы.
Создание объекта косимуляции в ЭЙЛЕР
Объект косимуляции можно создать двумя способами:
-
через специальное меню на верхней панели ЭЙЛЕР;
-
вручную в текстовом редакторе ЭЙЛЕР.
Панель для создания объекта косимуляции
Объект косимуляции в .elr-файле (конструкция cosimulation engee_cosim = engee(…)) создается через специальное меню в верхней панели ЭЙЛЕР.
Шаг 1. Запустите ЭЙЛЕР и создайте или откройте существующий проект .elr.
Шаг 2. В верхнем меню ЭЙЛЕР выберите «Косимуляция» → Engee → «Создать…»:

Шаг 3. Откроется окно «Настройки косимуляции Engee» с тремя пустыми полями сверху:

Заполните их:
-
Имя косимуляции — произвольное имя объекта (например,
engee_connector). Имя станет идентификатором в.elr-файле. -
Путь к DLL Engee — путь к
Engee_Euler.dll. Можно указать относительный путь, если DLL лежит рядом с.elr. -
Путь к config-файлу Engee — путь к
settings.cfg. Можно указать относительный путь, еслиsettings.cfgлежит рядом с.elr.
После чего таблицы входных/выходных датчиков автоматически заполнятся данными из файла settings.cfg.
Шаг 4. Нажмите «Да». Объект engee автоматически создастся в текущем .elr-файле и станет доступен в текстовом редакторе.
Шаг 5. Чтобы посмотреть или отредактировать уже созданный объект, выберите «Косимуляция» → Engee → «Список косимуляций…»:

В окне появится строка с именем объекта (например, engee_cosim). Двойной щелчок по строке открывает окно «Настройки косимуляции Engee»:

Что означает заполненное окно
Окно «Настройки косимуляции Engee» (с заполненными таблицами) — это визуальный интерфейс связывания датчиков (sensor) ЭЙЛЕР с сигналами Engee:
-
«Входные параметры» (колонки «Имя датчика», «Единицы измерения») — это датчики в ЭЙЛЕР, в которые ЭЙЛЕР будет получать данные из Engee. Их имена и единицы соответствуют полям
OUTPUT_SIGNAL_NAMES/OUTPUT_MEASURE_UNITSвsettings.cfg(с точки зрения Engee это выходные сигналы). -
«Выходные параметры» (колонки «Имя датчика», «Единицы измерения») — это датчики ЭЙЛЕР, которые передают данные в Engee. Их имена и единицы соответствуют
INPUT_SIGNAL_NAMES/INPUT_MEASURE_UNITSвsettings.cfg(с точки зрения Engee это входные сигналы).
|
«Входы» и «выходы» в окне указаны с точки зрения ЭЙЛЕР, а не Engee. Не путайте направление при проверке: то, что ЭЙЛЕР называет «входом» (принимает от Engee), Engee считает своим «выходом». Пример соответствия для скриншота выше:
|
Что создается в .elr-файле
После нажатия «Да» в текстовом редакторе ЭЙЛЕР (то есть в самом файле .elr) автоматически появляется строка вида:
cosimulation engee_cosim = engee("Engee_Euler.dll", "settings.cfg",
list((Sensor_F_frict, "[kgf]"), (V_G, "[m/s]"), (Pos_G, "[m]"), (V_M, "[m/s]")),
list(("pos_cmd", "[m]")));
Первый список содержит выходы ЭЙЛЕР (то, что Engee получает от ЭЙЛЕР), второй список — входы ЭЙЛЕР (то, что Engee передает в ЭЙЛЕР). В обоих списках каждая пара — (имя_датчика, "единица_измерения"). Имена датчиков должны существовать в проекте ЭЙЛЕР.
Если открыть уже созданный объект двойным кликом и снова нажать «Да», он будет обновлен в .elr. Если нужно удалить объект, в окне «Список косимуляций» есть кнопка «Удалить».
Ручное создание объекта косимуляции
Альтернативно можно вручную добавить в текстовом редакторе ЭЙЛЕР строку с созданием объекта engee. Например:
cosimulation engee_cosim = engee("Engee_Euler.dll", "settings.cfg",
list((Sensor_F_frict, "[kgf]"), (V_G, "[m/s]"), (Pos_G, "[m]"), (V_M, "[m/s]")), list(("pos_cmd", "[m]")));
Синтаксис ручного создания объекта engee в текстовом редакторе ЭЙЛЕР:
engee(DLLPath, SettingsPath, U, Y)
Параметры метода
string SimDLLName
Путь к DLL-модулю, содержащему DLL-библиотеку Engee_Euler.dll.
-
string U— строка описания имен входных датчиков и единиц измерения значений, передаваемых в модель Engee.Входные объекты в строке отделяются друг от друга запятыми, единицы измерения каждого объекта указываются после его имени в квадратных скобках. Объекты типа скаляр или датчик, соответствующие заданным именам, ищутся в текущем проекте ЭЙЛЕР. В случае если заданное имя объекта не найдено или тип найденного объекта не соответствует скаляру или датчику, то диагностируется ошибка. Имена входных объектов никак не связаны с их названиями в DLL, сопоставление выполняется по порядку их упоминания в строке.
Пример строки, описывающей входные датчики:
"sensor_U1 [kg], sensor_U2 [], sensor_U3 [m/s]" -
string Y— строка описания имен выходных датчиков и единиц измерения их значений, в которых они передаются из модели Engee в программный комплекс ЭЙЛЕР.Датчики в строке отделяются друг от друга запятыми, единицы измерения каждого объекта указываются после его имени в квадратных скобках. Имена выходных объектов никак не связаны с их названиями в DLL, сопоставление выполняется по порядку их упоминания в строке. Имена датчиков в рамках формируемого выходного массива должны быть уникальными. Выходные параметры с заданными именами создаются автоматически в виде дочерних объектов, значение которых меняется в соответствии с моделью Engee.
Пример строки, описывающей выходные датчики:
"sensor_Y1 [], sensor_Y2 [N], sensor_Y3 [m]"
Запуск первым — Engee или ЭЙЛЕР
В текущей версии косимуляция может быть запущена первой как со стороны Engee, так и со стороны ЭЙЛЕР — конкретный порядок не важен. Обе стороны ожидают handshake-сообщения в течение настраиваемого таймаута.
Таймаут рукопожатия задается параметром Максимальное время ожидания соединения, мс в блоке EULER Cosimulation (по умолчанию 2 минуты).
Типичные сценарии:
-
Запуск ЭЙЛЕР первым, Engee вторым: перейти в режим «Исследование проекта». ЭЙЛЕР начнет ожидать handshake от Engee, после чего следует запуск модели в Engee. Engee отправляет handshake в ЭЙЛЕР, после чего рукопожатие завершается — обе стороны переходят к обмену данными.

-
Запуск Engee первым, ЭЙЛЕР вторым: сначала запустить модель Engee. Она будет ожидать handshake от ЭЙЛЕР, далее нужно перевести ЭЙЛЕР в режим исследования проекта, после чего он сразу принимает и подтверждает handshake Engee.
Если в течение таймаута handshake не получен, косимуляция завершается ошибкой и в диагностических сообщениях появляется сообщение об ошибке.
Проверьте в этом случае совпадение IP и UDP-портов в settings.cfg и в параметрах блока EULER Cosimulation, а также доступность портов на уровне ОС.
Синхронизация модельных времен Engee и ЭЙЛЕР
В косимуляции Engee и ЭЙЛЕР работают как две независимые модели (черный ящик), каждая со своим модельным временем. Их времена не обязаны совпадать в любой момент обмена — это нормальная ситуация. Связь между ними обеспечивает Engee_Euler.dll. Внутренняя расчетная функция DLL-библиотеки вызывается на каждом шаге Engee и согласует данные, вычисленные ЭЙЛЕР, с текущим модельным временем Engee по правилам ниже.
Сценарий 1 — модельные времена равны
Это штатный режим. Engee получает значение сигнала, вычисленное ЭЙЛЕР точно для текущего момента времени. Так будет в большинстве случаев, если шаг ЭЙЛЕР и шаг Engee совпадают. Подстройка модельных времен не применяется.
Сценарий 2 — ЭЙЛЕР «не досчитывает» (модельное время ЭЙЛЕР отстает от Engee)
ЭЙЛЕР еще не дошел до того момента, на который Engee запросил данные. Например, шаг ЭЙЛЕР в 10 раз больше шага Engee, и на момент запроса данных с шага от Engee ЭЙЛЕР сделал только каждый десятый свой шаг. Расчетная функция DLL-библиотеки не «ждет» ЭЙЛЕР — это синхронный вызов. В таком случае Engee получает значение сигнала, вычисленное ЭЙЛЕР на его последний доступный момент времени (то есть на предыдущий шаг ЭЙЛЕР), а не на текущий момент Engee.
Такое поведение эквивалентно экстраполяции кусочно-ступенчатой функцией: до тех пор, пока ЭЙЛЕР не догонит, Engee получает последнее вычисленное значение на дискретной сетке (ближайшее к его текущему моменту слева).
Сценарий 3 — ЭЙЛЕР «пересчитывает» (модельное время ЭЙЛЕР опережает Engee)
ЭЙЛЕР уже забежал вперед, а Engee еще на старом шаге. Например, шаг ЭЙЛЕР в 10 раз меньше шага Engee, и к моменту запроса Engee ЭЙЛЕР успел сделать 10 своих внутренних шагов. В этом случае расчетная функция DLL-библиотеки выбирает из буфера ЭЙЛЕР значение, наиболее близкое к моменту времени Engee, но не превышающее его. То есть ЭЙЛЕР «подскакивает назад» к моменту Engee (используется последний вычисленный им шаг, который ≤ t_Engee).
Практические следствия
Примеры:
-
Шаги ЭЙЛЕР и Engee совпадают (например,
st_euler = 0.001иst_engee = 0.001). Модельные времена всегда равны, синхронизация тривиальна, экстраполяции не возникает. -
Шаг ЭЙЛЕР больше шага Engee (например,
st_euler = 0.01приst_engee = 0.001). ЭЙЛЕР будет отставать на 1–10 шагов Engee. Engee получит кусочно-постоянное значение сигнала ЭЙЛЕР на каждом из 10 своих шагов. -
Шаг ЭЙЛЕР меньше шага Engee (например,
st_euler = 0.0001приst_engee = 0.001). ЭЙЛЕР пересчитывает, Engee получает значения с дискретной сетки ЭЙЛЕР (каждый 10-й шаг ЭЙЛЕР), а остальные 9 шагов ЭЙЛЕР используются для уточнения. Шаги ЭЙЛЕР Engee видит с прореживанием до дискретной точности. -
Рекомендация. Подбирайте шаги так, чтобы их отношение было целым (1:1, 1:10, 10:1). Тогда не будет «плавающего» временного запаздывания, и поведение модели будет более предсказуемым.
Косимуляция с несколькими блоками EULER Cosimulation на базе блока Model
В одной Engee-модели можно разместить несколько блоков EULER Cosimulation (мультикосимуляция) — каждый из них связывается со своим экземпляром amEuler.exe и со своим .elr-проектом. Допускается и вложенная архитектура: основная модель (parent.engee) через блок Модель вызывает вспомогательную модель (sub.engee), а та, в свою очередь, содержит собственный EULER Cosimulation, который соединяется с отдельным экземпляром ЭЙЛЕР.
Каждый блок EULER Cosimulation обязан иметь уникальную пару UDP-портов, описанную в собственном settings.cfg. Это относится и к вложенной косимуляции через блок Модель: для родительской и дочерней модели порты выбираются разные.
Пример настройки двух пар (родительская и дочерняя модели):
-
родительская модель:
elr1/settings.cfg— мост для родительской модели Engee:MODEL_NAME multicosim_parent2 INPUT_SIGNAL_COUNT 1 OUTPUT_SIGNAL_COUNT 1 INPUT_SIGNAL_NAMES dummy_out INPUT_MEASURE_UNITS [m/s] OUTPUT_SIGNAL_NAMES dummy_in OUTPUT_MEASURE_UNITS [N] IP 127.0.0.1 RCV_PORT 7479 SND_PORT 7959 MAX_RCV_BUFFER_SIZE 4096 MAX_SND_BUFFER_SIZE 4096 SRVCIO_TIMEOUT 20000.0 HANDSHAKE_TIMEOUT 120000.0 SAMPLE_TIME 0.001 DIAGNOSTIC 1 -
дочерняя модель:
elr2/settings.cfg— мост для дочерней модели Engee (вложен через блок Модель):MODEL_NAME multicosim_sub2 INPUT_SIGNAL_COUNT 1 OUTPUT_SIGNAL_COUNT 1 INPUT_SIGNAL_NAMES dummy_out INPUT_MEASURE_UNITS [m/s] OUTPUT_SIGNAL_NAMES dummy_in OUTPUT_MEASURE_UNITS [N] IP 127.0.0.1 RCV_PORT 7489 SND_PORT 7919 MAX_RCV_BUFFER_SIZE 4096 MAX_SND_BUFFER_SIZE 4096 SRVCIO_TIMEOUT 20000.0 HANDSHAKE_TIMEOUT 120000.0 SAMPLE_TIME 0.001 DIAGNOSTIC 1
Обратите внимание на разные пары портов (7479/7959 против 7489/7919): это и есть изоляция между двумя мостами.
Порядок выполнения блоков в косимуляции с двумя блоками EULER Cosimulation
В мультикосимуляционном проекте через блок Модель важно понимать, в каком экземпляре ЭЙЛЕР нужно запускать модель первой. Engee выполняет блоки в определенном порядке: может оказаться так, что сначала выполняются блоки внутри Модель (то есть в дочерней модели sub.engee), и только затем блоки родительской модели parent.engee. Это значит, что handshake с ЭЙЛЕР для дочерней модели должен установиться раньше, чем handshake с ЭЙЛЕР для родительской.
Чтобы увидеть этот порядок в настройках модели Engee, включите опцию «Порядок выполнения блоков» в настройках: меню «Настройки» → вкладка «Отладка» → установите флажок «Порядок выполнения блоков».

После включения опции в правом верхнем углу каждого блока появится его порядковый номер в текущем цикле модели.
Родительская модель multicosim_parent.engee — видно блок Модель (на multicosim_sub.engee) и блок EULER Cosimulation. В этом примере блоки в родительской модели получают номера 7, 8, 9, 10, 11 — то есть выполняются после дочерней:

Дочерняя модель multicosim_sub.engee (открывается двойным кликом по блоку «Модель» в родительской модели). Здесь блоки получают номера 1, 2, 3, 4 — то есть выполняются раньше всех блоков родительской модели:

Из этого порядка (1–4 для дочерней модели, 7–11 для родительской модели) следует практическое правило: запускайте ЭЙЛЕР в порядке, соответствующем порядку выполнения блоков в Engee — сначала откройте и запустите расчет в экземпляре ЭЙЛЕР, обслуживающем sub.engee (тот, что слушает на паре портов 7489/7919 из elr2/settings.cfg), и только после того как handshake с дочерней моделью завершится, запустите расчет в экземпляре ЭЙЛЕР для parent.engee (порты 7479/7959 из elr1/settings.cfg). Если запустить их в обратном порядке, родительский ЭЙЛЕР простоит в ожидании handshake до истечения времени ожидания (по умолчанию 2 минуты) и вернет ошибку.
Описание параметров модели в settings.cfg
Файл settings.cfg описывает модель и состав сигналов для обмена между Engee и ЭЙЛЕР: имена, количество, физические единицы, сетевые параметры, таймауты и режим отладки.
В таблице ниже перечислены все параметры, распознаваемые DLL-библиотекой Engee_Euler.dll. Значения по умолчанию применяются, если соответствующая строка в файле отсутствует.
| Ключ | Тип | Описание |
|---|---|---|
|
строка |
Имя модели Engee. Должно совпадать с именем открытой модели, передаваемой в |
|
целое |
Количество сигналов, которые Engee получает от ЭЙЛЕР (т.е. сколько значений ЭЙЛЕР отдает в Engee за один шаг). |
|
целое |
Количество сигналов, которые Engee отправляет в ЭЙЛЕР (т.е. сколько значений ЭЙЛЕР принимает от Engee за один шаг). |
|
список имен |
Имена входов Engee — это имена сигналов, которые ЭЙЛЕР отдает в Engee. В |
|
список имен |
Имена выходов Engee — это имена сигналов, которые ЭЙЛЕР принимает от Engee. В |
|
массив единиц |
Физические единицы входов Engee. Каждый элемент записывается в квадратных скобках через пробел, например: |
|
массив единиц |
Физические единицы выходов Engee, формат аналогичен |
|
IPv4 |
Адрес, по которому Engee и ЭЙЛЕР обмениваются UDP-пакетами. По умолчанию |
|
целое |
UDP-порт, на котором DLL-библиотека |
|
целое |
UDP-порт, на который DLL-библиотека |
|
байты |
Размер UDP-буфера приема. По умолчанию |
|
байты |
Размер UDP-буфера передачи. По умолчанию |
|
мс |
Таймаут блокирующих операций ввода-вывода на сокете. По умолчанию |
|
мс |
Таймаут ожидания handshake-сообщения при инициализации косимуляции. По умолчанию |
|
секунды |
Шаг интегрирования, с которым DLL-библиотека обменивается сигналами. Обязательно должен быть кратен |
|
|
Включение логирования. |
Пример settings.cfg
Полный пример с минимальной косимуляцией (один входной и один выходной сигнал). Имена сигналов и порты — произвольные и генерируются пользователем из блока под конкретную задачу.
MODEL_NAME multicosim_parent2
INPUT_SIGNAL_COUNT 1
OUTPUT_SIGNAL_COUNT 1
INPUT_SIGNAL_NAMES dummy_out
INPUT_MEASURE_UNITS [m/s]
OUTPUT_SIGNAL_NAMES dummy_in
OUTPUT_MEASURE_UNITS [N]
IP 127.0.0.1
RCV_PORT 7479
SND_PORT 7959
MAX_RCV_BUFFER_SIZE 4096
MAX_SND_BUFFER_SIZE 4096
SRVCIO_TIMEOUT 20000.0
HANDSHAKE_TIMEOUT 120000.0
SAMPLE_TIME 0.001
DIAGNOSTIC 1
Соответствующая строка минимального примера для задания в .elr-проекте ЭЙЛЕР, объявляющая объект-коннектор с DLL-библиотекой, выглядит так:
cosimulation engee_cosim = engee("Engee_Euler.dll", "settings.cfg",
list((fx_sensor, "")), // список датчиков → INPUT_SIGNAL_NAMES
list(("FX", ""))); // список Engee-сигналов → OUTPUT_SIGNAL_NAMES
Логирование
Параметр DIAGNOSTIC управляет записью логов в файл engee_logs.txt. Файл создается рядом с проектом .elr.
-
DIAGNOSTIC 1 — логирование включено.
-
DIAGNOSTIC 0 — логирование отключено.
Пример фрагмента engee_logs.txt:
[2026-03-04 22:12:55] Euler model time: 0.053750
[2026-03-04 22:12:55] Engee model time: 0.054000
[2026-03-04 22:12:55] Received from Engee, signal dX: 0.400000
[2026-03-04 22:12:55] Received from Engee, signal dY: 0.300000
[2026-03-04 22:12:55] Received from Engee, signal dZ: 0.500000
[2026-03-04 22:12:55] Send from Euler, signal Fx: 0.305510
[2026-03-04 22:12:55] Send from Euler, signal Fy: 0.104000
[2026-03-04 22:12:55] Send from Euler, signal Fz: 0.524999
Также логи попадают в окно клиентской программы Engee.Интеграции. При запуске модели в Engee в этом окне появляются сообщения, оповещающие о ходе установления связи с ЭЙЛЕР:
INFO: Waiting for connection with EULER.
INFO: If the model inside EULER is not running, please start it.
INFO: Successfully interconnected with EULER!
Первые две строки говорят о том, что Engee уже отправил handshake и ожидает подтверждения от ЭЙЛЕР; в этот момент пользователю нужно запустить расчет в ЭЙЛЕР. Строка INFO: Successfully interconnected with EULER! появляется после успешного завершения рукопожатия.