SFM_SelimCNS/README
2025-11-08 21:45:54 +09:00

257 lines
14 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.01.5 s 권장, RS485 선점과 충돌 최소화.
슬레이브4 구현 팁
• 라운드로빈: CO → CO2 → HCHO 순서, 각 모드 dwell과 read budget 조정.
• Preempt on Modbus: 센서 읽기 중 RS485 요청 오면 즉시 중단하고 응답.
• STALE 창: CO5 s, HCHO~1012 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 (현장 상황에 따라 50500 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)은 본 규격을 유지한 채 점진적으로 도입 가능합니다.