257 lines
14 KiB
Plaintext
257 lines
14 KiB
Plaintext
Smart Factory Monitoring System - 프로토콜 & 프로젝트 보고서 v1.0
|
||
작성일: 2025-08-15 / 대상: ESP32 기반 RS485 Modbus RTU 마스터–슬레이브 시스템
|
||
________________________________________
|
||
1. 시스템 개요
|
||
• 구성: RS485 버스(마스터 1대 ↔ 슬레이브 N대), Wi Fi + MQTT 백엔드 연동.
|
||
• 마스터(ESP32): RS485 폴링, 응답 파싱, MQTT JSON 발행, 설정 CLI(시리얼) 제공.
|
||
• 슬레이브(ESP32): 각 센서 수집 → 내부 레지스터 매핑 → Modbus RTU 응답.
|
||
• 확장성: 슬레이브별 센서/레지스터 구성이 달라도 공통 규약(섹션 3)을 따르면 마스터는 동일하게 동작.
|
||
________________________________________
|
||
2. 물리 계층 & 배선 가이드 (RS485)
|
||
• 전기적: RS485 2선식 차동(A/B), 공통 GND 권장.
|
||
• 속도/포맷: 115200 bps, 8N1 (모든 노드 동일)
|
||
• 종단/바이어스: 버스 양 끝 120 Ω 종단 1개씩, 라인 바이어스(풀업/풀다운) 구성 권장.
|
||
• 프레임 정숙 시간(t3.5): 115200 bps(8N1) 기준 ≥ 0.4 ms. 구현 상 8 ms 이상의 침묵 시간을 프레임 경계로 사용.
|
||
________________________________________
|
||
3. 응용 프로토콜 (Modbus RTU 프로파일)
|
||
3.1 요청 프레임 (마스터 → 슬레이브)
|
||
[슬레이브ID][FC=03][addr_hi=0x00][addr_lo=0x00][qty_hi=0x00][qty_lo=0x0A][CRC_lo][CRC_hi]
|
||
• 의미: Holding Registers 0x0000부터 10개 읽기.
|
||
• CRC: Modbus/CRC16 IBM(다항식 0xA001), 리틀 엔디언(Lo,Hi).
|
||
3.2 응답 프레임 (슬레이브 → 마스터)
|
||
[슬레이브ID][FC=03][byteCount=20][Data(20B)][CRC_lo][CRC_hi]
|
||
• Data(20B)= 레지스터 10개(각 2B)
|
||
• CRC: 위와 동일.
|
||
3.3 공통 레지스터 맵(10 regs)
|
||
인덱스 크기 의미
|
||
[0] 1 reg 데이터 영역 길이(16비트 레지스터 개수). 예) 6 → 3개의 float(각 2 regs).
|
||
[1..] 가변 센서 데이터 영역. float은 2 regs 사용. 엔디언은 3.4절 참조.
|
||
[7..8] 2 regs 예약(0)
|
||
[9] 1 reg Heartbeat(순증가, 16비트)
|
||
슬레이브는 실제 보유 센서 수에 맞춰 [0]을 설정(예: 3개 float라면 6). 슬레이브가 데이터 갱신에 실패한 항목은 NULL 표현(3.5절)로 응답.
|
||
3.4 부동소수점 엔디언
|
||
• 기본: LSW first (레지스터 순서: LSW, MSW → 32비트 float 구성)
|
||
• 필요 시 프로젝트 전역 스위치: FLOAT_WORD_ORDER_LSW_FIRST = 0(MSW first)로 변경 가능. 마스터/슬레이브 일치 필수.
|
||
3.5 NULL 표현
|
||
• float: 해당 2레지스터가 0xFFFF, 0xFFFF → NULL(유효 데이터 없음)
|
||
• uint16: 0xFFFF → NULL
|
||
• 마스터는 이를 JSON에서 null 로 발행.
|
||
3.6 타이밍 권장값
|
||
• 마스터 폴링 간격: ≥ 50 ms(≤ 20 Hz) 권장.
|
||
• 프레임 경계 판정: 침묵 시간 ≥ 8 ms.
|
||
• 슬레이브 내부: 센서 수집은 라운드로빈 + 프레임 선점(마스터 요청 시 즉시 응답) 설계 권장.
|
||
________________________________________
|
||
4. 슬레이브별 데이터 맵 (의미 레벨)
|
||
실제 센서 인터페이스(아날로그/I2C/UART 등)가 달라도, 아래 의미/단위로 Modbus 레지스터만 일관되게 제공합니다.
|
||
Slave #1 – 소음 & 조도
|
||
항목 단위 타입 레지스터
|
||
noise dB float [1..2]
|
||
illuminance lux float [3..4]
|
||
meta/예약/HB - - [0], [7..9]
|
||
• [0] = 4 (float 2개 * 2 regs)
|
||
Slave #2 – 온습도(이중 채널)
|
||
항목 단위 타입 레지스터
|
||
t1 °C float [1..2]
|
||
h1 % float [3..4]
|
||
t2 °C float [5..6]
|
||
h2 % float [7..8] ※(주의: 예약과 겹치지 않게 10regs 내 설계 필요)
|
||
HB - uint16 [9]
|
||
• [0] = 8 (float 4개 × 2 regs)
|
||
• 구현상 10레지스터 제한에 맞춰 예약([7..8])을 데이터로 활용. 공용 템플릿과 차이가 있으므로 슬레이브2는 예약 미사용.
|
||
Slave #3 – 환경(온/습/CO2/TVOC/PM1/PM2.5/PM10)
|
||
항목 단위 타입 레지스터
|
||
t °C float [1..2]
|
||
h % float [3..4]
|
||
co2 ppm float [5..6]
|
||
tvoc ppb float [7..8]
|
||
pm1 µg/m³ float [9..10]
|
||
pm25 µg/m³ float [11..12]
|
||
pm10 µg/m³ float [13..14]
|
||
• 확장형 슬레이브: 10 regs(기본)로 부족 → 이 노드는 확장 프로파일(예: qty 늘리기)을 사용할 수 있음. 본 보고서 기본 프로파일(10 regs)에서는 축약 구성을 권장하거나, 마스터 요청 수량을 노드별로 늘리는 옵션을 사용.
|
||
Slave #4 – 가스( CO / CO2 / HCHO )
|
||
항목 단위 타입 레지스터
|
||
co ppm float [1..2]
|
||
co2 ppm float [3..4]
|
||
hcho ppm float [5..6]
|
||
meta/예약/HB - - [0], [7..9]
|
||
• [0] = 6 (float 3개 × 2 regs)
|
||
슬레이브4는 아래 센서 통신 상세를 따릅니다(섹션 7.4).
|
||
________________________________________
|
||
5. 마스터 코드 개요
|
||
• 역할: RS485 폴링(FC=03/0x0000/0x000A) → 응답 CRC/길이 검증 → 매핑(slaveMap) 기반 JSON 작성 → MQTT 발행.
|
||
• 매핑 변경으로 MQTT 키명을 자유롭게 정의 가능 (예: co,co2,hcho).
|
||
• 응답 파서: 바이트간 타임아웃(15 ms)로 프레임 리셋, CRC 불일치 폐기.
|
||
• NULL 규칙: 0xFFFF → JSON null.
|
||
• 엔디안 스위치: FLOAT_WORD_ORDER_LSW_FIRST 매크로.
|
||
5.1 시리얼 명령어 (CONFIG 모드)
|
||
명령 형식 설명
|
||
CONFIG CONFIG 설정 모드 진입(기능 일시 중지)
|
||
EXIT EXIT 또는 CONFIG OFF 설정 모드 종료 및 재시작
|
||
LIST LIST 저장된 Wi Fi 목록 표시
|
||
ADD ADD ssid,password Wi Fi 후보 추가
|
||
EDIT EDIT index ssid,password Wi Fi 후보 수정
|
||
DELETE DELETE index Wi Fi 후보 삭제
|
||
CLEAR CLEAR Wi Fi 목록 전체 삭제
|
||
MQTTSET MQTTSET server,user,pass,topic MQTT 설정 저장 (server는 host 또는 host:port)
|
||
MQTTINFO MQTTINFO 현재 MQTT 설정 조회
|
||
REQID REQID start,end RS485 폴링 ID 범위 설정
|
||
REQTIME REQTIME ms RS485 폴링 간격(ms) 설정
|
||
예시: MQTTSET selimcns.synology.me:1883,,,"smartfactory/monitor"
|
||
5.2 MQTT 발행 요약
|
||
• 브로커: 설정된 server:port, user/pass(옵션)
|
||
• 토픽: mqtt_topic (예: smartfactory/monitor)
|
||
• 페이로드(JSON):
|
||
{
|
||
"id": 4,
|
||
"co": 0,
|
||
"co2": 461,
|
||
"hcho": 0.72
|
||
}
|
||
• 키 이름은 slaveMap 으로 정의. 값이 NULL이면 JSON null 로 전송.
|
||
• QoS: PubSubClient 기본(QoS0). 필요 시 라이브러리 교체/확장으로 QoS1/2 지원 가능.
|
||
________________________________________
|
||
6. 마스터–슬레이브 통신 체크리스트
|
||
• 마스터 폴링 간격 ≥ 50 ms, 타임아웃 30 ~ 100 ms.
|
||
• 버스 끝단 종단 120 Ω, 바이어스 확인. A/B 극성 일치.
|
||
• 슬레이브가 프레임 우선 응답(센서 수집 선점 중단) 가능한 구조 권장.
|
||
• float 엔디언 일치 확인(LSW first 기본). 불일치 시 값이 비정상.
|
||
• CRC mismatch 증가 시 노이즈/배선 점검.
|
||
________________________________________
|
||
7. 슬레이브 코드 - 센서 통신 & 프로토콜
|
||
슬레이브 공통: UART1=RS485(Modbus), UART2=센서 묶음(슬레이브 별 배치 상이 가능). 센서 무응답/무갱신 시 일정 시간 후 NULL(0xFFFF)로 표시.
|
||
7.1 Slave #1 (Noise/Lux)
|
||
• Noise(dB): 구현 의존(ADC/I2S). 레지스터 [1..2] float.
|
||
• Illuminance(lux): 구현 의존(I2C BH1750 등). 레지스터 [3..4] float.
|
||
• [0]=4, [9]=HB. 센서 알람/범위는 프로젝트 요구에 맞춰 확장.
|
||
7.2 Slave #2 (Temp/Humi – Dual)
|
||
• t1/h1/t2/h2: 각 float → [1..8]. [9]=HB. 10regs 한계 내 사용.
|
||
• 센서 예시: SHT/DHT/RS 485 일체형 등. 폴링/필터 주기 현장에 맞춰 조정.
|
||
7.3 Slave #3 (Env – T/H/CO2/TVOC/PM)
|
||
• 항목 수가 많아 10regs 한계를 초과할 수 있음 → 확장 프로파일 사용(마스터가 qty를 크게 요청) 또는 축약.
|
||
• 표준 의미/단위만 고정, 실제 인터페이스는 노드 구현에 따름.
|
||
7.4 Slave #4 (Gas – CO / CO2 / HCHO)
|
||
CO (ELT CO S20 3V)
|
||
• UART: 38400 bps, 8N1, 센서 TX → ESP32 RX (단방향)
|
||
• 프레임: ASCII "____D1..D5 ppm\r\n"(예: " 0 ppm"), 약 1 s 주기.
|
||
• 파싱: ppm 앞 숫자만 추출 → float 저장.
|
||
• 주의: 보드 점퍼(ZERO/SPAN) 위치에 따라 주기적 동작(영점 보정) 영향 가능. 제조사 가이드 참조.
|
||
CO2 (HX 2000U 계열)
|
||
• UART: 9600 bps, 8N1 (TX/RX 모두 사용)
|
||
• 질의: 42 4D E3 00 00 01 72
|
||
• 응답(10B): 헤더 42 4D, 본문 00 08 ..., 합계검증(sum) 후 CO2 ppm 추출.
|
||
HCHO (Gravity – 9B 프레임)
|
||
• UART: 9600 bps, 8N1 (단방향 RX)
|
||
• 프레임(9B): FF 17 04 00 [CH] [CL] 13 88 [CS]
|
||
• 해석: [CH][CL]=ppb → ppm = ppb / 1000
|
||
• 수신 안정화: 듣는 창(드웰) 1.0–1.5 s 권장, RS485 선점과 충돌 최소화.
|
||
슬레이브4 구현 팁
|
||
• 라운드로빈: CO → CO2 → HCHO 순서, 각 모드 dwell과 read budget 조정.
|
||
• Preempt on Modbus: 센서 읽기 중 RS485 요청 오면 즉시 중단하고 응답.
|
||
• STALE 창: CO5 s, HCHO~10–12 s 권장(현장 튜닝).
|
||
________________________________________
|
||
8. 예제: 마스터 MQTT 페이로드 (슬레이브4)
|
||
{
|
||
"id": 4,
|
||
"co": 0,
|
||
"co2": 461,
|
||
"hcho": 0.72
|
||
}
|
||
• 센서 미갱신/오류 시 각 필드는 null 로 발행.
|
||
________________________________________
|
||
9. 버전/빌드 노트
|
||
• 2025 08 15 v1.0: 기본 통신규격 문서화, 마스터/슬레이브4 상세, MQTT 키 커스터마이즈(slaveMap).
|
||
• 향후: 슬레이브3 확장 프로파일(요청 qty 가변) 정식 문서화, QoS1 발행 옵션, OTA/보안 토큰 추가.
|
||
________________________________________
|
||
부록 A. 테스트 체크리스트
|
||
• RS485 A/B 극성, 120 Ω 종단, 바이어스 확인
|
||
• 모든 노드 115200 8N1, ID/주소 충돌 없음
|
||
• 마스터 폴링 ≥ 50 ms, CRC mismatch 없음
|
||
• 슬레이브4: CO/CO2/HCHO 각각 단독 테스트 후 통합 테스트
|
||
• MQTT 브로커 접속/발행 확인, 대시보드 스키마 업데이트
|
||
________________________________________
|
||
부록 B. 용어
|
||
• LSW first: 32비트 값의 하위 16비트 레지스터가 먼저 배치되는 방식.
|
||
• NULL 전파: 센서 무효값을 상위 계층(JSON)까지 null로 전달.
|
||
• Preempt on Modbus: RS485 요청 시 센서 읽기를 즉시 중단하고 응답 우선 처리하는 설계.
|
||
________________________________________
|
||
부록 C. 시리얼 CONFIG 명령어 상세
|
||
C.1 개요
|
||
마스터의 USB 시리얼 콘솔에서 설정을 변경/조회할 수 있습니다. CONFIG 모드에 들어가면 RS485 폴링과 MQTT 발행이 일시 중지됩니다.
|
||
C.2 명령 목록
|
||
• CONFIG : 설정 모드 진입
|
||
• EXIT 또는 CONFIG OFF : 설정 모드 종료 및 재시작
|
||
• LIST : 저장된 Wi Fi 목록 표시
|
||
• ADD <ssid>,<password> : Wi Fi 후보 추가
|
||
• EDIT <index> <ssid>,<password> : Wi Fi 후보 수정
|
||
• DELETE <index> : Wi Fi 후보 삭제
|
||
• CLEAR : Wi Fi 후보 전체 삭제
|
||
• MQTTSET <server[,port]>,<user>,<pass>,<topic> : MQTT 설정 저장 (server에 host:port 형태 허용)
|
||
• MQTTINFO : MQTT 설정 조회
|
||
• REQID <start>,<end> : RS485 폴링 슬레이브 ID 범위 지정
|
||
• REQTIME <ms> : RS485 폴링 간격(ms)
|
||
C.3 예시
|
||
CONFIG
|
||
ADD MyAP,MyPass1234
|
||
MQTTSET selimcns.synology.me:1883,,,"smartfactory/monitor"
|
||
REQID 1,4
|
||
REQTIME 200
|
||
EXIT
|
||
________________________________________
|
||
부록 D. MQTT 발행 스키마
|
||
D.1 공통 형식
|
||
• 토픽: smartfactory/monitor (변경 가능)
|
||
• QoS/Retain: QoS 0, Retain = false (기본 PubSubClient.publish())
|
||
• 페이로드(JSON): { "id": <slaveId>, <key1>: <value|null>, ... }
|
||
• NULL 규칙: 슬레이브가 0xFFFF(uint16) 또는 0xFFFF,0xFFFF(float)로 응답한 항목은 null 로 발행
|
||
D.2 슬레이브별 예시
|
||
• Slave #1
|
||
{ "id": 1, "noise": 42.3, "illuminance": 315.0 }
|
||
• Slave #2
|
||
{ "id": 2, "t1": 23.1, "h1": 45.0, "t2": 22.9, "h2": 44.8 }
|
||
• Slave #3 (확장 프로파일 사용 시 키는 동일, 필드 수만 증가)
|
||
{ "id": 3, "t": 25.0, "h": 40.0, "co2": 610, "tvoc": 120, "pm1": 4, "pm25": 7, "pm10": 9 }
|
||
• Slave #4
|
||
{ "id": 4, "co": 0, "co2": 461, "hcho": 0.72 }
|
||
D.3 키 매핑 전략
|
||
• 키 이름은 마스터의 slaveMap 으로 정의합니다. 슬레이브 변경 없이 필드명을 바꿀 수 있습니다.
|
||
• 레거시 호환이 필요하면 _legacy 객체로 병행 발행을 고려할 수 있습니다.
|
||
________________________________________
|
||
부록 E. 트러블슈팅 가이드
|
||
E.1 CRC mismatch가 자주 발생
|
||
• 배선/노이즈 확인(A/B 극성, 종단 120 Ω, 바이어스 저항)
|
||
• RS485 버스 길이/분기 최소화, 접지 공통화
|
||
• 마스터 폴링 간격을 50 ~ 200 ms 사이로 조정
|
||
E.2 특정 필드가 null 로 자주 발행
|
||
• 해당 슬레이브의 STALE 타임아웃 확인(슬레이브 코드)
|
||
• HCHO(9600 bps)처럼 프레임 주기가 긴 센서는 듣는 창(dwell) 확대 필요
|
||
• 센서 엔디안/프레임 체크(예: CO2 sum check 실패 등)
|
||
E.3 값이 비정상(이상한 큰 수/NaN)
|
||
• 부동소수 워드 순서 확인: 마스터/슬레이브의 FLOAT_WORD_ORDER_* 일치 필요
|
||
• 레지스터 수량/순서 확인([0] 길이와 매핑 개수 불일치 여부)
|
||
E.4 마스터 연결 시 슬레이브 수집이 끊김
|
||
• 슬레이브는 Preempt on Modbus 설계를 사용해야 함(요청 수신 즉시 센서 읽기 중단)
|
||
• 마스터 폴링 간격을 늘리거나 슬레이브의 센서 dwell/read budget 조정
|
||
E.5 MQTT 발행 실패
|
||
• 브로커 주소/포트/인증 확인(MQTTINFO), 네트워크 방화벽 점검
|
||
• Wi Fi 재연결 루틴 동작 로그 확인
|
||
________________________________________
|
||
부록 F. 파라미터 권장값 요약
|
||
F.1 마스터
|
||
• 폴링 간격: REQTIME 200 (현장 상황에 따라 50–500 ms)
|
||
• 응답 바이트간 타임아웃: 15 ms
|
||
• MQTT: QoS0/Retain false(기본)
|
||
F.2 슬레이브 #4 (예시)
|
||
• 센서 라운드로빈: CO(900ms) → CO2(200ms) → HCHO(1200ms)
|
||
• Read budget: CO/CO2=60ms, HCHO=80ms
|
||
• STALE: CO=6s, CO2=5s, HCHO=12s
|
||
• 워드 순서: LSW first
|
||
________________________________________
|
||
부록 G. 운영/보안 메모
|
||
• Wi Fi/MQTT 자격증명은 ESP32 NVS(Preferences)에 저장됩니다. 기기 양도/폐기 시 NVS 초기화 필요.
|
||
• 브로커 인증/암호화를 강화하려면 TLS 지원 라이브러리(PubSubClient SSL 등)와 인증서 핀닝을 검토하세요.
|
||
• 시리얼 CONFIG 모드는 현장 접근으로 간주되므로 물리적 접근 통제를 권장합니다.
|
||
________________________________________
|
||
결론
|
||
본 문서는 Smart Factory Monitoring System의 마스터–슬레이브 통신규격과 운영 절차를 정리합니다. 현장 환경에 따라 제시한 튜닝 파라미터를 조정하면 안정성과 응답성을 동시에 확보할 수 있습니다. 추가 확장(슬레이브 수/레지스터 확장, QoS1/2, TLS)은 본 규격을 유지한 채 점진적으로 도입 가능합니다.
|
||
|