Пример адресации Modbus: AiProc3 / 4_20mA_namur
← Алгоритм присвоения адресов Modbus
Рассмотрим типовую связку модели ПЛК и OBJTYPE на примере трёх аналоговых датчиков 4–20 мА (NAMUR) — типовой блок AiProc3, шаблон 4_20mA_namur. Общий алгоритм — в статье Алгоритм присвоения адресов Modbus.
Экземпляры на листе OBJ.AI модели ПЛК
Section titled “Экземпляры на листе OBJ.AI модели ПЛК”На листе OBJ.AI объявлены три экземпляра одного типа. Для участия в Modbus у каждого заполнен isMapped; остальные поля задают параметры процесса (ScaleLow, ScaleHigh, Units и т.д.):
| TAG | OBJTYPENAME | Template | isMapped | parentDescr (пример) |
|---|---|---|---|---|
M0_85JT16401 | AiProc3 | 4_20mA_namur | x | Температура шкафа 1 |
M0_85JT16402 | AiProc3 | 4_20mA_namur | x | Температура шкафа 2 |
M0_85JT16403 | AiProc3 | 4_20mA_namur | x | Температура шкафа 3 |
По OBJTYPENAME + Template конфигуратор загружает лист-шаблон 4_20mA_namur из файла AiProc3.xlsx (JSC\Conf\Models\ObjTypes\APUCS\AiProc3\). В строчных свойствах шаблона указано TechObject.modbusTemplate = AiProc3_Analog — по этому значению все три экземпляра попадают в одну группу сортировки при адресации. Лист Wntk.SrtList в том же файле задаёт шаблон документации Weintek и не подменяет значение TechObject.modbusTemplate на листе шаблона.
Лист-шаблон OBJTYPE 4_20mA_namur
Section titled “Лист-шаблон OBJTYPE 4_20mA_namur”Конфигурация alias (лист template)
Section titled “Конфигурация alias (лист template)”Алиасы и типы FB для шаблона 4_20mA_namur задаются на листе template файла AiProc3.xlsx (строка с именем шаблона в колонке template1…template5). Для этого шаблона активны два алиаса:
alias | TreiFB | body | Экземпляр FB Unimod 2 |
|---|---|---|---|
base0 | AiProc3 | [TAG] | [TAG] → AiProc3 |
channel_4_20mA_namur | AiChnl_4_20mA_namur | [TAG]_CH | [TAG]_CH → AiChnl_4_20mA_namur |
В колонке unimodFB листа-шаблона указывается alias; по строке на листе template подставляются тип FB (TreiFB) и имя экземпляра — prefix + body + suffix (для примера ниже: [TAG] и [TAG]_CH). Подробнее — в статье UnimodFB и template.
На листе 4_20mA_namur в колоночной таблице перечислены каналы этих FB и правила Modbus. Во всех колонках IR, HR, Di, coil стоят -: адреса назначаются автоматически, порядок внутри области — сверху вниз по строкам шаблона (как канал встречается при обходе листа).
Ниже — полный перечень каналов шаблона 4_20mA_namur по областям Modbus (порядок назначения адресов). Каналы без mapping в карту не попадают.
Discrete Input (mapping = DI)
Section titled “Discrete Input (mapping = DI)”| № | mapping | Имя FB | TreiFB | Канал | Функция Modbus | Описание (рус.) |
|---|---|---|---|---|---|---|
| 1 | DI | [TAG] | AiProc3 | InvalidPV | 0x02 | Недостоверность входного сигнала |
| 2 | DI | [TAG] | AiProc3 | Break | 0x02 | Обрыв |
| 3 | DI | [TAG] | AiProc3 | ShortCircuit | 0x02 | Короткое замыкание |
| 4 | DI | [TAG] | AiProc3 | Fault | 0x02 | Неисправность |
| 5 | DI | [TAG] | AiProc3 | BadSetpointPV | 0x02 | Ошибка уставок |
| 6 | DI | [TAG] | AiProc3 | HighSpeedAct | 0x02 | Сработка превышения предельной скорости изменения |
| 7 | DI | [TAG] | AiProc3 | ForceThAct | 0x02 | Принудительная сработка уставок |
| 8 | DI | [TAG] | AiProc3 | Invalid | 0x02 | Недостоверность значения процесса |
| 9 | DI | [TAG]_CH | AiChnl_4_20mA_namur | BadScale | 0x02 | Ошибка шкалы |
| 10 | DI | [TAG]_CH | AiChnl_4_20mA_namur | DeadZoneAct | 0x02 | Значение в зоне нечувствительности |
Занято на экземпляр: 10 бит.
Coil (mapping = COIL)
Section titled “Coil (mapping = COIL)”| № | mapping | Имя FB | TreiFB | Канал | Функция Modbus | Описание (рус.) |
|---|---|---|---|---|---|---|
| 1 | COIL | [TAG] | AiProc3 | OprHighSpeed | 0x01 / 0x05 / 0x0F | Активация мониторинга предельной скорости изменения |
| 2 | COIL | [TAG] | AiProc3 | OprSim | 0x01 / 0x05 / 0x0F | Симуляция активна |
| 3 | COIL | [TAG] | AiProc3 | OprForceThOnBreak | 0x01 / 0x05 / 0x0F | Взводить уставки при обрыве |
| 4 | COIL | [TAG] | AiProc3 | OprThOnShortCircuit | 0x01 / 0x05 / 0x0F | Взводить уставки при КЗ |
| 5 | COIL | [TAG] | AiProc3 | OprForceThOnInvalid | 0x01 / 0x05 / 0x0F | Взводить уставки при недостоверности модуля |
| 6 | COIL | [TAG] | AiProc3 | OprUseLastValid | 0x01 / 0x05 / 0x0F | Использовать последнее достоверное |
| 7 | COIL | [TAG] | AiProc3 | OprHighSpeedReset | 0x01 / 0x05 / 0x0F | Сброс превышения предельной скорости изменения |
Занято на экземпляр: 7 бит.
Input Register (mapping = real3x)
Section titled “Input Register (mapping = real3x)”| № | mapping | Имя FB | TreiFB | Канал | Функция Modbus | Описание (рус.) |
|---|---|---|---|---|---|---|
| 1 | real3x | [TAG] | AiProc3 | PV | 0x04 | Значение процесса |
| 2 | real3x | [TAG] | AiProc3 | InPV | 0x04 | Значение процесса входное |
| 3 | real3x | [TAG]_CH | AiChnl_4_20mA_namur | InPV | 0x04 | Входное токовое значение |
Занято на экземпляр: 3 канала × 2 регистра (mapping = real3x) = 6 регистров.
Holding Register (mapping = real4x)
Section titled “Holding Register (mapping = real4x)”| № | mapping | Имя FB | TreiFB | Канал | Функция Modbus | Описание (рус.) |
|---|---|---|---|---|---|---|
| 1 | real4x | [TAG] | AiProc3 | OprHighSpeedLim | 0x03 / 0x06 / 0x10 | Уставка предельной скорости изменения |
| 2 | real4x | [TAG] | AiProc3 | ValueOnInvalid | 0x03 / 0x06 / 0x10 | Значение параметра при недостоверности по модулю |
| 3 | real4x | [TAG] | AiProc3 | ValueOnBreak | 0x03 / 0x06 / 0x10 | Значение канала при обрыве |
| 4 | real4x | [TAG] | AiProc3 | ValueOnShortCircuit | 0x03 / 0x06 / 0x10 | Значение параметра при КЗ |
| 5 | real4x | [TAG] | AiProc3 | SimPV | 0x03 / 0x06 / 0x10 | Значение в режиме симуляции |
| 6 | real4x | [TAG]_CH | AiChnl_4_20mA_namur | HighScale | 0x03 / 0x06 / 0x10 | Верхняя граница шкалы |
| 7 | real4x | [TAG]_CH | AiChnl_4_20mA_namur | LowScale | 0x03 / 0x06 / 0x10 | Нижняя граница шкалы |
Занято на экземпляр: 7 каналов × 2 регистра (mapping = real4x) = 14 регистров.
Расчёт адресов для трёх экземпляров
Section titled “Расчёт адресов для трёх экземпляров”Пусть на PlcOptions: opt.DIStartAddr = 200, opt.CLStartAddr = 200, opt.IRStartAddr = 200, opt.HRStartAddr = 200; опция «Округление при адресации» включена.
В таблицах ниже для IR и HR у всех каналов mapping с префиксом real (real3x / real4x) — сдвиг 2 (200 → 202 → 204 …). Для каналов с int3x / int4x сдвиг был бы 1; с dint3x / dint4x — также 2, как у real. Функции Modbus — по таблице mapping в алгоритме адресации.
Экземпляр 1 — M0_85JT16401
Section titled “Экземпляр 1 — M0_85JT16401”| Канал | Область | Адрес Modbus | Функция Modbus |
|---|---|---|---|
M0_85JT16401.InvalidPV | DI | 200 | 0x02 |
M0_85JT16401.Break | DI | 201 | 0x02 |
M0_85JT16401.ShortCircuit | DI | 202 | 0x02 |
M0_85JT16401.Fault | DI | 203 | 0x02 |
M0_85JT16401.BadSetpointPV | DI | 204 | 0x02 |
M0_85JT16401.HighSpeedAct | DI | 205 | 0x02 |
M0_85JT16401.ForceThAct | DI | 206 | 0x02 |
M0_85JT16401.Invalid | DI | 207 | 0x02 |
M0_85JT16401_CH.BadScale | DI | 208 | 0x02 |
M0_85JT16401_CH.DeadZoneAct | DI | 209 | 0x02 |
M0_85JT16401.OprHighSpeed | COIL | 200 | 0x01 / 0x05 / 0x0F |
M0_85JT16401.OprSim | COIL | 201 | 0x01 / 0x05 / 0x0F |
M0_85JT16401.OprForceThOnBreak | COIL | 202 | 0x01 / 0x05 / 0x0F |
M0_85JT16401.OprThOnShortCircuit | COIL | 203 | 0x01 / 0x05 / 0x0F |
M0_85JT16401.OprForceThOnInvalid | COIL | 204 | 0x01 / 0x05 / 0x0F |
M0_85JT16401.OprUseLastValid | COIL | 205 | 0x01 / 0x05 / 0x0F |
M0_85JT16401.OprHighSpeedReset | COIL | 206 | 0x01 / 0x05 / 0x0F |
M0_85JT16401.PV | IR | 200 | 0x04 |
M0_85JT16401.InPV | IR | 202 | 0x04 |
M0_85JT16401_CH.InPV | IR | 204 | 0x04 |
M0_85JT16401.OprHighSpeedLim | HR | 200 | 0x03 / 0x06 / 0x10 |
M0_85JT16401.ValueOnInvalid | HR | 202 | 0x03 / 0x06 / 0x10 |
M0_85JT16401.ValueOnBreak | HR | 204 | 0x03 / 0x06 / 0x10 |
M0_85JT16401.ValueOnShortCircuit | HR | 206 | 0x03 / 0x06 / 0x10 |
M0_85JT16401.SimPV | HR | 208 | 0x03 / 0x06 / 0x10 |
M0_85JT16401_CH.HighScale | HR | 210 | 0x03 / 0x06 / 0x10 |
M0_85JT16401_CH.LowScale | HR | 212 | 0x03 / 0x06 / 0x10 |
После экземпляра 1: следующий свободный DI — 210 → округление до 224; COIL — 207 → округление до 208; IR — 206; HR — 214.
Экземпляр 2 — M0_85JT16402
Section titled “Экземпляр 2 — M0_85JT16402”| Канал | Область | Адрес Modbus | Функция Modbus |
|---|---|---|---|
M0_85JT16402.InvalidPV | DI | 224 | 0x02 |
M0_85JT16402.Break | DI | 225 | 0x02 |
M0_85JT16402.ShortCircuit | DI | 226 | 0x02 |
M0_85JT16402.Fault | DI | 227 | 0x02 |
M0_85JT16402.BadSetpointPV | DI | 228 | 0x02 |
M0_85JT16402.HighSpeedAct | DI | 229 | 0x02 |
M0_85JT16402.ForceThAct | DI | 230 | 0x02 |
M0_85JT16402.Invalid | DI | 231 | 0x02 |
M0_85JT16402_CH.BadScale | DI | 232 | 0x02 |
M0_85JT16402_CH.DeadZoneAct | DI | 233 | 0x02 |
M0_85JT16402.OprHighSpeed | COIL | 208 | 0x01 / 0x05 / 0x0F |
M0_85JT16402.OprSim | COIL | 209 | 0x01 / 0x05 / 0x0F |
M0_85JT16402.OprForceThOnBreak | COIL | 210 | 0x01 / 0x05 / 0x0F |
M0_85JT16402.OprThOnShortCircuit | COIL | 211 | 0x01 / 0x05 / 0x0F |
M0_85JT16402.OprForceThOnInvalid | COIL | 212 | 0x01 / 0x05 / 0x0F |
M0_85JT16402.OprUseLastValid | COIL | 213 | 0x01 / 0x05 / 0x0F |
M0_85JT16402.OprHighSpeedReset | COIL | 214 | 0x01 / 0x05 / 0x0F |
M0_85JT16402.PV | IR | 206 | 0x04 |
M0_85JT16402.InPV | IR | 208 | 0x04 |
M0_85JT16402_CH.InPV | IR | 210 | 0x04 |
M0_85JT16402.OprHighSpeedLim | HR | 214 | 0x03 / 0x06 / 0x10 |
M0_85JT16402.ValueOnInvalid | HR | 216 | 0x03 / 0x06 / 0x10 |
M0_85JT16402.ValueOnBreak | HR | 218 | 0x03 / 0x06 / 0x10 |
M0_85JT16402.ValueOnShortCircuit | HR | 220 | 0x03 / 0x06 / 0x10 |
M0_85JT16402.SimPV | HR | 222 | 0x03 / 0x06 / 0x10 |
M0_85JT16402_CH.HighScale | HR | 224 | 0x03 / 0x06 / 0x10 |
M0_85JT16402_CH.LowScale | HR | 226 | 0x03 / 0x06 / 0x10 |
После экземпляра 2: следующий свободный DI — 234 → округление до 240; COIL — 215 → округление до 224; IR — 212; HR — 228.
Экземпляр 3 — M0_85JT16403
Section titled “Экземпляр 3 — M0_85JT16403”| Канал | Область | Адрес Modbus | Функция Modbus |
|---|---|---|---|
M0_85JT16403.InvalidPV | DI | 240 | 0x02 |
M0_85JT16403.Break | DI | 241 | 0x02 |
M0_85JT16403.ShortCircuit | DI | 242 | 0x02 |
M0_85JT16403.Fault | DI | 243 | 0x02 |
M0_85JT16403.BadSetpointPV | DI | 244 | 0x02 |
M0_85JT16403.HighSpeedAct | DI | 245 | 0x02 |
M0_85JT16403.ForceThAct | DI | 246 | 0x02 |
M0_85JT16403.Invalid | DI | 247 | 0x02 |
M0_85JT16403_CH.BadScale | DI | 248 | 0x02 |
M0_85JT16403_CH.DeadZoneAct | DI | 249 | 0x02 |
M0_85JT16403.OprHighSpeed | COIL | 224 | 0x01 / 0x05 / 0x0F |
M0_85JT16403.OprSim | COIL | 225 | 0x01 / 0x05 / 0x0F |
M0_85JT16403.OprForceThOnBreak | COIL | 226 | 0x01 / 0x05 / 0x0F |
M0_85JT16403.OprThOnShortCircuit | COIL | 227 | 0x01 / 0x05 / 0x0F |
M0_85JT16403.OprForceThOnInvalid | COIL | 228 | 0x01 / 0x05 / 0x0F |
M0_85JT16403.OprUseLastValid | COIL | 229 | 0x01 / 0x05 / 0x0F |
M0_85JT16403.OprHighSpeedReset | COIL | 230 | 0x01 / 0x05 / 0x0F |
M0_85JT16403.PV | IR | 212 | 0x04 |
M0_85JT16403.InPV | IR | 214 | 0x04 |
M0_85JT16403_CH.InPV | IR | 216 | 0x04 |
M0_85JT16403.OprHighSpeedLim | HR | 228 | 0x03 / 0x06 / 0x10 |
M0_85JT16403.ValueOnInvalid | HR | 230 | 0x03 / 0x06 / 0x10 |
M0_85JT16403.ValueOnBreak | HR | 232 | 0x03 / 0x06 / 0x10 |
M0_85JT16403.ValueOnShortCircuit | HR | 234 | 0x03 / 0x06 / 0x10 |
M0_85JT16403.SimPV | HR | 236 | 0x03 / 0x06 / 0x10 |
M0_85JT16403_CH.HighScale | HR | 238 | 0x03 / 0x06 / 0x10 |
M0_85JT16403_CH.LowScale | HR | 240 | 0x03 / 0x06 / 0x10 |
В Dictionary.csv полное имя канала — ИмяFB.parName (например, M0_85JT16401.PV, M0_85JT16401_CH.InPV).