Расширить возможности по автоматизации технологических установок путем передачи данных от одноплатного компьютера (Raspberry Pi) к ПЛК (Delta Electronics DVP-SS2) через Modbus RTU.
Например, требуется получить информацию о температурах объекта, а покупать модуль расширения для ПЛК невыгодно. Также хотелось бы узнать, а какая погода будет через час и оповестить об этом ПЛК. На помощь приходить Raspberry Pi (или любой другой одноплатник): по 1-wire подключаем датчики ds18b20, опрашиваем API любимого сайта с погодой или же просто в наглую парсим его, встраиваемся в какое-то устройство по внутренним шинам данных - I2C, UART и забираем нужные нам данные. Так или иначе если информация попала в Raspberry - то мы легко её передадим в ПЛК для работы автоматики.
Проект программы для ПЛК (в WPLSoft) в файле: modbus_slave.dvp
Ниже настройки ПЛК для коммуникации по Modbus RTU, доступные через интерфейс WPLSoft:
Wizzard -> Program Example Generator -> Communication Programm
В коде программы это будет выглядеть так:
В документации на ПЛК. Здесь важно помнить что в столбце Address данные в HEX формате, т.е. доступная область D-регистров начинается с 1000h (4096 в десятичном представлении).
Для примера мы будем записывать значения с какими-то данными (например полученная одноплатником температура с датчиков) в регистры 4096-4100 с каким-то интервалом (например 5 секунд). Регистры 4096-4100 соответсвтуют D0-D4 (см. картинку и пояснения выше).
Для промышленных решений: PyModbus (синхронный) + asyncio для сложных задач
Для быстрого прототипирования: MinimalModbus
Выбираем PyModbus если:
- Нужна полная реализация протокола Modbus;
- Требуется поддержка TCP и других расширенных функций;
- Планируется масштабирование проекта;
- Необходима асинхронная работа.
Установка PyModbus:
pip install pymodbusУстановка MinimalModbus:
pip install minimalmodbusСкрипт ds18b20_modbus.py опрашивает подключенные к Raspberry датчики DS18B20 каждые 5 секунд и полученное значение температуры в градусах Цельсия отправляет по Modbus RTU в ПЛК.
Скрипт использует библиотеку MinimalModbus
Запуск скрипта:
python ds18b20_modbus.pyПояснения к работе скрипта:
- Скрипт передачи данных необходимо запускать на Raspberry;
- Поскольку мы используем преобразователь USB в RS485 то порт Modbus будет
/dev/ttyUSB0; - Класс ModbusRTUWriter - отправляет данные в ПЛК через Modbus RTU
- Температура передается как целое число, умноженное на 10 (для сохранения одного знака после запятой);
- Все операции логируются в файл
temperature_monitor.log
Видео демонстрация стенда с температурами: тыц
Подключить преобразователь USB/RS485 и настроить связь (параметры такие же как и в проекте ПЛК). Если обмен пакетами не просиходит - переверни A и B.
Для теста связи я использую Modbus Poll, для других приложений - аналогично
Ссылка на видео: тыц
Проект программы для ПЛК (в ISPSoft) в архиве: modbus_ISPSoft 3.19.zip
Получим данные о погоде в любимом городе через wttr.in и отправим эти данные по Modbus RTU в ПЛК
Скрипт weather_modbus.py будет автоматически получать температуру каждые 5 минут и отправлять ее в указанный регистр ПЛК.
Особенности скрипта:
- Класс WeatherFetcher - получает температуру из wttr.in для указанного города;
- Интервал обновления - 5 минут (300 секунд);
- Логирование - все операции записываются в файл
weather_modbus.log;
Установка зависимостей:
pip install minimalmodbus requestsЗапуск:
python weather_modbus.pyНастройки которые можно изменить:
WEATHER_REGISTER- номер регистра в ПЛКmodbus_config- параметры Modbus связи- Интервал обновления в
time.sleep() - Город в
WeatherFetcher("Kurgan")
Ссылка на видео: тыц






