라즈베리 파이에서 EdgeX Foundry로 Modbus 센서 원활하게 통합하기
라즈베리 파이에서 EdgeX Foundry로 Modbus 센서 원활하게 통합하기
산업용 IoT(IIoT) 배포는 점점 더 에지 게이트웨이에 의존하여 Modbus 지원 주변 장치를 클라우드 분석과 연결합니다. 독점 게이트웨이를 구축하는 것은 비용이 많이 들고 느립니다. 이 사례 연구는 오픈 소스 프레임워크인 EdgeX Foundry를 라즈베리 파이에 배포하여 Modbus 온습도 센서를 연결하고, 데이터를 클라우드로 스트리밍하며, 최소한의 노력으로 실시간 작동을 트리거하는 방법을 보여줍니다.
왜 Modbus와 EdgeX인가?
Modbus는 저렴한 RS-485 링크에서 실행되는 개방적이고 가벼운 프로토콜입니다. 아날로그 값에는 단순 레지스터(16비트 부호 없는 정수)를, 바이너리 상태에는 코일을 사용하여 산업용 디바이스에 이상적입니다. 오픈 소스 에지 미들웨어인 EdgeX Foundry는 물리적 센서와 IT 시스템 사이의 다리 역할을 하며, 디바이스 관리, 데이터 변환, 클라우드 연결을 즉시 제공합니다.
하드웨어 스택
- 라즈베리 파이 4 (에지 게이트웨이)
- Modbus RTU 센서: SHT20 (온도 & 습도)
- RS-485 to USB 컨버터
- 시각적 상태 표시용 LED (GPIO-12 & GPIO-14)
- USB 전원 공급 장치
그림 1:
그림 1. EdgeX Foundry – 오픈 소스 에지 미들웨어
그림 2:
그림 2. EdgeX 배포의 고수준 블록 다이어그램
단계별 통합
- 라즈베리 파이 설정
- Docker와 docker-compose가 설치된 Ubuntu 20.04 LTS를 설치합니다.
- EdgeX Foundry 저장소를 복제하고 docker-compose로 스택을 실행합니다.
- Modbus 디바이스 시뮬레이션
- ModbusPal(GPL)을 사용하여 최대 247개의 Modbus 슬레이브를 에뮬레이트합니다.
- 온도(주소 2)와 습도(주소 3)에 대한 홀딩 레지스터를 가진 슬레이브를 구성합니다. 각 레지스터는 °C와 %RH로 스케일링될 16비트 정수에 매핑됩니다.
- TCP 또는 시리얼(USB-RS485)로 ModbusPal을 시작하여 통신을 확인합니다.
- 디바이스 프로필 업로드
아래 YAML 파일을 포함하여 POST 요청을 https://localhost:48081/api/v1/deviceprofile/uploadfile로 보냅니다. 응답은 고유한 프로필 ID를 반환합니다.
- 디바이스 등록
다음 JSON을 https://localhost:48081/api/v1/device로 게시하여 센서 항목을 생성합니다. protocols.modbus-rtu 섹션은 9600 보드에서 /dev/ttyUSB0을 가리킵니다.
{ "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 상태 변경을 트리거하며, 저비용 라즈베리 파이에서 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 |