Skip to content

Алгоритм присвоения адресов Modbus

← К модели ПЛК

Материал описывает алгоритм присвоения адресов Modbus каналам технических объектов при генерации проекта ПЛК в Uniplant Atomix.

Ожидаемый результат: разработчик понимает, какие поля модели ПЛК и OBJTYPE влияют на карту регистров, и зачем включают опцию «Округление при адресации» в проектах с панелями Weintek.

ПЛК в типовой схеме 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.*)
OBJTYPEJSC\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"]
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

1. Начальные адреса — лист PlcOptions

Section titled “1. Начальные адреса — лист PlcOptions”

На листе PlcOptions модели ПЛК задаются точки отсчёта для каждой области Modbus:

ПеременнаяОбласть Modbus
opt.DIStartAddrDiscrete Input (1x)
opt.CLStartAddrCoil (0x)
opt.IRStartAddrInput Register (3x)
opt.HRStartAddrHolding Register (4x)

Области ведут независимые счётчики: сдвиг в DI не влияет на HR. Значения могут совпадать (например, 200 во всех четырёх колонках) или различаться — в зависимости от проекта.

Параметры начальных адресов Modbus на листе PlcOptions

Рис. — фрагмент модели ПЛК: лист 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; адрес не назначается
DIDiscrete Input1 бит0x02 Read Discrete Inputs
COILCoil1 бит0x01 / 0x05 / 0x0F
int3xInput Register1 регистр0x04 Read Input Registers
real3x, dint3xInput Register2 регистра0x04 Read Input Registers
int4xHolding Register1 регистр0x03 / 0x06 / 0x10
real4x, dint4xHolding Register2 регистра0x03 / 0x06 / 0x10

Суффиксы 3x и 4x в значении mapping задают область Modbus (Input Register / Holding Register), а не число регистров. Для типов с префиксом real или dint канал занимает 2 последовательных регистра (следующий канал: +2, напр. 200, 202, 204…); для int1 регистр (+1).

5. Порядок каналов — колонки IR, HR, Di, coil

Section titled “5. Порядок каналов — колонки IR, HR, Di, coil”

Для канала с заполненным mapping способ упорядочивания в своей области задаётся в соответствующих колонках IR, HR, Di, coil:

ЗначениеПоведение
-Адрес назначается автоматически; порядок каналов — как строки на листе шаблона (сверху вниз)
Число (1, 2, 3, …)Задаёт порядок канала при размещении внутри экземпляра (не абсолютный адрес Modbus)

Итоговый адрес канала:

начальный сдвиг экземпляра в области + накопленный шаг по предыдущим каналам в этой области.

ОбластьРазмер канала
DI / COIL1 бит
IR / HR, mapping = int3x / int4x1 регистр
IR / HR, mapping = real3x / real4x / dint3x / dint4x2 регистра (следующий канал: +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. Экземпляр 1 — 10 каналов DI: адреса 200–209; следующий свободный — 210.
  2. Округление: ближайшее кратное 16 вверх — 224.
  3. Экземпляр 2 начинает DI с адреса 224.

Пошаговый разбор на трёх аналоговых входах 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.

Как запуститьПанель внешних модулейModbusMapDocGeneratorPlay; MapCreator отрабатывает автоматически
РезультатDocs\ModbusMap\ModbusMap.xls в каталоге результатов ПЛК
Когда запускатьНа финальном этапе подготовки проекта — операция может занимать длительное время на больших конфигурациях