Описание модуля для протокола 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-файла

Общие параметры

Параметр

Тип

Описание

manufacturer

string

Название производителя

description

string

Краткое описание модуля

type

string

Строковый тип контроллера, для которого предназначен модуль. Например "CA100"

version

number

Версия формата описания, пока всегда 1

moduleID

number

Числовой идентификатор модуля (например, 3584 для 0x0E00). Размерность — 3 байта.

moduleVer

number

Числовая версия модуля или аппаратная ревизия платы. Размерность — 1 байт.

pubName

string

Пользовательское имя модуля

busAddr

number

Адрес модуля на шине (обычно 0, если модуль один)

Массив rxobjects

Массив rxobjects содержит объекты протокола ECPP для чтения (данные, поступающие от модуля).

Параметры объекта:

Параметры rxobjects

Параметр

Тип

Описание

ecppID

number

Числовой идентификатор объекта (от 0 до 65535)

size

number

Размер объекта в байтах, не может быть больше 16

comment

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 для описания переменных.

Параметры группы:

Параметр

Тип

Описание

intName

string

Внутреннее имя группы (только латиница и цифры)

pubName

string

Пользовательское имя группы для отображения в интерфейсе

service

bool

Флаг системной группы. Если true, в группу помещаются служебные переменные (версия, модель и т.д.). Если не указан — false.

vars

array

Массив переменных, входящих в группу

Групповые параметры:

В группе можно задать параметры, которые будут применяться ко всем переменным массива vars, если они не переопределены индивидуально. К таким параметрам относятся: writable, readable, groupID, groupMode. Например, указав в группе параметр "readable" : false, в описании переменных этот параметр можно не указывать, все переменные возьмут значение этого параметра из группы.

Секция описания переменных vars

Массив vars описывает отдельные переменные (входы/выходы модуля).

Параметры переменной:

Параметр

Тип

Описание

datatype

string

Тип данных (см. таблицу ниже)

vdef

number

Значение по умолчанию (если отсутствует, то 0)

pubname

string

Пользовательское название переменной

intname

string

Внутреннее имя переменной (только латинские буквы и цифры). Используется как идентификатор

shortname

string (опционально)

Краткое наименование для отображения на блоке

description

string (опционально)

Описание переменной для пользователя

ecppID

number

Идентификатор объекта ECPP, в котором находится значение (должен быть описан в rxobjects или txobjects)

ecppOffsetAddr

number

Смещение от начала объекта в байтах (для Bool — в битах)

groupID

string (опционально)

Имя группы для объединения в универсальные каналы

groupMode

number (опционально)

Режим работы универсальной переменной (см. таблицу режимов)

writable

boolean

Доступность для записи (размещена в tx-объекте)

readable

boolean

Доступность для чтения (размещена в rx-объекте)

Важно

В параметре intname допускается использовать только латинские буквы и цифры. Использование знаков препинания, пробелов и служебных символов запрещено.

Во избежание конфликтов идентификаторов при работе с несколькими модулями в одной системе рекомендуется включать в intname префикс, соответствующий типу модуля. Например, вместо A1 следует указывать E00.A1 — это гарантирует уникальность имени в глобальном пространстве переменных.

Типы данных:

Тип

Описание

"Bool"

Логический (1 бит)

"UInt8"

Беззнаковый 8-битный

"UInt16"

Беззнаковый 16-битный

"UInt32"

Беззнаковый 32-битный

"UInt64"

Беззнаковый 64-битный

"SInt8"

Знаковый 8-битный

"SInt16"

Знаковый 16-битный

"SInt32"

Знаковый 32-битный

"SInt64"

Знаковый 64-битный

"Float32"

32-битный с плавающей запятой (IEEE 754)

"Float64"

64-битный с плавающей запятой (IEEE 754)

Режимы работы groupMode

Параметры groupID и groupMode объединяют переменные в универсальные каналы. Это нужно, когда несколько переменных относятся к одному физическому каналу (например, АЦП, напряжение, сопротивление — всё с одного входа).

Основные правила:

  1. Один физический канал = один groupID

  2. Переменная с groupMode = 0управляющая (задает режим работы канала)

  3. Остальные переменные с тем же groupID, но разными groupModeданные (напряжение, сопротивление, ток и т.д.)

  4. Программа отображает ту переменную, чей groupMode совпадает со значением управляющей переменной

Значения groupMode:

Режим

Значение (hex)

Описание

Управляющий

0x00

Переменная задаёт режим работы канала (должна быть одна на groupID)

ext_in_a

0x10

Аналоговый вход — сырые данные АЦП (UInt16)

ext_volt3_3

0x20

Напряжение 0–3.3 В (Float32)

ext_volt10

0x30

Напряжение 0–10 В (Float32)

ext_cur

0x40

Ток 4–20 мА (Float32)

ext_res

0x50

Сопротивление в Омах (Float32)

ext_din

0x60

Дискретный вход (Bool)

ext_cntr

0x70

Счетчик импульсов (UInt16)

ext_frec

0x80

Частота в Гц (UInt16)

ext_out_d

0x90

Дискретный выход (Bool)

ext_out_a

0xA0

Аналоговый выход 0–10 В (значение 0–1000)

ext_out_a_5

0xA1

Аналоговый выход 0–5 В (значение 0–1000)

ext_out_a_24

0xA2

Аналоговый выход 0–24 В (значение 0–1000)

ext_out_v24

0x11

Дискретный выход 0–24 В

ext_out_spwm

0x13

Медленный ШИМ

ext_out_fpwm

0x14

Быстрый ШИМ

ext_ref

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}
        ]
    }
]