FB_MaximumDemandController
Funktionsbaustein zur Spitzenlastoptimierung, der durch Ab-/ Zuschaltung von bis zu acht Verbrauchern die Einhaltung der eingestellten Leistungsgrenze realisiert. Die Verbraucher können entsprechend ihrer Leistung und Priorität so abgeschaltet werden, dass keine Störungen des Produktionsablaufs entstehen.
Zur Erkennung der einzelnen Messzyklen wird von dem Energieversorgungsunternehmen (EVU) ein Synchronimpuls geliefert. Dieser gibt den Beginn eines neuen Messzyklus an und muss auf den Eingang bPeriodPuls aufgeschaltet werden. Die Erfassung der Ist-Leistung erfolgt über die Zählerklemme KL1501.
Der Baustein arbeitet mit einer festen Messperiodenzeit von 15 Minuten. Überschreitet der Synchronimpuls die 16-Minuten-Grenze, so wird der Ausgang bEmergencySignal gesetzt.
Zu Begin jeder Messperiode werden alle Verbraucher zugeschaltet. Innerhalb der Messperiode erfolgt bei drohender Überschreitung der Leistungsgrenze (fAgreedPower) nacheinander eine Abschaltung der Verbraucher. Ist die Gefahr der Lastüberschreitung nicht mehr gegeben, werden die Verbraucher wieder eingeschaltet.
Über eine Eingangsvariable können Besonderheiten, wie minimale Einschaltzeit, minimale Ausschaltzeit oder maximale Ausschaltzeit festgelegt werden. Ebenfalls kann die Priorität der einzelnen Verbraucher bestimmt werden. Verbraucher mit einer niedrigen Priorität werden vor Verbrauchern mit einer hohen Priorität abgeschaltet.
VAR_INPUT
bStart : BOOL;
fMeterConstant : LREAL;
fAgreedPower : LREAL;
bPeriodPulse : BOOL;
arrLoadParameter : ARRAY[1..8] OF ST_MDCLoadParameters;
bStart: Über eine positive Flanke an diesem Eingang wird der Baustein aktiviert.
fMeterConstant: Zählerkonstante [Impulse / kWh].
fAgreedPower: Dies ist die vereinbarte Leistungsgrenze, die im Betriebsfall nach Möglichkeit nicht überschritten werden darf [kW].
bPeriodPulse: Synchronimpuls, der vom Energieversorgungsunternehmen (EVU) gesendet wird. Mit diesem Impuls wird das Messintervall gestartet.
arrLoadParameter: Parameterstruktur des jeweiligen Verbrauchers. Diese besteht aus den folgenden Elementen:
TYPE ST_MDCLoadParameters: STRUCT bConnected : BOOL; nDegreeOfPriority : INT; tMINPowerOnTime : TIME; tMINPowerOffTime : TIME; tMAXPowerOffTime : TIME; END_STRUCT END_TYPE |
bConnected: TRUE = Verbraucher angeschlossen; FALSE = Verbraucher nicht angeschlossen.
nDegreeOfPriority: Kennzeichnet die Abschaltpriorität, Verbraucher mit der niedrigen Priorität werden als erstes abgeschaltet. ( 1 => niedrige; ... 8 => hohe Priorität )
tMINPowerOnTime: Minimale Einschaltzeit (Mindest-Hochlaufzeit) in der, der Verbraucher nicht abgeschaltet werden darf.
tMINPowerOffTime: Minimale Ausschaltzeit (Erholzeit) in der, der Verbraucher nicht erneut eingeschaltet werden darf.
tMAXPowerOffTime: Maximale Ausschaltzeit nach der, der Verbraucher erneut eingeschaltet werden muss.
VAR_OUTPUT
arrLoad : ARRAY[1..8] OF BOOL;
fAgreedEnergy : LREAL;
fInstantaneousEnergy : LREAL;
fActualEnergy : LREAL;
tRemainingTime : TIME;
fLastPeriodEnergy : LREAL;
bEmergencySignal : BOOL;
bError : BOOL;
nErrorId : UDINT;
arrLoad: Ist ein Array des Datentyps BOOL; eingeschaltete Verbraucher sind TRUE.
fAgreedEnergy: Vereinbarter Energieverbrauch [kWh].
fInstantaneousEnergy: momentaner Energieverbrauch [kWh] bezogen auf einen Integrationszeitraum von 15s (interner Messintervall).
fActualEnergy: Zum "jetzigen" betrachteten Zeitpunkt der Messperiode verbrauchte Energie.
tRemainingTime: Restzeit bis zum nächsten Messintervall.
fLastPeriodEnergy: Sollleistung aus der vorhergegangenen Messperiode [kWh].
bEmergencySignal: Der Ausgang wird gesetzt so bald die vorgegebene Energie überschritten wird.
bError: Dieser Ausgang wird auf TRUE geschaltet, wenn bei der Ausführung eines Befehls ein Fehler aufgetreten ist.
nErrorId: Enthält den Fehlercode.
VAR_IN_OUT
stInDataKL1501 : ST_MDCInDataKL1501;
stOutDataKL1501 : ST_MDCOutDataKL1501;
stInDataKL1501: Verknüpft mit der KL1501.
TYPE ST_MDCInDataKL1501 :
STRUCT
nStatus : USINT;
nDummy1 : USINT;
nDummy2 : USINT;
nDummy3 : USINT;
nData : DWORD;
END_STRUCT
END_TYPE
stOutDataKL1501: Verknüpft mit der KL1501.
TYPE ST_MDCOutDataKL1501 :
STRUCT
nCtrl : USINT;
nDummy1 : USINT;
nDummy2 : USINT;
nDummy3 : USINT;
nData : DWORD;
END_STRUCT
END_TYPE
Beispiel
VAR_GLOBAL
arrLoadParameters AT %MB100 : ARRAY[1..8] OF ST_MDCLoadParameters;
(* KL1002 *)
bPeriodPulse AT %IX6.0 : BOOL;
(* KL1501*)
stInDataKL1501 AT %IB0 : ST_MDCInDataKL1501;
stOutDataKL1501 AT %QB0 : ST_MDCOutDataKL1501;
(* KL2404 *)
bLoadOut1 AT %QX6.0 : BOOL;
bLoadOut2 AT %QX6.1 : BOOL;
bLoadOut3 AT %QX6.2 : BOOL;
bLoadOut4 AT %QX6.3 : BOOL;
(* KL2404 *)
bLoadOut5 AT %QX6.4 : BOOL;
bLoadOut6 AT %QX6.5 : BOOL;
bLoadOut7 AT %QX6.6 : BOOL;
bEmergencySignal AT %QX6.7 : BOOL;
END_VAR
PROGRAM MAIN
VAR
fbMaximumDemandController : FB_MaximumDemandController;
END_VAR
arrLoadParameters[1].bConnected := TRUE;
arrLoadParameters[1].nDegreeOfPriority := 1;
arrLoadParameters[1].tMINPowerOnTime := t#60s;
arrLoadParameters[1].tMINPowerOffTime := t#120s;
arrLoadParameters[1].tMAXPowerOffTime := t#600s;
arrLoadParameters[2].bConnected := TRUE;
arrLoadParameters[2].nDegreeOfPriority := 2;
arrLoadParameters[2].tMINPowerOnTime := t#60s;
arrLoadParameters[2].tMINPowerOffTime := t#120s;
arrLoadParameters[2].tMAXPowerOffTime := t#600s;
arrLoadParameters[3].bConnected := TRUE;
arrLoadParameters[3].nDegreeOfPriority := 3;
arrLoadParameters[3].tMINPowerOnTime := t#60s;
arrLoadParameters[3].tMINPowerOffTime := t#120s;
arrLoadParameters[3].tMAXPowerOffTime := t#300s;
arrLoadParameters[4].bConnected := TRUE;
arrLoadParameters[4].nDegreeOfPriority := 4;
arrLoadParameters[4].tMINPowerOnTime := t#20s;
arrLoadParameters[4].tMINPowerOffTime := t#30s;
arrLoadParameters[4].tMAXPowerOffTime := t#8m;
arrLoadParameters[5].bConnected := TRUE;
arrLoadParameters[5].nDegreeOfPriority := 5;
arrLoadParameters[5].tMINPowerOnTime := t#20s;
arrLoadParameters[5].tMINPowerOffTime := t#50s;
arrLoadParameters[5].tMAXPowerOffTime := t#20m;
arrLoadParameters[6].bConnected := TRUE;
arrLoadParameters[6].nDegreeOfPriority := 6;
arrLoadParameters[6].tMINPowerOnTime := t#30s;
arrLoadParameters[6].tMINPowerOffTime := t#1m;
arrLoadParameters[6].tMAXPowerOffTime := t#1m;
arrLoadParameters[7].bConnected := TRUE;
arrLoadParameters[7].nDegreeOfPriority := 7;
arrLoadParameters[7].tMINPowerOnTime := t#0s;
arrLoadParameters[7].tMINPowerOffTime := t#0s;
arrLoadParameters[7].tMAXPowerOffTime := t#1m;
arrLoadParameters[8].bConnected := FALSE;
fbMaximumDemandController(bStart := TRUE,
fMeterConstant := 20000,
fAgreedPower := 600,
bPeriodPulse := bPeriodPulse,
arrLoadParameters := arrLoadParameters,
stInDataKL1501 := stInDataKL1501,
stOutDataKL1501 := stOutDataKL1501);
bLoadOut1 := fbMaximumDemandController.arrLoad[1];
bLoadOut2 := fbMaximumDemandController.arrLoad[2];
bLoadOut3 := fbMaximumDemandController.arrLoad[3];
bLoadOut4 := fbMaximumDemandController.arrLoad[4];
bLoadOut5 := fbMaximumDemandController.arrLoad[5];
bLoadOut6 := fbMaximumDemandController.arrLoad[6];
bLoadOut7 := fbMaximumDemandController.arrLoad[7];
bEmergencySignal := fbMaximumDemandController.bEmergencySignal;