결론부터: 운전 스케줄러는 사용자가 "가동"을 누르면 등록 순서대로 설정 간격마다 한 대씩 켜고, "정지"는 한꺼번에 끕니다. AI를 켜면 Chronos가 "지금 켜도 되는지"를 판정하고, AI가 간격의 2배 동안 아무것도 켜지 않으면 dataserver가 대신 켭니다. 가장 큰 빈칸은 룰과 AI 모두 켤 설비 자신의 부하(돌입·정상 kW)를 판단에 넣지 않는다는 점입니다. 개선은 기동 기록으로 설비별 기동 프로파일을 만들고(0~2), 이번 구간에 얹히는 면적과 다음 구간 예산으로 판단하며(1), 피크제어와 같은 남은 구간 예측을 공유(3)하는 순서입니다.
표시확인 10/12 코드로 확인가정 추정·미확인신규 이번에 새로 찾은 문제
0
한눈에 보기
단계
바꾸는 것
AI
넘어가는 조건
0 기록
기동 이벤트에 기동 전 총전력·돌입 최대 kW·안정 후 kW·안정까지 시간 추가, PLC 미연결로 건너뛴 설비 표시
없음
설비별 기동 3회 이상 기록
1 기본값
룰 모드에 "면적 + 다음 구간 + 순간" 세 가지 허용 조건, AI 폴백도 같은 조건으로, 건너뛴 설비 알림
없음
보류 때문에 기동이 지나치게 늦어지지 않을 것
2 계수
설비별 기동 프로파일(돌입 크기·지속, 정상 kW 중앙값) 자동 갱신, 구간 시작 직후 기동 권장
통계
프로파일 예측과 실제 차이 중앙값 15% 이내
3 예측·연결
AI 판정을 피크제어의 남은 구간 예측과 공유, 피크제어에 "곧 켤 설비" 미리 알림(06)
지도학습
그림자에서 기동 후 피크 레벨 상승 감소
1
지금 운전 스케줄러가 하는 일
그림 1. 켜는 순서는 등록 순서 그대로입니다. AI는 "지금 켤지"만 판단합니다.
항목
동작
위치
시작·정지
사용자 버튼만. 시간 예약 없음. run_scheduler_unitind 1 = 가동, 2 = 정지
smartScheduler.checkRunStop 확인
설정
run_scheduler.name = 설비 번호 목록(;), value = 간격(초). name 앞 "A|"가 AI 사용 표시
runSchedulerAiFlag
룰 모드 기동
간격이 지나면 목록에서 아직 안 켜진 첫 설비 1대를 켜고 기록. 전부 켜지면 unitind = 0
runUnits
PLC 미연결
그 설비는 경고 로그만 남기고 건너뜀. 나머지가 다 켜지면 완료 처리
runUnits 확인
정지
목록 전체를 한 번에 끔(간격 없음)
stopUnits
AI 모드 기동
마지막 기동(누가 켰든) 후 간격이 지나면 매초 판정해서 yes면 켬. dataserver는 마지막 기동 후 간격 × 2가 지나도록 아무것도 안 켜졌을 때만 대신 켬
aiControlProc2.run_scheduler_run_once, runUnits
AI 판정
① live_total_kw_peak_data 최근 2시간으로 "제어 간격(초) 뒤 kW" 0.9 분위 예측 ≤ 적용전력, ② 15분 평균 최근 7일로 "다음 블록 평균" 0.9 분위 예측 ≤ 적용전력 × 주의%. 둘 다 통과해야 yes
run_scheduler_run_once
AI 감시
하트비트 60초 끊기면 "A|"를 떼어 AI 자동 해제, 알람·사용자 제어 기록
checkRunStop
기동 후
켜진 설비는 간격(초)만큼 기동 유예: 피크·절전·부하적응 제어 대상에서 제외
emsPlcClient·smartControl
기록
unit_power_onoff_log: 설비, ON/OFF, control_type(R 룰, A AI), status(P 대기 → PLC 쓰기 성공 시 S)
UnitPowerOnOffLog
참고: 운영 설명자료에는 LLM 방식과 "위험 수준이면 AI에게 묻지 않고 보류" 같은 사전 규칙이 적혀 있지만, 10/12 코드(aiControlProc2)의 판정은 위 ①·② 두 예측 비교뿐입니다.
2
문제점
#
문제
영향
근거
S1
켤 설비 자신의 부하를 보지 않음
룰은 전력을 아예 안 보고, AI도 "지금 부하가 이어지면" 넘는지만 예측함. 30kW 설비와 300kW 설비를 같은 기준으로 판정
run_scheduler_run_once 신규
S2
15분 구간 안의 시점을 무시
같은 100kW 설비도 3분에 켜면 이번 구간에 20kWh, 13분에 켜면 3.3kWh가 더해짐. 판단은 kW가 아니라 면적이어야 함
3층
·
S3
AI "초 단위" 입력이 실제로는 1분 최대값 위주
live_total_kw_peak_data는 1분이 지나면 그 분의 최대값만 남기고 지움. 2시간 입력 중 마지막 1~2분만 초 단위이고 나머지는 분당 최대값이며 간격도 불규칙. 예측이 높게 나와 보류가 잦아지는 쪽으로 치우칠 수 있음
getRunDataSet.get_kw_history + RealtimeDBManager 신규
S4
AI 예측 길이가 피크제어 간격에 묶임
"몇 초 뒤"를 auto_control_param.value(피크제어 제어 간격)로 정함. 피크제어 간격을 바꾸면 운전 스케줄러 판정 기준도 함께 바뀜
get_control_interval_sec 신규
S5
PLC 미연결 설비가 조용히 빠짐
건너뛴 설비는 나머지가 다 켜지면 "전부 가동 완료"로 끝나 다시 시도하지 않음. 경고 로그 외에 알람이 없음
runUnits 신규
S6
AI의 정당한 보류를 폴백이 무시
AI가 위험하다고 계속 no를 내도, 간격 × 2가 지나면 dataserver가 조건 확인 없이 켬. AI가 죽은 경우와 구분하지 않음
runUnits(AI 분기)
S7
기동 결과를 확인하지 않음
status S는 PLC 쓰기 성공일 뿐. 실제로 돌기 시작했는지(kW 상승)는 보지 않음
runControl
3
모듈별 개선 설계
M1
수집: 기동 프로파일
0단계
이미 있는 unit_power_onoff_log에 기동 직후의 실측을 붙여, 설비마다 "켜면 무엇이 얹히는가"를 기록합니다.
추가할 값
기동 직전 10초 평균 총전력, 기동 후 60초 동안 설비 kW 최대값(돌입), 돌입이 정상의 1.2배 아래로 내려오기까지 걸린 초, 기동 후 3~5분 설비 kW 중앙값(정상 부하)
재료
unit_used_data는 10초마다 구간 최대값을 남기므로 돌입 최대값은 10초 해상도로 볼 수 있음 확인. 돌입 지속 시간은 10초 단위로만 추정
건너뛴 설비
PLC 미연결로 건너뛴 설비를 기록하고 알람(S5)
기동 확인
지령 후 30초 안에 설비 kW가 오르지 않으면 "기동 미확인" 표시(S7)
M2·M4
목표와 허용 판정: 세 가지 조건
1단계 · 계산식
피크제어의 층 1(15분 예산)을 같이 씁니다. 다음 설비를 켜도 되는지를 아래 세 조건으로 판단합니다.
조건
식
지키는 것
(a) 이번 구간
E_r − P_예측 × 남은 시간 ≥ 돌입kW × 지속초 ÷ 3600 + 정상kW × 남은 시간
이번 15분 평균 3층
·
(b) 다음 구간
다음 구간 예상 평균 + 정상kW ≤ 목표kW × 여유율(처음엔 주의%)
켠 뒤 계속 얹히는 다음 15분
(c) 순간
현재 kW + (돌입kW − 0) ≤ 순간 한계(적용전력 또는 수전 차단 여유)
돌입이 겹칠 때의 순간 초과
프로파일이 없을 때
정상kW = 설비 정격 또는 등록값, 돌입kW = 정상 × 6, 지속 10초로 보수적 시작. 기록이 3회 쌓이면 실측으로 교체
룰 모드
간격이 지나도 세 조건을 통과할 때까지 대기. 최대 대기 시간(예: 간격 × 5)을 넘으면 켜지 않고 운영자 알림
AI 폴백
간격 × 2 폴백도 무조건 켜지 않고 세 조건으로 판단(S6)
M3
예측: 피크제어와 하나로
1단계 계산 → 3단계 AI
1단계
P_예측 = 최근 1~3분 평균(피크제어 층 1과 같은 값). 다음 구간 예상 평균은 같은 요일·시각 과거 평균
3단계
피크제어의 남은 구간 예측기(「AI 도입 지도」 )를 그대로 공유. 운전 스케줄러용 별도 초 단위 예측(S3·S4)은 없앰
임시 보완
3단계 전에 지금 AI를 유지한다면, 초 단위 입력을 1분 최대값이 섞이지 않은 별도 10초 평균 보관분으로 바꾸고, 예측 길이를 운전 스케줄러 간격으로 분리
M5
할당: 언제 켤지
2~3단계
순서
등록 순서는 공정상 이유가 있을 수 있으므로 바꾸지 않음(기본). 바꿔도 되는 현장만 "작은 설비 먼저" 옵션 가정
구간 정렬
(a)는 통과하지만 (b)가 빠듯하면, 다음 구간이 시작된 직후로 미룸. 남은 시간이 짧을 때 켜면 이번 구간 영향은 작지만 다음 구간 전체에 얹히기 때문
피크제어에 알림
곧 켤 설비와 예상 정상kW를 공유 테이블에 써서, 피크제어가 P_end에 미리 반영(「AI 도입 지도」 )
M6·M7
안전과 효과 검증
유지 + 지표
유지
간격 = 기동 유예(다른 제어가 돌입 구간을 건드리지 않음), AI 하트비트 해제, PLC 미연결 거부
지표
기동 후 15분 안에 피크 레벨 ≥ 주의가 생긴 비율, 기동 1회당 이번 구간 평균 증가분, 보류 시간 합, 전체 가동 완료까지 걸린 시간
그림자
새 조건은 먼저 "켰을 것인가/보류했을 것인가"만 기록하고 지금 방식과 2주 비교
4
실행 계획
순서
작업
제어 변경
0-1
건너뛴 설비 기록·알람, 기동 미확인 표시
없음
0-2
기동 프로파일 기록(돌입·정상·지속)
없음
1-1
세 조건 그림자 기록(피크제어 층 1 완료 후)
없음
1-2
룰 모드·AI 폴백에 세 조건 적용, 최대 대기 알림
기동 시점
2-1
프로파일 자동 갱신, 구간 정렬
기동 시점
3-1
남은 구간 예측 공유, 별도 AI 판정 정리, 피크제어 알림
예측 입력
5
확인 필요
현장 설비의 기동 방식(직입, Y-Δ, 소프트 스타터, 인버터): 돌입 크기와 지속이 크게 다름
등록 순서가 공정상 고정인지(순서를 바꿀 수 있는지)
(c) 순간 한계를 적용전력으로 볼지 수전 차단기 기준으로 볼지
Chronos predict_df가 간격이 불규칙한 입력에 freq='s'를 받았을 때 실제로 어떻게 처리하는지(S3의 영향 크기)
한 줄 정리
지금은 "시간이 지났는가(룰)" 또는 "지금 부하가 이어지면 넘는가(AI)"만 봅니다. 켤 설비가 이번 구간과 다음 구간에 얹는 양을 기동 기록으로 알아내고, 그 면적으로 판단하면 AI 없이도 판단 근거가 생깁니다.