결론부터 씁니다. ESS 컨테이너 HVAC 평상시 제어에서 가장 자주 틀리는 제어 변수는 온도가 아니라 결로 여유(표면 온도와 실내 이슬점의 차)입니다. 여름 첨두 부하에서는 냉방 용량이 문제지만, 저부하·고습 계절에는 과냉방과 외기 도입이 결로를 만들고, 결로는 절연 저하와 접점 부식으로 이어집니다. 제어 입력을 리턴 공기 온도 하나에 두지 말고 BMS 최고 셀 온도, 랙 흡입 온도, 실내 이슬점을 함께 받아야 하며, HVAC 이상은 PCS 출력 제한으로 연결돼야 합니다. 화재·오프가스 대응은 별도 계통이 주관하고, 평상시 제어기는 그 시그널을 받으면 제어권을 내려놓는 구조가 원칙입니다.

안전 인터락 조건 먼저
평상시 환경 제어기는 안전 계통이 아닙니다. 그러므로 먼저 “평상시 제어기가 하지 않는 것”을 고정합니다.
- □ EMO는 하드와이어드 안전회로로 PCS와 배터리 직류 차단부를 개방합니다. 환경 제어 PLC는 EMO 상태를 감시 입력으로만 읽습니다.
- □ 가스(오프가스)·연기·화재 감지 시 배기 팬·댐퍼·HVAC의 동작은 소방·방폭 제어반이 하드와이어로 주관합니다. 환경 제어 PLC는 해당 시그널을 받으면 자신의 출력 지령을 해제 상태로 두고, 소방 측 지령과 경쟁하지 않습니다.
- □ 소방 측 오버라이드가 PLC 출력보다 우선하도록 HVAC·팬 기동 회로에 접점으로 구성돼 있는지 결선도로 확인합니다. PLC 로직만으로 우선순위를 만드는 구조는 허용하지 않습니다.
- □ HVAC 전원 상실은 배터리 운전 계속 여부의 판단 입력입니다. 냉방이 없는 상태에서 PCS가 정격 출력을 계속 내지 않도록 출력 제한 경로를 둡니다.
이 네 줄이 전제되면 나머지는 품질·수명을 위한 제어입니다. 이 글은 그 평상시 제어 범위만 다룹니다.
제어 입력의 선택
컨테이너 내부 온도는 균일하지 않습니다. 급기구에 가까운 랙과 먼 랙, 상단과 하단의 흡입 온도가 다르고, 리턴 공기 온도는 이 모두가 섞인 값입니다. 리턴 온도만으로 제어하면 평균은 맞추지만 가장 뜨거운 랙은 놓칩니다.
| 입력 | 장점 | 한계 | 용도 |
|---|---|---|---|
| 리턴 공기 온도 | HVAC 내장, 응답 빠름 | 혼합값, 편차 은폐 | HVAC 자체 제어 |
| 랙 흡입 온도 | 랙별 실제 조건 | 센서 수 증가 | 급기 설정 보정 |
| BMS 최고 셀 온도 | 배터리 기준 값 | 통신 경유, 열 지연 | PCS 출력 제한 |
| 실내 이슬점 | 결로 여유 계산 | 센서 드리프트 | 냉방 하한·외기 도입 판단 |
표의 결론은 “하나로 제어하지 말고 역할을 나누라”입니다. HVAC는 리턴 온도로 자체 루프를 돌리고, PLC는 랙 흡입 온도로 급기 설정을 보정하며, BMS 최고 셀 온도는 PCS 출력 제한에만 쓰고, 이슬점은 냉방 하한과 외기 댐퍼 개방의 조건으로만 씁니다. 역할이 겹치면 두 루프가 서로 싸웁니다.
평상시 제어 시퀀스
동작 타임차트 전제: HVAC 2대(A, B) N+1 구성, 외기 도입 댐퍼 1개, 결로 방지 히터 1개, PCS 출력 제한은 아날로그 또는 MODBUS_TCP 지령으로 전달한다고 가정합니다.
- 기본 운전: HVAC A 주기, B 대기. 운전 시간 누적이 설정값을 넘으면 주·대기를 교대합니다.
- 랙 흡입 최고 온도가 상한에 접근하면 B를 추가 기동합니다. 두 대 운전 중에도 상승이 계속되면 PCS 출력 제한 단계로 넘어갑니다.
- 냉방 설정 하한은 실내 이슬점 + 여유값 아래로 내려가지 않게 클램프합니다. 저부하 시 과냉방을 막는 핵심 조건입니다.
- 외기 댐퍼는 외기 이슬점이 실내 이슬점보다 낮을 때만 엽니다. 외기 조건 측정이 없으면 평상시 외기 도입은 하지 않습니다.
- 결로 여유가 기준 이하로 줄면 결로 방지 히터를 켜고 냉방 단계를 낮춥니다.
- HVAC 양대 고장 또는 전원 상실 시 PCS 출력 제한을 즉시 최저 단계로 내리고, 셀 온도 추이로 정지 여부를 판단합니다.
(* I/O MAP
%I3.0 DI_EMO_LOOP_OK : EMO hardwired loop healthy (monitor only)
%I3.1 DI_FIRE_PANEL_OVERRIDE : fire / off-gas panel has taken HVAC and fans
%I3.2 DI_HVAC_A_FAULT : HVAC A fault contact
%I3.3 DI_HVAC_B_FAULT : HVAC B fault contact
%I3.4 DI_DOOR_OPEN : container door open
%IW400 AI_RACK_INLET_TMAX : highest rack inlet temperature, 0.1 degC/digit
%IW402 AI_ROOM_DEWPT : room dew point, 0.1 degC/digit
%IW404 AI_OUT_DEWPT : outdoor dew point, 0.1 degC/digit
%IW406 AI_BMS_CELL_TMAX : BMS highest cell temperature via MODBUS_TCP
%IW408 AI_RACK_INLET_TMIN : lowest rack inlet temperature (coldest surface proxy)
%Q3.0 DO_HVAC_A_RUN : HVAC A run command
%Q3.1 DO_HVAC_B_RUN : HVAC B run command
%Q3.2 DO_FRESH_AIR_DAMPER : fresh air damper open
%Q3.3 DO_ANTI_COND_HEATER : anti-condensation heater
%QW400 AO_SUPPLY_T_SP : HVAC supply air setpoint, 0.1 degC/digit
%QW402 AO_PCS_P_LIMIT_PCT : PCS active power limit, 0.1 %/digit
*)
VAR
NORMAL_CTRL : BOOL;
COOL_FLOOR : INT; (* lowest allowed supply setpoint = dew point + margin *)
COND_MARGIN : INT;
HVAC_ALL_LOST: BOOL;
END_VAR
(* normal control only when EMO loop healthy and fire panel has not taken over *)
NORMAL_CTRL := DI_EMO_LOOP_OK AND NOT DI_FIRE_PANEL_OVERRIDE;
(* condensation guard: supply setpoint never below room dew point plus margin *)
COOL_FLOOR := AI_ROOM_DEWPT + DEWPT_MARGIN_SP;
AO_SUPPLY_T_SP := MAX(SUPPLY_T_BASE_SP, COOL_FLOOR);
COND_MARGIN := AI_RACK_INLET_TMIN - AI_ROOM_DEWPT; (* coldest point decides condensation *)
DO_ANTI_COND_HEATER := NORMAL_CTRL AND (COND_MARGIN < COND_MARGIN_MIN_SP);
(* lead / lag: B starts on high inlet temperature or A fault *)
DO_HVAC_A_RUN := NORMAL_CTRL AND NOT DI_HVAC_A_FAULT;
DO_HVAC_B_RUN := NORMAL_CTRL AND NOT DI_HVAC_B_FAULT
AND (DI_HVAC_A_FAULT OR (AI_RACK_INLET_TMAX > INLET_T_STAGE2_SP));
(* fresh air only when outdoor air is drier and door closed *)
DO_FRESH_AIR_DAMPER := NORMAL_CTRL AND NOT DI_DOOR_OPEN
AND (AI_OUT_DEWPT < AI_ROOM_DEWPT - DAMPER_DP_MARGIN_SP);
(* PCS derating: loss of both HVAC units or high cell temperature *)
HVAC_ALL_LOST := DI_HVAC_A_FAULT AND DI_HVAC_B_FAULT;
IF HVAC_ALL_LOST OR (AI_BMS_CELL_TMAX > CELL_T_DERATE_SP) THEN
AO_PCS_P_LIMIT_PCT := P_LIMIT_MIN_PCT; (* set by thermal study *)
ELSE
AO_PCS_P_LIMIT_PCT := 1000; (* 100.0 % *)
END_IF;
코드의 설정값(DEWPT_MARGIN_SP, INLET_T_STAGE2_SP, CELL_T_DERATE_SP 등)은 셀 제조사의 운전 온도 범위와 설비 열해석으로 정하는 값이며, 여기서는 변수로만 둡니다. BMS 최고 셀 온도가 통신으로 들어오는 경우 통신 끊김 시 이 입력을 어떻게 볼지(최악값 가정 등)를 별도로 정해야 합니다.
현장 확인 체크리스트
- □ 소방·방폭 제어반의 오버라이드 접점이 HVAC와 배기 팬 기동 회로에 PLC 출력보다 우선하도록 결선돼 있는가.
- □ 랙 흡입 온도 센서가 급기구 최근접 랙과 최원격 랙, 상·하단에 분산돼 있는가.
- □ 냉방 설정 하한이 이슬점 기반으로 클램프되는지, 저부하 겨울철 운전 데이터로 확인했는가.
- □ 주·대기 교대 시 두 대가 동시에 정지하는 구간이 없는가(교대는 기동 확인 후 정지 순서).
- □ HVAC 양대 고장 모의 시 PCS 출력 제한이 실제로 적용되는지 PCS 측 응답을 기록했는가.
- □ 도어 개방 중 외기 댐퍼가 닫히고, 장시간 개방 시 경보가 발생하는가.
- □ HVAC 압축기 기동 시 보조 전원 전압 강하가 제어 전원에 미치는 영향은 파형 분석 및 실측 요망 항목으로 관리하는가.
경계 조건
이 설계가 틀리게 되는 조건이 있습니다. 첫째, 액랭(수랭) 방식 컨테이너는 셀 온도 제어가 냉각수 루프에서 이뤄지므로, 공조는 전장품 발열과 결로 관리로 역할이 줄고 제어 입력의 우선순위가 달라집니다. 둘째, 연중 건조한 기후에서는 결로 여유 제어의 이득이 작아 온도 중심 제어로 충분합니다. 셋째, 컨테이너가 작고 랙이 한두 개뿐이면 랙 흡입 온도 분산 측정의 이득이 작습니다.
단일 판단 기준은 이렇습니다. 냉방 설정 하한이 실내 이슬점에 연동돼 있지 않다면, 그 컨테이너의 평상시 제어는 여름만 기준으로 설계된 것이며 저부하 계절 운전 전에 수정해야 합니다.


