В прошлой статье я описал подключение ModBUS-устройств к Linux. Нынешняя статья – об использовании подключения для вывода данных и управления приборами с удобного пользовательского интерфейса.
В качестве такого интерфейса мы будем использовать страницу браузера (сайт). Такое решение получается удобным, быстрым, кроссплатформенным запускающимся на всех устройствах, где есть браузер). А браузер, как известно, обращается к web-серверу и в свою очередь с ним обменивается данными. То есть будет система, в которой будет установлен веб-сервер, который обменивается с нашими ModBUS-устройствами, и выводит данные в удобной для нас форме на страницу браузера.
Установка web-сервера Apache 2 на Linux (на примере Debian)
В терминале вводим команду
sudo apt-get install apache2
Для проверки установки вводим в браузере localhost. Должна появится страница приветствия. Настраивать подключения нет необходимости, потому что будем работать на одном компьютере. Для программирования нам понадобится скриптовый язык PHP. Установка осуществляется командой:
sudo apt-get install php
После удачной установки нужно разобраться с правами пользователей. Опишу как сделать проще, без заботы о безопасности.
- Удобнее, когда apache запускается от основного пользователя (по умолчанию www-data). Для изменения из терминала открываем файл конфигурации
sudo nano /etc/apache2/envvars
и меняем переменные
export APACHE_RUN_USER=(имя пользователя)
export APACHE_RUN_GROUP=(имя пользователя)
Сохраняем файл. Добавляем пользователя www-data в группу dialout:
sudo adduser www-data dialout
есть смысл перезагрузить компьютер.
- Заходим в папку /var. Папку www открыть как root с контекстного меню. В открытой папке находим папку html. Открываем свойства из контекстного меню. В правах задаем полный доступ к папкам и файлам для пользователя от которого работаем (для начала можно и для всех задать). Закрываем окно папки открытое от администратора. Теперь нужно перезапустить сервисы, легче перезагрузить компьютер. Теперь можно написать первую программу. Открываем папку /var/www/html. В ней создаем папку Primer. Заходим в эту папку, в ней созаем файл index.php. В файле можете написать
<?php echo 'Привет, МИР!'; ?>
и сохранить его. Затем в браузере набираем адрес localhost/Primer, и мы должны увидеть на странице браузера
«Привет, МИР!».
Мы убедились, что apache и php работают.
Подключение приборов
В прошлой статье я описывал как подключал и настраивал приборы. Здесь опишу в общих чертах.
Установка утилиты (более подробно на https://github.com/epsilonrt/mbpoll) :
sudo apt install mbpoll
Для обмена по ModBUS RTU RS485 используем преобразователь ОВЕН АС4. Определяется как Silicon Labs CP210x UART Bridge. К нему подключаем модуль аналогового ввода вывода МВ110-8А. Его настройки: Датчик ДТС054-50М на канале 1, Модбас RTU 9600-8-N-1. Адрес 4. Из инструкции находим, что нам подходит регистр 1 (Целочисленное значение показания 1-канала). Вводим в терминале:
mbpoll -1 -q -a 4 -b 9600 -P none -o 1 -r 2 /dev/ttyUSB0
получаем ответ:
[2]: 285
Обмен есть, мы получили температуру в целочисленном представлении, 1 знак после запятой нас вполне устраивает, для этого в программе будем полученное значение делить на 10.
Программа обмена
В папке html создаем еще один файл opros.php. В него записываем программу опроса, который будет происходить фоново на открытой странице.
<?php
$Temper = shell_exec("mbpoll -1 -q -a 4 -b 9600 -P none -o 1 -r 2 /dev/ttyUSB0");
$KonProbel = strripos($Temper, ' '); // Находим последний пробел в строке ответа
$Temper = substr($Temper, $KonProbel, 10);
$Temper = $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А: 28.5 ºС
Урра! получилось
В данном примере мы рассмотрели возможность чтения температуры. Можно легко добавить другие приборы, вывести их значения, записывать данные в файлы в базы данных. Затем строить графики по этим данным. А это уже SCADA-система. В PHP программировать такие вещи очень легко, при этом система будет занята только теми процессами, которые мы зададим, множество фоновых процессов запускаемых в различных SCADA не будут мешать работе. А возможности apache сервера по передаче этих данных в интернет и подключения к этим данным с любых устройств дает такой SCADA-системе очень широкие возможности, без привлечения дополнительных программ.
Здесь используется более оптимизированная утилита mbpoll. Такой же текст с использованием утилиты modbus-cli есть на Дзене