在树莓派上使用EdgeX Foundry实现Modbus传感器无缝集成
在树莓派上使用EdgeX Foundry实现Modbus传感器无缝集成
工业物联网(IIoT)部署越来越依赖边缘网关,将支持Modbus的外设与云分析连接。构建专有网关成本高、耗时长。本案例研究演示如何在树莓派上部署开源框架EdgeX Foundry,连接Modbus温湿度传感器,将数据流式传输到云端,并以最小工作量触发实时执行。
为何选择Modbus和EdgeX?
Modbus是运行在廉价RS-485链路上的开放轻量级协议。它使用简单寄存器(16位无符号整数)表示模拟值,线圈表示二进制状态,非常适合工业设备。EdgeX Foundry作为开源边缘中间件,充当物理传感器与IT系统的桥梁,开箱即用地提供设备管理、数据转换和云连接。
硬件栈
- 树莓派4(边缘网关)
- Modbus RTU传感器:SHT20(温度与湿度)
- RS-485转USB转换器
- 用于可视状态的LED(GPIO-12与GPIO-14)
- USB电源
图1:
图1. EdgeX Foundry – 开源边缘中间件
图2:
图2. EdgeX部署高层框图
分步集成
- 设置树莓派
- 安装Ubuntu 20.04 LTS,配备Docker和docker-compose。
- 克隆EdgeX Foundry仓库并通过docker-compose启动栈。
- 模拟Modbus设备
- 使用ModbusPal(GPL)模拟多达247个Modbus从站。
- 配置一个从站,包含温度(地址2)和湿度(地址3)的保持寄存器。每个寄存器映射为16位整数,将缩放为°C和%RH。
- 通过TCP或串口(USB-RS485)启动ModbusPal验证通信。
- 上传设备配置文件
向
https://localhost:48081/api/v1/deviceprofile/uploadfile发送POST请求,附带包含配置文件的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规则引擎驱动LED
- 定义规则:温度>30°C开启红灯;<30°C关闭;同样蓝灯在28°C触发。
- Kuiper推送命令到EdgeX core-command,再更新GPIO设备服务。
- 通过
/sys/class/gpio/gpio12/value和/sys/class/gpio/gpio14/value验证GPIO输出。
关键配置片段
设备配置文件(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状态变化,演示了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 | Man 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 推理:获取可落地洞察的实战指南
- OpenDDS 与 RTI Connext DDS:选择正确的数据分发服务解决方案
- 开源术语入门指南
- Cisco 发布 Catalyst 5G 工业路由器,无缝融合企业核心网与边缘网络
- AT&T与Tech Mahindra推出Acumos:面向快速部署的开源AI平台
- 工业4.0赋能制造卓越:质量4.0崛起
- 保障物联网开源软件安全:缓解软件风险
- 提升工业 4.0:利用边缘分析实现更智能、更快速的制造
- IIC与OpenFog合并,推动边缘计算创新
- 开源与厂商支持 IoT 开发工具:为企业选型正确技术栈
- 为何开源驱动边缘创新——必读电子书
- 开源赋能物联网与边缘计算崛起