Бесшовная интеграция Modbus-сенсоров с EdgeX Foundry на Raspberry Pi
Бесшовная интеграция Modbus-сенсоров с EdgeX Foundry на Raspberry Pi
Развертывания промышленного Интернета вещей (IIoT) все чаще полагаются на пограничные шлюзы для соединения Modbus-периферии с облачной аналитикой. Создание проприетарного шлюза может быть дорого и медленно. Это исследование демонстрирует, как фреймворк с открытым исходным кодом — EdgeX Foundry — может быть развернут на Raspberry Pi для подключения Modbus-сенсора температуры и влажности, передачи данных в облако и запуска актуаторов в реальном времени с минимальными усилиями.
Почему Modbus и EdgeX?
Modbus — открытый, легковесный протокол, работающий над недорогими линиями RS-485. Он использует простые регистры (16-битные беззнаковые целые) для аналоговых значений и катушки для бинарных состояний, что делает его идеальным для промышленных устройств. EdgeX Foundry, открытое промежуточное ПО для периферии, выступает мостом между физическими сенсорами и IT-системами, предоставляя управление устройствами, преобразование данных и облачную связь «из коробки».
Аппаратный стек
- Raspberry Pi 4 (пограничный шлюз)
- Modbus RTU сенсор: SHT20 (температура и влажность)
- RS-485 в USB преобразователь
- Светодиоды для визуального статуса (GPIO-12 и GPIO-14)
- USB-блок питания
Рис. 1:
Рис. 1. EdgeX Foundry — открытое промежуточное ПО для периферии
Рис. 2:
Рис. 2. Блок-схема высокого уровня развертывания EdgeX
Пошаговая интеграция
- Настройка Raspberry Pi
- Установка Ubuntu 20.04 LTS с Docker и docker-compose.
- Клонирование репозитория EdgeX Foundry и запуск стека через docker-compose.
- Симуляция Modbus-устройства
- Использование ModbusPal (GPL) для эмуляции до 247 Modbus-ведомых.
- Настройка ведомого с хранилищными регистрами для температуры (адрес 2) и влажности (адрес 3). Каждый регистр отображается в 16-битное целое, которое будет масштабировано в °C и %RH.
- Запуск ModbusPal через TCP или последовательный порт (USB-RS485) для проверки связи.
- Загрузка профиля устройства
Отправка
POSTзапроса наhttps://localhost:48081/api/v1/deviceprofile/uploadfileс YAML-файлом, содержащим профиль (см. ниже). Ответ возвращает уникальный ID профиля. - Регистрация устройства
Отправка следующего JSON на
https://localhost:48081/api/v1/deviceдля создания записи сенсора. Разделprotocols.modbus-rtuуказывает на/dev/ttyUSB0на скорости 9600 бод.{ "name": "TemperatureHumiditySensor", "description": "Industrial Grade Temperature & Humidity Transmitter SHT20", "adminState": "UNLOCKED", "operatingState": "ENABLED", "protocols": { "modbus-rtu": { "Address": "/dev/ttyUSB0", "BaudRate": "9600", "DataBits": "8", "StopBits": "1", "Parity": "N", "UnitID": "1" } }, "labels": ["TemperatureHumiditySensor","modbusRTU"], "service": {"name": "edgex-device-modbus"}, "profile": {"name": "TemperatureHumiditySensor"}, "autoEvents": [ {"frequency": "5s", "onChange": false, "resource": "TemperatureDegC"}, {"frequency": "5s", "onChange": false, "resource": "HumidityPercentRH"} ] } - Проверка потока данных
- Устройство-сервис EdgeX опрашивает данные каждые 5 сек и записывает в основной сервис, который хранит их в Redis.
- Приложения-сервисы передают данные в IBM Cloud (или любое другое облако).
- Примеры записей логов показывают пакеты Modbus запрос/ответ.
- Управление светодиодами через движок правил Kuiper
- Определение правил: если температура > 30 °C включить красный светодиод; если < 30 °C выключить; аналогично для синего светодиода при 28 °C.
- Kuiper отправляет команды в EdgeX core-command, который затем обновляет GPIO-устройство-сервис.
- GPIO-выходы проверяются через
/sys/class/gpio/gpio12/valueи/sys/class/gpio/gpio14/value.
Ключевые фрагменты конфигурации
Профиль устройства (YAML)
name: TemperatureHumiditySensor
manufacturer: ROBOKITS
model: RKI-4879
labels:
- SHT20
description: Industrial Grade Temperature & Humidity Transmitter SHT20 Sensor High Precision Monitoring Modbus RS485
deviceResources:
- name: TemperatureDegC
description: Room Temperature in Degrees Celsius.
attributes: { primaryTable: INPUT_REGISTERS, startingAddress: 2, rawType: INT16 }
properties:
value: { type: Float32, readWrite: R, scale: 0.1, floatEncoding: eNotation }
units: { type: String, readWrite: R, defaultValue: degrees celsius }
- name: HumidityPercentRH
description: Room Humidity in %RH.
attributes: { primaryTable: INPUT_REGISTERS, startingAddress: 3, rawType: INT16 }
properties:
value: { type: Float32, readWrite: R, scale: 0.1, floatEncoding: eNotation }
units: { type: String, readWrite: R, defaultValue: %RH }
deviceCommands:
- name: TemperatureDegC
get: [{ index: 1, operation: get, deviceResource: TemperatureDegC }]
- name: HumidityPercentRH
get: [{ index: 2, operation: get, deviceResource: HumidityPercentRH }]
coreCommands:
- name: TemperatureDegC
get:
path: /api/v1/device/{deviceId}/TemperatureDegC
responses:
- code: 200
description: Get the temperature in degrees C
expectedValues: [TemperatureDegC]
- name: HumidityPercentRH
get:
path: /api/v1/device/{deviceId}/HumidityPercentRH
responses:
- code: 200
description: Get the humidity in %RH
expectedValues: [HumidityPercentRH]
Конфигурация device-modbus TOML (фрагмент)
[DeviceList]
Name = "TemperatureHumiditySensor"
Profile = "TemperatureHumiditySensor"
Description = "Industrial Grade Temperature & Humidity Transmitter SHT20"
labels = ["TemperatureHumiditySensor","modbusRTU"]
[DeviceList.Protocols.modbus-rtu]
Address = "/dev/ttyUSB0"
BaudRate = 9600
DataBits = 8
StopBits = 1
Parity = "N"
UnitID = 1
[[DeviceList.AutoEvents]]
Frequency = "5s"
OnChange = false
Resource = "TemperatureDegC"
[[DeviceList.AutoEvents]]
Frequency = "5s"
OnChange = false
Resource = "HumidityPercentRH"
Результаты
Сквозной поток показывает данные о температуре и влажности в реальном времени, поступающие в IBM Cloud, запускающие изменения статуса светодиодов на основе правил, и демонстрирующие полные возможности EdgeX на недорогом Raspberry Pi.
Заключение
EdgeX Foundry обеспечивает быстрое развертывание Modbus-решений IIoT с минимальными затратами на разработку. Абстрагируя управление устройствами, хранение данных и облачную связь, он освобождает инженеров для фокуса на предметной логике и аналитике.
Аббревиатуры
| Аббревиатура | Расшифровка |
|---|---|
| AOF | Append Only File |
| API | Application Program Interface |
| AWS | Amazon Web Services |
| BACnet | Building Automation and Control Network |
| BLE | Bluetooth Low Energy |
| CURL | Client Uniform Resource Locator |
| GPIO | General Purpose Input Output |
| HTTP | Hypertext Transfer Protocol |
| IBM | International Business Machines |
| IIoT | Industrial Internet of Things |
| IoT | Internet of Things |
| IT | Information Technology |
| LED | Light Emitting Diode |
| LTS | Long Term Support |
| M2M | Machine to Machine |
| MQTT | Message Queuing Telemetry Transport |
| RDB | Redis Database |
| Redis | REmote DIctionary Server |
| REST | Representational State Transfer |
| RS-485 | Recommended Standard – 485 |
| SCADA | Supervisory Control and Data Acquisition |
| SQL | Structured Query Language |
| TCP/IP | Transmission Control Protocol/Internet Protocol |
Интернет вещей
- Руководство новичка по терминологии Open Source
- Cisco представляет промышленные маршрутизаторы Catalyst 5G для бесшовного соединения корпоративных и периферийных…
- AT&T и Tech Mahindra запускают Acumos: открытую ИИ-платформу для быстрого развертывания
- Повышение производственного совершенства с Industry 4.0: подъем Quality 4.0
- Защита открытого ПО в IoT: смягчение программных рисков
- Подъем Индустрии 4.0: использование пограничной аналитики для более умного, быстрого производства
- IIC и OpenFog слияются для драйва инноваций в Edge Computing
- Open Source vs вендор-поддерживаемые инструменты разработки IoT: выбор правильного стека для предприятия
- Почему открытый исходный код движет инновациями на периферии — важная электронная книга
- Открытый исходный код питает рост IoT и периферийных вычислений