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

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

При этом непосредственное отображение графических объектов выполняется при помощи SVG графики. Действительно такой подход дает возможность сосредоточиться на создании кода web страницы работающего в разных операционных системах, а не создавать отдельное приложение для каждого отдельного проекта.

Очевидно, что такой подход экономит много времени на реализацию проекта, даже если это простой проект для домашней автоматизации.

Редактор SVG


За основу данного редактора мнемосхем был взят свободно распространяемый редактор svg графики svg-edit. Редактор работает на базе html и вполне работоспособен при локальном использовании.

Для того, чтобы интегрировать svg-editor в приложение на PyQt5 необходимо подключить библиотеку QtWebEngineWidgets, причем в Linux проблем не обнаружилось, а вот с первого раза на Windows это сделать не удалось и пришлось обновить PyQt5 до последней версии. На данный момент у меня установлена версия 5.9.3.

Редактор мнемосхем.


Для удобства редактирования html файла проекта, файл разбит на 3 части:
Заголовочная часть — вставляется код от тега html до тега body.

<html lang="ru-RU" >
<head>
<meta name="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<script type="text/javascript" src="./scadapy.js"></script>
<body  onload="init()"  bgcolor='black'>

SVG часть — вставляется код SVG графики.

<svg width="1200" height="899.9999999999999" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
</svg>

Нижняя часть — вставляется код от тега /body до тега /html
</body></html>

После запуска приложения, на экране появится окно со стандартными кнопками управления и несколькими вкладками.

image

В первой вкладке «SVG-edit» располагается SVG редактор, со всеми инструментами необходимыми для редактирования графического объекта.

Во второй вкладке «Html Up» находится текстовый редактор для редактирования заголовочной части html файла.

image

Во вкладке «Html Down» находится текстовый редактор для редактирования нижней части html файла.

image

Во вкладке «SVG body» находится текстовый редактор для редактирования кода графического объекта.

image

Во вкладке «JavaScript» находится текстовый редактор для редактирования кода файла scadapy.js.

image

Во вкладку «View» выводится собранный html файл проекта.

image

Создание проекта.


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

image

После этого во все вкладки загрузятся соответствующие файлы проекта и при переходе на вкладку View можно сразу увидеть html страницу в действии.

Файлы проекта жестко привязаны к каждой вкладке и формируются автоматически:
ind.prj — описание проекта
up.pr — заголовочная часть файла
down.pr — нижняя часть файла
img.svg — svg картинка
scadapy.js — файл сценария на javascript
tmp.html — временный файл html страницы
project.html — сохраненный файл html страницы

Для редактирования svg объекта необходимо загрузить файл img.svg в редактор svg. Для это в меню редактора нужно выбрать пункт «Загрузить изображение», и на экране появится картинка.

image

После этого графический объект можно редактировать и изменять значения.

image

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

Например мы присвоили текстовому объекту id = id_001, теперь в сценарии мы присваиваем ему новое значение:

document.getElementById("id_001").innerHTML = "100.00 A"  

Для изменения цветовой перерисовки, делается приблизительно так:

document.getElementById("job").setAttribute("fill", "#00ff00");

После редактирования svg объектов, их нужно перенести каким-то образом в файл html. Для этого нужно нажать на кнопку \<SVG\> редактора и в появившемся окне скопировать код Ctrl-A Ctrl-C.

image

После этого идем на вкладку «SVG-body» и делаем Ctrl-A Ctrl-V, то есть перенесли скопированный код объекта.

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

Помимо редактора мнемосхем, в приложении можно запустить json.py и srvconf.py.

image

image

Поскольку QtWebEngineWidgets основан на WebKit, то решили, что при нажатии на кнопку «Run project» запустится tmp.html в браузере Google Chrome.

Если этот браузер не установлен, желательно его установить.

Разумеется можно в обработке нажатия кнопки прописать иной браузер.

Скачать можно здесь.

Комментарии (6)


  1. AleksandrFox
    01.01.2018 17:49

    Добрый день. Интересная статья и у меня появилось несколько вопросов по скаде на питоне.
    1. На сколько сложно вносить мелкие изменения в мнемосхемы на ходу людям, которые мало что знают о html, js и т.д? Так как в силу несовершенства проектов сделать один раз и навсегда мнемосхемы не получается и поэтому во время пуско-наладочных работ довольно часто приходится вносить мелкие и не очень изменения, и выполняют их местные инженеры АСУТП, наладчики или даже технологи.
    2. Есть ли библиотеки стандартных элементов для мнемосхем? Насосы, задвижки, регуляторы и прочее? Можно ли создавать самому типовые устройства и повторно их использовать в других проектах?
    3. Нет ли проблем с производительностью? Я встречал мнемосхемы с 100 отображаемых параметров и были нюансы с их открытием и обновлением данных.


    1. jackmas Автор
      01.01.2018 18:25

      Добрый день.
      1. Я думаю для людей не знакомых с web программированием это будет сложно сделать.
      2. Библиотеки существуют, их можно собрать в интернете. В файле svglibs.rar есть немного из того, что я собрал.
      3. Производительность это основная проблема для любой scada системы. Добивается она различными способами. Ну например, чтобы не отображать сразу 100 параметров на одной схеме можно вывести их в журналы предупредительной и аварийной сигнализации по верхним и нижним уставкам (для аналоговых сигналов), а затем группировать в отдельные контейнеры и просматривать по изменению в отдельном окне. В любом случае вы согласитесь со мной, что при большом количестве объектов мнемосхемы, сложно следить за каким то конкретным параметром.
      А то что касается scadapy, то это просто попытка использовать питон для целей автоматизации.
      Как то так.


  1. DarkDemon
    02.01.2018 01:03

    Тоже пользую в качестве scada python( flask + socketio+celery) в качестве бд mongo, + немного приправленно jquery. Мнемосхему отрисовываю прямо в браузере (по факту выбор готовых svg элементов) там же связываю элементы. На данном этапе 200 параметров каждую секунду в интерфейсе обновляю.
    hmi_python


    1. jackmas Автор
      02.01.2018 11:31

      Очень интересно.
      Это можно где-то увидеть, посмотреть?


  1. Obramko
    02.01.2018 12:58

    Поскольку QtWebEngineWidgets основан на WebKit, то решили, что при нажатии на кнопку «Run project» запустится tmp.html в браузере Google Chrome.

    Простите, а как это связано?
    Почему не использовать системный браузер?


    1. jackmas Автор
      02.01.2018 16:55

      Просто crome раньше делался на webkit и в нем более качественно отображаются элементы, никто не мешает вам использовать иной браузер. Например некоторые разработчики асу тп сейчас рекомендуют использовать chromium.