Алгоритм присвоения адресов Modbus
Материал описывает алгоритм присвоения адресов Modbus каналам технических объектов при генерации проекта ПЛК в Uniplant Atomix.
Ожидаемый результат: разработчик понимает, какие поля модели ПЛК и OBJTYPE влияют на карту регистров, и зачем включают опцию «Округление при адресации» в проектах с панелями Weintek.
Когда применяется
Section titled “Когда применяется”ПЛК в типовой схеме Uniplant Atomix работает как Modbus Slave: панели оператора, SCADA и другие системы верхнего уровня выступают Modbus Master и опрашивают регистры контроллера.
Адреса Modbus для каналов объектов рассчитываются при включённых опциях «Генерация глоб. словаря Unimod» и «Генерация маппинга Modbus» в ПЛК Конфигураторе. Результат попадает в Dictionary.csv и SetModbusSlave.xlsx — подробнее в Расчёт адресов Modbus Slave.
Связь модели ПЛК, OBJTYPE и генератора
Section titled “Связь модели ПЛК, OBJTYPE и генератора”Данные для расчёта берутся из трёх уровней:
| Уровень | Где в проекте | Что задаёт для Modbus |
|---|---|---|
| Модель ПЛК | JSC\Usr\Prj\Conf\Models\PLC\Logic\{PLC}.xlsx | Стартовые адреса областей (PlcOptions); перечень экземпляров и признак выдачи наверх (OBJ.*) |
| OBJTYPE | JSC\Conf\Models\ObjTypes\ и локальные копии | Структура каналов, mapping, порядок адресов (IR/HR/Di/coil), имя Modbus-карты (TechObject.modbusTemplate) |
| ПЛК Конфигуратор | опции генерации | Запуск расчёта; «Округление при адресации» для выравнивания DI/COIL |
Связь экземпляра ПЛК с шаблоном OBJTYPE — в статье Связь с моделями верхнего уровня. Столбцы каналов на листе шаблона — в Листы шаблонов.
flowchart LR
subgraph plc ["Модель ПЛК"]
PO["PlcOptions
opt.*StartAddr"]
OBJ["OBJ.*
isMapped, TAG,
OBJTYPENAME, Template"]
end
subgraph objtype ["OBJTYPE"]
MT["TechObject.modbusTemplate"]
MAP["mapping, IR, HR, Di, coil"]
end
subgraph automix ["ПЛК Конфигуратор"]
GEN["Генерация маппинга Modbus"]
RND["Округление при адресации"]
end
PO --> GEN
OBJ --> GEN
MT --> GEN
MAP --> GEN
RND --> GEN
GEN --> OUT["Dictionary.csv
SetModbusSlave.xlsx"]
Блок-схема алгоритма
Section titled “Блок-схема алгоритма”flowchart TD
A([Старт расчёта]) --> B["PlcOptions: счётчики DI, COIL, IR, HR
от opt.*StartAddr"]
B --> C["Экземпляры с OBJ.*"]
C --> D{"isMapped
заполнен?"}
D -->|нет| E["Пропуск экземпляра"]
D -->|да| F["OBJTYPE: OBJTYPENAME + Template"]
F --> G["TechObject.modbusTemplate"]
G --> H["Сортировка по modbusTemplate"]
H --> I{Следующий
экземпляр?}
I -->|нет| Z([Dictionary.csv / SetModbusSlave.xlsx])
I -->|да| J["Каналы шаблона"]
J --> K{"mapping
заполнен?"}
K -->|нет| J
K -->|да| L{"Di / coil / IR / HR:
- или число?"}
L -->|"-"| M["Порядок = строки шаблона"]
L -->|1, 2, 3…| N["Порядок = по числу"]
M --> O["Адрес = сдвиг экземпляра + позиция"]
N --> O
O --> R{"Область
IR / HR?"}
R -->|да| S["След. адрес: +1 int*
или +2 real/dint*"]
R -->|DI / COIL| T["След. адрес: +1 бит"]
S --> J
T --> J
J --> P{"Округление
при адресации?"}
P -->|да| Q["DI и COIL: адрес кратный 16"]
P -->|нет| I
Q --> I
E --> I
Пошаговое описание
Section titled “Пошаговое описание”1. Начальные адреса — лист PlcOptions
Section titled “1. Начальные адреса — лист PlcOptions”На листе PlcOptions модели ПЛК задаются точки отсчёта для каждой области Modbus:
| Переменная | Область Modbus |
|---|---|
| opt.DIStartAddr | Discrete Input (1x) |
| opt.CLStartAddr | Coil (0x) |
| opt.IRStartAddr | Input Register (3x) |
| opt.HRStartAddr | Holding Register (4x) |
Области ведут независимые счётчики: сдвиг в DI не влияет на HR. Значения могут совпадать (например, 200 во всех четырёх колонках) или различаться — в зависимости от проекта.

Рис. — фрагмент модели ПЛК: лист PlcOptions (в т.ч. opt.DIStartAddr, opt.CLStartAddr, opt.IRStartAddr, opt.HRStartAddr).
2. Отбор экземпляров — листы OBJ.*
Section titled “2. Отбор экземпляров — листы OBJ.*”На листах OBJ.* объявляются экземпляры технических объектов. В расчёт адресов Modbus попадают только строки, у которых заполнена колонка isMapped (типичное значение — x).
| Поле | Роль в адресации |
|---|---|
| isMapped | Признак выдачи данных на верхний уровень; без него экземпляр не участвует в расчёте Modbus |
| OBJTYPENAME | Имя модели OBJTYPE для загрузки шаблона |
| Template | Имя листа-шаблона внутри OBJTYPE |
| TAG | Тег экземпляра (имя в Unimod и словаре) |
Остальные поля строки (ScaleLow, PathDevStudio, HmiTag и др.) на порядок Modbus-адресов не влияют, но используются при других этапах генерации.
3. Сортировка экземпляров — TechObject.modbusTemplate
Section titled “3. Сортировка экземпляров — TechObject.modbusTemplate”После загрузки шаблона OBJTYPE из строчных свойств листа читается TechObject.modbusTemplate — имя Modbus-карты (раскладка регистров для панелей Weintek, документации и т.д.).
Экземпляры с заполненным isMapped сортируются по значению TechObject.modbusTemplate, а не по паре OBJTYPENAME + Template. Разные типовые блоки могут использовать одну карту (например, Wntk.SrtList); тогда их экземпляры обрабатываются в одной группе адресации.
Пара OBJTYPENAME + Template по-прежнему определяет, какой лист шаблона и какие каналы разворачивать для экземпляра.
4. Участие канала — колонка mapping
Section titled “4. Участие канала — колонка mapping”На листе-шаблоне OBJTYPE Modbus-адрес получает только канал с заполненной колонкой mapping.
mapping | Область | Сдвиг адреса (IR/HR) | Функции Modbus (чтение / запись) |
|---|---|---|---|
| (пусто) | — | — | Канал не в Modbus; адрес не назначается |
| DI | Discrete Input | 1 бит | 0x02 Read Discrete Inputs |
| COIL | Coil | 1 бит | 0x01 / 0x05 / 0x0F |
| int3x | Input Register | 1 регистр | 0x04 Read Input Registers |
| real3x, dint3x | Input Register | 2 регистра | 0x04 Read Input Registers |
| int4x | Holding Register | 1 регистр | 0x03 / 0x06 / 0x10 |
| real4x, dint4x | Holding Register | 2 регистра | 0x03 / 0x06 / 0x10 |
Суффиксы 3x и 4x в значении mapping задают область Modbus (Input Register / Holding Register), а не число регистров. Для типов с префиксом real или dint канал занимает 2 последовательных регистра (следующий канал: +2, напр. 200, 202, 204…); для int — 1 регистр (+1).
5. Порядок каналов — колонки IR, HR, Di, coil
Section titled “5. Порядок каналов — колонки IR, HR, Di, coil”Для канала с заполненным mapping способ упорядочивания в своей области задаётся в соответствующих колонках IR, HR, Di, coil:
| Значение | Поведение |
|---|---|
- | Адрес назначается автоматически; порядок каналов — как строки на листе шаблона (сверху вниз) |
Число (1, 2, 3, …) | Задаёт порядок канала при размещении внутри экземпляра (не абсолютный адрес Modbus) |
Итоговый адрес канала:
начальный сдвиг экземпляра в области + накопленный шаг по предыдущим каналам в этой области.
| Область | Размер канала |
|---|---|
| DI / COIL | 1 бит |
IR / HR, mapping = int3x / int4x | 1 регистр |
IR / HR, mapping = real3x / real4x / dint3x / dint4x | 2 регистра (следующий канал: +2, напр. 200, 202, 204…) |
Число регистров для IR/HR определяется значением mapping: префикс real или dint — сдвиг 2; префикс int — сдвиг 1.
Начальный сдвиг экземпляра складывается из opt.*StartAddr и объёма, занятого предыдущими экземплярами в порядке сортировки по modbusTemplate.
6. Округление после экземпляра — опция генерации
Section titled “6. Округление после экземпляра — опция генерации”Опция «Округление при адресации» в окне опций генерации влияет на следующий стартовый адрес после обработки каждого экземпляра:
- при включённой опции для областей DI и COIL указатель следующего свободного адреса округляется вверх до кратного 16;
- области IR и HR округлением не затрагиваются.
При выключенной опции следующий экземпляр продолжает нумерацию сразу после последнего занятого бита в DI/COIL, без выравнивания.
Пример (DI, opt.DIStartAddr = 200, округление включено):
- Экземпляр 1 — 10 каналов
DI: адреса 200–209; следующий свободный — 210. - Округление: ближайшее кратное 16 вверх — 224.
- Экземпляр 2 начинает DI с адреса 224.
Пример расчёта
Section titled “Пример расчёта”Пошаговый разбор на трёх аналоговых входах AiProc3 / 4_20mA_namur — перечень каналов шаблона, таблицы адресов по экземплярам и проверка округления — вынесен в отдельную статью:
Пример адресации Modbus: AiProc3 / 4_20mA_namur
Сводная таблица источников данных
Section titled “Сводная таблица источников данных”| Вопрос | Где смотреть |
|---|---|
| С какого адреса начинать область? | PlcOptions: opt.DIStartAddr, opt.CLStartAddr, opt.IRStartAddr, opt.HRStartAddr |
| Какой экземпляр участвует в Modbus? | OBJ.*: колонка isMapped |
| В каком порядке идут экземпляры? | OBJTYPE, свойство TechObject.modbusTemplate |
| Какой канал в Modbus? | OBJTYPE, лист шаблона: mapping |
| Порядок каналов внутри экземпляра? | OBJTYPE: IR / HR / Di / coil (- или числа) |
| Выравнивание DI/COIL между экземплярами? | ПЛК Конфигуратор: «Округление при адресации» |
Запуск расчёта и результаты
Section titled “Запуск расчёта и результаты”Один и тот же алгоритм адресации (модель ПЛК + OBJTYPE + опция округления) используется при генерации словаря Unimod и при построении Modbus-карты для документации.
ПЛК Конфигуратор — словарь и импорт в Unimod
Section titled “ПЛК Конфигуратор — словарь и импорт в Unimod”| Как запустить | ПЛК Конфигуратор → «Генерация глоб. словаря Unimod» + «Генерация маппинга Modbus»; для Weintek — также «Округление при адресации» |
| Результат | Столбцы MOD_BUS, MOD_BUS_type, ADDR_MOD в Dictionary.csv; файл SetModbusSlave.xlsx |
| Порядок импорта | Словарь импортируют до импорта Modbus и FBD/ST — см. путь от модели к результатам |
ModbusMapDocGenerator — документация для сторонних организаций
Section titled “ModbusMapDocGenerator — документация для сторонних организаций”Внешний модуль ModbusMapDocGenerator формирует Excel ModbusMap.xls с картой регистров для сдачи проектной документации и согласования с интеграторами. Перед выгрузкой Excel MapCreator пересчитывает Modbus-карту по инстансам выбранного ПЛК — с теми же правилами, что описаны в этой статье (PlcOptions, OBJ.* / isMapped, mapping, TechObject.modbusTemplate, округление DI/COIL). Адреса и коды функций из карты попадают в колонки «Адрес регистра чтения (дес.)», «Адрес регистра записи (дес.)» и «Код функции» файла ModbusMap.xls.
| Как запустить | Панель внешних модулей → ModbusMapDocGenerator → Play; MapCreator отрабатывает автоматически |
| Результат | Docs\ModbusMap\ModbusMap.xls в каталоге результатов ПЛК |
| Когда запускать | На финальном этапе подготовки проекта — операция может занимать длительное время на больших конфигурациях |
См. также
Section titled “См. также”- Модель ПЛК
- Связь с моделями верхнего уровня
- Листы шаблонов OBJTYPE
- Настройка каналов OBJTYPE
- Расчёт адресов Modbus Slave — опции генерации и результат в Unimod
- ModbusMapDocGenerator — Excel
ModbusMap.xlsпо той же карте адресов - MapCreator — построение Modbus-карты для зависимых модулей
- Генерация глобального словаря Unimod
- Пример адресации Modbus: AiProc3 / 4_20mA_namur
- Типовой блок AiProc3