Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA

в 13:12, , рубрики: open source, openscada, scada, меркурий200, меркурий230, Промышленное программирование, СКАДА

Для кого
— Для тех кто использует OpenSCADA, но не может реализовать больше чем решения «из коробки»
— Для тех кто ищет СКАДу для себя, но так и не может определится
— Для тех кто забросил этот проект, так и не разобравшись как он работает

Зачем
— Данное решение позволяет считывать показания счетчиков меркурий 230 и меркурий 200 без каких либо лимитов
— Это бесплатно

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 1


Проекту openscada (oscada.org) уделяют не заслужено мало внимания, о нем написана всего одна статья на хабре. Большинство инженеров боятся трогать и трехметровой палкой этот продукт, черт его знает какой этот ваш линукс. Разрабатывает его уже не первый десяток лет фактически один человек, Роман Савоченко.

Не имея раньше опыта со СКАДА вообще (а с линуксом немного дружил) выбрал именно его для реализации мониторинга объектов на предприятии. Так как сравнить мне было не с чем, интерфейс и все связи данных с друг другом я воспринял как должное. Очень помог видеоурок «быстрый старт», лично я считаю таких уроков можно было сделать и побольше. Документацию тоже пришлось перечитывать не раз, но оно того стоило. Подключив первый модуль сбора данных Невод+ долго не мог понять почему он не работает. Ведь как совместимый с протоколом DCON он в списке проекта числился(точнее его аналог). Полез в исходник протокола и… оказалось что совсем он с ним не совместим, как и многие другие модули сбора из списка. Первое обращение на форум проблему мою исправило и еще несколько ошибок довольно оперативно. Рассказывать обо всех тонкостях системы я не буду, лучше прочтите вышеупомянутую статью на хабре или посмотрите «быстрый старт».

Спустя какое то время мне понадобилось снимать показания с электросчетчиков Меркурий 230. Поддержки этих счетчиков в openscada нет. Попробовал утилиту taskgroup от создателя всем известного konfiguratorа, опрашивать счетчики по CSD ей оказалось дохлым номером. Но все не так плохо как могло быть, openscada система предельно модульная и написать свой модуль можно хоть на С++, хоть на языке высокого уровня прямо в ней. Описание протокола обмена для меркурия 230 без проблем можно найти в сети, производитель «Инкотекс» конечно может предоставить вам описание по запросу, но мне не хотелось связываться с этой волокитой.

Итак, подключаем шину со счетчиками, для наглядности и лучшей ориентации в протоколе ставим konfigurator и сниффер последовательно порта, открываем документацию. Пытаемся прочитать данные со счетчика с адресом 75.

все скриншоты кликабельны

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 2

Видим как побежали наши данные.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 3

Протокол обмена для меркурий 230 очень похож на протокол modbus.

Запрос на открытие канала связи предназначен для разрешения доступа к данным с указанием уровня доступа. В счетчике реализован двухуровневый доступ к данным: первый (низший) — уровень потребителя, и второй (высший) — уровень хозяина

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 4

Попытаемся с помощью конфигуратора опросить наш счетчик и видим что первый запрос это и есть пароль, а ответ счетчика это 4 байта. включающие в себя

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 5

Теперь попытаемся это реализовать на openscada. В С++ я не силен, поэтому решил реализовать на языке, встроенном в саму СКАДу, который там зовется JavaLikeCalc.Javascript. Сам код опроса реализуется в двух модулях UserProtocol и DevLib. Создадим устройство в библиотеке устройств и назовем m230. Добавим атрибуты netaddr(сетевой адрес), password(пароль), transport(последовательный порт) и answer(ответ на запрос пароля). И напишем запрос.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 6

Теперь перейдем к протокольной части и создадим в UserProtocol наш пользовательский протокол и назовем его так же m230. Начнем с преобразования сетевого адреса. Код расчета контрольной суммы modbus CRC16 уже был написан давно, мне осталось его только вставить в свой код.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 7

Создадим и транспорт, прописав в нем нужный порт, скорость и тайминги.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 8

Теперь создадим устройства в LogivLev, в нем создадим контроллер а так же параметры (они же и есть счетчики). Выбираем наш шаблон, в конфигурации прописываем сетевой адрес, пароль и транспорт.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 9

Не лишним будет и включить архивацию в соответствующей вкладке.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 10

Переходим ко вкладке Атрибуты и видим наши 4 байта ответа от счетчика. Пароль принят, отлично!!!

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 11

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

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 12

Далее добавим в наш протокол еще строки. Не лишнем будет проверить ответ на тот ли запрос пришел и проверить длину пакета. Каждый 4 байта полезной информации ответа интерпретируется своей последовательностью байт, для чтения энергии она видна на скриншоте. В конце из 16ричной системы данные переводим в десятичную, к тому же это число надо разделить на 1000.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 13

Заходим опять в конфигурацию шаблона, ставим галку «Считывать энергию от сброса» и в атрибутах у нас уже видны данные о тарифах.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 14

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

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 15

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 16

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

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 17

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

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 18

Добавим для наглядности еще несколько счетчиков. Но это не все, данные надо не просто считывать но и представить их в удобном виде. Для этого в openscada существует Vision (рабочий пользовательский интерфейс) в котором данные можно представить в любом удобном для вас виде, хоть в виде мнемосхемы, в виде графиков, в виде документов итд. Возьмем стандартный документ из шаблона и отредактируем его чтобы получилось так.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 19

А в обработку документа добавим строку, чтобы можно было легко читать архивы данных по дням.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 20

В итоге запускаем проект и открываем наш документ.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 21

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

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 22

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

Сетевой адрес тут и есть пароль счетчика. По умолчанию он равен последним 6 цифрам серийного номера. Попробуем написать шаблон.

Вот схема пакета запроса и ответа

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 23

Серийный номер счетчика слишком длинный чтоб уместить его в 32-битное целое число, поэтому поделим его на две части.

Код запроса тарифа 0x27, пишем структуру запроса и выделяем какие байты за какой тариф у нас отвечают. И делим это значение на 100. И проверяем наш ответ на объем символов.

Чтобы считывать мгновенные значения используем код запроса 0х63. Также проверим наш ответ на количество байтов. Нюансы по каждому из этих значений тоже учитываем.

Но что делать если счетчик закодирован программой наладчик+? К счастью как кодирует наладчик+ всем уже давно известно, поэтому добавляем строку в начало нашего кода.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 24

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

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 25

Добавим несколько счетчиков и в конфигурации шаблона пропишем наши настройки.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 26

И во вкладке Атрибуты видим как счетчик отдает нужные нам значения.

Пишем протоколы счетчиков Меркурий 230 и Меркурий 200 для OpenSCADA - 27

Создадим документ чтобы просматривать эти значения в более удобном виде. Отредактируем наш шаблон документа. Запустим наш проект.

Автор: iegova

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js