계기와 수집
계측과 수집
에너지 시스템의 품질은 화면이 아니라 계측에서 갈립니다. 계기가 잘못 매핑되면 그 위에 쌓는 집계, 기준선, 요금, 보고서는 전부 틀린 숫자가 됩니다.
이 페이지는 에너지원, 조직-계기 매핑, 수집 통신, 원시 계측 테이블을 현장 개발 기준으로 정리합니다.
1. 에너지원
에너지원은 단위와 환산계수가 다릅니다. 전력만 있다고 가정하고 스키마를 짜면 가스, 스팀, 압축공기가 들어올 때 테이블을 다시 쪼개게 됩니다.
energy_source (에너지원)
| 컬럼명 | 설명 |
|---|---|
| energy_source_id (PK) | 에너지원 ID |
| code | 코드 (ELECTRIC, GAS, STEAM, AIR, WATER) |
| name | 이름 |
| unit | 기본 단위 (kWh, N㎥, ton, ㎥) |
| co2_factor | 탄소 환산계수 |
| toe_factor | 석유환산톤 계수 |
- 전력: kWh, 한전 요금과 직결
- 가스: N㎥ 또는 ㎥, 압력/온도 보정이 붙는 경우가 많음
- 스팀: ton, 엔탈피로 열량 환산
- 압축공기: ㎥ 또는 N㎥, 비전력(kWh/㎥)이 핵심 지표
- 용수/냉각수: ㎥, 유량계 중심
2. 마스터 데이터
제조업 ERP처럼 거래 데이터가 먼저가 아닙니다. 에너지는 마스터가 먼저입니다. 회사-공장-구역-자산-설비-계기 순으로 등록해야 값이 붙습니다.
company / plant / plant_area
| 테이블 | 핵심 컬럼 | 설명 |
|---|---|---|
| company | company_id, company_code, company_name | 법인, 보고 단위 |
| plant | plant_id, company_id, plant_code, plant_name | 사업장, 수전 계약 |
| plant_area | area_id, plant_id, parent_id, area_code | 동/라인, 계층 |
asset / equipment
| 테이블 | 핵심 컬럼 | 설명 |
|---|---|---|
| asset | asset_id, plant_id, asset_code, asset_type_id | 공정 또는 유틸리티 |
| process | asset_id, process_type_id | 생산 공정 |
| utility | asset_id, utility_type_id | 압축기실, 보일러실 |
| equipment | equipment_id, plant_id, area_id, asset_id, equipment_code, status_id | 실제 설비 |
meter / equipment_meter
| 컬럼명 | 설명 |
|---|---|
| meter_id (PK) | 계기 ID |
| plant_id | 사업장 |
| meter_code | 현장 태그/자산번호. unique |
| meter_name | 표시명 |
| meter_type_id | 전력, 유량, 가스, 압력, 소음 등 |
| energy_source_id | 에너지원 |
| ratio | 배율. 기본 1.0 |
설비와 계기는 N:N입니다. 한 전력량계가 여러 설비를 물거나, 한 설비에 전력+유량이 같이 붙습니다. equipment_meter에 설비-계기-비율을 둡니다.
3. 계기 서브타입
계기 공통 속성과 물리 속성을 한 테이블에 다 넣으면 NULL이 많아집니다. 공통 meter + 타입별 확장 테이블이 실무에서 잘 맞습니다.
power / flow / gas / pressure / air
| 테이블 | 주요 컬럼 | 용도 |
|---|---|---|
| 전력 계기 | 상전압, 전류, 역률, 펄스 상수 | kWh, kW, 수요전력 |
| 유량 계기 | 관경, 유체 종류 | 순시유량, 적산유량 |
| 가스 계기 | 환산계수, 압력보정 | 부피 → 표준상태 |
| 압력 계기 | 범위 min/max, 단위 | 이상 압력 감시 |
| 공기 계기 | 유량 범위, 펄스 상수 | 압축공기 |
- 필자 생각: 계기 타입을 화면 enum으로만 관리하지 말고, 공통코드 테이블로 두는 편이 낫습니다. 현장에 "소음계", "분진계"가 갑자기 추가됩니다.
4. 수집기
수집기는 계기의 값을 가져오는 통신 주체입니다. 현장마다 장비가 다릅니다.
collector
| 컬럼명 | 설명 |
|---|---|
| collector_id (PK) | 수집기 ID |
| plant_id | 사업장 |
| collector_code | 장비 코드 |
| collector_type_id | RTU, RAW_TCP, CONVERTER, GEMS 등 |
| communication_type_id | Modbus, MQTT, TCP |
| polling_interval_sec | 폴링 주기 |
타입별 확장
| 타입 | 핵심 설정 | 특징 |
|---|---|---|
| RTU / MQTT | ltid, broker_url | 현장 게이트웨이가 브로커로 publish |
| Raw TCP | ip_address, port | 장비가 소켓으로 패킷을 밀어줌 |
| Converter | ip, port, memorymap | Modbus 맵을 읽어 변환 |
| GEMS | memorymap, ip, port | 한전/사설 전력 수집 장비 |
meter_collector
| 컬럼명 | 설명 |
|---|---|
| collector_id | 수집기 |
| meter_id | 계기 |
| port_no | 채널/슬롯 |
| is_active | 활성 여부 |
통신이 끊겨도 마스터는 남아 있어야 합니다. 수집 실패는 계측 공백이지 계기 삭제가 아닙니다.
5. 원시 계측
원시 테이블은 빨리 쌓이고 잘 안 지웁니다. 컬럼을 과하게 정규화하기보다, 도메인별로 측정 테이블을 나누는 편이 조회가 쉽습니다.
power_measurement (전력 원시값)
| 컬럼명 | 설명 |
|---|---|
| measurement_id (PK) | 계측 ID |
| company_id | 회사. 파티션/권한용 |
| meter_id | 계기 |
| kwh | 유효전력량 |
| kVARh | 무효전력량 |
| kVAh | 피상전력량 |
| voltage / current | 전압, 전류 |
| measured_at | 계측 시각 (KST) |
flow_measurement (유량 원시값)
| 컬럼명 | 설명 |
|---|---|
| measurement_id (PK) | 계측 ID |
| company_id | 회사 |
| meter_id | 계기 |
| c_flow_rate | 보정 유량 또는 적산 |
| measured_at | 계측 시각 |
공통 규칙:
measured_at은 타임존을 고정합니다. 한국 현장은 Asia/Seoul.- 적산값(누적)과 순시값을 섞지 않습니다. 적산이면 차분해서 사용량을 만듭니다.
- 중복 수집을 대비해
(meter_id, measured_at)unique를 거는 경우가 많습니다. - 원시 테이블에 요금, 탄소를 바로 넣지 않습니다. 집계 단계에서 계산합니다.
6. 통신 기술
현장에서 실제로 많이 만나는 프로토콜입니다.
- Modbus TCP / RTU: 전력량계, 인버터, 컨버터. 주소(맵) 관리가 핵심
- MQTT: 게이트웨이가 토픽으로 값 publish. 유실/재전송 정책 필요
- Raw TCP: 벤더 패킷. 길이, 체크섬, 리틀엔디안을 문서화해야 함
- OPC-UA: 상위 SCADA 연동
- REST 폴링: 클라우드 로거, 최근 장비
수집 주기:
- 실시간 감시: 1~10초. 화면용, 알람용
- 과금/절감: 1분 또는 15분. 한전 수요와 맞출 때 15분
- 일 마감: 하루 한 번 집계 잡
7. 프로세스 흐름
- 조직 등록: 회사, 공장, 구역
- 에너지원 등록: 단위, 탄소/TOE 계수
- 자산/설비 등록: 공정, 유틸리티, 설비
- 계기 등록: 타입, 에너지원, 배율
- 수집기 등록: IP, 맵, 토픽, 폴링 주기
- 매핑: 수집기-계기, 설비-계기
- 수집 시작: 원시 계측 insert
- 결측 처리: 통신 끊김, 음수 차분, 급증 스파이크 검증
결측이 있으면 일 집계를 그냥 더하면 안 됩니다. 보간할지, 결측 표시를 남길지 먼저 정하세요.
8. 현장에서 자주 터지는 이슈
- 변성기 배율을 안 곱해서 사용량이 1/60로 나옴
- 적산 리셋(계기 교체) 후 차분이 음수가 됨
- 상위 모선 계기와 하위 분기 계기를 같이 더해서 2배
- MQTT는 살아 있는데 특정 port만 멈춤
- 서버는 UTC, 현장은 KST라 하루 경계가 한 시간 밀림