Find file History
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
..
Failed to load latest commit information.
MQTTCore Optimization KpMQTT Jan 22, 2018
Properties Загрузка проекта KpMQTT Jul 15, 2016
KpMQTT.csproj develop Sep 1, 2018
KpMQTTLogic.cs Fix bug JS handler Sep 1, 2018
KpMQTTView.cs Загрузка проекта KpMQTT Jul 15, 2016
MQTTPubTopic.cs
README.md Update Documentation for JS handler Sep 2, 2018

README.md

KpMQTT

Драйвер KpMQTT.dll является прикладной библиотекой для приложения Scada Communicator проекта RapidScada. При помощи данного драйвера можно осуществлять прием и передачу сообщений по протоколу MQTT.

Краткое введение в протокол MQTT.

MQTT - является простым сетевым протоколом, который получил наибольшую популярность в сетях IoT, для обмена информацией между различными устройствами. На текущий момент протокол реализован на достаточно большом количестве языков программирования, в том числе и на C#. Это позволяет реализовать телематику между разнородными системами в виде универсальной шины передачи данных. Спецификация протокола находится по ссылке .

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

Примеры построения топиков.

Обычно описание большинства иерархических объектов можно представить в виде древовидной структуры. Так к примеру описание доступа к каналам RapidScada можно было бы представить в виде следуещего шаблона для ветки дерева:

/rapidobject/rapidkp/rapidcnl , где

  • rapidobject указывает на уникальный номер объекта из справочника объектов RapidScada;
  • rapidkp указывает на уникальный номер КП из справочника КП;
  • rapidcnl указывает на номер канала из справочника входящих каналов;

В итоге имя топика может получиться таким: /1/1/1 (номер объекта/номер КП/номер канала) или таким /1/1/2. Что в целом будет описывать объект №1, который включает в себя КП 1, у которого в свою очередь есть канал №1 и №2.

Именование топиков может быть более определенным при использовании собственных правил кодирования принятых для объекта автоматизации. Но следует учитывать, что общая длинна топика ограничивается стандартом.

Брокеры MQTT.

На странице описания протокола MQTT находится информация по различным реализациям клиентских и серверных приложений. Чаще всего в качестве брокера MQTT для небольших IoT проектов используют сервер Mosquitto . На сайте проекта присутствует достаточный объем документации, который позволит развернуть сервер для различных операционных систем, включая операционную систему Windows. Проект Mosquitto активно поддерживается и соответствует последним версиям спецификации протокола MQTT. Программные пакеты данного брокера доступны также для роутеров на базе ОС OpenWRT. Также есть открытые проекты для установки брокеров масштаба предприятия, которые позволяют выдерживать высокие нагрузки и обеспечивать механизмы отказоустойчивости. Если отсутствует возможность установки собственного MQTT брокера, то можно воспользоваться услугами облачных сервисов развернутых сторонними компаниями. Бесплатный доступ к таким брокерам обычно имеет некоторые ограничения. Примеры таких брокеров:

Для тестирования работоспособности и других задач удобно использотвать графическое клиентское приложение для работы с MQTT брокером. Обзор таких приложений можно найти здесь.

Настройка KpMQTT драйвера для Scada Communicator.

Настройку драйвера KpMQTT можно разделить на 2 этапа:

  • Создание конфигурационного файла для драйвера KpMQTT
  • Создание линии связи, добавление КП и привязка к нему конфигурационого файла

При создании конфигурационного файла для драйвера KpMQTT используются следующие блоковые секции и их атрибуты:

  • Секция MqttParams - данная секция содержит атрибуты, предназначенные для настройки соединения с MQTT брокером.

    • Атрибут Hostname - данный атрибут должен содержать DNS(IP) адрес MQTT брокера. (Пример: iot.eclipse.org)
    • Атрибут ClientID - данный атрибут должен содержать уникальный идентификатор (имя) клиента для подключения к MQTT брокеру.
    • Атрибут Port - этот атриубт должен содержать номер порта, на котором брокер MQTT принимает соединения от клиентских приложений.
    • Атрибут UserName и Password - данные атрибуты содержат имя пользователя и пароль для досутпа к MQTT брокеру. Могут быть пустыми если авторизация не используется и брокер позволяет подключение в таком режиме.
  • Секция RapSrvCnf - данная секция содержит атрибуты, предназначенные для соединения с сервером RapidScada.

    • Атрибут ServerHost - данный атрибут должен содержать IP адрес сервера RapidScada.
    • Атрибут ServerPort - данный атрибут должен содержать номер порта, на котором сервер RapidScada принимает соединения от клиентских приложений.
    • Атрибут ServerUser и ServerPwd - данные атрибуты содержат имя пользователя и пароль для доступа к серверу RapidScada.
  • Секция MqttSubTopics - данная секция является родительской для секции Topic и предназначена для конфигурации подписок на топики.

  • Секция MqttPubTopics - данная секция является родительской для секции Topic и предназначена для конфигурации публикации топиков.

  • Секция MqttPubCmds - данная секция является родительской для секции Topic и предназначена для конфигурации публикации команд Rapid Scada .

  • Секция MqttSubCmds - данная секция является родительской для секции Topic и предназначена для конфигурации подписки на команды поступающие из MQTT брокера в виде строки.

  • Секция MqttSubJSs - данная секция является родительской для секции Topic и предназначена для конфигурации подписки на сообщения, поступающие из MQTT брокера в формате JSON .

  • Секция Topic - данная секция является дочерней для секций MqttPubTopics, MqttSubTopics, MqttPubCmds, MqttSubCmds, MqttSubJSs и предназначена для конфигурации топика.

    • Атрибут TopicName - данный атрибут должен содержать идентификатор топика в виде адреса URI. Этот адрес определяет размещение топика в дереве, описывающем структуру реального объекта.
    • Атрибут QosLevel - данный атрибут определяет значение, влияющее на гарантию доставки сообщения между клиентом и брокером. Данный атрибут может иметь следующие значения: 0 - гарантируется доставка сообщения, на уровне протокола TCP/IP. При этом уровне обеспечивается максимальная производительность. 1 - гарантируется доставка сообщения брокеру от одной и более попыток. При этом уровне происходит некоторое снижение производительности. 2 - гарантируется доставка собщения брокеру и клиенту. При этом уровне обеспечивается маскисмальная надежность с минимальной производительностью.
    • Атрибут NumCnl - данный атрибут определяет номер канала из таблицы конфигурации RapidScada.
    • Атрибут PubBehavior - данный атрибут определяет режим отправки сообщений брокеру и применяется только к Topic, у которых родительская секция MqttPubTopics . Может принимать следующие значения:
      "OnChange" - отправка сообщения брокеру происходит, если текущее значение отличается от предидущего. (В основном используется при подключении к внешним сервисам MQTT, которые ограничвают количество обрабатываемых сообщений)
      "OnAlways" - отправка сообщения брокеру происходит в каждом цикле опроса.
    • Атрибут Retain - данный атрибут определяет поведение сервера при подписке на этот топик. Используется для секции MqttPubTopics .
      "true" - при подписке на топик, сервер сразу же отправит последнее актуальное на момент подписки значение клиенту.
      "false" - при подписке на топик, сервер отправит значение только в момент следующей публикации значения для этого топика.
    • Атрибут NDS - данный атрибут определяет разделитель десятичного разряда для чисел с плавающей точкой. Исользуется для секции MqttPubTopics .
      "." - в качестве десятичного разряда будет использован символ "." .
      "," - в качестве десятичного разряда будет использован символ "," .
    • Атрибут NumCmd - данный атрибут должен содержать номер команды из канала управления. Используется в секциях MqttPubCmds и MqttSubCmds .
    • Атрибут CmdType - данный атрибут должен содержать тип команды. Используется в секции MqttSubCmds . Должен содержать одно из следующих значений:
      "St" - формируется стандартная команда управления. Формат входного значения: "20.02", "20".
      "BinHex" - формируется бинарная команда управления. Формат входного значения должен быть в виде строки из HEX символов.
      "BinTxt" - формируется бинарная команда управления. Формат входного значения должен быть в виде обычной строки UTF-8. "Req" - формируется команда внеочередного опроса КП. Входное значение игнорируется. Используется значение атрибута KpNum.
    • Атрибут KpNum - данный атрибут должен содержать номер КП. Используется в секции MqttSubCmds .
    • Атрибут IDUser - данный атрибут должен содержать идентификатор пользователя из под которого отправляется команада. Используется в секции MqttSubCmds .
    • Атрибут NumCnlCtrl - данный атрибут должен содержать номер канала управления на который будет отправлена команда. Используется в секции MqttSubCmds .
    • Атрибут CnlCnt - данный атрибут должен содержать значение количества каналов, в которые будут записаны значения. Используется в секции MqttSubJSs .
    • Атрибут JSHandlerPath - данный атрибут должен содержать путь до JS файла, который будет обрабатывать JSON значение. Используется в секции MqttSubJSs .

Пример содержания конфигурационного файла для драйвера KpMQTT показан ниже:

<?xml version="1.0" encoding="utf-8"?>
<DevTemplate>

    <MqttParams Hostname="iot.eclipse.org" ClientID="KpMQTTrs111" Port="1883" UserName="" Password=""/>
    <RapSrvCnf ServerHost="xxx.xxx.xxx.xxx" ServerPort="10000" ServerUser="ScadaComm" ServerPwd="12345"/>
    <MqttSubTopics>
        <Topic TopicName="/rsparam1" QosLevel="0" NumCnl="600"/>
    </MqttSubTopics>
    <MqttPubTopics>
        <Topic TopicName="/rsparam10" QosLevel="0" NumCnl="600" PubBehavior="OnChange" Retain="true" NDS="."/>
    </MqttPubTopics>
    <MqttPubCmds>
        <Topic TopicName="/rsparam100" QosLevel="0" NumCmd="1"/>
        <Topic TopicName="/rsparam1000" QosLevel="0" NumCmd="2"/>
    </MqttPubCmds>
    <MqttSubCmds>
        <Topic TopicName="/rsparam10000" QosLevel="0" NumCmd="10" CmdType="St" KPNum="60" IDUser="0" NumCnlCtrl="500"/>
        <Topic TopicName="/rsparam100000" QosLevel="0" NumCmd="10" CmdType="BinHex" KpNum="60" IDUser="0" NumCnlCtrl="501"/>
    </MqttSubCmds>
    <MqttSubJSs>
        <Topic TopicName="/mesparam11" QosLevel="0" CnlCnt="1" JSHandlerPath="/home/RSSCADA/553/RSComm553Run/Config/job.js"/>
    </MqttSubJSs>
</DevTemplate>

Пример JSON строки для обработки скриптом на JavaScript:

{"Num":600,"Val":200.3,"Stat":0}

Пример содержания скрипта на JavaScript для обработки сообщения в формате JSON:

    var obj2 = JSON.parse(InMsg);
    jsvals[0].CnlNum=obj2.Num;
    jsvals[0].Stat=obj2.Stat;
    jsvals[0].Val=obj2.Val;
    mylog("Script return OK");

При разработке скрипта на JavaScript необходимо учитывать следующие условия:

  • Для обработки скриптов используется библиотека Jint
  • Внтури скрипта доступны глобальные функции и переменные:
    • Переменная mqttJS - позволяет получить доступ к информации об имени топика (TopicName), пути по которому расположен обработчик (JSHandlerPath), количество каналов доступных для отправки в RapidScada .
    • Переменная InMsg - позволяет получить строку JSON, полученную от MQTT сервера.
    • Переменная jsvals - позволяет получить доступ для чтения и записи к информации о номере канала (CnlNum), значении (Val) и статусе (Stat).
    • Функция mylog - позволяет записать строковые сообщения в лог системы RapidScada .

Теперь необходимо создать линию связи, добавить КП и привязать к нему конфигурационный файл. Эти операции можно выполнить путем редактирования файла ScadaCommSvcConfig.xml в папке Config приложения ScadaCommunicator, либо при помощи одноименного графического приложения, путем заполнения соответствующих полей.

Ниже приведен пример раздела файла конфигурации ScadaCommunicator, касающийся линии связи:

<!--Линия 17-->
    <CommLine active="true" bind="true" number="17" name="MQTT">
      <CommChannel type="" />
      <LineParams>
        <Param name="ReqTriesCnt" value="3" descr="Количество попыток перезапроса КП при ошибке" />
        <Param name="CycleDelay" value="0" descr="Задержка после цикла опроса, мс" />
        <Param name="CmdEnabled" value="false" descr="Команды ТУ разрешены" />
        <Param name="DetailedLog" value="true" descr="Записывать в журнал подробную информацию" />
      </LineParams>
      <CustomParams />
      <ReqSequence>
        <KP active="true" bind="false" number="42" name="Test MQTT" dll="KpMQTT.dll" address="0" callNum="" timeout="0" delay="60" time="00:00:00" period="00:00:00" cmdLine="KpMQTT_Config.xml" />
      </ReqSequence>
    </CommLine>

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

Описание секций и атрибутов, касающихся работы KpMQTT драйвера:

  • Секция ReqSequence - данная секция является родительской для секции KP и предназначена для конфигурации всех КП на этой линии связи.
  • Секция KP - эта секция содержит настройки определнного типа КП:
    • Атрибут bind (Для GUI: Опрос КП/Выбранный КП/Привязка) - данный атрибут определяет условие привязки каналов к определенному номеру КП из таблицы конфигурации сервера. Должен быть выставлен в false, поскольку в текущей реализации драйвера такой механизм привязки не используется.
    • Атрибут dll (Для GUI: Опрос КП/Выбранный КП/DLL)- данный атрибут определяет имя файла, который используется в качестве драйвера реализуеющего логику КП. Имя файла должно быть утановлено в KpMQTT.dll . Файл драйвера необходимо поместить в папку KP приложения Scada Communicator.
    • Атрибут delay (Для GUI: Опрос КП/Выбранный КП/Пауза)- данный атрибут определяет значение задержки между циклами опроса MQTT брокера. Данное значение выбирается индивидуально в зависимости от требований к механизму сбора данных. В данном случае выбрано значение равное 60.
    • Атрибут cmdLine (Для GUI: Опрос КП/Выбранный КП/Командная строка)- данный атрибут определяет имя файла конфигурации для текущего КП. В данном случае имя файла KpMQTT_Config.xml . Файл располагается в папке Config приложения Scada Communicator.

Каких либо ограничений на количество создаваемых КП в пределах одной линии связи для данного драйвера нет. Но при этом следует учитывать и другие уловия, которые могут оказывать существенное влияние на весь механизм работы линии связи в целом. Если брать во внимание внешние условия, то следует обратить внимание на конфигурационный параметр таймаута брокера MQTT. Общий цикл опроса всех КП на одной линии связи не должен превышать таймаут брокера. При создании более одного КП типа KpMQTT на одной линии связи, следует задавать разные ClientID.

Если в процессе эксплуатации вы обнаружите какие либо проблемы в работе данного драйвера прошу сообщить об этом на электронную почту vvk.kos@gmail.com