Raspberry Pi上のEdgeX FoundryによるModbusセンサーのシームレスな統合
Raspberry Pi上のEdgeX FoundryによるModbusセンサーのシームレスな統合
産業用IoT(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変換器
- 視覚ステータス用LED(GPIO-12 & GPIO-14)
- USB電源
図1:
図1. EdgeX Foundry – オープンソースエッジミドルウェア
図2:
図2. EdgeX導入のハイレベルブロック図
ステップバイステップ統合
- Raspberry Piのセットアップ
- Dockerとdocker-composeを用いてUbuntu 20.04 LTSをインストール。
- EdgeX Foundryリポジトリをクローンし、docker-composeでスタックを起動。
- Modbusデバイスのシミュレーション
- ModbusPal(GPL)を使用し、最大247台のModbusスレーブをエミュレート。
- 温度(アドレス2)と湿度(アドレス3)の保持レジスタを持つスレーブを設定。各レジスタは16ビット整数にマッピングされ、°Cと%RHにスケーリング。
- ModbusPalをTCPまたはシリアル(USB-RS485)で起動し、通信を確認。
- デバイスプロファイルのアップロード
https://localhost:48081/api/v1/deviceprofile/uploadfileにYAMLファイルを含むPOSTリクエストを送信(詳細は下記)。レスポンスで一意のプロファイルIDが返されます。 - デバイスの登録
https://localhost:48081/api/v1/deviceに以下のJSONをPOSTしてセンサーエントリを作成。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ルールエンジンでLEDを制御
- ルール定義:温度 > 30°C で赤色LED点灯、< 30°C で消灯;同様に青色LEDを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に到着し、ルールベースのLEDステータス変更をトリガーし、低コストRaspberry Pi上でのEdgeXの全機能を実証しています。
結論
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 |
モノのインターネットテクノロジー
- エッジAI推論をマスター:実用的なインサイトを得るための実践ガイド
- オープンソース用語入門:プロジェクトからライセンスまで
- シスコ、エンタープライズとエッジをシームレスに接続するCatalyst 5G産業用ルーターを発表
- AT&TとTech Mahindra、オープンソースAIプラットフォーム「Acumos」を発表
- インダストリー4.0で製造卓越性を高める:クオリティ4.0の台頭
- IoTにおけるオープンソースソフトウェアの保護:ソフトウェアリスクの軽減
- インダストリー4.0を昇華:エッジアナリティクスでよりスマートで速い製造を実現
- IICとOpenFogが合併、エッジコンピューティング革新を加速
- オープンソース vs ベンダーサポートIoT開発ツール:企業に適したスタックの選び方
- オープンソースがエッジでのイノベーションを駆動する理由──必携eBook
- オープンソースがIoTとエッジコンピューティングの台頭を支える