Контроллер отвечает на запросы из браузера, SCADA и своих скриптов. Достаточно обычного HTTP: прочитать JSON и записать текстовые команды. База: http://<IP>/.

Ниже — для инженера, который подключает внешнюю систему. Оператор все те же действия делает мышью в веб-интерфейсе.

Примеры рассчитаны на доступ без пароля или уже выполненную авторизацию. Подставьте адрес устройства.

Вход

Если включён пароль на просмотр, без сессии данные не отдадут.

  POST /auth
Content-Type: text/plain

пароль
w
  

Вторая строка — роль: r просмотр, u пользователь, w администратор. Успех — cookie сессии и ответ {"result":"ok"}.

Дальше cookie нужно передавать с запросами. Менять значения и настройки могут пользователь и администратор.

Что читать: GET /json

ЗапросЗачем
/json?allРазовая загрузка: паспорт устройства, настройки, список программ. Текущих значений нет
/json?stateЖивые значения, пользовательские аварии, состояние программы
/json?staticМодель, версии прошивок, сколько каналов
/json?settingsИмена и типы тегов, сеть, пароли (скрыты)
/json?scriptsФайлы в хранилище
/json?events&limit=200Журнал
/json?chart&start=…&end=…Точки графиков за интервал (время unix)

Опрос с объекта:

  curl -s "http://192.168.0.10/json?state"
  

В state смотрите массивы val (входы, выходы, регистры в привычном виде) и поле alarms — биты пользовательских аварий. Системные аварии веб показывает в шапке; сбросить их можно командой ниже. Кратко о программе — блок py (имя, работает или нет, причина останова).

Что писать: POST /conf

Тело — строки имя=значение. Так меняют и уставки, и настройки.

  curl -s -d "devName=Печь-1
val-r0=650
val-do0=1
" "http://192.168.0.10/conf"
  

Ответ {"result":"ok"} или сообщение, какой ключ не принят.

КлючПример
Живое значениеval-r0, val-do0, val-ao0, val-doPwm0
Имя и тип регистраr0-name, r0-type, r0-web, r0-ext
Каналdi0-name, do0-en, ai0-type
Имя аварии или событияa0-name, e0-name
Сеть, время, Modbus, SNMPeth-ip, time-zone, mb-addr
Имя устройства, язык, автозапускdevName, webLang, pyStart

Запись значений подчиняется тем же правам, что страница «Управление». Программа может писать теги независимо от этого.

Команды: POST /cmd?…

  curl -s -X POST "http://192.168.0.10/cmd?reset=alarms"
curl -s -X POST "http://192.168.0.10/cmd?devReboot"
  
КомандаДействие
reset=alarms / alarmsSysСброс пользовательских или системных аварий
reset=userRegs / userPins / userAlarms / userEventsСброс настройки соответствующего раздела
reset=settЗаводские настройки
settCopy / settRestoreКопия настроек внутри устройства и откат
devRebootПерезагрузка
logMetricClear / logEventClearОчистка журналов
pyClearУдалить все сценарии

Программы

ЗапросСмысл
GET /json?scriptsСписок
GET /txt?script&code=<номер>Текст программы
POST /script?runLastЗапустить последнюю
POST /script?run&code=<номер>Запустить из памяти
POST /script?runStdin&name=имя.pyЗапустить текст из тела запроса
POST /script?stopОстановить
POST /script?save&code=<номер>Сохранить тело запроса
POST /script?build&code=<номер>Собрать C без запуска

Журнал и диагностика текстом

Событие в JSON — набор чисел: время, тип (0 авария, 1 конфигурация, 2 сервис, 3 управление), источник (0 — контроллер, иначе программа), код, причина, необязательные параметры.

Для человека удобнее страница Отладка. Тот же текст можно открыть запросом:

АдресЧто смотреть
/txt?runtimeШаги сценария, длительность, память. См. Python и C
/txt?outКонсоль программы
/txt?allПолный отчёт (его же кладут в снапшот)

Файлы и прошивка

ЗапросСмысл
GET /bin?settingsСкачать конфигурацию (как кнопка на «Сервис»)
POST /binЗагрузить этот файл
GET /firmwareСтраница обновления
POST /firmware?fn=<имя>Передать файл прошивки
GET /fwstateХод обновления

Внешняя система за пять шагов

  1. Один раз прочитать /json?static и /json?settings — какие теги есть.
  2. Циклически читать /json?state.
  3. Писать уставки через /conf (val-r0=…).
  4. Аварии — поле alarms и при необходимости /cmd?reset=alarms.
  5. Не разбирать служебный поток веб-интерфейса: для SCADA достаточно JSON.

Подключение из интернета без своего VPN — через сервер, не открывая порт каждого щита.