BMS-PCS 통신 끊김 페일세이프, 타임아웃은 운전점으로 정해야 하는 이유 — 얼라이브 카운터와 하드와이어 허가 접점

결론부터 씁니다. BMS-PCS 통신(CAN, MODBUS_TCP) 끊김 시 페일세이프 타임아웃은 통신 관례값이 아니라 현재 운전점에서 셀이 한계에 도달하기까지 남은 시간으로 정해야 합니다. 중간 SOC에서 저전류로 운전 중이라면 마지막 값을 몇 초 유지해도 문제가 없지만, 충전 말기 고전류 구간에서는 같은 몇 초가 한계를 넘기기에 충분할 수 있습니다. 또 통신 링크가 살아 있다는 것과 데이터가 새것이라는 것은 다른 문제이므로, 링크 감시와 함께 얼라이브 카운터(Alive Counter) 감시가 필수입니다. 마지막 방어선은 통신과 무관한 하드와이어 허가 접점입니다.

배터리 랙과 BMS, 랙 직류 접촉기, PCS, 계통 변압기로 이어지는 전력 흐름과, BMS에서 PCS로 가는 통신선 및 별도 하드와이어 허가 신호선을 나타낸 등각 도식
전력은 배터리 랙에서 직류 접촉기와 PCS를 거쳐 계통으로 흐르고, BMS-PCS 사이에는 통신선과 별도로 하드와이어 허가 접점이 병행됩니다.

안전 인터락 조건 먼저

통신은 운전 최적화 수단이지 안전 수단이 아닙니다. 통신이 완전히 사라져도 셀을 보호할 수 있는 경로가 먼저 존재해야 하고, 그다음에 통신 끊김 시 거동을 설계합니다.

  • □ EMO는 하드와이어드 안전회로로 PCS 교류·직류 측과 랙 직류 접촉기를 개방합니다. PLC와 PCS 제어기는 EMO 상태를 감시 입력으로만 읽습니다.
  • □ BMS는 셀 과전압·저전압·과온 시 자체 판단으로 랙 직류 접촉기를 개방할 수 있어야 합니다. 이 경로는 PCS와 통신이 끊겨도 동작합니다.
  • □ BMS 운전 허가는 통신 데이터와 별도로 무전압 접점(DI_BMS_PERMIT_HW)으로도 PCS에 전달합니다. 상시 폐로 배선으로 단선 시 허가 상실로 판정합니다.
  • □ 직류 접촉기는 부하 전류를 끊는 용도로 쓰지 않습니다. 개방 전에 PCS 전류를 0으로 내리는 순서를 두고, 비상 시에만 전류 중 개방을 허용합니다(접촉기 차단 정격 확인 필수).

이 네 조건이 갖춰진 상태에서 통신 페일세이프는 “안전”이 아니라 “불필요한 정지를 줄이면서 안전 경로가 동작하기 전에 먼저 부드럽게 내리는 것”이 목적이 됩니다.

통신 고장 유형과 검출 방법

통신 끊김은 한 종류가 아닙니다. 케이블이 빠진 경우는 타임아웃으로 쉽게 잡히지만, BMS 애플리케이션이 멈추고 통신 스택만 살아 같은 값을 계속 보내는 경우는 타임아웃으로 잡히지 않습니다.

고장 유형 현상 검출 방법
물리 단선 프레임 수신 없음 수신 타임아웃
BMS 앱 정지 링크 정상, 값 고정 얼라이브 카운터 정지
게이트웨이 지연 값은 오나 오래됨 타임스탬프 경과 시간
값 오류 범위 밖 값 CRC·범위·변화율 검사
버스 과부하·노이즈 간헐 누락 누락률 계수(파형 분석 및 실측 요망)

표에서 두 번째 줄이 가장 위험합니다. MODBUS_TCP에서 TCP 세션이 살아 있고 레지스터 읽기가 성공해도, 그 값이 몇 분 전 값일 수 있습니다. 얼라이브 카운터나 BMS 측 타임스탬프를 레지스터 맵에 넣지 않은 설비는 이 고장을 원리적으로 검출하지 못합니다.

타임아웃을 운전점으로 정하는 방법

SOC 변화 속도는 전류(C-rate)로 계산됩니다. 1C는 1시간에 100%이므로 SOC 1%당 36 s입니다. 0.5C라면 1%당 72 s, 2C라면 18 s입니다. 여기에 충전 말기에는 SOC가 조금만 올라도 전압이 급하게 오르는 구간이 있으므로, 실제 여유는 SOC 계산보다 짧게 잡아야 합니다.

가정: 전압 상한 도달 전 SOC 여유 2%, 운전 전류 1C라면 여유 시간은 약 72 s입니다. 이 경우 마지막 값 유지 5 s는 여유의 약 7%로 충분히 작습니다. 반면 여유 0.5%, 2C라면 여유 시간은 약 9 s이고, 5 s 유지는 여유의 절반을 넘습니다. 같은 타임아웃 값이 운전점에 따라 안전하기도, 위험하기도 합니다. 그래서 유지 시간은 고정값과 “여유 시간의 일정 비율” 중 작은 값으로 정합니다.

단계별 페일세이프 시퀀스

  1. T1 구간(유지): 통신 이상 검출 후 마지막 전류 한계값을 유지하되, 운전점 기준 유지 가능 시간을 넘지 않습니다.
  2. T2 구간(감발): 전류 지령을 설정 기울기로 0까지 내립니다. 방향(충전·방전)에 관계없이 0으로 수렴시킵니다.
  3. T3 구간(정지): 전류 0 확인 후 PCS 운전 허가를 해제하고, 랙 직류 접촉기 개방을 요청합니다.
  4. 하드와이어 허가 접점이 떨어지면 T1·T2를 건너뛰고 T3로 직행합니다.
  5. 재기동은 통신 정상 복귀, 얼라이브 카운터 연속 증가 확인, BMS 알람 없음, 운전원 리셋을 AND 조건으로 묶습니다. 자동 재기동은 두지 않습니다.
(* I/O MAP
   %I4.0  DI_EMO_LOOP_OK        : EMO hardwired loop healthy (monitor only)
   %I4.1  DI_BMS_PERMIT_HW      : BMS run permit dry contact, NC wiring
   %I4.2  DI_RESET_PB           : operator reset
   %IW500 BMS_ALIVE_CNT         : BMS alive counter via CAN / MODBUS_TCP
   %IW502 AI_BMS_CHG_I_LIM      : BMS charge current limit, 0.1 A/digit
   %IW504 AI_BMS_DSG_I_LIM      : BMS discharge current limit, 0.1 A/digit
   %IW506 AI_BMS_SOC_MARGIN     : SOC margin to nearest voltage limit, 0.1 %/digit
   %IW508 AI_PCS_DC_I           : PCS DC current, 0.1 A/digit, +charge / -discharge
   %QW500 AO_PCS_I_LIM          : current limit to PCS, 0.1 A/digit
   %Q4.0  DO_PCS_RUN_PERMIT     : PCS run permit
   %Q4.1  DO_DC_CONT_OPEN_REQ   : rack DC contactor open request to BMS
*)
VAR
  LAST_CNT      : INT;
  T_STALE       : TON;    (* alive counter not changing *)
  COMM_FAULT    : BOOL;
  HOLD_LIMIT_MS : DINT;   (* operating-point based hold time *)
  T_HOLD        : TON;
  I_CMD         : REAL;
  STATE         : INT;    (* 0 normal, 1 hold, 2 ramp down, 3 stopped *)
END_VAR

(* stale detection: counter must change within ALIVE_TO; link-up alone is not healthy *)
T_STALE(IN := (BMS_ALIVE_CNT = LAST_CNT), PT := T#500MS);   (* example value *)
LAST_CNT := BMS_ALIVE_CNT;
COMM_FAULT := T_STALE.Q;

(* hold time = min(fixed max, 10 % of time to limit); time to limit = margin / C-rate *)
HOLD_LIMIT_MS := MIN(HOLD_MAX_MS, TIME_TO_LIMIT_MS(AI_BMS_SOC_MARGIN, AI_PCS_DC_I) / 10);

CASE STATE OF
  0: IF COMM_FAULT THEN STATE := 1; END_IF;
     I_CMD := MIN(AI_BMS_CHG_I_LIM, AI_BMS_DSG_I_LIM);
  1: T_HOLD(IN := TRUE, PT := DINT_TO_TIME(HOLD_LIMIT_MS));
     IF NOT COMM_FAULT THEN STATE := 0; T_HOLD(IN := FALSE);
     ELSIF T_HOLD.Q THEN STATE := 2; T_HOLD(IN := FALSE); END_IF;
  2: I_CMD := MAX(0.0, I_CMD - RAMP_A_PER_SCAN);           (* ramp to zero *)
     IF (I_CMD = 0.0) AND (ABS(AI_PCS_DC_I) < I_ZERO_BAND) THEN STATE := 3; END_IF;
  3: I_CMD := 0.0;
     IF NOT COMM_FAULT AND DI_BMS_PERMIT_HW AND DI_RESET_PB THEN STATE := 0; END_IF;
END_CASE;

(* hardwired permit loss skips hold and ramp *)
IF NOT DI_BMS_PERMIT_HW OR NOT DI_EMO_LOOP_OK THEN STATE := 3; I_CMD := 0.0; END_IF;

AO_PCS_I_LIM        := REAL_TO_INT(I_CMD * 10.0);
DO_PCS_RUN_PERMIT   := (STATE < 3) AND DI_BMS_PERMIT_HW AND DI_EMO_LOOP_OK;
DO_DC_CONT_OPEN_REQ := (STATE = 3);

얼라이브 타임아웃 500 ms와 유지 비율 10%는 예시입니다. BMS의 송신 주기, 게이트웨이 변환 지연, PCS 전류 응답 속도에 따라 정하며, 통신 누락률은 버스 부하와 배선 상태에 좌우되므로 현장 파형 분석 및 실측 후 확정합니다. TIME_TO_LIMIT_MS는 SOC 여유를 현재 C-rate로 나눈 값을 반환하는 함수로 가정했습니다.

경계 조건

이 설계가 틀리게 되는 조건이 있습니다. 첫째, BMS가 SOC 여유나 전압 한계까지의 거리를 레지스터로 제공하지 않는다면 운전점 기반 유지 시간은 계산할 수 없고, 가장 불리한 운전점 기준의 짧은 고정값으로 돌아가야 합니다. 둘째, 그리드포밍 운전이나 계통 지원 지령 중에는 전류를 0으로 내리는 감발 자체가 계통에 교란이 될 수 있어, 계통 측 요구 조건과 함께 검토해야 합니다. 셋째, BMS 자체 보호가 통신 끊김 시에도 독립적으로 동작한다는 전제가 시험으로 확인되지 않았다면, 이 페일세이프 시퀀스는 1차 보호로 격상돼야 하고 설계 기준도 달라집니다.

단일 판단 기준은 이렇습니다. 통신 끊김 시 마지막 값을 유지하는 시간이 운전점과 무관한 고정값이라면, 충전 말기 최대 전류 조건에서 그 시간이 한계 도달 시간보다 충분히 짧은지부터 계산으로 확인합니다.

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤