Выгрузка упаковки DI в Modbus
Статья описывает назначение и базовую настройку модуля «Выгрузка упаковки DI в Modbus».
Назначение
Section titled “Назначение”Внешний модуль Выгрузка упаковки DI в Modbus входит в библиотеку StandardModules.dll.
Модуль предназначен для упаковки дискретных сигналов DI в слова типа Integer, что позволяет сократить количество передаваемых переменных по Modbus.
Такой подход уменьшает объем опроса и в ряде проектов напрямую влияет на лицензионные ограничения и стоимость опроса со стороны сторонних компаний и интеграционных систем.
Внешний вид модуля в Uniplant Atomix
Section titled “Внешний вид модуля в Uniplant Atomix”
Внешний вид внешнего модуля «Выгрузка упаковки DI в Modbus» в интерфейсе Uniplant Atomix.
Модуль формирует:
ST-секции для packedDIиCOIL;- локальные словари;
- глобальный словарь packed discrete;
- итоговую
Modbus-карту для упакованных сигналов.
Алгоритм работы
Section titled “Алгоритм работы”Запуск и применение результатов генерации
Section titled “Запуск и применение результатов генерации”Запуск модуля выполняется кнопкой Play. Процесс выполнения и статус операций отображаются в логе.

Лог выполнения модуля после запуска кнопкой Play.
Если отсутствуют обязательные входные данные или некорректны настройки, модуль завершится без сохранения файлов.
Подготовка данных
Section titled “Подготовка данных”1. Используются данные предыдущей генерации Modbus-карты.
2. Выполняется подготовка packed DI с параметрами:
- Упаковывать каждый OBJTYPE с нового слова;
- Начальный адрес Modbus для packed DI (по умолчанию
5000).
3. При отсутствии входных данных модуль завершает работу без сохранения результатов.
Резолв путей
Section titled “Резолв путей”Перед сохранением пути из настроек проверяются и подставляются с учетом переменных проекта ПЛК.
Если переменная не подставилась, путь используется как есть.
Сохранение POU и словарей (если включено)
Section titled “Сохранение POU и словарей (если включено)”Шаг выполняется только при включённой настройке Сохранять POU и словарь Unimod.
1. Проверяются конфликты адресов:
- для каждой packed-переменной проверяется, не занят ли
Modbus-адрес в основной карте; - при конфликте пишется ошибка вида:
«Конфликт packed Modbus-адреса: переменная … использует адрес … но он уже занят основной генерацией: …».
2. Модуль сохраняет:
ST-секциюDI(MbPackDi);ST-секциюCOIL(MbPackCoil);- локальные словари
DIиCOIL; - глобальный словарь packed discrete.
3. Каждый созданный файл регистрируется в Result-кнопках и логируется.
Базовые пути по умолчанию:
POU:%JSC%\USR\PRJ\ResultFiles\PLC\<PlcName>\Unimod\Pou\Generated\main\;- шаблоны локальных словарей:
%JSC%\Conf\Models\System\Modbus\PackData\LocalDictionary\; - глобальный словарь:
[UNIMOD_DICTIONARY_PACKED_PATH].
Сохранение итоговой Modbus-карты (если включено)
Section titled “Сохранение итоговой Modbus-карты (если включено)”Шаг выполняется только при включённой настройке Сохранять итоговую Modbus-карту (по умолчанию включена).
1. Итоговая карта строится на базе основной Modbus-карты и результатов упаковки дискретных сигналов.
2. Базовый XLS-шаблон берётся из настройки Шаблон Excel для Modbus-карты (по умолчанию [MODBUS_BASE_PATH]) и резолвится через переменные ПЛК.
3. Документ сохраняется по пути из настройки Путь к итоговой Modbus-карте:
%JSC%\USR\PRJ\ResultFiles\PLC\<PlcName>\Docs\ModbusMap\ModbusMapPacked.xls
4. Путь к файлу отображается в результатах модуля и в логе.
Интеграция результатов в проект Unimod2
Section titled “Интеграция результатов в проект Unimod2”Последовательность интеграции результатов генерации в проектные решения:
- Копируем глобальный словарь с переменной массива в папку проекта
Unimod2кнопкой «Копирование packed в Unimod». - Открываем окно со сгенерированными секциями
FBD/STдля дальнейшего импорта программ в проектUnimod2.

Шаги 1-2: переход в раздел Unimod, копирование словаря («Копирование распаковки в Unimod») и открытие импорта FBD/ST.
- Выбираем секцию
MbPackDiи выполняем импорт выделенного в проектUnimod2. - Нажимаем кнопку копирования содержимого локального словаря секции в буфер обмена.

Шаги 3-4: выбор секции (MbPackDi) и копирование содержимого локального словаря в буфер.
- В задачах проекта
Unimod2находим импортированную секцию и в ее локальном словаре выполняем действие «Импорт из буфера».

Шаг 5: импорт из буфера в локальный словарь импортированной секции.
- Открываем «Глобальный словарь» и импортируем файл с именем, указанным в настройках модуля (по умолчанию —
DictionaryPackModbus). - Компилируем проект для проверки корректности импорта и сборки.
Файл с картой переменных и адресами Modbus
Section titled “Файл с картой переменных и адресами Modbus”Итоговая карта сохраняется в формате XLS по шаблону базовой карты Modbus.
При формировании:
- сохраняется структура и формат исходной карты;
- данные основной генерации дополняются packed
DI/COIL; - для дискретных сигналов записываются адрес регистра и номер бита.
Для быстрого доступа к карте используйте кнопку «Открыть папку документации» в разделе «Результат сборки» и перейдите к соответствующему файлу.

Быстрый переход к каталогу с файлом Modbus-карты через кнопку «Открыть папку документации».
Окно настроек
Section titled “Окно настроек”
Окно настроек модуля.
| Параметр | Описание |
|---|---|
| Начальный адрес Modbus для packed DI | Стартовый адрес packed DI (по умолчанию 5000). |
| Упаковывать каждый OBJTYPE с нового слова | Начинать каждый ObjType с новой 16-битной границы (по умолчанию выключено). |
| Каталог POU для импорта в Unimod | Каталог сохранения POU-файлов. |
| Итоговый путь к глобальному словарю Unimod | Путь итогового файла глобального словаря packed discrete. |
| Каталог шаблонов локальных словарей | Каталог шаблонов локальных словарей DI/COIL. |
| Путь к итоговой Modbus-карте | Путь сохранения ModbusMapPacked.xls. |
| Шаблон Excel для Modbus-карты | Путь к базовому шаблону карты ([MODBUS_BASE_PATH] по умолчанию). |
| Сохранять итоговую Modbus-карту | Включение/отключение шага сохранения итоговой карты (true по умолчанию). |
| Сохранять POU и словарь Unimod | Включение/отключение шага сохранения POU и словарей (true по умолчанию). |
Результат работы
Section titled “Результат работы”После выполнения модуль формирует:
- переменную массива в глобальном словаре
Unimod2с назначеннымиModbus-адресами; - программу
STдля упаковки дискретных каналов в слова; - переменную локального словаря для созданной
ST-программы; Modbus-карту в форматеXLSX.
В итоговой Modbus-карте для каждого упакованного дискретного сигнала указываются:
- имя сигнала;
- адрес регистра;
- номер бита в слове;
- пометка о принадлежности к packed-данным.
Пример фрагмента ST-программы:
BitToIntDi.IN0 := F0_80_020_JTI1201.Fault;BitToIntDi.IN1 := F0_80_020_JTI1201.InvalidPV;BitToIntDi.IN2 := F0_80_020_JTI1201_CH.Break;BitToIntDi.IN3 := F0_80_020_JTI1201_CH.ShortCircuit;BitToIntDi.IN4 := F0_80_020_JTI1201_CH.BadScale;BitToIntDi.IN5 := F0_80_020_JTI1201_CH.DeadZoneAct;BitToIntDi.IN6 := false;BitToIntDi.IN7 := false;BitToIntDi.IN8 := false;BitToIntDi.IN9 := false;BitToIntDi.IN10 := false;BitToIntDi.IN11 := false;BitToIntDi.IN12 := false;BitToIntDi.IN13 := false;BitToIntDi.IN14 := false;BitToIntDi.IN15 := false;BitToIntDi.IN16 := F0_80_020_JTI1202.Fault;BitToIntDi.IN17 := F0_80_020_JTI1202.InvalidPV;BitToIntDi.IN18 := F0_80_020_JTI1202_CH.Break;BitToIntDi.IN19 := F0_80_020_JTI1202_CH.ShortCircuit;BitToIntDi.IN20 := F0_80_020_JTI1202_CH.BadScale;BitToIntDi.IN21 := F0_80_020_JTI1202_CH.DeadZoneAct;BitToIntDi.IN22 := false;BitToIntDi.IN23 := false;BitToIntDi.IN24 := false;BitToIntDi.IN25 := false;BitToIntDi.IN26 := false;BitToIntDi.IN27 := false;BitToIntDi.IN28 := false;BitToIntDi.IN29 := false;BitToIntDi.IN30 := false;BitToIntDi.IN31 := false;BitToIntDi.BIT_TO_INT();PackedDataMbDi[0] := BitToIntDi.q;Пример фрагмента Modbus-карты (выведена часть столбцов таблицы):
| Тег | Тип данных | Адрес регистра чтения (дес.) | Бит | Примечание |
|---|---|---|---|---|
F0_80_020_JTI1201.Fault | Bool | 5000 | 0 | PackedDiscrete |
F0_80_020_JTI1201.InvalidPV | Bool | 5000 | 1 | PackedDiscrete |
F0_80_020_JTI1201.Break | Bool | 5000 | 2 | PackedDiscrete |
F0_80_020_JTI1201.ShortCircuit | Bool | 5000 | 3 | PackedDiscrete |
F0_80_020_JTI1201.BadScale | Bool | 5000 | 4 | PackedDiscrete |
F0_80_020_JTI1201.DeadZoneAct | Bool | 5000 | 5 | PackedDiscrete |
F0_80_020_JTI1202.Fault | Bool | 5001 | 0 | PackedDiscrete |
F0_80_020_JTI1202.InvalidPV | Bool | 5001 | 1 | PackedDiscrete |
F0_80_020_JTI1202.Break | Bool | 5001 | 2 | PackedDiscrete |
F0_80_020_JTI1202.ShortCircuit | Bool | 5001 | 3 | PackedDiscrete |
F0_80_020_JTI1202.BadScale | Bool | 5001 | 4 | PackedDiscrete |
F0_80_020_JTI1202.DeadZoneAct | Bool | 5001 | 5 | PackedDiscrete |