FB_MaximumDemandController

FB_MaximumDemandController 1:

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.

FB_MaximumDemandController 2:

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;