★용어 — 딱 5개만 알면 됩니다
| 말 | 쉬운 뜻 |
|---|---|
| RAW(원시) 데이터 | 인버터가 보내는 가공 전 날것의 숫자. 예: "지금 전압 2301". |
| 레지스터 | 인버터 안의 '정보 칸' 하나. 칸마다 번호(주소)가 있고, 읽으면 숫자 하나가 나옴. |
| 주소 | 그 칸의 번지수. 0x1200처럼 적음(0x = 16진수 표기). |
| 계수(Unit rate) ★ | 인버터는 소수점을 못 보내 정수로만 줌. 그래서 받은 값에 계수를 곱해야 진짜 값. 예: 2301 × 0.1V = 230.1V. |
| 가공 | 받은 RAW를 계산·비교·학습해 사람이 쓰는 정보로 바꾸는 일. 이 문서의 핵심. |
★가장 기초 — 전선 2가닥으로 숫자를 보내는 법 (RS-485)
모든 데이터는 결국 전선에 1과 0을 빠르게 실어 보내는 데서 시작합니다. 산업용 기기는 전선 2가닥(A·B)에 서로 반대 전압을 실어 보내는 RS-485 방식을 씁니다(두 선의 차이로 0/1을 읽어 노이즈에 강함). 1초에 9600번(=9600 baud) 신호를 바꾸므로 1비트 ≈ 0.0001초로 눈에는 순식간이에요. 아래는 그 과정을 아주 느리게 재생한 애니메이션입니다.
0x1200 응답 = 2바이트프레임 한 묶음 = 대기(1) → 시작비트(0) → 데이터 8비트(작은 자리부터) → 정지비트(1). 8비트가 모이면 한 바이트(0~255). 전압 같은 큰 값은 2바이트를 이어 붙여 만듭니다. 위 애니메이션이 바로 RAW 숫자가 만들어지는 순간 — 비트 → 바이트 → 정수 → ×계수 → 실제값까지 보여줍니다.
참고: 위 애니메이션은 이해를 위해 데이터 2바이트(08 FD)만 따로 보여줍니다. 실제 Modbus 한 묶음은 이 데이터 앞뒤로 [슬레이브 주소][기능코드][바이트 수] … [CRC 오류검출]로 감싸여 전송됩니다(전체 프레임 구성은 §1 ③ 응답 패킷 표 참고).
0데이터가 오는 길 — 무선(RF)이 진짜 출발점
방금 본 전선 전송은 "수집기 ↔ 서버" 구간에서 쓰입니다. 그런데 인버터는 멀리 떨어진 패널 옆에 있어, 먼저 무선(RF)으로 자기 상태를 쏘고(이때 쓰는 신호 규칙은 제조사가 만든 자체 통신규격), 그걸 받아 정리하는 중간 장치(DTU=수집기)가 따로 있습니다. 인버터가 Modbus로 말하는 게 아닙니다.
무선(RF)으로 쏨
형성·정리
① 공식 수집기 — DTU-Pro-S
정품 수집기. 인버터 RF(제조사 자체 통신규격)를 받아, 서버에는 제조사 자체 프로토콜(S-Miles 등)로 내보냄.
즉 인버터도 수집기도 Modbus가 아닌 자체 규격을 씀. 수집기는 RF를 받아 다시 포장하는 중계기. 느림(약 120초), 인버터 1대 단위 요약.
② 직접 만든 수집기 — OpenDTU
그 RF 자체 통신규격을 직접 해독(reverse-engineering, 일종의 신호 해킹)한 오픈소스 수집기. 작은 칩(ESP32+무선모듈)이 RF를 가로채 읽고, 서버에는 MQTT로 내보냄. 빠름(약 5초), 패널 단위로 촘촘 → AI·세밀 분석에 유리.
잠깐 — MQTT · Modbus · 자체 프로토콜이 뭐가 다른가
| 통신 규격 | 방식 | 특징 | 여기서 |
|---|---|---|---|
| MQTT | 발행/구독 (push) | 값이 바뀌면 곧바로 밀어줌. 가볍고 실시간. 사물인터넷 표준. | OpenDTU → 서버 |
| Modbus | 요청/응답 (polling) | 마스터가 물어볼 때만 답함. 산업 표준, 단순·견고. | TSUN 레지스터(§5) |
| 자체 프로토콜 | 제조사 고유 | 제조사가 비공개로 만든 규칙. 인버터↔DTU의 RF, DTU-Pro-S→서버. | Hoymiles RF / DTU-Pro-S |
셋 다 "통신 규격(데이터를 주고받는 약속)"이라는 점은 같습니다. MQTT는 밀어주기(push)·Modbus는 물어보기(poll)가 핵심 차이.
1인버터에서 들어오는 원시(RAW) 데이터
우리가 쓰는 TSUN G4(350W·1채널=태양광 입력 1줄)에서 읽는 값들. 같은 값도 수집기마다 이름·단위가 달라 "통일 이름"으로 묶어 다룹니다. DC=태양광 입력 AC=출력(전력망) 상태/안전
받은 값이 실제값이 되기까지 (변환 과정 자세히)
왜 "0x1200"이 230.1V가 되나 — 주소·진수·바이트순서·CRC까지
0x1200은 "값"이 아니라 "번지수(주소)"예요. 230.1V가 곧 0x1200인 게 아니라, 0x1200번 칸을 읽어달라고 요청하면 인버터가 그 칸의 내용물을 돌려줍니다. 우편함 비유 = 0x1200은 몇 호 우편함, 2301은 그 안의 쪽지.
① 0x는 뭔가요? — 16진수 표기01 03 12 00 00 01 CRC (한 바이트씩)
| 바이트 | 뜻 | 설명 |
|---|---|---|
01 | 슬레이브 주소 | 몇 번 인버터에게 (1번) |
03 | 기능코드 | "읽어줘"(0x03) |
12 00 | 시작 주소 | 0x1200 칸부터 |
00 01 | 읽을 개수 | 1칸 |
CRC | 오류검출 (2B) | ⑤ 참고 |
01 03 02 08 FD CRC
| 바이트 | 뜻 | 설명 |
|---|---|---|
01 03 | 주소·기능코드 | 1번 인버터, 읽기 응답 |
02 | 데이터 길이 | 이어지는 데이터가 2바이트 |
08 FD | 데이터 | ← 0x1200 칸의 내용 |
CRC | 오류검출 |
전선·무선은 노이즈로 비트가 뒤집힐 수 있어요. CRC는 앞 내용 전체로 계산한 검사 숫자(2바이트)입니다. 받는 쪽이 같은 방법으로 다시 계산해 붙어온 CRC와 같으면 정상, 다르면 도중에 깨진 것 → 버리고 다시 요청. (바코드 끝자리·주민번호 끝자리 검증과 같은 원리.)
직접 변환해 보기 — 받은 바이트를 넣으면 실제값으로
| 통일 이름 | 무슨 값 | 단위 | OpenDTU (MQTT) | DTU-Pro-S (자체 프로토콜) | TSUN (Modbus·레지스터) |
|---|---|---|---|---|---|
dc.voltage DC | 태양광 입력 전압 | V | <sn>/1/voltage | pv_voltage | 0x1302 ×0.1 |
dc.current DC | 태양광 입력 전류 | A | <sn>/1/current | pv_current | 0x1303 ×0.01 |
dc.power DC | 태양광 입력 전력 | W | <sn>/1/power | pv_power | 0x1304 ×0.1 |
ac.voltage AC | 전력망(출력) 전압 | V | <sn>/0/voltage | grid_voltage | 0x1200 ×0.1 |
ac.current AC | 출력 전류 | A | <sn>/0/current | (전력÷전압) | 0x1201 ×0.01 |
ac.power AC | 지금 만드는 출력 전력 | W | <sn>/0/power | pv_power | 0x1211 ×0.1 |
ac.frequency AC | 전력망 주파수 | Hz | <sn>/0/frequency | grid_frequency | 0x1209 ×0.01 |
ac.powerfactor AC | 역률 | — | <sn>/0/powerfactor | — | (계산) |
temperature 상태 | 인버터 온도 | °C | <sn>/0/temperature | temperature | 0x120D 값−40 |
yield.day AC | 오늘 발전량 | Wh | <sn>/0/yieldday | today_production | 0x1212 ×10 |
yield.total AC | 누적 발전량 | kWh | <sn>/0/yieldtotal | total_production | 0x1213 ×10 (U32) |
iso.rx/ry 안전 | 절연저항 | MΩ | — | — | 0x1216/7 ×0.001 |
gfci 안전 | 누설전류 | mA | — | — | 0x120C |
status.run 상태 | 운전 상태 | — | status/producing | operating_status | 0x1100 |
alarm.code 상태 | 고장 코드 | 비트 | (고장 토픽) | alarm_code | 0x1105~ |
왜 통일 이름? 화면·계산·알림은 통일 이름만 봅니다. 수집기를 바꾸거나 인버터를 교체해도 "이름 연결표"만 갈아끼우면 나머지는 그대로. (규격엔 태양광 6줄까지 있지만 350W 기기는 PV1 1줄만 사용.)
2A기본 기능 — RAW를 이렇게 가공합니다
모든 인버터의 기본 3가지. 각 기능마다 ① RAW → ② 가공 → ③ 표출 순서로, 그리고 표출은 전부 아래 그림으로 보여줍니다.
① 발전량 & 효율
dc.power(들어온 전력)ac.power(내보낸 전력)yield.day
- 출력 게이지(W)
- 효율 막대
- 발전량(일·월·년)
③ 표출 — 화면엔 이렇게
ac.poweryield② MPPT (최대 전력점 추적)
dc.voltagedc.currentdc.power
- I-V / P-V 곡선
- 지금 동작점 위치
- MPPT 효율 %
③ 표출 — 화면엔 이렇게
③ 보호 (안전장치)
ac.voltage,ac.frequencygfci,isoalarm.code
- 상태 배지
- 알람 로그
- 전압 정상범위 표시
③ 표출 — 화면엔 이렇게
status.runalarm.code 풀이 + 시각2B스마트 기능 — 끄는 대신 전력망을 도움
전력망이 흔들릴 때 바로 끄지 않고 전압·주파수를 능동적으로 받쳐줍니다.
① 전압 도움 (무효전력 조절)
그런데 무효전력을 어떻게 '감지'하나?
인버터는 전압 파형과 전류 파형을 1초에 수천~수만 번 빠르게 측정합니다. 이 두 파형이 얼마나 어긋나 있는지(위상차 φ)가 핵심이에요.
③ 표출
② 주파수 도움 — 왜 낮을 땐 100%, 높을 땐 줄이나
주파수 낮음 = 전기가 모자람. 전력망은 더 받고 싶어 합니다. 그런데 태양광은 지금 햇빛만큼만 만들 수 있어요(없는 전기를 못 만듦). 이미 최대(MPP)로 내보내는 중이라 더 못 올리고 100%에서 멈춤(포화).
주파수 높음 = 전기가 남음. 이땐 출력을 줄이는 건 언제든 가능하니, 곡선이 내려가며 발전을 줄여 과잉을 해소합니다. → 줄이긴 쉽고, 더 키우긴 불가능해서 모양이 비대칭(왼쪽 평평).
③ LVRT / HVRT — 전압이 출렁여도 버티기
왜 필요한가: 전력망 사고로 전압이 순간 푹 꺼졌다(LVRT) 다시 돌아오는 일이 잦습니다. 옛날 인버터는 이때 바로 탈락했는데, 태양광이 많아진 지금은 다 같이 탈락하면 전력망이 더 무너집니다. 그래서 "짧은 출렁임은 끊지 말고 버티며 전류를 계속 보내라"가 규칙(IEC 61727)이에요. 깊게 꺼질수록 버텨야 하는 시간은 짧습니다.
LVRT(저전압 버티기): 전압이 0%까지 꺼져도 최소 0.15초, 20% 이하면 0.625초 안에 회복되면 계속 운전. 그 안에 안 돌아오면 그때 보호 차단.
HVRT(고전압 버티기): 전압이 120%를 넘어 솟아도 0.1초 내 대응하며 잠깐 버팀. 우리 기기는 이 자율 버티기가 △ 제한적 → 소프트웨어(BEMS)로 보완(§4).
2CAI 기능 — 데이터를 모아 예측·진단
RAW를 오래 모아 학습해 앞날(발전량)과 이상(고장)을 미리 압니다. AI
① 고장 미리 알기 (예지 보전)
temperature변화- 효율 변화
dc/ac패턴
- 열화 추세 그래프
- 부품별 위험도
③ 표출
② 발전량 예측
- 과거
yield - 기상청 일사·구름·기온
- 예측 곡선 + 오차 범위
- 루버 각도 추천
③ 표출
3I-V 곡선 — 직접 움직여 보기
dc.voltage(가로)와 dc.current(세로)를 모으면 패널의 성격 곡선(I-V)이 나옵니다. 전력(P-V)을 겹치면 봉우리가 MPP(최대 전력점) — MPPT가 머물려는 지점이에요. 상황 버튼을 눌러보세요.
상황 바꿔보기
I-V 곡선으로 알 수 있는 것 (위 기능들과 연결)
| 곡선의 변화 | 무슨 뜻 (진단) | 연결 기능 | 버튼 |
|---|---|---|---|
| 전체가 아래로 (전류↓) | 햇빛 약함 / 패널 더러움 | 발전량 저하 원인 분석 | 흐림 |
| 봉우리가 왼쪽으로 (전압↓) | 온도 높음 → 출력 감소 | 온도 보정·디레이팅 | 한여름 |
| 계단(꺾임)이 생김 | 일부 그늘 → 패널 일부 막힘 | 음영 분석·루버 각도 | 부분 그늘 |
| 무릎이 둥글게 뭉개짐 | 접촉불량·노화(내부저항↑) | 고장 예지(열화) | 열화 |
| 동작점이 봉우리에서 벗어남 | MPPT가 최적점 못 잡음 | MPPT 효율 점검 | — |
4지금 기기의 한계와 보완
○ 됨 · △ 제한적 · ✗ 안 됨
| 기능 | 등급 | 기기 | 보완(소프트웨어 레이어) |
|---|---|---|---|
| 발전량·효율·MPPT | 기본 | ○ | OpenDTU/Modbus로 직접 수집 |
| 전압 도움(무효전력) | 스마트 | ○ | 유럽 규격 준수 |
| 주파수 자율 대응 | 스마트 | △ | 외부 주파수 받아 직접 제어(루버 각도) |
| LVRT/HVRT | 스마트 | △ | 한국 KS 미확정 → 국제기준 선행 |
| 고장 예지(AI) | AI | ✗ | 데이터 3~6개월 모아 학습 |
| 발전 예측(AI) | AI | ✗ | 날씨 연동 예측 모델 |
5TSUN 레지스터 표 — 계수까지 차근차근
§0대로 이 표는 수집기를 통해 읽는 값 목록. 각 줄 = 정보 칸 하나. 읽은 정수 × 계수 = 진짜 값. 출처: TSUN G4 Modbus Protocol_summary.xlsx (제조사 정본 Register Address)
0x03 읽기 · 0x06 한 칸 쓰기 · 0x10 여러 칸 쓰기 · 끝에 CRC.
누가 묻고 누가 답하나 — 마스터·슬레이브, 그리고 읽기 vs 제어
읽기도 하고 제어(쓰기)도 함
요청에 답하거나, 시키는 대로 설정 변경
즉 마스터는 그냥 보기만 하는 게 아니라 인버터를 제어할 수 있어요. 명령(기능코드)으로 읽기와 제어가 갈립니다:
| 기능코드 | 하는 일 | 분류 | 예시 |
|---|---|---|---|
0x03 | 레지스터 값을 읽음 | 모니터링(읽기) | 전압·전류·발전량·고장코드 확인 |
0x06 | 한 칸에 값을 씀 | 제어(쓰기) | 출력 제한·보호 정정값 한 개 변경 |
0x10 | 여러 칸에 한 번에 씀 | 제어(쓰기) | 안전규격·시간 설정 묶음 변경 |
마스터(DTU)가 "이 레지스터 값 줘"라고 호출(요청)하면, 인버터가 그 칸의 값을 그대로 반환합니다. 받아서 화면에 보여주는 게 모니터링. 인버터 상태를 바꾸지 않고 들여다보기만 함.
제어 레지스터는 "값을 쓰면 미리 정해둔 동작을 하도록" 프로토콜에 설계돼 있습니다. 예: 출력제한 칸에 70을 쓰면 → 인버터가 출력을 70%로 낮춤. 값 입력 = 명령 실행.
레지스터도 두 종류 — 읽기 전용 vs 제어 가능
| 구역 | 주소대 | 읽기/쓰기 | 무엇 |
|---|---|---|---|
| 계측·상태 | 0x1000~0x13xx | 읽기 전용 | 전압·전류·전력·온도·발전량·고장 — 관찰만 |
| 설정·보호 (제어) | 0x1400~ | 읽기 + 쓰기 | 안전규격·기동/재접속 시간·과저전압/주파수 정정값 — 바꿀 수 있음 |
제어(쓰기)로 할 수 있는 것 (0x06 / 0x10)
| 주소 | 항목 | 계수 | 제어 의미 |
|---|---|---|---|
| (출력 제한) | 출력 제한 / 끄기 | % 또는 W | 역송 방지·계통 명령 시 출력을 낮추거나 정지 (OpenDTU cmd/limit) |
0x1400 | 안전규격(Safety) | — | 나라별 계통연계 규정 선택 |
0x1401 | 기동 시간 | 0.5s | 전원 켜고 출력 시작까지 |
0x1402 | 재접속 시간 | 0.5s | 고장 풀린 뒤 다시 붙기까지 |
0x1404/0x1405 | 과·저전압 복귀값 | 0.1V | 차단이 풀리는 기준 전압 |
0x1406 | 과주파수 복귀값 | 0.01Hz | 차단이 풀리는 기준 주파수 |
이 "제어" 능력이 §2B 스마트 기능(주파수 대응·출력 조절)을 소프트웨어로 구현하는 손잡이입니다.
계수 변환 — 한 번 더 (예시)
자주 읽는 값 (읽기 0x03)
| 주소 | 무슨 값 | 형식 | 계수 | 설명 |
|---|---|---|---|---|
0x1100 | 운전 상태 | U16 | — | 정상/대기/고장 — 먼저 확인 |
0x1200 | 전력망 전압(A상) | U16 | 0.1V | 한국 205~253V |
0x1201 | 출력 전류 | U16 | 0.01A | 날씨로 변함 |
0x1209 | 주파수 | U16 | 0.01Hz | 한국 60Hz → 6000 근처 |
0x120C | 누설전류(GFCI) | U16 | mA | 커지면 누전 위험 |
0x120D | 온도(방열판) | U16 | 값−40℃ | 85 → 45℃ |
0x1211 | 지금 출력 전력 | U16 | 0.1W | 핵심 값 |
0x1212 | 오늘 발전량 | U16 | 10Wh | 자정 0으로 리셋 |
0x1213 | 누적 발전량 | U32 | 10Wh | 두 칸 합산 — 상위워드(0x1213)가 앞, 하위워드(0x1214)가 뒤 |
0x1216/7 | 절연저항 RX/RY | U16 | 0.001MΩ | 전기 새는지(안전) |
0x1302~4 | 태양광 입력 V/I/P | U16 | 0.1V·0.01A·0.1W | 우리는 PV1만(1채널) |
형식: U16=0~65535 정수, U32=큰 정수(두 칸), s16=음수 가능(배터리 충·방전), char[16]=글자(일련번호).
고장 코드 해석기 (한 숫자에 여러 고장이 섞임)
고장 값은 2진수 비트로 풀어 읽음. 값 48 = 16+32 = 통신끊김 + 원격종료. 숫자를 넣어보세요.
| Fault 0 — 전력망/회로 | |
|---|---|
| 4 | GFDI 지락 고장 |
| 8 | 과온 |
| 16 | 통신 끊김 |
| 32 | 원격 종료 |
| 256 | 전력망 상실(정전) |
| 1024/2048 | 릴레이 단선/단락 |
| 4096/8192 | 계통 과/저전압 |
| 16384/32768 | 계통 과/저주파수 |
| Fault 1 — 태양광(DC) | |
|---|---|
| 1 | 태양광 과전압 |
| 2 | 태양광 저전압 |
| 4 | 태양광 과전류 |
| 16 | 단락 보호 |
| 32 | 자가진단 고장 |