Взаимодействие промышленных датчиков Modbus со шлюзом IIoT с открытым исходным кодом
Для промышленных приложений Интернета вещей (IIoT) обычно требуется пограничный шлюз для интеграции периферийных устройств Modbus и других устройств, но реализация шлюза может быть дорогостоящей и трудоемкой. В этой статье предлагается пример взаимодействия промышленного датчика с платформой периферийных вычислений с открытым исходным кодом, которая может значительно упростить развертывание.
Технологии промышленного Интернета вещей (IIoT) быстро развиваются. Приложения IIoT в области удаленного мониторинга и расширенной аналитики революционизируют бизнес и предлагают им образцовые преимущества. Граничные вычисления обычно происходят непосредственно на устройствах, к которым подключены датчики, или на устройстве шлюза, которое физически близко к датчикам.
В случаях промышленного использования, когда несколько датчиков необходимо сопрягать с пограничными шлюзами, архитекторам решений и разработчикам необходимо принять решение о проектировании программного обеспечения и разработке пограничных шлюзов, а также о том, как обрабатывать данные с различных датчиков и выполнять анализ данных во время проектирования и разработки. фаза. В такой ситуации, если нет фреймворка с открытым исходным кодом, разработка нового программного обеспечения и исправление ошибок могут потребовать много усилий и затрат.
В первой статье этой серии, состоящей из двух частей, описываются промышленные датчики с примерами использования и дается обзор требований к пограничному шлюзу, а также обсуждается, как требования к пограничному шлюзу могут быть выполнены с помощью EdgeX Foundry - среды пограничных вычислений с открытым исходным кодом, которая служит пограничным шлюзом. промежуточное ПО между физическим восприятием и приведением в действие «вещей» и системой информационных технологий (ИТ) (рис. 1).
Рис. 1. EdgeX Foundry (Источник:www.edgexfoundry.org)
В этой статье предлагается пример взаимодействия промышленного датчика с EdgeX для достижения функциональности периферийных вычислений.
Цель этого тематического исследования - оценить одну из фреймворков периферийных вычислений под названием EdgeX Foundry, работающую на шлюзе Raspberry Pi, путем сопряжения с промышленным датчиком температуры и влажности. Вот блок высокого уровня и диаграмма потока данных с которыми объясняется тематическое исследование:
щелкните, чтобы просмотреть изображение в полном размере
Рис. 2. Блок-схема высокого уровня (Источник:www.edgexfoundry.org)
Modbus
Modbus - это открытый протокол, и транспорт является стандартным. Он не требует определенного физического уровня, в отличие от многих проприетарных протоколов, поэтому сети Modbus строятся на дешевой и распространенной инфраструктуре, такой как каналы RS-485.
Modbus реализует очень простое и понятное представление данных. Его основная цель - просто перемещать данные между ведущим и ведомым устройствами Modbus. Есть только два типа данных, которые нужно переместить:регистры и катушки. Регистры представляют собой 16-разрядные целые числа без знака, используемые для хранения аналоговых значений, таких как значения температуры, влажности и давления. Катушки - это отдельные биты, используемые для хранения цифровых значений в карте памяти Modbus, обычно таких значений состояния, как состояние переключателя (ВКЛ или ВЫКЛ), состояние работы двигателя (ВВЕРХ или ВНИЗ) и состояние клапана (ОТКРЫТО или ЗАКРЫТО).
Для этого требовалось мало места для кода, часто всего 1 КБ. Оперативная память варьировалась в зависимости от размера вашего пространства данных. Простые устройства автоматизации с небольшими битами данных могут быть реализованы практически без места в ОЗУ.
Modbus может быть так легко понят непрограммистам. Инженеры, создававшие клеевые машины, счетчики, измерительные устройства и т. Д., Могли легко понять концепцию катушек / регистров и простые команды для их чтения и записи.
Часто несколько приборов подключаются к одной сети Modbus. Ни один прибор не поддерживает все протоколы измерительной сети, но почти все они поддерживают Modbus. Выбрав Modbus, у вас есть хорошие шансы избежать проблем с совместимостью и проблем с обновлением в будущем.
Мониторинг температуры
Система мониторинга температуры IoT позволяет отрасли отслеживать параметры окружающей среды на защищенной веб- / мобильной платформе и предлагает мгновенные уведомления в режиме реального времени. Доступ к этим данным датчика температуры можно получить удаленно.
Данные, собранные с датчиков температуры, можно использовать для создания статистической информации. Это поможет отраслям повысить надежность складских и холодильных складов.
Это приложение используется во многих промышленных случаях:
- Цифровой мониторинг температуры в лабораториях и клиниках,
- Соответствие требованиям безопасности пищевых продуктов,
- Управление складом и запасами,
- Товары в пути,
- Мониторинг оборудования.
В таких случаях очень важно приложение для мониторинга температуры и влажности. Этому приложению нужен шлюз для контроля температуры и влажности. Для шлюза требуется периферийная вычислительная среда. Здесь используются датчик Modbus, шлюз и периферийная вычислительная среда:промышленный датчик температуры и влажности SHT20, Raspberry Pi 4 и EdgeX Foundry соответственно.
Как используется Edgex?
Проверка службы устройства Modbus с помощью имитатора ведомого устройства Modbus (ModbusPal)
ModbusPal - это симулятор подчиненного устройства Modbus, бесплатный и открытый исходный код, выпущенный под лицензией GPL. Его цель - предложить простой в использовании интерфейс с возможностью воспроизведения сложных и реалистичных сред Modbus. Он изначально поддерживает TCP / IP и поддерживает последовательную связь, если на компьютере установлена библиотека RxTx.
ModbusPal может моделировать до 247 ведомых устройств Modbus. Каждое ведомое устройство может иметь регистры хранения и катушки. Каждый регистр или катушку можно анимировать, связав с генератором динамических значений, называемым «автоматизацией».
Проверка службы устройства Modbus с использованием симулятора ModbusPal с ведомым устройством в качестве измерителя мощности выполняется с помощью следующих шагов, указанных ниже. Таким же образом мы можем моделировать любую среду, поддерживаемую Modbus, с помощью ведомых устройств, таких как датчики температуры, влажности и давления.
- Настройка среды ModbusPal,
- Добавление подчиненных устройств и настройка их адресации, значений и автоматизации,
- Публикация профиля устройства Modbus в EdgeX,
- Размещение устройства Modbus в EdgeX,
- Отправка данных или активация ведомого устройства (PUT),
- Получение данных от ведомого устройства (GET).
- Установите любую операционную систему, которая может устанавливать docker и docker-compose. В этом примере мы используем Ubuntu 20.04.2 LTS для развертывания EdgeX с помощью докера.
Рисунок 3. Настройка среды для ModbusPal Simulator
- Добавьте подчиненные устройства, настройте регистры хранения, введите значения и имена и привяжите их к соответствующей автоматизации.
Рис. 4. Добавление и настройка ведомых устройств в симуляторе ModbusPal (Источник:www.edgexfoundry.org)
- Опубликуйте профиль устройства с помощью команды POST.
curl –X POST http://:48081 / api / v1 / deviceprofile / uploadfile -F file =@
Рис. 5. Публикация профиля устройства в EdgeX
- Разместите устройство с помощью команды POST. Используйте команду ниже для загрузки в виде файла или команду, которая представляет собой снимок экрана, для загрузки в качестве содержимого.
curl –X POST http://:48081 / api / v1 / device / uploadfile -F «file =@ »
Рисунок 6. Публикация устройства в EdgeX
- Выполните команду PUT, чтобы отправить данные.
curl –X PUT http://:48082 / api / v1 / device / / command / -H «Content-Type:application / json »–d '{« »:« »,« »:« »}'
Рис. 7. Выполнение команды PUT в EdgeX
- Выполните команду GET, чтобы получить данные.
curl –X GET http://:48082 / api / v1 / device / name / / command / Configuration | json_pp
щелкните, чтобы просмотреть изображение в полном размере
Рисунок 8. Выполнение команды GET в EdgeX
Профиль устройства
Профиль устройства описывает тип устройства в системе EdgeX. Каждое устройство, управляемое службой устройств, связано с профилем устройства, который определяет этот тип устройства с точки зрения поддерживаемых им операций. Профиль устройства определяет значения устройства и метод работы, который может быть чтением или записью. Профиль устройства состоит из следующих тегов:
- Идентификация: Профиль содержит различные идентификационные поля. Поле имени является обязательным и должно быть уникальным в развертывании EdgeX. Остальные поля являются необязательными - они не используются службами устройства, но могут быть заполнены в информационных целях.
- DeviceResources: DeviceResource указывает значение датчика в устройстве, которое может быть прочитано или записано либо по отдельности, либо как часть deviceCommand. У него есть имя для идентификации и описание для информационных целей.
- DeviceCommands: Команды DeviceCommands определяют доступ к чтению и записи для нескольких одновременных ресурсов устройства. Каждая именованная команда deviceCommand должна содержать несколько операций get и / или set resourceOperation, описывающих чтение или запись соответственно,
- CoreCommands: CoreCommands определяет команды, доступные через микросервис core-command для чтения и записи на устройство. И deviceResources, и deviceCommands могут быть представлены coreCommands (имя coreCommand относится к имени deviceCommand или deviceResource).
Профиль устройства датчика температуры и влажности Modbus (Прокрутите, чтобы просмотреть полный список)
name :"TemperatureHumiditySensor" производитель : модель "ROBOKITS" :"RKI-4879" ярлыки :- "SHT20" описание :"Промышленный датчик температуры и влажности SHT20, высокоточный мониторинг, Modbus RS485" deviceResources :- имя :"TemperatureDegC" описание :"Комнатная температура в градусах Цельсия". атрибуты : {primaryTable :"INPUT_REGISTERS", startAddress:"2", rawType:"INT16"} свойства : значение : {type :"Float32", readWrite:"R", scale:"0.1", floatEncoding:"eNotation"} единиц : {type :"String", readWrite:"R", defaultValue:"градусы Цельсия"} - имя :"HumidityPercentRH" описание :"Влажность в помещении в% относительной влажности." атрибуты : {primaryTable :"INPUT_REGISTERS", startAddress:"3", rawType:"INT16"} свойства : значение : {type :"Float32", readWrite:"R", scale:"0.1", floatEncoding:"eNotation"} единиц : {type :"String", readWrite:"R", defaultValue:"% RH"} deviceCommands :- имя :"TemperatureDegC" получить : - {index :"1", операция:"get", deviceResource:"TemperatureDegC"} - имя :"HumidityPercentRH" получить : - {index :"2", операция:"get", deviceResource:"HumidityPercentRH"} coreCommands :- имя :"TemperatureDegC" получить : путь :"/ api / v1 / device / {deviceId} / TemperatureDegC" ответы :- код :"200" описание :"Получить температуру в градусах Цельсия" ожидаемые значения :["TemperatureDegC"] - код :"503" описание :"служба недоступна" ожидаемые значения :[] - имя :"HumidityPercentRH" получить : путь :"/ api / v1 / device / {deviceId} / HumidityPercentRH" ответы :- код :"200" описание :"Получить влажность в% относительной влажности" ожидаемые значения :["HumidityPercentRH"] - код :"503" описание :"служба недоступна" ожидаемые значения :[]
1.1.1.1 Профиль устройства GPIO - 1 (красный светодиод) (Прокрутите, чтобы просмотреть полный список)
name :"device-gpio12" производитель : модель "Jiangxing Intelligence" :"SP-01" ярлыки :- "gpio12" описание :"автоматически экспортировать gpio12 с помощью команды" deviceResources :- имя :"значение" описание :"установить или получить системное значение gpio" свойства : значение : {type :"Int8", readWrite:"RW", минимум:"0", максимум:"1", defaultValue:"0"} единиц : {type :"String", readWrite:"R", defaultValue:"high:1; low:0"} deviceCommands :- имя :"value" получить : - {операция :"get", deviceResource:"value"} set : - {операция :"набор", deviceResource:"значение", параметр:"0"} coreCommands :- имя :"value" положить : путь :"/ api / v1 / device / {deviceId} / value" имена параметров :["значение"] ответы :- код :"200" описание :"" - код :"500" описание :"служба недоступна" ожидаемые значения :[] получить : путь :"/ api / v1 / device / {deviceId} / value" ответы :- код :"200" описание :"" ожидаемые значения :["значение"] - код :"500" описание :"служба недоступна" ожидаемые значения :[]
Профиль устройства GPIO - 2 (синий светодиод) (Прокрутите, чтобы просмотреть полный список)
name :"device-gpio14" производитель : модель "Jiangxing Intelligence" :"SP-01" ярлыки :- "gpio14" описание :"автоматически экспортировать gpio14 с помощью команды" deviceResources :- имя :"значение" описание :"установить или получить системное значение gpio" свойства : значение : {type :"Int8", readWrite:"RW", минимум:"0", максимум:"1", defaultValue:"0"} единиц : {type :"String", readWrite:"R", defaultValue:"high:1; low:0"} deviceCommands :- имя :"value" получить : - {операция :"get", deviceResource:"value"} set : - {операция :"набор", deviceResource:"значение", параметр:"0"} coreCommands :- имя :"value" положить : путь :"/ api / v1 / device / {deviceId} / value" имена параметров :["значение"] ответы :- код :"200" описание :"" - код :"500" описание :"служба недоступна" ожидаемые значения :[] получить : путь :"/ api / v1 / device / {deviceId} / value" ответы :- код :"200" описание :"" ожидаемые значения :["значение"] - код :"500" описание :"служба недоступна" ожидаемые значения :[]
Конфигурации
Файл конфигурации для определения устройств и расписания заданий. Микросервисы (например, device-modbus) генерируют относительный экземпляр при запуске. Он содержит такие сведения, как тип протокола, имя шлюза, протокол, адрес, порт и путь (идентификатор устройства).
Файл конфигурации датчика температуры и влажности (Прокрутите, чтобы просмотреть полный список)
[Доступно для записи] LogLevel ='DEBUG' [Service] BootTimeout =30000CheckInterval ='10s'Host =' localhost'ServerBindAddr ='' # пустое значение по умолчанию - Service .Host valuePort =49991Protocol ='http'StartupMsg =' устройство Modbus запущено'Timeout =5000ConnectRetries =10Labels =[] EnableAsyncReadings =trueAsyncBufferSize =16 [Реестр] Host ='localhost'Port =8500Type =' consulmote '[Logging] EnableRemote ='./GPIO.LOG'[Clients] [Clients.Data] Protocol =' http 'Host =' localhost 'Port =48080 [Clients.Metadata] Protocol =' http 'Host =' localhost 'Port =48081 [Clients. Ведение журнала] Протокол ='http' Host ='localhost' Порт =48061 [Устройство] DataTransform =true InitCmd ='' InitCmdArgs ='' MaxCmdOps =128 MaxCmdValueLen =256 RemoveCmd ='' RemoveCmdArgs ='' ProfilesDir ='./res' UpdateLastConnected =false # Предварительно определить устройства [[DeviceList]] Name ='TemperatureHumiditySensor' # имя файла профиля устройства Profile ='TemperatureH umiditySensor 'Description =' Датчик температуры и влажности промышленного класса SHT20, высокоточный мониторинг, Modbus RS485 'label =[' TemperatureHumiditySensor ',' modbusRTU '] [DeviceList.Protocols] [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'
Файл конфигурации устройств GPIO (красный и синий светодиод) (Прокрутите, чтобы просмотреть полный список)
[Доступно для записи] LogLevel ='DEBUG' [Service] BootTimeout =30000CheckInterval ='10s'Host =' localhost'ServerBindAddr ='' # пустое значение по умолчанию - Service .Host valuePort =49950Protocol ='http'StartupMsg =' устройство gpio start'Timeout =5000ConnectRetries =10Labels =[] EnableAsyncReadings =falseAsyncBufferSize =16 [Registry] Host ='localhost'Port =8500Type =' consulmote Logging] ='./GPIO.LOG'[Clients] [Clients.Data] Protocol =' http 'Host =' localhost 'Port =48080 [Clients.Metadata] Protocol =' http 'Host =' localhost 'Port =48081 [Clients. Ведение журнала] Протокол ='http' Host ='localhost' Порт =48061 [Устройство] DataTransform =true InitCmd ='' InitCmdArgs ='' MaxCmdOps =128 MaxCmdValueLen =256 RemoveCmd ='' RemoveCmdArgs ='' ProfilesDir ='./res' UpdateLastConnected =false # Предварительно определить устройства [[DeviceList]] Name ="gpio12" Profile ="device-gpio12" Description ="use gpio12" Labels =['gpio1 2 '] [DeviceList.Protocols] [DeviceList.Protocols.other] Address ="device-gpio12" [[DeviceList]] Name ="gpio14" Profile ="device-gpio14" Description ="use gpio14" Labels =[' gpio14 '] [DeviceList.Protocols] [DeviceList.Protocols.other] Address ="device-gpio14"
Настройка и выполнение с результатами
- Подключите промышленный датчик температуры и влажности SHT20 к Raspberry Pi (в котором установлен EdgeX Foundry) через интерфейс RS485 к USB-преобразователю и светодиодам с помощью перемычек и резисторов, как показано на рисунке ниже.
щелкните, чтобы просмотреть изображение в полном размере
Рис. 9. Сведения о подключении оборудования
-
- Загрузите указанный выше профиль устройства в метаданные с помощью POST по адресу http:// localhost:48081 / api / v1 / deviceprofile / uploadfile и добавьте файл в качестве ключевого «файла» в тело в формате данных формы, а созданный ID будет возвращен. В следующем примере команда использует curl для отправки запроса:
curl –X POST http://
:48081 / api / v1 / deviceprofile / uploadfile -F file =@ - Убедитесь, что все обязательные службы устройства включены и работают.
- Загрузите указанный выше профиль устройства в метаданные с помощью POST по адресу http:// localhost:48081 / api / v1 / deviceprofile / uploadfile и добавьте файл в качестве ключевого «файла» в тело в формате данных формы, а созданный ID будет возвращен. В следующем примере команда использует curl для отправки запроса:
Рис. 10. Проверка активных служб устройства
c. Добавьте устройство с помощью POST в http:// localhost:48081 / api / v1 / device, тело будет выглядеть примерно так: (Прокрутите, чтобы просмотреть полный список)
curl -X POST http:// localhost:48081 / api / v1 / device -H "Content-Type:application / json" -d '{ "имя" :"TemperatureHumiditySensor", "описание" :"Промышленный датчик температуры и влажности SHT20, высокоточный мониторинг, Modbus RS485", "adminState" :"РАЗБЛОКИРОВАНО", "рабочее состояние" :"ВКЛЮЧЕНО", "протоколы" :{ "modbus-rtu" :{ "Адрес" :"/ dev / ttyUSB0", "BaudRate" :"9600", "DataBits" :«8», «StopBits» :«1», «Четность» :"N", "UnitID" :"1"}}, "ярлыки" :["TemperatureHumiditySensor", "modbusRTU"], "service" :{"name":"edgex-device-modbus"}, "профиль" :{"name":"TemperatureHumiditySensor"}, "autoEvents" :[{ "частота" :"5s", "onChange" :false, "ресурс" :"TemperatureDegC"}, { "частота" :"5s", "onChange" :false, "ресурс" :"HumidityPercentRH"}]} '
Устройство можно добавить с помощью команды POST или как часть файла configuration.toml.
- Служба устройства будет получать данные о температуре и влажности с датчика каждые 5 секунд. Полученные данные будут отправлены в основную службу и сохранены на сервере Redis.
2021/03/02 05:03:33 modbus:отправка 01 04 00 01 00 01 60 0a2021 / 03/02 05:03:33 modbus:получено 01 04 02 01 4d 78 95
Таблица 1. Расшифровка запроса и ответа Modbus
Отправлено Расшифровка Получено Расшифровка 01 ID ведомого 01 ID ведомого 04 Код функции 04 Код функции 00 01 Адрес регистра 02 Счетчик байтов 00 01 Число регистров 01 4dData (0x014d =333) 60 0aCRC 78 95CRC- Базовая служба будет отправлять данные в службу приложения. На рисунке ниже показаны данные основной службы.
Рис. 11. Данные о температуре и влажности, хранящиеся в основной службе
- Служба приложений отправляет данные в облако. Здесь мы используем облако IBM. На рисунке ниже показаны данные в облаке IBM.
щелкните, чтобы просмотреть изображение в полном размере
Рис. 12. Данные о температуре и влажности в IBM Cloud, отправленные из Application Service
- На другой стороне от северной до южной границы служба приложения отправит данные в механизм правил (здесь мы используем механизм правил Койпера). Установлены следующие правила.
Таблица 2. Правила
№ правил Правила Светодиод Статус Правило №1 ТемператураDegC> 30 ° CRed1 (ВКЛ) Правило №2 ТемператураDegC <30 ° CRed0 (ВЫКЛ) Правило №3 ТемператураDegC> 28 ° CBlue0 (ВЫКЛ) Правило №4 ТемператураDegC <28 ° CBlue1 (ВКЛ)
Рис. 13. Правило №1
Рисунок 14. Скрипт для применения правил
- При достижении пороговых значений температуры механизм правил отправляет команду основной команде.
- Основная команда активирует службу устройства GPIO для включения или выключения светодиодов в зависимости от пороговой температуры. Как только мы запустим правила, они будут применены. Здесь gpio12 означает красный светодиод, а gpio14 - синий светодиод.
а. Красный светодиод загорается всякий раз, когда температура поднимается выше 30 ° C.
Журналы системы правил:
level =info msg ="результат сброса для правила red_led_on:[{\" TemperatureDegC \ ":32.3}] файл ="inks / log_sink.go:16 "rule =red_led_onlevel =info msg =" результат поглощения для правила blue_led_off:[{\ "TemperatureDegC \":32.3}] file ="inks / log_sink.go:16 "rule =blue_led_off
GPIO:
root @ ubuntu:~ # cat / sys / class / gpio / gpio12 / value1root @ ubuntu:~ # cat / системный / класс / gpio / gpio14 / значение0
б. Загорается синий светодиод, когда температура опускается ниже 28 ° C.
Механизм правил:
level =info msg ="результат сброса для правила red_led_off:[{\" TemperatureDegC \ ":27.2}] файл ="раковины / log_sink.go:16" rule =red_led_offlevel =info msg ="результат поглощения для правила blue_led_on:[{\" TemperatureDegC \ ":27.2}] file =" раковины / log_sink.go:16 "rule =blue_led_on
GPIO:
root @ ubuntu:~ # cat / sys / class / gpio / gpio12 / value0root @ ubuntu:~ # cat / sys / класс / gpio / gpio14 / значение1
- Наконец, служба GPIO заставит светодиоды включаться или выключаться.
Acronyms
Acronym Expansion AOFAppend Only FileAPIApplication Program Interface AWSAmazon Web ServicesBACnetBuilding Automation and Control NetworkBLEBluetooth Low EnergyCURLClient Uniform Resource LocatorGPIOGeneral Purpose Input OutputHTTPHypertext Transfer ProtocolIBMInternational Business MachinesIIoTIndustrial Internet of ThingsIoTInternet of ThingsITInformation TechnologyLEDLight Emitting DiodeLTSLong Term SupportM2MMan to MachineMQTTMessage Queuing Telemetry TransportRDBRedis DatabaseRedisREmote DIctionary ServerRESTRepresentational State TransferRS-485Recommended Standard – 485SCADASupervisory Control and Data AcquisitionSQLStructured Query LanguageTCP/IPTransmission Control Protocol/Internet ProtocolИнтернет вещей
- Введение в терминологию с открытым исходным кодом
- Cisco объединяет предприятия и промышленные предприятия с помощью новых маршрутизаторов
- AT&T и Tech Mahindra совместно работают над новой платформой искусственного интеллекта с открытым исходным кодом
- Повышение стандартов качества с помощью промышленной революции 4.0
- Программные риски:защита открытого исходного кода в IoT
- Обновление Индустрии 4.0 с помощью пограничной аналитики
- Развитие пограничных вычислений, IIC объединяется с OpenFog
- Инструменты разработки IoT с открытым исходным кодом и инструменты, поддерживаемые поставщиком
- Необходимость открытого исходного кода на периферии (электронная книга)
- Открытый исходный код стимулирует внедрение Интернета вещей и граничных вычислений