Найти в Дзене
7-100

Работа с ModBUS-устройствами из браузера

В прошлой статье описал подключение ModBUS-устройств к Linux

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

Установка web-сервера Apache 2 на Linux

В терминале вводим команду

sudo apt-get install apache2

После установки нам нет необходимости можно проверить установку. Вводим в браузере localhost, Должна появится страница приветствия. Настраивать подключения нет необходимости, потому что будем работать на одном компьютере.

Для программирования нам понадобится скриптовый язык PHP. Установка осуществляется командой:

sudo apt-get install php

После удачной установки нужно разобраться с правми пользователей. Опишу как сделать проще, без заботы о безопасности.

1. Удобнее, когда apache запускается от основного пользователя (по умолчанию www-data). Для изменения из терминала открываем файл конфигурации

sudo nano /etc/apache2/envvars

Меняем переменные

export APACHE_RUN_USER=(имя пользователя)

export APACHE_RUN_GROUP=(имя пользователя)

сохраняем файл.

добавляем пользователя www-data в группу dialout

sudo adduser www-data dialout

есть смысл перезагрузить компьютер.

2. Заходим в папку /var. Папку www открыть как root с контекстного меню. В открытой папке находим папку html. Открываем свойства из контекстного меню. В правах задаем полный доступ к папкам и файлам для пользователя от которого работаем (для начала можно и для всех задать). Закрываем окно папки открытое от администратора. Теперь нужно перезапустить сервисы, легче перезагрузить компьютер.

Теперь можно написать первую программу. Открываем папку /var/www/html. В ней создаем папку Primer. Заходим в эту папку, в ней созаем файл index.php. В файле можете написать

<?php echo 'Привет, МИР!'; ?>

и сохранить его. Затем в браузере набираем адрес localhost/Primer, и мы должны увидеть на странице браузера "Привет, МИР!".

Мы убедились, что apache и php работают.

Подключение приборов

В прошлой статье https://dzen.ru/a/aCLZIGBtABZip2Gz описывал как подключал и настраивал приборы. Здесь опишу в общих чертах.

Для работы с устройствами по протоколу Modbus используем консольную python-утилиту modbus-cli

Установка:

sudo apt install python3-pip
sudo pip3 install modbus_cli

Для обмена по ModBUS RTU RS485 используем преобразователь ОВЕН АС4. Определяется как Silicon Labs CP210x UART Bridge. К нему подключаем модуль аналогового ввода вывода МВ110-8А. Его настройки:

Датчик ДТС054-50М на канале 1, Модбас RTU 9600-8-N-1. Адрес 4.

Из инструкции находим, что нам подходит регистр 1 (Целочисленное значение показания 1-канала). Вводим в терминале:

modbus -b 9600 -s 4 -v /dev/ttyUSB0 1

получаем ответ:

Parsed 0 registers definitions from 1 files

Serial port /dev/ttyUSB0. Parameters: 9600 baud, 1 stop bit(s), parity: N, timeout 5.0s.

→ < 04 03 00 01 00 01 d5 9f >

← < 04 03 02 00 e7 34 0e > 7 bytes

← [231]

1: 231 0xe7

Обмен есть, мы получили температуру в целочисленном представлении, 1 знак после запятой нас вполне устраивает, для этого в программе будем полученное значение делить на 10.

Программа обмена

В папке html создаем еще один файл opros.php. В него записываем программу опроса, который будет происходить фоново на открытой странице.

<?php

$Temper = shell_exec("modbus -b 9600 -s 4 -v /dev/ttyUSB0 1");

$KonProbel = strripos($Temper, ' '); // Находим последний пробел в строке ответа

$Temper = substr($Temper, $KonProbel, 10);

$Temper = hexdec($Temper)/10; // Преобразовываем в dec

echo "Температура от МВ 110-8А: $Temper ºС<br><br>";

?>

В файле index.php напишем скрипт для запуска фоновой задачи opros.php

<div class="container" >

<div class="row">

<div class="col-12">

<h2>

<div id="content"></div>

</h2>

</div>

</div>

</div>

<script type="text/javascript"

src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>

<script>

function timer(){ // функция, которая запрашивает данные с сервера

$.ajax({ // вызываем встроенную функцию, которая поможет нам получить данные с сервера

url: "opros.php", // какой скрипт серверу нужно выполнить

cache: false, // предыдущие ответы не сохраняем

success: function(html){ // если всё хорошо, отправляем ответ от сервера на страницу в блок content

$("#content").html(html);

}

});

}

$(document).ready(function(){ // как только страница полностью загрузилась

timer();

setInterval('timer()',1000); // начинаем каждую секунду запрашивать новые данные

});

</script>

<?php echo 'Урра! получилось'; ?>

Сохраняем и обновляем страницу в браузере localhost/Primer.

Должно получиться:

Температура от МВ 110-8А: 23 ºС

Урра! получилось

В данном примере рассмотрели возможность чтения температуры. Можно легко добавить другие приборы, вывести их значения, записывать данные в файлы в базы данных. Затем строить графики по этим данным. А это уже SCADA-система. В PHP программировать такие вещи очень легко, при этом система будет занята только теми процессами, которые мы зададим, множество фоновых процессов запускаемых в различных SCADA не будут мешать работе. А возможности apache сервера по передаче этих данных в интернет и подключения к этим данным с любых устройств дает такой SCADA-системе очень широкие возможности, без привлечения дополнительных программ.