← J-EMS 제어 개선 문서 모음
J-EMS 기능별 개선 상세 · 3/5

운전 스케줄러 개선 상세

2026년 11월 6일 · v1
기준 코드: jems_watch 2026-10-12 (현행과 같음 확인)
상위 문서: 제어 고도화·AI 도입 통합안 v1 · 관련: 3층 구조 v3 5-5
결론부터: 운전 스케줄러는 사용자가 "가동"을 누르면 등록 순서대로 설정 간격마다 한 대씩 켜고, "정지"는 한꺼번에 끕니다. 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

지금 운전 스케줄러가 하는 일

가동 버튼unitind = 1 룰 모드 (dataserver)간격이 지나면 다음 설비 무조건 AI 모드 (aiControlProc2)마지막 기동 후 간격 경과 시 매초 판정초 단위 예측·15분 예측 둘 다 통과 다음 설비 켬units.run = 1 PLCM1000 ON AI 모드에서 간격 × 2 동안 아무것도 안 켜지면 dataserver가 대신 켬(폴백)
그림 1. 켜는 순서는 등록 순서 그대로입니다. AI는 "지금 켤지"만 판단합니다.
항목동작위치
시작·정지사용자 버튼만. 시간 예약 없음. run_scheduler_unitind 1 = 가동, 2 = 정지smartScheduler.checkRunStop 확인
설정run_scheduler.name = 설비 번호 목록(;), value = 간격(초). name 앞 "A|"가 AI 사용 표시runSchedulerAiFlag
룰 모드 기동간격이 지나면 목록에서 아직 안 켜진 첫 설비 1대를 켜고 기록. 전부 켜지면 unitind = 0runUnits
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 분위 예측 ≤ 적용전력 × 주의%. 둘 다 통과해야 yesrun_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 신규
S215분 구간 안의 시점을 무시같은 100kW 설비도 3분에 켜면 이번 구간에 20kWh, 13분에 켜면 3.3kWh가 더해짐. 판단은 kW가 아니라 면적이어야 함3층
S3AI "초 단위" 입력이 실제로는 1분 최대값 위주live_total_kw_peak_data는 1분이 지나면 그 분의 최대값만 남기고 지움. 2시간 입력 중 마지막 1~2분만 초 단위이고 나머지는 분당 최대값이며 간격도 불규칙. 예측이 높게 나와 보류가 잦아지는 쪽으로 치우칠 수 있음getRunDataSet.get_kw_history + RealtimeDBManager 신규
S4AI 예측 길이가 피크제어 간격에 묶임"몇 초 뒤"를 auto_control_param.value(피크제어 제어 간격)로 정함. 피크제어 간격을 바꾸면 운전 스케줄러 판정 기준도 함께 바뀜get_control_interval_sec 신규
S5PLC 미연결 설비가 조용히 빠짐건너뛴 설비는 나머지가 다 켜지면 "전부 가동 완료"로 끝나 다시 시도하지 않음. 경고 로그 외에 알람이 없음runUnits 신규
S6AI의 정당한 보류를 폴백이 무시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

확인 필요

한 줄 정리

지금은 "시간이 지났는가(룰)" 또는 "지금 부하가 이어지면 넘는가(AI)"만 봅니다. 켤 설비가 이번 구간과 다음 구간에 얹는 양을 기동 기록으로 알아내고, 그 면적으로 판단하면 AI 없이도 판단 근거가 생깁니다.