Описание модуля для протокола ECPP
Протокол ECPP используется для обмена данными между основным и подчиненными модулями контроллера. Обмен выполняется небольшими пакетами (не более 16 байт), каждый из которых имеет фиксированный числовой идентификатор. Данные передаются только при их изменении. Координатором передачи выступает основной модуль.
Чтобы основной модуль мог опрашивать подчиненные модули, ему необходимо описание внутренней структуры объектов, реализованных в подчиненных модулях. Это описание оформляется в JSON-файле.
Для базовых модулей контроллеров описание содержится в ресурсах zWorkbench и не доступно для редактирования. Для сторонних разработчиков доступна разработка дополнительных модулей для контроллера CA100. Тип модуля должен иметь значение в диапазоне от 0x0E00 до 0x0EFF.
Полный пример описания модуля 0x0E00
Ниже приведен пример модуля типа 0E00 и его описания в формате JSON. Модуль имеет 4 группы входов/выходов:
Универсальные контакты A1–A8 — каждый контакт может работать в различных режимах (дискретный вход, АЦП, сопротивление, ток, счетчик, частота, напряжение, аналоговый выход).
Дискретные входы B1–B8 — только дискретные входы.
Входы напряжения C1–C8 — только измерение напряжения.
Реле Q1–Q8 — управление реле и их аварийные состояния.
Структура модуля E00 в виде дерева:
Группа "Универсальные контакты A1-A8"
├── Контакт A1
│ ├── A1:Din
│ ├── A1:ADC
│ ├── A1:Res
│ ├── A1:Cur
│ ├── A1:Cnt
│ ├── A1:Freq
│ ├── A1:Volt
│ └── A1:DOut
├── Контакт A2
│ ├── A2:Din
│ ├── A2:ADC
│ ├── A2:Res
│ ├── A2:Cur
│ ├── A2:Cnt
│ ├── A2:Freq
│ ├── A2:Volt
│ └── A2:DOut
├── Контакт A3
│ ├── A3:Din
│ ├── A3:ADC
│ ├── A3:Res
│ ├── A3:Cur
│ ├── A3:Cnt
│ ├── A3:Freq
│ ├── A3:Volt
│ └── A3:DOut
├── Контакт A4
│ ├── A4:Din
│ ├── A4:ADC
│ ├── A4:Res
│ ├── A4:Cur
│ ├── A4:Cnt
│ ├── A4:Freq
│ ├── A4:Volt
│ └── A4:DOut
├── Контакт A5
│ ├── A5:Din
│ ├── A5:ADC
│ ├── A5:Res
│ ├── A5:Cur
│ ├── A5:Cnt
│ ├── A5:Freq
│ ├── A5:Volt
│ └── A5:DOut
├── Контакт A6
│ ├── A6:Din
│ ├── A6:ADC
│ ├── A6:Res
│ ├── A6:Cur
│ ├── A6:Cnt
│ ├── A6:Freq
│ ├── A6:Volt
│ └── A6:DOut
├── Контакт A7
│ ├── A7:Din
│ ├── A7:ADC
│ ├── A7:Res
│ ├── A7:Cur
│ ├── A7:Cnt
│ ├── A7:Freq
│ ├── A7:Volt
│ └── A7:DOut
└── Контакт A8
├── A8:Din
├── A8:ADC
├── A8:Res
├── A8:Cur
├── A8:Cnt
├── A8:Freq
├── A8:Volt
└── A8:DOut
Группа "Дискретные входы B1-B8"
├── B1:Din
├── B2:Din
├── B3:Din
├── B4:Din
├── B5:Din
├── B6:Din
├── B7:Din
└── B8:Din
Группа "Входы напряжения C1-C8"
├── C1:Volt
├── C2:Volt
├── C3:Volt
├── C4:Volt
├── C5:Volt
├── C6:Volt
├── C7:Volt
└── C8:Volt
Группа "Реле Q1-Q8"
├── Q1
├── Q2
├── Q3
├── Q4
├── Q5
├── Q6
├── Q7
└── Q8
Кроме того имеются переменные для настройки параметров «Время фильтрации» и «Время подсчета частоты», а так-же для чтения ошибок модуля «Код ошибки».
JSON-описание модуля E00:
{
"manufacturer": "Zentec",
"description": "Универсальный модуль входов-выходов",
"type": "CA100",
"version": 1,
"moduleID": 3584,
"moduleVer": 0,
"pubName": "Модуль E00",
"busAddr": 0,
"rxobjects": [
{"ecppID": 128, "size": 8, "comment" : "Данные о версии и исполнении модуля, обязательный объект, объявлять переменные в группе vars не нужно"},
{"ecppID": 256, "size": 8, "comment" : "Счетчики статистики шины данных, обязательный объект, объявлять переменные в группе vars не нужно"},
{"ecppID": 12, "size": 1, "comment" : "A1-A8 - Дискретные входы, каждый бит отвечает за определенный вход"},
{"ecppID": 14, "size": 1, "comment" : "B1-B8 - Дискретные входы, каждый бит отвечает за определенный вход"},
{"ecppID": 32, "size": 16, "comment" : "A1-A8 - Сырые данные АЦП"},
{"ecppID": 48, "size": 16, "comment" : "A1-A4 - Сопротивление(float)"},
{"ecppID": 49, "size": 16, "comment" : "A5-A8 - Сопротивление(float)"},
{"ecppID": 80, "size": 16, "comment" : "A1-A4 - Ток(float)"},
{"ecppID": 81, "size": 16, "comment" : "A5-A8 - Ток(float)"},
{"ecppID": 72, "size": 16, "comment" : "A1-A8 - счетный режим"},
{"ecppID": 64, "size": 16, "comment" : "A1-A8 - частотный режим"},
{"ecppID": 56, "size": 16, "comment" : "A1-A4 - Напряжение(float)"},
{"ecppID": 57, "size": 16, "comment" : "A5-A8 - Напряжение(float)"},
{"ecppID": 58, "size": 16, "comment" : "C1-C4 - Напряжение(float)"},
{"ecppID": 59, "size": 16, "comment" : "C5-C8 - Напряжение(float)"},
{"ecppID": 208,"size": 1}
],
"txobjects": [
{"ecppID": 13, "size": 2, "comment" : "1 байт - 8 бит управление реле Q1-Q8, 2 байт - 8 бит состояния реле в режиме аварии"},
{"ecppID": 16, "size": 16, "comment" : "8*u16 - AOUT - выходное напряжение, 0,01В"},
{"ecppID": 40, "size": 8, "comment" : "Конфигурация контактов A1-A8"},
{"ecppID": 41, "size": 4, "comment" : "Настройки входов"}
],
"groups" :
[
{
"intName" : "E00",
"pubName" : "Модуль E00",
"service": true,
"writable": true,
"readable": true,
"vars": [
{ "datatype": "UInt8", "vdef": 0, "pubname": "Код ошибки", "intname": "ErrCode", "shortname": "ErrCode", "writable": false, "ecppID": 208, "ecppOffsetAddr": 0},
{ "datatype": "UInt16", "vdef": 2, "pubname": "Время фильтрации", "description" : "Время фильтрации для цифровых входов на включение, мс", "intname": "E00.TimeFilter", "ecppID": 41, "ecppOffsetAddr": 0},
{ "datatype": "UInt16", "vdef": 1000, "pubname": "Время подсчета частоты", "description" : "Время подсчета частоты цифрового сигнала, мс", "intname": "E00.TimeFreq", "ecppID": 41, "ecppOffsetAddr": 2}
]
},
{
"intName" : "E00.A",
"pubName" : "Универсальные контакты A",
"vars": [
{"datatype": "Bool", "vdef": "0", "pubname": "A1:Дискретный вход", "intname": "E00.A1Din", "shortname": "A1:Din", "writable": false, "readable": true, "groupID": "A1", "groupMode": 96, "ecppID": 12, "ecppOffsetAddr": 0},
{"datatype": "Bool", "vdef": "0", "pubname": "A2:Дискретный вход", "intname": "E00.A2Din", "shortname": "A2:Din", "writable": false, "readable": true, "groupID": "A2", "groupMode": 96, "ecppID": 12, "ecppOffsetAddr": 1},
{"datatype": "Bool", "vdef": "0", "pubname": "A3:Дискретный вход", "intname": "E00.A3Din", "shortname": "A3:Din", "writable": false, "readable": true, "groupID": "A3", "groupMode": 96, "ecppID": 12, "ecppOffsetAddr": 2},
{"datatype": "Bool", "vdef": "0", "pubname": "A4:Дискретный вход", "intname": "E00.A4Din", "shortname": "A4:Din", "writable": false, "readable": true, "groupID": "A4", "groupMode": 96, "ecppID": 12, "ecppOffsetAddr": 3},
{"datatype": "Bool", "vdef": "0", "pubname": "A5:Дискретный вход", "intname": "E00.A5Din", "shortname": "A5:Din", "writable": false, "readable": true, "groupID": "A5", "groupMode": 96, "ecppID": 12, "ecppOffsetAddr": 4},
{"datatype": "Bool", "vdef": "0", "pubname": "A6:Дискретный вход", "intname": "E00.A6Din", "shortname": "A6:Din", "writable": false, "readable": true, "groupID": "A6", "groupMode": 96, "ecppID": 12, "ecppOffsetAddr": 5},
{"datatype": "Bool", "vdef": "0", "pubname": "A7:Дискретный вход", "intname": "E00.A7Din", "shortname": "A7:Din", "writable": false, "readable": true, "groupID": "A7", "groupMode": 96, "ecppID": 12, "ecppOffsetAddr": 6},
{"datatype": "Bool", "vdef": "0", "pubname": "A8:Дискретный вход", "intname": "E00.A8Din", "shortname": "A8:Din", "writable": false, "readable": true, "groupID": "A8", "groupMode": 96, "ecppID": 12, "ecppOffsetAddr": 7},
{"datatype": "UInt16", "vdef": "0", "pubname": "A1:АЦП", "intname": "E00.A1ADC", "shortname": "A1:ADC", "writable": false, "readable": true, "groupID": "A1", "groupMode": 16, "ecppID": 32, "ecppOffsetAddr": 0},
{"datatype": "UInt16", "vdef": "0", "pubname": "A2:АЦП", "intname": "E00.A2ADC", "shortname": "A2:ADC", "writable": false, "readable": true, "groupID": "A2", "groupMode": 16, "ecppID": 32, "ecppOffsetAddr": 2},
{"datatype": "UInt16", "vdef": "0", "pubname": "A3:АЦП", "intname": "E00.A3ADC", "shortname": "A3:ADC", "writable": false, "readable": true, "groupID": "A3", "groupMode": 16, "ecppID": 32, "ecppOffsetAddr": 4},
{"datatype": "UInt16", "vdef": "0", "pubname": "A4:АЦП", "intname": "E00.A4ADC", "shortname": "A4:ADC", "writable": false, "readable": true, "groupID": "A4", "groupMode": 16, "ecppID": 32, "ecppOffsetAddr": 6},
{"datatype": "UInt16", "vdef": "0", "pubname": "A5:АЦП", "intname": "E00.A5ADC", "shortname": "A5:ADC", "writable": false, "readable": true, "groupID": "A5", "groupMode": 16, "ecppID": 32, "ecppOffsetAddr": 8},
{"datatype": "UInt16", "vdef": "0", "pubname": "A6:АЦП", "intname": "E00.A6ADC", "shortname": "A6:ADC", "writable": false, "readable": true, "groupID": "A6", "groupMode": 16, "ecppID": 32, "ecppOffsetAddr": 10},
{"datatype": "UInt16", "vdef": "0", "pubname": "A7:АЦП", "intname": "E00.A7ADC", "shortname": "A7:ADC", "writable": false, "readable": true, "groupID": "A7", "groupMode": 16, "ecppID": 32, "ecppOffsetAddr": 12},
{"datatype": "UInt16", "vdef": "0", "pubname": "A8:АЦП", "intname": "E00.A8ADC", "shortname": "A8:ADC", "writable": false, "readable": true, "groupID": "A8", "groupMode": 16, "ecppID": 32, "ecppOffsetAddr": 14},
{"datatype": "Float32", "vdef": "0", "pubname": "A1:Сопротивление", "intname": "E00.A1Res", "shortname": "A1:Res", "writable": false, "readable": true, "groupID": "A1", "groupMode": 80, "ecppID": 48, "ecppOffsetAddr": 0},
{"datatype": "Float32", "vdef": "0", "pubname": "A2:Сопротивление", "intname": "E00.A2Res", "shortname": "A2:Res", "writable": false, "readable": true, "groupID": "A2", "groupMode": 80, "ecppID": 48, "ecppOffsetAddr": 4},
{"datatype": "Float32", "vdef": "0", "pubname": "A3:Сопротивление", "intname": "E00.A3Res", "shortname": "A3:Res", "writable": false, "readable": true, "groupID": "A3", "groupMode": 80, "ecppID": 48, "ecppOffsetAddr": 8},
{"datatype": "Float32", "vdef": "0", "pubname": "A4:Сопротивление", "intname": "E00.A4Res", "shortname": "A4:Res", "writable": false, "readable": true, "groupID": "A4", "groupMode": 80, "ecppID": 48, "ecppOffsetAddr": 12},
{"datatype": "Float32", "vdef": "0", "pubname": "A5:Сопротивление", "intname": "E00.A5Res", "shortname": "A5:Res", "writable": false, "readable": true, "groupID": "A5", "groupMode": 80, "ecppID": 49, "ecppOffsetAddr": 0},
{"datatype": "Float32", "vdef": "0", "pubname": "A6:Сопротивление", "intname": "E00.A6Res", "shortname": "A6:Res", "writable": false, "readable": true, "groupID": "A6", "groupMode": 80, "ecppID": 49, "ecppOffsetAddr": 4},
{"datatype": "Float32", "vdef": "0", "pubname": "A7:Сопротивление", "intname": "E00.A7Res", "shortname": "A7:Res", "writable": false, "readable": true, "groupID": "A7", "groupMode": 80, "ecppID": 49, "ecppOffsetAddr": 8},
{"datatype": "Float32", "vdef": "0", "pubname": "A8:Сопротивление", "intname": "E00.A8Res", "shortname": "A8:Res", "writable": false, "readable": true, "groupID": "A8", "groupMode": 80, "ecppID": 49, "ecppOffsetAddr": 12},
{"datatype": "Float32", "vdef": "0", "pubname": "A1:Ток", "intname": "E00.A1Cur", "shortname": "A1:Cur", "writable": false, "readable": true, "groupID": "A1", "groupMode": 64, "ecppID": 80, "ecppOffsetAddr": 0},
{"datatype": "Float32", "vdef": "0", "pubname": "A2:Ток", "intname": "E00.A2Cur", "shortname": "A2:Cur", "writable": false, "readable": true, "groupID": "A2", "groupMode": 64, "ecppID": 80, "ecppOffsetAddr": 4},
{"datatype": "Float32", "vdef": "0", "pubname": "A3:Ток", "intname": "E00.A3Cur", "shortname": "A3:Cur", "writable": false, "readable": true, "groupID": "A3", "groupMode": 64, "ecppID": 80, "ecppOffsetAddr": 8},
{"datatype": "Float32", "vdef": "0", "pubname": "A4:Ток", "intname": "E00.A4Cur", "shortname": "A4:Cur", "writable": false, "readable": true, "groupID": "A4", "groupMode": 64, "ecppID": 80, "ecppOffsetAddr": 12},
{"datatype": "Float32", "vdef": "0", "pubname": "A5:Ток", "intname": "E00.A5Cur", "shortname": "A5:Cur", "writable": false, "readable": true, "groupID": "A5", "groupMode": 64, "ecppID": 81, "ecppOffsetAddr": 0},
{"datatype": "Float32", "vdef": "0", "pubname": "A6:Ток", "intname": "E00.A6Cur", "shortname": "A6:Cur", "writable": false, "readable": true, "groupID": "A6", "groupMode": 64, "ecppID": 81, "ecppOffsetAddr": 4},
{"datatype": "Float32", "vdef": "0", "pubname": "A7:Ток", "intname": "E00.A7Cur", "shortname": "A7:Cur", "writable": false, "readable": true, "groupID": "A7", "groupMode": 64, "ecppID": 81, "ecppOffsetAddr": 8},
{"datatype": "Float32", "vdef": "0", "pubname": "A8:Ток", "intname": "E00.A8Cur", "shortname": "A8:Cur", "writable": false, "readable": true, "groupID": "A8", "groupMode": 64, "ecppID": 81, "ecppOffsetAddr": 12},
{"datatype": "UInt16", "vdef": "0", "pubname": "A1:Счетный", "intname": "E00.A1Cnt", "shortname": "A1:Cnt", "writable": false, "readable": true, "description": "", "groupID": "A1", "groupMode": 112, "ecppID": 72, "ecppOffsetAddr": 0},
{"datatype": "UInt16", "vdef": "0", "pubname": "A2:Счетный", "intname": "E00.A2Cnt", "shortname": "A2:Cnt", "writable": false, "readable": true, "description": "", "groupID": "A2", "groupMode": 112, "ecppID": 72, "ecppOffsetAddr": 2},
{"datatype": "UInt16", "vdef": "0", "pubname": "A3:Счетный", "intname": "E00.A3Cnt", "shortname": "A3:Cnt", "writable": false, "readable": true, "description": "", "groupID": "A3", "groupMode": 112, "ecppID": 72, "ecppOffsetAddr": 4},
{"datatype": "UInt16", "vdef": "0", "pubname": "A4:Счетный", "intname": "E00.A4Cnt", "shortname": "A4:Cnt", "writable": false, "readable": true, "description": "", "groupID": "A4", "groupMode": 112, "ecppID": 72, "ecppOffsetAddr": 6},
{"datatype": "UInt16", "vdef": "0", "pubname": "A5:Счетный", "intname": "E00.A5Cnt", "shortname": "A5:Cnt", "writable": false, "readable": true, "description": "", "groupID": "A5", "groupMode": 112, "ecppID": 72, "ecppOffsetAddr": 8},
{"datatype": "UInt16", "vdef": "0", "pubname": "A6:Счетный", "intname": "E00.A6Cnt", "shortname": "A6:Cnt", "writable": false, "readable": true, "description": "", "groupID": "A6", "groupMode": 112, "ecppID": 72, "ecppOffsetAddr": 10},
{"datatype": "UInt16", "vdef": "0", "pubname": "A7:Счетный", "intname": "E00.A7Cnt", "shortname": "A7:Cnt", "writable": false, "readable": true, "description": "", "groupID": "A7", "groupMode": 112, "ecppID": 72, "ecppOffsetAddr": 12},
{"datatype": "UInt16", "vdef": "0", "pubname": "A8:Счетный", "intname": "E00.A8Cnt", "shortname": "A8:Cnt", "writable": false, "readable": true, "description": "", "groupID": "A8", "groupMode": 112, "ecppID": 72, "ecppOffsetAddr": 14},
{"datatype": "UInt16", "vdef": "0", "pubname": "A1:Частотный", "intname": "E00.A1Freq", "shortname": "A1:Freq", "writable": false, "readable": true, "description": "", "groupID": "A1", "groupMode": 128, "ecppID": 64, "ecppOffsetAddr": 0},
{"datatype": "UInt16", "vdef": "0", "pubname": "A2:Частотный", "intname": "E00.A2Freq", "shortname": "A2:Freq", "writable": false, "readable": true, "description": "", "groupID": "A2", "groupMode": 128, "ecppID": 64, "ecppOffsetAddr": 2},
{"datatype": "UInt16", "vdef": "0", "pubname": "A3:Частотный", "intname": "E00.A3Freq", "shortname": "A3:Freq", "writable": false, "readable": true, "description": "", "groupID": "A3", "groupMode": 128, "ecppID": 64, "ecppOffsetAddr": 4},
{"datatype": "UInt16", "vdef": "0", "pubname": "A4:Частотный", "intname": "E00.A4Freq", "shortname": "A4:Freq", "writable": false, "readable": true, "description": "", "groupID": "A4", "groupMode": 128, "ecppID": 64, "ecppOffsetAddr": 6},
{"datatype": "UInt16", "vdef": "0", "pubname": "A5:Частотный", "intname": "E00.A5Freq", "shortname": "A5:Freq", "writable": false, "readable": true, "description": "", "groupID": "A5", "groupMode": 128, "ecppID": 64, "ecppOffsetAddr": 8},
{"datatype": "UInt16", "vdef": "0", "pubname": "A6:Частотный", "intname": "E00.A6Freq", "shortname": "A6:Freq", "writable": false, "readable": true, "description": "", "groupID": "A6", "groupMode": 128, "ecppID": 64, "ecppOffsetAddr": 10},
{"datatype": "UInt16", "vdef": "0", "pubname": "A7:Частотный", "intname": "E00.A7Freq", "shortname": "A7:Freq", "writable": false, "readable": true, "description": "", "groupID": "A7", "groupMode": 128, "ecppID": 64, "ecppOffsetAddr": 12},
{"datatype": "UInt16", "vdef": "0", "pubname": "A8:Частотный", "intname": "E00.A8Freq", "shortname": "A8:Freq", "writable": false, "readable": true, "description": "", "groupID": "A8", "groupMode": 128, "ecppID": 64, "ecppOffsetAddr": 14},
{"datatype": "Float32", "vdef": "0", "pubname": "A1:Напряжение", "intname": "E00.A1Volt", "shortname": "A1:Volt", "writable": false, "readable": true, "groupID": "A1", "groupMode": 48, "ecppID": 56, "ecppOffsetAddr": 0},
{"datatype": "Float32", "vdef": "0", "pubname": "A2:Напряжение", "intname": "E00.A2Volt", "shortname": "A2:Volt", "writable": false, "readable": true, "groupID": "A2", "groupMode": 48, "ecppID": 56, "ecppOffsetAddr": 4},
{"datatype": "Float32", "vdef": "0", "pubname": "A3:Напряжение", "intname": "E00.A3Volt", "shortname": "A3:Volt", "writable": false, "readable": true, "groupID": "A3", "groupMode": 48, "ecppID": 56, "ecppOffsetAddr": 8},
{"datatype": "Float32", "vdef": "0", "pubname": "A4:Напряжение", "intname": "E00.A4Volt", "shortname": "A4:Volt", "writable": false, "readable": true, "groupID": "A4", "groupMode": 48, "ecppID": 56, "ecppOffsetAddr": 12},
{"datatype": "Float32", "vdef": "0", "pubname": "A5:Напряжение", "intname": "E00.A5Volt", "shortname": "A5:Volt", "writable": false, "readable": true, "groupID": "A5", "groupMode": 48, "ecppID": 57, "ecppOffsetAddr": 0},
{"datatype": "Float32", "vdef": "0", "pubname": "A6:Напряжение", "intname": "E00.A6Volt", "shortname": "A6:Volt", "writable": false, "readable": true, "groupID": "A6", "groupMode": 48, "ecppID": 57, "ecppOffsetAddr": 4},
{"datatype": "Float32", "vdef": "0", "pubname": "A7:Напряжение", "intname": "E00.A7Volt", "shortname": "A7:Volt", "writable": false, "readable": true, "groupID": "A7", "groupMode": 48, "ecppID": 57, "ecppOffsetAddr": 8},
{"datatype": "Float32", "vdef": "0", "pubname": "A8:Напряжение", "intname": "E00.A8Volt", "shortname": "A8:Volt", "writable": false, "readable": true, "groupID": "A8", "groupMode": 48, "ecppID": 57, "ecppOffsetAddr": 12},
{"datatype": "UInt16", "vdef": 0, "pubname": "A1:Выход напряжения", "intname": "E00.A1OUT", "shortname": "A1:DOut", "writable": true, "readable": false, "groupID": "A1", "groupMode": 160, "ecppID": 16, "ecppOffsetAddr": 0},
{"datatype": "UInt16", "vdef": 0, "pubname": "A2:Выход напряжения", "intname": "E00.A2OUT", "shortname": "A2:DOut", "writable": true, "readable": false, "groupID": "A2", "groupMode": 160, "ecppID": 16, "ecppOffsetAddr": 2},
{"datatype": "UInt16", "vdef": 0, "pubname": "A3:Выход напряжения", "intname": "E00.A3OUT", "shortname": "A3:DOut", "writable": true, "readable": false, "groupID": "A3", "groupMode": 160, "ecppID": 16, "ecppOffsetAddr": 4},
{"datatype": "UInt16", "vdef": 0, "pubname": "A4:Выход напряжения", "intname": "E00.A4OUT", "shortname": "A4:DOut", "writable": true, "readable": false, "groupID": "A4", "groupMode": 160, "ecppID": 16, "ecppOffsetAddr": 6},
{"datatype": "UInt16", "vdef": 0, "pubname": "A5:Выход напряжения", "intname": "E00.A5OUT", "shortname": "A5:DOut", "writable": true, "readable": false, "groupID": "A5", "groupMode": 160, "ecppID": 16, "ecppOffsetAddr": 8},
{"datatype": "UInt16", "vdef": 0, "pubname": "A6:Выход напряжения", "intname": "E00.A6OUT", "shortname": "A6:DOut", "writable": true, "readable": false, "groupID": "A6", "groupMode": 160, "ecppID": 16, "ecppOffsetAddr": 10},
{"datatype": "UInt16", "vdef": 0, "pubname": "A7:Выход напряжения", "intname": "E00.A7OUT", "shortname": "A7:DOut", "writable": true, "readable": false, "groupID": "A7", "groupMode": 160, "ecppID": 16, "ecppOffsetAddr": 12},
{"datatype": "UInt16", "vdef": 0, "pubname": "A8:Выход напряжения", "intname": "E00.A8OUT", "shortname": "A8:DOut", "writable": true, "readable": false, "groupID": "A8", "groupMode": 160, "ecppID": 16, "ecppOffsetAddr": 14},
{"datatype": "UInt8", "vdef": "96", "pubname": "A1:Режим", "intname": "E00.A1Mode", "writable": true, "readable": false, "groupID": "A1", "groupMode": 0, "ecppID": 40, "ecppOffsetAddr": 0},
{"datatype": "UInt8", "vdef": "96", "pubname": "A2:Режим", "intname": "E00.A2Mode", "writable": true, "readable": false, "groupID": "A2", "groupMode": 0, "ecppID": 40, "ecppOffsetAddr": 1},
{"datatype": "UInt8", "vdef": "96", "pubname": "A3:Режим", "intname": "E00.A3Mode", "writable": true, "readable": false, "groupID": "A3", "groupMode": 0, "ecppID": 40, "ecppOffsetAddr": 2},
{"datatype": "UInt8", "vdef": "96", "pubname": "A4:Режим", "intname": "E00.A4Mode", "writable": true, "readable": false, "groupID": "A4", "groupMode": 0, "ecppID": 40, "ecppOffsetAddr": 3},
{"datatype": "UInt8", "vdef": "96", "pubname": "A5:Режим", "intname": "E00.A5Mode", "writable": true, "readable": false, "groupID": "A5", "groupMode": 0, "ecppID": 40, "ecppOffsetAddr": 4},
{"datatype": "UInt8", "vdef": "96", "pubname": "A6:Режим", "intname": "E00.A6Mode", "writable": true, "readable": false, "groupID": "A6", "groupMode": 0, "ecppID": 40, "ecppOffsetAddr": 5},
{"datatype": "UInt8", "vdef": "96", "pubname": "A7:Режим", "intname": "E00.A7Mode", "writable": true, "readable": false, "groupID": "A7", "groupMode": 0, "ecppID": 40, "ecppOffsetAddr": 6},
{"datatype": "UInt8", "vdef": "96", "pubname": "A8:Режим", "intname": "E00.A8Mode", "writable": true, "readable": false, "groupID": "A8", "groupMode": 0, "ecppID": 40, "ecppOffsetAddr": 7}
]
},
{
"intName" : "E00.B",
"pubName" : "Группа входов B",
"writable": false,
"readable": true,
"vars": [
{"datatype": "Bool", "vdef": "0", "pubname": "B1:Дискретный вход", "intname": "E00.B1Din", "shortname": "B1:Din", "ecppID": 14, "ecppOffsetAddr": 0},
{"datatype": "Bool", "vdef": "0", "pubname": "B2:Дискретный вход", "intname": "E00.B2Din", "shortname": "B2:Din", "ecppID": 14, "ecppOffsetAddr": 1},
{"datatype": "Bool", "vdef": "0", "pubname": "B3:Дискретный вход", "intname": "E00.B3Din", "shortname": "B3:Din", "ecppID": 14, "ecppOffsetAddr": 2},
{"datatype": "Bool", "vdef": "0", "pubname": "B4:Дискретный вход", "intname": "E00.B4Din", "shortname": "B4:Din", "ecppID": 14, "ecppOffsetAddr": 3},
{"datatype": "Bool", "vdef": "0", "pubname": "B5:Дискретный вход", "intname": "E00.B5Din", "shortname": "B5:Din", "ecppID": 14, "ecppOffsetAddr": 4},
{"datatype": "Bool", "vdef": "0", "pubname": "B6:Дискретный вход", "intname": "E00.B6Din", "shortname": "B6:Din", "ecppID": 14, "ecppOffsetAddr": 5},
{"datatype": "Bool", "vdef": "0", "pubname": "B7:Дискретный вход", "intname": "E00.B7Din", "shortname": "B7:Din", "ecppID": 14, "ecppOffsetAddr": 6},
{"datatype": "Bool", "vdef": "0", "pubname": "B8:Дискретный вход", "intname": "E00.B8Din", "shortname": "B8:Din", "ecppID": 14, "ecppOffsetAddr": 7}
]
},
{
"intName" : "E00.C",
"pubName" : "Группа входов C",
"writable": false,
"readable": true,
"vars": [
{"datatype": "Float32", "vdef": "0", "pubname": "C1:Напряжение", "intname": "E00.C1Volt", "shortname": "C1:Volt", "ecppID": 58, "ecppOffsetAddr": 0},
{"datatype": "Float32", "vdef": "0", "pubname": "C2:Напряжение", "intname": "E00.C2Volt", "shortname": "C2:Volt", "ecppID": 58, "ecppOffsetAddr": 4},
{"datatype": "Float32", "vdef": "0", "pubname": "C3:Напряжение", "intname": "E00.C3Volt", "shortname": "C3:Volt", "ecppID": 58, "ecppOffsetAddr": 8},
{"datatype": "Float32", "vdef": "0", "pubname": "C4:Напряжение", "intname": "E00.C4Volt", "shortname": "C4:Volt", "ecppID": 58, "ecppOffsetAddr": 12},
{"datatype": "Float32", "vdef": "0", "pubname": "C5:Напряжение", "intname": "E00.C5Volt", "shortname": "C5:Volt", "ecppID": 59, "ecppOffsetAddr": 0},
{"datatype": "Float32", "vdef": "0", "pubname": "C6:Напряжение", "intname": "E00.C6Volt", "shortname": "C6:Volt", "ecppID": 59, "ecppOffsetAddr": 4},
{"datatype": "Float32", "vdef": "0", "pubname": "C7:Напряжение", "intname": "E00.C7Volt", "shortname": "C7:Volt", "ecppID": 59, "ecppOffsetAddr": 8},
{"datatype": "Float32", "vdef": "0", "pubname": "C8:Напряжение", "intname": "E00.C8Volt", "shortname": "C8:Volt", "ecppID": 59, "ecppOffsetAddr": 12}
]
},
{
"intName" : "E00.Q",
"pubName" : "Группа реле",
"writable": true,
"readable": false,
"vars": [
{"datatype": "Bool", "vdef": 0, "pubname": "Q1", "intname": "E00.Q1", "shortname": "Q1", "ecppID": 13, "ecppOffsetAddr": 0},
{"datatype": "Bool", "vdef": 0, "pubname": "Q2", "intname": "E00.Q2", "shortname": "Q2", "ecppID": 13, "ecppOffsetAddr": 1},
{"datatype": "Bool", "vdef": 0, "pubname": "Q3", "intname": "E00.Q3", "shortname": "Q3", "ecppID": 13, "ecppOffsetAddr": 2},
{"datatype": "Bool", "vdef": 0, "pubname": "Q4", "intname": "E00.Q4", "shortname": "Q4", "ecppID": 13, "ecppOffsetAddr": 3},
{"datatype": "Bool", "vdef": 0, "pubname": "Q5", "intname": "E00.Q5", "shortname": "Q5", "ecppID": 13, "ecppOffsetAddr": 4},
{"datatype": "Bool", "vdef": 0, "pubname": "Q6", "intname": "E00.Q6", "shortname": "Q6", "ecppID": 13, "ecppOffsetAddr": 5},
{"datatype": "Bool", "vdef": 0, "pubname": "Q7", "intname": "E00.Q7", "shortname": "Q7", "ecppID": 13, "ecppOffsetAddr": 6},
{"datatype": "Bool", "vdef": 0, "pubname": "Q8", "intname": "E00.Q8", "shortname": "Q8", "ecppID": 13, "ecppOffsetAddr": 7},
{"datatype": "Bool", "vdef": 0, "pubname": "Аварийное состояние Q1", "intname": "E00.Q1ERR", "ecppID": 13, "ecppOffsetAddr": 8},
{"datatype": "Bool", "vdef": 0, "pubname": "Аварийное состояние Q2", "intname": "E00.Q2ERR", "ecppID": 13, "ecppOffsetAddr": 9},
{"datatype": "Bool", "vdef": 0, "pubname": "Аварийное состояние Q3", "intname": "E00.Q3ERR", "ecppID": 13, "ecppOffsetAddr": 10},
{"datatype": "Bool", "vdef": 0, "pubname": "Аварийное состояние Q4", "intname": "E00.Q4ERR", "ecppID": 13, "ecppOffsetAddr": 11},
{"datatype": "Bool", "vdef": 0, "pubname": "Аварийное состояние Q5", "intname": "E00.Q5ERR", "ecppID": 13, "ecppOffsetAddr": 12},
{"datatype": "Bool", "vdef": 0, "pubname": "Аварийное состояние Q6", "intname": "E00.Q6ERR", "ecppID": 13, "ecppOffsetAddr": 13},
{"datatype": "Bool", "vdef": 0, "pubname": "Аварийное состояние Q7", "intname": "E00.Q7ERR", "ecppID": 13, "ecppOffsetAddr": 14},
{"datatype": "Bool", "vdef": 0, "pubname": "Аварийное состояние Q8", "intname": "E00.Q8ERR", "ecppID": 13, "ecppOffsetAddr": 15}
]
}
]
}
Примечание
Для сторонних разработчиков доступны идентификаторы модулей в диапазоне 0x0E00 – 0x0EFF (десятичные значения: 3584 – 3839). Это позволяет создавать собственные модули, совместимые с протоколом ECPP.
Детальное описание формата JSON-файла
Общие параметры
Параметр |
Тип |
Описание |
|---|---|---|
|
string |
Название производителя |
|
string |
Краткое описание модуля |
|
string |
Строковый тип контроллера, для которого предназначен модуль. Например |
|
number |
Версия формата описания, пока всегда |
|
number |
Числовой идентификатор модуля (например, |
|
number |
Числовая версия модуля или аппаратная ревизия платы. Размерность — 1 байт. |
|
string |
Пользовательское имя модуля |
|
number |
Адрес модуля на шине (обычно 0, если модуль один) |
Массив rxobjects
Массив rxobjects содержит объекты протокола ECPP для чтения (данные, поступающие от модуля).
Параметры объекта:
Параметр |
Тип |
Описание |
|---|---|---|
|
number |
Числовой идентификатор объекта (от 0 до 65535) |
|
number |
Размер объекта в байтах, не может быть больше 16 |
|
string (опционально) |
Комментарий к объекту с описанием его структуры |
Важно
Массив rxobjects обязательно должен содержать два служебных объекта с идентификаторами 128 и 256, размер каждого - 8 байт. В них хранится информация о модуле, версия ПО и служебные данные протокола.
Служебные переменные (версия модуля, идентификатор, статус и т.п.) автоматически помещаются в группу, помеченную флагом «service»: true. Если в описании модуля отсутствует группа с таким флагом, система создаст её автоматически. Имя такой группы будет сформировано по шаблону: «Модуль XXX», где XXX — значение параметра moduleID из общего описания модуля.
{ "ecppID": 128, "size": 8 },
{ "ecppID": 256, "size": 8 }
Массив txobjects
Массив txobjects содержит объекты протокола ECPP для записи (команды управления модулем). Структура аналогична rxobjects.
"txobjects": [
{ "ecppID": 13, "size": 2 },
{ "ecppID": 16, "size": 16 }
]
Массив groups — группы переменных
Массив groups объединяет переменные в логические группы для отображения в визуальном интерфейсе. Каждый объект в этом массиве описывает одну группу и содержит массив vars для описания переменных.
Параметры группы:
Параметр |
Тип |
Описание |
|---|---|---|
|
string |
Внутреннее имя группы (только латиница и цифры) |
|
string |
Пользовательское имя группы для отображения в интерфейсе |
|
bool |
Флаг системной группы. Если |
|
array |
Массив переменных, входящих в группу |
Групповые параметры:
В группе можно задать параметры, которые будут применяться ко всем переменным массива vars, если они не переопределены индивидуально. К таким параметрам относятся: writable, readable, groupID, groupMode. Например, указав в группе параметр "readable" : false, в описании переменных этот параметр можно не указывать, все переменные возьмут значение этого параметра из группы.
Секция описания переменных vars
Массив vars описывает отдельные переменные (входы/выходы модуля).
Параметры переменной:
Параметр |
Тип |
Описание |
|---|---|---|
|
string |
Тип данных (см. таблицу ниже) |
|
number |
Значение по умолчанию (если отсутствует, то |
|
string |
Пользовательское название переменной |
|
string |
Внутреннее имя переменной (только латинские буквы и цифры). Используется как идентификатор |
|
string (опционально) |
Краткое наименование для отображения на блоке |
|
string (опционально) |
Описание переменной для пользователя |
|
number |
Идентификатор объекта ECPP, в котором находится значение (должен быть описан в |
|
number |
Смещение от начала объекта в байтах (для Bool — в битах) |
|
string (опционально) |
Имя группы для объединения в универсальные каналы |
|
number (опционально) |
Режим работы универсальной переменной (см. таблицу режимов) |
|
boolean |
Доступность для записи (размещена в tx-объекте) |
|
boolean |
Доступность для чтения (размещена в rx-объекте) |
Важно
В параметре intname допускается использовать только латинские буквы и цифры. Использование знаков препинания, пробелов и служебных символов запрещено.
Во избежание конфликтов идентификаторов при работе с несколькими модулями в одной системе рекомендуется включать в intname префикс, соответствующий типу модуля. Например, вместо A1 следует указывать E00.A1 — это гарантирует уникальность имени в глобальном пространстве переменных.
Типы данных:
Тип |
Описание |
|---|---|
|
Логический (1 бит) |
|
Беззнаковый 8-битный |
|
Беззнаковый 16-битный |
|
Беззнаковый 32-битный |
|
Беззнаковый 64-битный |
|
Знаковый 8-битный |
|
Знаковый 16-битный |
|
Знаковый 32-битный |
|
Знаковый 64-битный |
|
32-битный с плавающей запятой (IEEE 754) |
|
64-битный с плавающей запятой (IEEE 754) |
Режимы работы groupMode
Параметры groupID и groupMode объединяют переменные в универсальные каналы. Это нужно, когда несколько переменных относятся к одному физическому каналу (например, АЦП, напряжение, сопротивление — всё с одного входа).
Основные правила:
Один физический канал = один
groupIDПеременная с
groupMode = 0— управляющая (задает режим работы канала)Остальные переменные с тем же
groupID, но разнымиgroupMode— данные (напряжение, сопротивление, ток и т.д.)Программа отображает ту переменную, чей
groupModeсовпадает со значением управляющей переменной
Значения groupMode:
Режим |
Значение (hex) |
Описание |
|---|---|---|
Управляющий |
0x00 |
Переменная задаёт режим работы канала (должна быть одна на groupID) |
|
0x10 |
Аналоговый вход — сырые данные АЦП (UInt16) |
|
0x20 |
Напряжение 0–3.3 В (Float32) |
|
0x30 |
Напряжение 0–10 В (Float32) |
|
0x40 |
Ток 4–20 мА (Float32) |
|
0x50 |
Сопротивление в Омах (Float32) |
|
0x60 |
Дискретный вход (Bool) |
|
0x70 |
Счетчик импульсов (UInt16) |
|
0x80 |
Частота в Гц (UInt16) |
|
0x90 |
Дискретный выход (Bool) |
|
0xA0 |
Аналоговый выход 0–10 В (значение 0–1000) |
|
0xA1 |
Аналоговый выход 0–5 В (значение 0–1000) |
|
0xA2 |
Аналоговый выход 0–24 В (значение 0–1000) |
|
0x11 |
Дискретный выход 0–24 В |
|
0x13 |
Медленный ШИМ |
|
0x14 |
Быстрый ШИМ |
|
0xB0 |
Источник опорного напряжения |
Пример группировки:
{
"groupID": "AIN1",
"vars": [
{"datatype": "UInt8", "vdef": 48, "groupMode": 0}, // управляющая
{"datatype": "UInt16", "groupMode": 16}, // АЦП
{"datatype": "Float32", "groupMode": 48}, // Напряжение
{"datatype": "Float32", "groupMode": 80} // Сопротивление
]
}
Как это работает: - Если управляющая переменная = 48 → отображается напряжение - Если = 80 → отображается сопротивление - Если = 16 → отображается АЦП
Важно
В каждой группе (по groupID) должна быть только одна переменная с groupMode = 0.
Пример простых переменных (без группировки)
Если переменные не требуется объединять в универсальные каналы, параметры groupID и groupMode можно опустить или оставить пустыми. Переменные будут сгруппированы только визуально в интерфейсе.
"groups": [
{
"intName": "F00",
"pubName": "Модуль F00",
"vars": [
{"datatype": "UInt16", "vdef": 500, "pubname": "Частота сигнала", "intname": "SpeakerFreq", "writable": true, "readable": true, "ecppID": 3584, "ecppOffsetAddr": 0},
{"datatype": "UInt16", "vdef": 50, "pubname": "Громкость", "intname": "Volume", "writable": true, "readable": true, "ecppID": 3584, "ecppOffsetAddr": 2}
]
}
]