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

Пакет поддержки ЭЙЛЕР

Пакет поддержки ЭЙЛЕР обеспечивает работу Engee с решателем ЭЙЛЕР с помощью DLL-библиотеки обмена, которая работает в контексте решателя ЭЙЛЕР и обменивается сигналами с Engee.

Пакет поддержки работает в контексте подсистемы Engee.Интеграции.

Порты приема и передачи сигналов задаются пользователем в параметрах блока EULER Cosimulation на стороне Engee и зеркально записываются в файл settings.cfg для чтения в DLL из ЭЙЛЕР. Значения по умолчанию не зафиксированы — для каждой пары EngeeЭЙЛЕР выбирается свободная пара UDP-портов, уникальная в пределах локальной машины.

Требования

  • Установлена и запущена подсистема Engee.Интеграции.

  • Установлено ПО ЭЙЛЕР.

  • Локально доступны UDP-порты, указанные в настройках блока EULER Cosimulation (не заняты другими приложениями, разрешены правилами ОС/Firewall).

Подготовка settings.cfg

Перед тем как создавать объект косимуляции в ЭЙЛЕР, необходимо подготовить settings.cfg для загружаемой DLL в ЭЙЛЕР.

  1. В Engee добавьте на холст блок EULER Cosimulation и задайте в его параметрах пару UDP-портов приема и передачи — они будут использоваться для обмена сигналами между Engee и ЭЙЛЕР. Укажите имена, количество и единицы измерения входных и выходных сигналов — см. раздел Описание settings.cfg ниже.

  2. В параметре Путь к Эйлер: блока 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«Создать…»:

engee cosim menu

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

engee cosim empty dialog

Заполните их:

  • Имя косимуляции — произвольное имя объекта (например, 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 list

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

engee cosim filled dialog

Что означает заполненное окно

Окно «Настройки косимуляции 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 считает своим «выходом». Пример соответствия для скриншота выше:

В окне ЭЙЛЕР (имя датчика → ед.) В settings.cfg В Engee

Вход 1: Sensor_F_frict [kgf]

OUTPUT_SIGNAL_NAMES

Выход Engee

Вход 2: V_G [m/s]

OUTPUT_SIGNAL_NAMES

Выход Engee

Вход 3: Pos_G [m]

OUTPUT_SIGNAL_NAMES

Выход Engee

Вход 4: V_M [m/s]

OUTPUT_SIGNAL_NAMES

Выход Engee

Выход 1: pos_cmd [m]

INPUT_SIGNAL_NAMES

Вход 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 waiting for connection

  • Запуск 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). Тогда не будет «плавающего» временного запаздывания, и поведение модели будет более предсказуемым.

Важно

В сценариях 2 и 3 Engee никогда не получает искусственное или интерполированное значение. ЭЙЛЕР хранит историю шагов, и расчетная функция библиотеки DLL возвращает ближайшее дискретное значение.

Косимуляция с несколькими блоками EULER Cosimulation на базе блока Model

В одной Engee-модели можно разместить несколько блоков EULER Cosimulation (мультикосимуляция) — каждый из них связывается со своим экземпляром amEuler.exe и со своим .elr-проектом. Допускается и вложенная архитектура: основная модель (parent.engee) через блок Model вызывает вспомогательную модель (sub.engee), а та, в свою очередь, содержит собственный EULER Cosimulation, который соединяется с отдельным экземпляром ЭЙЛЕР.

Каждый блок EULER Cosimulation обязан иметь уникальную пару UDP-портов, описанную в собственном settings.cfg. Это относится и к вложенной косимуляции через блок Model: для родительской и дочерней модели порты выбираются разные.

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

  • родительская модель:

    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):

    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

В мультикосимуляционном проекте через блок Model важно понимать, в каком экземпляре ЭЙЛЕР нужно запускать модель первой. Engee выполняет блоки в определенном порядке: может оказаться так, что сначала выполняются блоки внутри Model (то есть в дочерней модели sub.engee), и только затем блоки родительской модели parent.engee. Это значит, что handshake с ЭЙЛЕР для дочерней модели должен установиться раньше, чем handshake с ЭЙЛЕР для родительской.

Чтобы увидеть этот порядок в настройках модели Engee, включите опцию «Порядок выполнения блоков» в настройках: меню «Настройки» → вкладка «Отладка» → установите флажок «Порядок выполнения блоков».

engee settings execution order

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

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

multicosim parent model

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

multicosim sub model

Из этого порядка (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. Значения по умолчанию применяются, если соответствующая строка в файле отсутствует.

Ключ Тип Описание

MODEL_NAME

строка

Имя модели Engee. Должно совпадать с именем открытой модели, передаваемой в engee.run() на стороне Engee. Используется в handshake-сообщении.

INPUT_SIGNAL_COUNT

целое

Количество сигналов, которые Engee получает от ЭЙЛЕР (т.е. сколько значений ЭЙЛЕР отдает в Engee за один шаг).

OUTPUT_SIGNAL_COUNT

целое

Количество сигналов, которые Engee отправляет в ЭЙЛЕР (т.е. сколько значений ЭЙЛЕР принимает от Engee за один шаг).

INPUT_SIGNAL_NAMES

список имен

Имена входов Engee — это имена сигналов, которые ЭЙЛЕР отдает в Engee. В .elr-проекте это сигналы-датчики sensor, объявленные в аргументе list((sensor, ""), …​) конструкции cosimulation.

OUTPUT_SIGNAL_NAMES

список имен

Имена выходов Engee — это имена сигналов, которые ЭЙЛЕР принимает от Engee. В .elr-проекте это сигналы, объявленные вторым аргументом конструкции cosimulation (например, ("FX", "")).

INPUT_MEASURE_UNITS

массив единиц

Физические единицы входов Engee. Каждый элемент записывается в квадратных скобках через пробел, например: [m/s] [N].

OUTPUT_MEASURE_UNITS

массив единиц

Физические единицы выходов Engee, формат аналогичен INPUT_MEASURE_UNITS.

IP

IPv4

Адрес, по которому Engee и ЭЙЛЕР обмениваются UDP-пакетами. По умолчанию 127.0.0.1 — локальный адрес. Для связи между разными машинами замените на нужный IPv4.

RCV_PORT

целое

UDP-порт, на котором DLL-библиотека Engee_Euler.dll принимает входящие пакеты от блока EULER Cosimulation в Engee. Должен совпадать с параметром m_rcv_port блока. Задается пользователем.

SND_PORT

целое

UDP-порт, на который DLL-библиотека Engee_Euler.dll отправляет пакеты блоку EULER Cosimulation в Engee. Должен совпадать с параметром m_snd_port блока. Задается пользователем.

MAX_RCV_BUFFER_SIZE

байты

Размер UDP-буфера приема. По умолчанию 4096. Увеличьте, если на одном шаге передается много сигналов и пакет не помещается в стандартный буфер.

MAX_SND_BUFFER_SIZE

байты

Размер UDP-буфера передачи. По умолчанию 4096.

SRVCIO_TIMEOUT

мс

Таймаут блокирующих операций ввода-вывода на сокете. По умолчанию 20000.0 (20 секунд).

HANDSHAKE_TIMEOUT

мс

Таймаут ожидания handshake-сообщения при инициализации косимуляции. По умолчанию 120000.0 (2 минуты). Должен быть согласован со значением параметра m_handshake_timeout в параметрах блока EULER Cosimulation.

SAMPLE_TIME

секунды

Шаг интегрирования, с которым DLL-библиотека обменивается сигналами. Обязательно должен быть кратен FixedStep модели Engee и совпадать со значением параметра m_sample_time блока EULER Cosimulation.

DIAGNOSTIC

0 / 1

Включение логирования. 1 — в файл engee_logs.txt пишется диагностика обмена (временные метки, имена и значения сигналов); 0 — лог отключен.

Пример 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! появляется после успешного завершения рукопожатия.