Протокол MQTT в Eclipse 4diac
MQTT (Message Queuing Telemetry Transport) — лёгкий протокол pub/sub для IoT и промышленного мониторинга. Широко используется для передачи данных с датчиков в облако или SCADA-системы.
Когда использовать MQTT
✅ Телеметрия с датчиков в реальном времени ✅ Интеграция с облачными платформами (AWS IoT, Azure IoT Hub, Thingsboard) ✅ Много устройств → один брокер ✅ Ненадёжные или медленные каналы связи ❌ Не подходит для синхронных команд (лучше OPC-UA)
Требования
- MQTT-брокер: Eclipse Mosquitto (рекомендуется), HiveMQ, EMQX
- FORTE собранный с
-DFORTE_COM_MQTT=ON
Установка Mosquitto-брокера
# Ubuntu / Debian
sudo apt install mosquitto mosquitto-clients
sudo systemctl enable mosquitto
Публикация данных (PUBLISH)
Структура FB:
┌──────────────────────────┐
INIT ──►│ │──► CNF
REQ ──►│ PUBLISH_1 │
│ ID = "mqtt://broker │
│ #factory/temp/sensor1" │
│ SD_1: REAL │
└──────────────────────────┘
Пример применения:
E_CYCLE(T#5s) ──EO──► SENSOR_READ ──EO──► PUBLISH_1
temperature ──────► SD_1
Параметры PUBLISH_1:
ID = "mqtt://192.168.1.100#factory/line1/temperature"
SD_1 = (значение температуры в REAL)
Формат параметра ID для MQTT:
mqtt://[username:password@]hostname[:port]#topic[/path]
Примеры:
mqtt://localhost#sensors/temp # локальный брокер
mqtt://user:pass@broker.io:1883#prod # с аутентификацией
mqtt://192.168.1.100#factory/line1/rpm # по IP
Подписка на данные (SUBSCRIBE)
Структура FB:
┌──────────────────────────┐
INIT ──►│ │──► CNF
│ SUBSCRIBE_1 │──► IND
│ ID = "mqtt://broker │
│ #commands/actuator1" │
│ RD_1: STRING │
└──────────────────────────┘
При получении сообщения срабатывает событие IND, а RD_1 содержит значение.
Качество обслуживания (QoS)
FORTE поддерживает все уровни QoS:
| QoS | Гарантия | Применение |
|---|---|---|
| 0 | Не более 1 раза (fire & forget) | Высокочастотная телеметрия |
| 1 | Не менее 1 раза (с подтверждением) | Команды управления |
| 2 | Ровно 1 раз (двойное подтверждение) | Критические данные |
Уровень QoS задаётся в параметре ID:
mqtt://broker#topic[qos=1]
Пример: Мониторинг температуры
Полная система из 3 FB:
E_CYCLE(5s) ──►[TEMP_SENSOR]──────►[PUBLISH_1]
temperature(REAL) ──► SD_1
ID = "mqtt://mqtt.factory.local#monitoring/room1/temp"
Проверка в командной строке:
# Подписаться и смотреть данные
mosquitto_sub -h 192.168.1.100 -t "monitoring/room1/temp" -v
# Ожидаемый вывод:
monitoring/room1/temp 23.5
monitoring/room1/temp 23.7
monitoring/room1/temp 23.4
Безопасность
Для продакшн-систем обязательно настройте:
# /etc/mosquitto/mosquitto.conf
listener 8883
cafile /certs/ca.crt
certfile /certs/server.crt
keyfile /certs/server.key
require_certificate false
allow_anonymous false
password_file /etc/mosquitto/passwd
Подключение с TLS в FORTE:
mqtts://user:pass@broker.io:8883#topic # mqtts = MQTT over TLS
Интеграция с Thingsboard
Thingsboard — популярная IoT-платформа для визуализации:
FORTE PUBLISH ──[MQTT]──► Thingsboard
SD_1 = {"temperature": 23.5}
topic = "v1/devices/me/telemetry"
ID = "mqtt://demo.thingsboard.io#v1/devices/me/telemetry"
В Thingsboard используйте токен устройства как имя пользователя:
mqtt://ACCESS_TOKEN@demo.thingsboard.io#v1/devices/me/telemetry
Следующий шаг
- Modbus TCP — интеграция с ПЛК и датчиками по Modbus
- HTTP API — отправка данных в REST-сервисы