Sweden
Loading...
India
Loading...
peakShaving EC
Peak Shaving Logic of ems controller
flowchart TD
%% Global Styles
classDef phase fill:#e3f2fd,stroke:#1565c0,stroke-width:2px;
classDef decision fill:#fff9c4,stroke:#fbc02d,stroke-width:2px;
classDef hazard fill:#ffcdd2,stroke:#c62828,stroke-width:2px;
classDef term fill:#e0e0e0,stroke:#616161,stroke-width:2px;
%% START
Start([START CYCLE]) --> PhaseA
style Start term
%% PHASE A
PhaseA["PHASE A β MONITORING <br/> β’ Read grid meter (P_grid) <br/> β’ Check timestamp & quality"]
style PhaseA phase
PhaseA --> CheckData
%% DATA VALIDATION
CheckData{"Data Valid? <br/> (Fresh & Good)"}
style CheckData decision
%% --- NO PATH (Fallback) ---
CheckData -- NO --> Fallback
Fallback["FALLBACK SAFE STATE <br/> Set all batteries β 0 kW"]
style Fallback hazard
Fallback --> EndCycle([END CYCLE])
style EndCycle term
%% --- YES PATH (Main Logic) ---
CheckData -- YES --> PhaseB
%% PHASE B
PhaseB["PHASE B β ERROR DETECTION <br/> Compare P_grid vs Limits"]
style PhaseB phase
PhaseB --> CheckCondition{Check Condition}
style CheckCondition decision
%% Phase B Logic Branches
CheckCondition -- "Import Violation <br/> (P_grid > Import Limit)" --> CalcImport["<b>Need DISCHARGE</b> <br/> Error = P_grid - Import_Limit"]
CheckCondition -- "Export Violation <br/> (P_grid < Export Limit)" --> CalcExport["<b>Need CHARGE</b> <br/> Error = P_grid - Export_Limit"]
CheckCondition -- "Within Deadband" --> Deadband["<b>NO ACTION</b> <br/> Error = 0 <br/> Set Request = 0 kW"]
%% PHASE C (Only if Violation)
CalcImport --> PhaseC
CalcExport --> PhaseC
PhaseC["PHASE C β CORRECTION CALCULATION <br/> <b>PID Controller</b> <br/> SP=Limit, PV=P_grid <br/> P = Kp*err, I = Ki*err*dt, D = Kd*d_err <br/> <br/> <b>Saturation & Anti-Windup</b> <br/> Clamp Output & Freeze I-term"]
style PhaseC phase
%% PHASE D (Dispatch)
PhaseC --> PhaseD
Deadband --> PhaseD
PhaseD["PHASE D β RESOURCE DISPATCH <br/> β’ Determine Direction (+/-) <br/> β’ Allocate based on SoC <br/> β’ Send Setpoints"]
style PhaseD phase
%% WAIT & LOOP
PhaseD --> Wait
Wait["WAIT FOR NEXT CYCLE <br/> (Sleep for dt)"]
style Wait term
Wait --> Start