Skip to content

Пример адресации 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 и т.д.):

TAGOBJTYPENAMETemplateisMappedparentDescr (пример)
M0_85JT16401AiProc34_20mA_namurxТемпература шкафа 1
M0_85JT16402AiProc34_20mA_namurxТемпература шкафа 2
M0_85JT16403AiProc34_20mA_namurxТемпература шкафа 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 (строка с именем шаблона в колонке template1template5). Для этого шаблона активны два алиаса:

aliasTreiFBbodyЭкземпляр FB Unimod 2
base0AiProc3[TAG][TAG]AiProc3
channel_4_20mA_namurAiChnl_4_20mA_namur[TAG]_CH[TAG]_CHAiChnl_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 в карту не попадают.

mappingИмя FBTreiFBКаналФункция ModbusОписание (рус.)
1DI[TAG]AiProc3InvalidPV0x02Недостоверность входного сигнала
2DI[TAG]AiProc3Break0x02Обрыв
3DI[TAG]AiProc3ShortCircuit0x02Короткое замыкание
4DI[TAG]AiProc3Fault0x02Неисправность
5DI[TAG]AiProc3BadSetpointPV0x02Ошибка уставок
6DI[TAG]AiProc3HighSpeedAct0x02Сработка превышения предельной скорости изменения
7DI[TAG]AiProc3ForceThAct0x02Принудительная сработка уставок
8DI[TAG]AiProc3Invalid0x02Недостоверность значения процесса
9DI[TAG]_CHAiChnl_4_20mA_namurBadScale0x02Ошибка шкалы
10DI[TAG]_CHAiChnl_4_20mA_namurDeadZoneAct0x02Значение в зоне нечувствительности

Занято на экземпляр: 10 бит.

mappingИмя FBTreiFBКаналФункция ModbusОписание (рус.)
1COIL[TAG]AiProc3OprHighSpeed0x01 / 0x05 / 0x0FАктивация мониторинга предельной скорости изменения
2COIL[TAG]AiProc3OprSim0x01 / 0x05 / 0x0FСимуляция активна
3COIL[TAG]AiProc3OprForceThOnBreak0x01 / 0x05 / 0x0FВзводить уставки при обрыве
4COIL[TAG]AiProc3OprThOnShortCircuit0x01 / 0x05 / 0x0FВзводить уставки при КЗ
5COIL[TAG]AiProc3OprForceThOnInvalid0x01 / 0x05 / 0x0FВзводить уставки при недостоверности модуля
6COIL[TAG]AiProc3OprUseLastValid0x01 / 0x05 / 0x0FИспользовать последнее достоверное
7COIL[TAG]AiProc3OprHighSpeedReset0x01 / 0x05 / 0x0FСброс превышения предельной скорости изменения

Занято на экземпляр: 7 бит.

mappingИмя FBTreiFBКаналФункция ModbusОписание (рус.)
1real3x[TAG]AiProc3PV0x04Значение процесса
2real3x[TAG]AiProc3InPV0x04Значение процесса входное
3real3x[TAG]_CHAiChnl_4_20mA_namurInPV0x04Входное токовое значение

Занято на экземпляр: 3 канала × 2 регистра (mapping = real3x) = 6 регистров.

mappingИмя FBTreiFBКаналФункция ModbusОписание (рус.)
1real4x[TAG]AiProc3OprHighSpeedLim0x03 / 0x06 / 0x10Уставка предельной скорости изменения
2real4x[TAG]AiProc3ValueOnInvalid0x03 / 0x06 / 0x10Значение параметра при недостоверности по модулю
3real4x[TAG]AiProc3ValueOnBreak0x03 / 0x06 / 0x10Значение канала при обрыве
4real4x[TAG]AiProc3ValueOnShortCircuit0x03 / 0x06 / 0x10Значение параметра при КЗ
5real4x[TAG]AiProc3SimPV0x03 / 0x06 / 0x10Значение в режиме симуляции
6real4x[TAG]_CHAiChnl_4_20mA_namurHighScale0x03 / 0x06 / 0x10Верхняя граница шкалы
7real4x[TAG]_CHAiChnl_4_20mA_namurLowScale0x03 / 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 в алгоритме адресации.

КаналОбластьАдрес ModbusФункция Modbus
M0_85JT16401.InvalidPVDI2000x02
M0_85JT16401.BreakDI2010x02
M0_85JT16401.ShortCircuitDI2020x02
M0_85JT16401.FaultDI2030x02
M0_85JT16401.BadSetpointPVDI2040x02
M0_85JT16401.HighSpeedActDI2050x02
M0_85JT16401.ForceThActDI2060x02
M0_85JT16401.InvalidDI2070x02
M0_85JT16401_CH.BadScaleDI2080x02
M0_85JT16401_CH.DeadZoneActDI2090x02
M0_85JT16401.OprHighSpeedCOIL2000x01 / 0x05 / 0x0F
M0_85JT16401.OprSimCOIL2010x01 / 0x05 / 0x0F
M0_85JT16401.OprForceThOnBreakCOIL2020x01 / 0x05 / 0x0F
M0_85JT16401.OprThOnShortCircuitCOIL2030x01 / 0x05 / 0x0F
M0_85JT16401.OprForceThOnInvalidCOIL2040x01 / 0x05 / 0x0F
M0_85JT16401.OprUseLastValidCOIL2050x01 / 0x05 / 0x0F
M0_85JT16401.OprHighSpeedResetCOIL2060x01 / 0x05 / 0x0F
M0_85JT16401.PVIR2000x04
M0_85JT16401.InPVIR2020x04
M0_85JT16401_CH.InPVIR2040x04
M0_85JT16401.OprHighSpeedLimHR2000x03 / 0x06 / 0x10
M0_85JT16401.ValueOnInvalidHR2020x03 / 0x06 / 0x10
M0_85JT16401.ValueOnBreakHR2040x03 / 0x06 / 0x10
M0_85JT16401.ValueOnShortCircuitHR2060x03 / 0x06 / 0x10
M0_85JT16401.SimPVHR2080x03 / 0x06 / 0x10
M0_85JT16401_CH.HighScaleHR2100x03 / 0x06 / 0x10
M0_85JT16401_CH.LowScaleHR2120x03 / 0x06 / 0x10

После экземпляра 1: следующий свободный DI — 210 → округление до 224; COIL — 207 → округление до 208; IR — 206; HR — 214.

КаналОбластьАдрес ModbusФункция Modbus
M0_85JT16402.InvalidPVDI2240x02
M0_85JT16402.BreakDI2250x02
M0_85JT16402.ShortCircuitDI2260x02
M0_85JT16402.FaultDI2270x02
M0_85JT16402.BadSetpointPVDI2280x02
M0_85JT16402.HighSpeedActDI2290x02
M0_85JT16402.ForceThActDI2300x02
M0_85JT16402.InvalidDI2310x02
M0_85JT16402_CH.BadScaleDI2320x02
M0_85JT16402_CH.DeadZoneActDI2330x02
M0_85JT16402.OprHighSpeedCOIL2080x01 / 0x05 / 0x0F
M0_85JT16402.OprSimCOIL2090x01 / 0x05 / 0x0F
M0_85JT16402.OprForceThOnBreakCOIL2100x01 / 0x05 / 0x0F
M0_85JT16402.OprThOnShortCircuitCOIL2110x01 / 0x05 / 0x0F
M0_85JT16402.OprForceThOnInvalidCOIL2120x01 / 0x05 / 0x0F
M0_85JT16402.OprUseLastValidCOIL2130x01 / 0x05 / 0x0F
M0_85JT16402.OprHighSpeedResetCOIL2140x01 / 0x05 / 0x0F
M0_85JT16402.PVIR2060x04
M0_85JT16402.InPVIR2080x04
M0_85JT16402_CH.InPVIR2100x04
M0_85JT16402.OprHighSpeedLimHR2140x03 / 0x06 / 0x10
M0_85JT16402.ValueOnInvalidHR2160x03 / 0x06 / 0x10
M0_85JT16402.ValueOnBreakHR2180x03 / 0x06 / 0x10
M0_85JT16402.ValueOnShortCircuitHR2200x03 / 0x06 / 0x10
M0_85JT16402.SimPVHR2220x03 / 0x06 / 0x10
M0_85JT16402_CH.HighScaleHR2240x03 / 0x06 / 0x10
M0_85JT16402_CH.LowScaleHR2260x03 / 0x06 / 0x10

После экземпляра 2: следующий свободный DI — 234 → округление до 240; COIL — 215 → округление до 224; IR — 212; HR — 228.

КаналОбластьАдрес ModbusФункция Modbus
M0_85JT16403.InvalidPVDI2400x02
M0_85JT16403.BreakDI2410x02
M0_85JT16403.ShortCircuitDI2420x02
M0_85JT16403.FaultDI2430x02
M0_85JT16403.BadSetpointPVDI2440x02
M0_85JT16403.HighSpeedActDI2450x02
M0_85JT16403.ForceThActDI2460x02
M0_85JT16403.InvalidDI2470x02
M0_85JT16403_CH.BadScaleDI2480x02
M0_85JT16403_CH.DeadZoneActDI2490x02
M0_85JT16403.OprHighSpeedCOIL2240x01 / 0x05 / 0x0F
M0_85JT16403.OprSimCOIL2250x01 / 0x05 / 0x0F
M0_85JT16403.OprForceThOnBreakCOIL2260x01 / 0x05 / 0x0F
M0_85JT16403.OprThOnShortCircuitCOIL2270x01 / 0x05 / 0x0F
M0_85JT16403.OprForceThOnInvalidCOIL2280x01 / 0x05 / 0x0F
M0_85JT16403.OprUseLastValidCOIL2290x01 / 0x05 / 0x0F
M0_85JT16403.OprHighSpeedResetCOIL2300x01 / 0x05 / 0x0F
M0_85JT16403.PVIR2120x04
M0_85JT16403.InPVIR2140x04
M0_85JT16403_CH.InPVIR2160x04
M0_85JT16403.OprHighSpeedLimHR2280x03 / 0x06 / 0x10
M0_85JT16403.ValueOnInvalidHR2300x03 / 0x06 / 0x10
M0_85JT16403.ValueOnBreakHR2320x03 / 0x06 / 0x10
M0_85JT16403.ValueOnShortCircuitHR2340x03 / 0x06 / 0x10
M0_85JT16403.SimPVHR2360x03 / 0x06 / 0x10
M0_85JT16403_CH.HighScaleHR2380x03 / 0x06 / 0x10
M0_85JT16403_CH.LowScaleHR2400x03 / 0x06 / 0x10

В Dictionary.csv полное имя канала — ИмяFB.parName (например, M0_85JT16401.PV, M0_85JT16401_CH.InPV).