Шлюз МЭК 104

Материал из Wiren Board
Это утверждённая версия страницы. Она же — наиболее свежая версия.

Описание

МЭК 104 — протокол передачи данных в сетях телеметрии и телемеханики, соответствующий требованиям ГОСТ Р МЭК 60870-5-104. Применяется в системах контроля и управления территориально распределенных систем.

Протокол функционирует на базе стека TCP/IP и использует для передачи данных локальные вычислительные сети (LAN) или глобальные вычислительные сети (WAN).

Для работы с протоколом МЭК 104 в контроллере Wiren Board используется шлюз для трансляции сообщений между MQTT-брокером и системами c поддержкой протокола МЭК 60870-5-104.

Работает с контроллером Wiren Board 6 и 7.

Принцип работы

Передача сообщений из MQTT в МЭК 60870-5-104

Сообщения MQTT передаются в МЭК 60870-5-104 блоками данных (ASDU) с причиной передачи “спорадически”(3). При подключении нового контролирующего устройства, шлюз автоматически высылает последние известные значения всех включенных каналов. В дальнейшем каждое новое MQTT-сообщение сразу же передаётся в МЭК 60870-5-104.

Передача команд МЭК 60870-5-104 в MQTT

Шлюз поддерживает ASDU с типами:

  • одноэлементная команда (C_SC_NA_1);
  • команда уставки, масштабированное значение (C_SE_NB_1);
  • команда уставки, короткое число с плавающей запятой (C_SE_NC_1).

Обрабатывается первый объект информации в ASDU. Если в конфигурационном файле есть включенный канал для адреса этого объекта информации, шлюз произведёт запись полученного значения в соответствующую тему канала, например, /devices/wb-gpio/controls/5V_OUT/on. Также поддерживается команда общего опроса станции (C_IC_NA_1, QOI равный 20), прочие команды не поддерживаются.

Установка

Обновляем список пакетов командой:

apt update

Устанавливаем командой:

apt install wb-mqtt-iec104

При запуске шлюза происходит автоматическое создание конфигурационного файла. При последующих запусках шлюз анализирует доступные MQTT каналы(контролы) и добавляет их в этот файл. Активировать передачу данных конкретных каналов можно, редактируя файл конфигурации, либо воспользовавшись онлайн-редактором настроек.

Шлюз подключается к заданому MQTT брокеру и подписывается на сообщения от каналов, указанных в конфигурационном файле. В системах с поддержкой протокола МЭК 60870-5-104 шлюз выступает в роли контролируемой станции и принимает входящие TCP/IP соединения по указаному в конфигурационном файле локальному интерфейсу и порту.

Настройка в веб-интерфейсе контроллера Wiren Board

Настройка шлюза МЭК-104 в веб-интерфейсе контроллера Wiren Board

После установки шлюза его можно настроить в веб-интерфейсе контроллера, выбрав из списка файл /etc/wb-mqtt-iec104.conf.

В настройках можно указать параметры подключения к MQTT-брокеру и выбрать локальный IP и порт, по которым шлюз будет ожидать подключения. Нажав на кнопку «Properties» можно добавить дополнительные параметры подключения.

Описание структуры конфигурационного файла смотрите в репозитории на Github.

По умолчанию шлюз создаёт отдельную группу для каждого устройства. Список групп можно редактировать.

Список каналов

Уникальный адрес объекта информации согласно МЭК генерируется при старте сервиса, его можно изменить в столбце Unique IEC information object address. Также можно поменять тип объекта информации.

Обработка значения измеряемого параметра

С помощью правил в контроллере можно реализовать передачу значений параметров различных типов, а также задание апертуры измеренного параметра. Апертура — величина изменения параметра для инициализации передачи этого параметра на верхний уровень спорадически (спонтанно при изменении параметра, не по таймеру).

Для реализации этих функций создается виртуальный датчик который принимает измеренное значение, обрабатывает его и передает уже обработанное значение в шлюз МЭК104.

Ниже приведен пример преобразования напряжения в ток, аналогичным образом можно выполнить любые преобразования измеренного сигнала с датчика.

var v_input78 = "wb-adc/EXT1_A7_A8"; //Пишем сюда строку-источник НАПРЯЖЕНИЯ с шунта

defineVirtualDevice("CurrentValue", {
    title: "currentvalue",
    cells: {
	current: {
	    type: "value",
	    value: 0,
        forceDefault: true // при каждой загрузке сценария поле будет получать значение 10
	},
    }
});

defineRule("ChangeVoltage", {
  whenChanged: v_input78,
  then: function (newValue, devName, cellName)  {
	dev["CurrentValue/current"] = newValue/0,0015; //Преобразуем напряжение в ток
  }
});

Доработав этот скрипт под свои нужды можно очень гибко обработать сигнал с датчика.

Для создания временной зоны используется тот же механизм — создается виртуальный датчик, содержащий поля, с помощью которых можно задавать таймзону.

Полезные ссылки