МиниSCADA своими руками

в 16:19, , рубрики: Анализ и проектирование систем, Программирование

Однажды, мне позвонили и спросили – могу ли я сделать маленькую автоматизацию для канализационной насосной станции (КНС)? Толком ничего не выспросив и положив трубку я стал раздумывать что и как сделать.

Являясь специалистом по SCADA более 10-ти лет, в основном по продуктам томской компании «Элеси», мне сразу пришло в голову использовать какой-нибудь известный пакет типа TraceMode и ему подобным. Однако, встретившись с заказчиком и узнав более подробно, что ему нужно, решение использовать готовые пакеты отпало.

Задача была проста: исключить бабушку, сидящую в здании КНС и наблюдающую за периодическим процессом раскачки емкости со сточными водами. Насосами управлял ПЛК фирмы Modicon в составе какого-то российского щита управления. Бабушка требовалась на случай аварии насосов, чтобы сообщить ремонтной бригаде и не допустить перелива емкости. Контроль должен был осуществляться дистанционно, функций управления не требовалось.

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

Организация связи

Было решено контролировать работу КНС в браузере через интернет. Тут же появилась задача – каким образом передать данные с КНС, находящейся на задворках одного из районов города? Интернет туда не проведешь, да и глупо это, пришлось бы ставить туда компьютер. ПЛК в щите имел интерфейс RS-485 и поддерживал протокол Modbus (что естественно, т.к. этот протокол и был создан фирмой Modicon).
После долгого гугления на глаза попалось вот такое устройство:

МиниSCADA своими руками
CCU-Wireless COM

Устройство представляет из себя GSM удлинитель COM порта, поддерживает RS-232, RS-485 и RS-422 интерфейсы. Предлагает его НПО «Сибсвязь», а кто разрабатывает, я так и не понял. Обошлось оно в 15 тысяч рублей. Дополнительно была приобретена GSM антенна. В прибор установили симку билайн с тарифом «Телеметрия».

Предприятие уже имело веб-сервер (IIS), поэтому дополнительных затрат не потребовалось. На веб-сервер был установлен драйвер com-порта для связи с CCU, прибор настроен и состоялась проверка связи. С драйвером поставляется программа мониторинга порта, поэтому было сразу видно, что прибор связывается с сервером и мы получаем у себя в системе com-порт, как бы физически подключенный к контроллеру. Теперь с ПЛК можно работать напрямую.

Серверная часть

Каким-то образом нужно было передать данные с com-порта в MySQL базу. Имея небольшие навыки в программировании на VB6 и знание Modbus протокола была написана программа, считывающая регистры с ПЛК и записывающая их в текстовый файл. Прямую запись в базу я не сделал исключительно из-за лени и пары неудачных попыток подружить VB6 с MySQL и еще из-за чего-то, уже не помню. Из-за этого пришлось делать костыль, который работает уже 4-й год и не ломается.

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

В базе были созданы таблицы алармов, названий событий, их важность и т.д. – все, как у взрослых систем. Считывающий скрипт раскладывает в базу все по битам и посылает смс, если сработало нужное событие.

Клиентская часть

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

МиниSCADA своими руками

Картинка нарисована в TraceMode и используется в качестве бэкграунда. Активные элементы это блоки div поверх картинки. Информация обновляется каждые 15 секунд, что даже очень часто, т.к. запуск-останов насосов происходит примерно раз в 40 минут.

Здесь мы видим, что два насоса находятся в автоматическом режиме, нули рядом с насосами это потребляемый ток. В емкости сработал датчик первого уровня.
Информация в браузер приходит посредством AJAX в виде xml:

<shittank>
<signals>
<name>pump1_on</name>
<datatimer>2012-10-04 16:09:05</datatimer>
<name_signal>Работа</name_signal>
<type>B</type>
<alarm_text>насос 1 включен</alarm_text>
<priority>1</priority>
<data>0</data>
</signals>
<signals>
<name>pump1_man</name>
<datatimer>2012-10-04 16:09:05</datatimer>
<name_signal>Ручной</name_signal>
<type>B</type>
<alarm_text>насос 1 ручной режим</alarm_text>
<priority>0</priority>
<data>0</data>
</signals>
…
…
</shittank>

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

При отладке системы столкнулся с проблемой кеширования браузером данных, что мне совсем было не нужно. Проблему решил путем добавления в url рандомного значения:
var url = «update.php?=»+Math.random();

Сигнал «нет связи» формируется при отсутствии ответа от ПЛК в течение 20 минут. При этом посылается смс обслуживающему инженеру. Связь может отсутствовать по причине «забыли положить денег на симку» и отсутствия напряжения в здании КНС.

Кнопка «История» открывает окно истории событий.

МиниSCADA своими руками

Кнопка «Сводка» открывает окно сводки запуска насосов.

МиниSCADA своими руками

В процессе эксплуатации выяснилось, что на экран никто не смотрит, поэтому рисовать все эти красивости и реализовывать отображение а-ля настоящая SCADA не было нужды. Все, что делает оператор – это открывает время от времени историю событий и смотрит, какие были аварии, и в конце месяца вносит в отчет данные по наработкам насосов.

Итог:
Решение работает без сбоев уже четвертый год. Бабушка была уволена, современные технологии победили старость.

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

Автор: Satyricon

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


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