FB_HVACPowerRangeTable

Der Funktionsbaustein stellt eine Leistungsstufentabelle dar und dient zur sequentiellen Regelung von Leistungserzeugern wie beispielsweise Heizkesseln oder Kältemaschinen. Die Leistungsstufen werden von dem vorgelagerten Regler FB_HVACI_Ctrl_Step bestimmt und der Leistungsstufentabelle über den Eingang iStep übergeben.
Alle für die Anlagensteuerung relevanten Informationen bzw. Parameter sind in dem Leistungsstufentabellen-ARRAY arrPowerRangeTable zusammengefasst. Die Leistungsstufentabelle ist ein zweidimensionales Array mit der Struktur ST_HVACPowerRange. Die Leistungsstufentabelle kann mit einer normalen Tabelle verglichen werden. Ein einzelnes Element ist durch Nennung von Zeile und Spalte eindeutig bezeichnet. Die Spalten sind durch den Feldbereich 1..g_iMaxNumberOfProfiles gekennzeichnet. Dieser Bereich wird als Profil bezeichnet und wird über die Eingangsvariable iProfile angesprochen. Der Feldbereich 0..g_iMaxNumberOfSteps stellt die Zeilen dar. Dieser Bereich wird als Stufe bezeichnet und wird über die Eingangsvariable iStep angesprochen.
Die Leistungsstufentabelle besteht aus 16 Profilen. Jedes Profil kann bis zu 33 Stufen haben, von 0 bis 32. Jede einzelne Stufe beinhaltet die für die Anlagensteuerung benötigte Parameterstruktur ST_HVACPowerRange. Die hier angegebenen Parameter werden über die Ausgangsstrukturen stI_Ctrl und stAggregate1-6 dem Funktionsbaustein FB_HVACI_CtrlStep zur Steuerung der Stufen und den Funktionsbausteinen zur Energieerzeugung übergeben.
Wie viele Stufen sich in einem Profil befinden, wird über die Ausgangsvariable iNumberOfStepInProfile angegeben. Die Anzahl ist abhängig von den Einträgen in der Leistungsstufentabelle und von der Angabe des ausgewählte Profil siCurrentProfile .Intern wird das ausgewählte Profil von der Stufe 1 bis zu der Stufe überprüft, in der alle Variablen der Struktur ST_HVACPowerRange den Wert 0 haben. iNumberOfStepInProfile wird immer nur für das vorgegebene Profil bestimmt. iNumberOfStepInProfile kann somit als Begrenzung der Stufen in einem Profil für andere Funktionsbausteine verwendet werden wie z.B. für den Eingang iNumberOfStepInProfile des FB_HVACI_CtrlStep, der über seinen Ausgang iStep die einzelnen Stufen des FB_HVACPowerRangeTable steuern könnte. Die Stufe 0 wird bei der Auswertung der Anzahl der Stufen über iNumberOfStepInProfile nicht berücksichtigt, weil in dieser Stufe die Leistungserzeuger ausgeschaltet sind, sie kann als Bereitschaftsstufe gesehen werden. Die Werte der Variablen der Ausgangsstrukturen stAggregate1-6 geben dann den Wert 0 aus. In der Bereitschaftsstufe werden dem vorgelagerten Regler FB_HVACI_Ctrl_Step über die Ausgangsstruktur stI_Ctrl die Parameter übergeben, die für das Starten der Leistungsstufensequenz der Energieerzeuger notwendig sind.
Tabellenbeispiel zur Leistungsstufentabelle arrPowerRangeTable
Innerhalb eines Profils (Tabellenspalten) wird jeder Leistungsstufe ein Aggregat zugeordnet.
Damit wird die Reihenfolge bestimmt mit der die Leistungserzeuger innerhalb einer Sequenz zu- oder ausgeschaltet werden.
Die Leistung der Aggregate wird bei stufigen Leistungserzeugern von 0 bis 6 angegeben, bei stetigen Leistungserzeugern von 0 bis 100%.
Nach dem Umschalten in eine höhere oder niedrigere Leistungsstufe wird der Integralanteil des vorgelagerten Funktionsbausteins FB_HVACI_Ctrl_Step neu initialisiert. Dem Regler werden dann mittels der Struktur stI_Ctrl die aktuellen Werte für das Hoch- und Rückschaltintegral übergeben.
Für einen Folgewechsel der Aggregate innerhalb der Sequenz kann auf ein anderes Profil umgeschaltet werden. Durch geschicktes Eintragen unterschiedlicher Reihenfolgen der Aggregate in den Profilen kann äußerst flexibel auf alle Anforderungen bezüglich der Führung von Leistungserzeugern reagiert werden.
Das Umschalten der Leistungsprofile (iCurrentProfile) erfolgt in der Regelzeit- oder betriebsstundenabhängig damit alle Leistungserzeuger einer Anlage gleichmäßig ausgelastet sind.
Bei Leistungserzeugern unterschiedlicher Nennleistung wird das Leistungsprofil lastabhängig geändert.
![]() | Ist ein Aggregat innerhalb einer Erzeugergruppe gestört kann auf ein Profil umgeschaltet werden in dem der gestörte Erzeuger an das Ende der Leistungsfolge gestellt wird. |

Die Leistungsstufentabelle zeigt drei Leistungsprofile. In jedem Leistungsprofil ist die Folge der Leistungserzeuger eingetragen.
Profil 1:
In dem Profil 1 wird in der Leistungsstufe 1 das Aggregat 1 in die erste Leistungsstufe geschaltet. In der 2. Leistungsstufe wird das Aggregat 2 mit seiner 1. Stufe hinzu geschaltet.
Profil 2:
In dem Profil 2 wird in der Leistungsstufe 1 das Aggregat 3 in die erste Leistungsstufe geschaltet. In der 2. Leistungsstufe wird das Aggregat 3 in seiner 2. Stufe geschaltet. In der 3. Leistungsstufe wird das Aggregat 1 mit seiner 1. Stufe hinzu geschaltet.
Profil 3:
In dem Profil 3 wird in der Leistungsstufe 1 das Aggregat 5 in die erste Leistungsstufe geschaltet. In der 2. Leistungsstufe wird das Aggregat 4 mit seiner 1. Stufe hinzu geschaltet. In der 3. Leistungsstufe wird das Aggregat 3 mit seiner 1. Stufe hinzu geschaltet.
Durch geschicktes Anordnen der Leistungsprofile kann auf die Störung einzelner Aggregate, dem betriebsstundenabhängigen Folgewechsel oder auf den lastoptimierten Wechsel von Leistungsfolgen reagiert werden.
Anhand des Tabellenbeispiels soll der Zusammenhang zwischen der Leistungsstufentabelle arrPowerRange und den Ausgangsstrukturen stAggregate1-6 und stI_Ctrl näher erläutert werden:
- Die Spalte iCurrentProfile= 1 soll das 1. Profil der Leistungsstufentabelle arrPowerRange darstellen. In diesem Profil hat der Ausgang iNumberOfStepInProfile den Wert 2, weil in der Zeile iCurrentStep= 3 kein Variablenwert der Struktur ST_HVACPowerRange (rot markiert) größer 0 ist.
Unter der Annahme, dass die aktuelle Leistungsstufe iCurrentStep den Wert 2 hat, werden die Variablenwerte wie folgt an den Ausgangsstrukturen ausgegeben: - arrPowerRangeTable[iCurrentProfile,iCurrentStep];
stAggregate1.iAggregateStep :=arrPowerRangeTable[1,1].iAggregateStep;
stAggregate1.rY_Max := arrPowerRangeTable[1,1].rY_Max;
stAggregate1.rY_Min :=arrPowerRangeTable[1,1].rY_Min;
stAggregate1.bBlock := arrPowerRangeTable[1,1].bBlock; - stAggregate2.iAggregateStep :=arrPowerRangeTable[1,2].iAggregateStep;
stAggregate2.rY_Max := arrPowerRangeTable[1,2].rY_Max;
stAggregate2.rY_Min :=arrPowerRangeTable[1,2].rY_Min;
stAggregate2.bBlock := arrPowerRangeTable[1,2].bBlock; - stI_Ctrl.rIntegralHigh := arrPowerRangeTable[1,2].rIntegralHigh;
stI_Ctrl.rIntegralLow := arrPowerRangeTable[1,2].rIntegralLow;
stI_Ctrl.udiSecDelayHigh :=arrPowerRangeTable[1,2,].udiSecDelayHigh;
stI_Ctrl.udiSecDelayLow :=arrPowerRangeTable[1,2].udiSecDelayLow; - Inhalte der Ausgangsstrukturen stAggregate1, stAggregate2 und stI_Ctrl. Die Variablen der Ausgangsstrukturen stAggregate3-6 haben den Wert 0.
- stAggregate1.iAggregateStep :=1;
stAggregate1.rY_Max := 0;
stAggregate1.rY_Min :=0;
stAggregate1.bBlock := FALSE; - stAggregate2.iAggregateStep :=1;
stAggregate2.rY_Max := 0;
stAggregate2.rY_Min :=0;
stAggregate2.bBlock := TRUE; - stI_Ctrl.rIntegralHigh := 10;
stI_Ctrl.rIntegralLow := 10;
stI_Ctrl.udiSecDelayHigh :=300;
stI_Ctrl.udiSecDelayLow :=300; - Die Spalte iCurrentProfile= 2 stellt das 2. Profil der Leistungsstufentabelle arrPowerRange dar. In diesem Profil hat der Ausgang iNumberOfStepInProfile den Wert 3, weil in der Zeile iCurrentStep= 4 kein Variablenwert der Struktur ST_HVACPowerRange(rot markiert) größer 0 ist.
Unter der Annahme, dass die aktuelle Leistungsstufe iCurrentStep den Wert 3 hat, werden die Variablenwerte wie folgt an den Ausgangsstrukturen ausgegeben: - arrPowerRangeTable[iCurrentProfile,iCurrentStep];
stAggregate1.iAggregateStep :=arrPowerRangeTable[2,3].iAggregateStep;
stAggregate1.rY_Max := arrPowerRangeTable[2,3].rY_Max;
stAggregate1.rY_Min :=arrPowerRangeTable[2,3].rY_Min;
stAggregate1.bBlock := arrPowerRangeTable[2,3].bBlock; - stAggregate3.iAggregateStep :=arrPowerRangeTable[2,2].iAggregateStep;
stAggregate3.rY_Max := arrPowerRangeTable[2,2].rY_Max;
stAggregate3.rY_Min :=arrPowerRangeTable[2,2].rY_Min;
stAggregate3.bBlock := arrPowerRangeTable[2,2].bBlock; - stI_Ctrl.rIntegralHigh := arrPowerRangeTable[2,3].rIntegralHigh;
stI_Ctrl.rIntegralLow := arrPowerRangeTable[2,3].rIntegralLow;
stI_Ctrl.udiSecDelayHigh :=arrPowerRangeTable[2,3].udiSecDelayHigh;
stI_Ctrl.udiSecDelayLow :=arrPowerRangeTable[2,3].udiSecDelayLow; - Inhalte der Ausgangsstrukturen stAggregate1, stAggregate3 und stI_Ctrl. Die Variablen der Ausgangsstrukturen stAggregate2 und stAggregate4-6 haben den Wert 0.
- stAggregate1.iAggregateStep :=1;
stAggregate1.rY_Max := 0;
stAggregate1.rY_Min :=0;
stAggregate1.bBlock := FALSE; - stAggregate3.iAggregateStep :=2;
stAggregate3.rY_Max := 60;
stAggregate3.rY_Min :=30;
stAggregate3.bBlock := FALSE; - stI_Ctrl.rIntegralHigh := 8;
stI_Ctrl.rIntegralLow := 8;
stI_Ctrl.udiSecDelayHigh :=23;
stI_Ctrl.udiSecDelayLow :=123; - Die Spalte iCurrentProfile= 3 stellt das 3. Profil der Leistungsstufentabelle arrPowerRange dar. In diesem Profil hat der Ausgang iNumberOfStepInProfile den Wert 3, weil in der Zeile iCurrentStep= 4 kein Variablenwert der Struktur ST_HVACPowerRange(rot markiert) größer 0 ist.
Unter der Annahme, dass die aktuelle Leistungsstufe iCurrentStep den Wert 3 hat, werden die Variablenwerte wie folgt an den Ausgangsstrukturen ausgegeben: - arrPowerRangeTable[iCurrentProfile,iCurrentStep];
stAggregate3.iAggregateStep :=arrPowerRangeTable[3,3].iAggregateStep;
stAggregate3.rY_Max := arrPowerRangeTable[3,3].rY_Max;
stAggregate3.rY_Min :=arrPowerRangeTable[3,3].rY_Min;
stAggregate3.bBlock := arrPowerRangeTable[3,3].bBlock; - stAggregate4.iAggregateStep :=arrPowerRangeTable[3,2].iAggregateStep;
stAggregate4.rY_Max := arrPowerRangeTable[3,2].rY_Max;
stAggregate4.rY_Min :=arrPowerRangeTable[3,2].rY_Min;
stAggregate4.bBlock := arrPowerRangeTable[3,2].bBlock;
stAggregate5.iAggregateStep :=arrPowerRangeTable[3,1].iAggregateStep;
stAggregate5.rY_Max := arrPowerRangeTable[3,1].rY_Max;
stAggregate5.rY_Min :=arrPowerRangeTable[3,1].rY_Min;
stAggregate5.bBlock := arrPowerRangeTable[3,1].bBlock; - stI_Ctrl.rIntegralHigh := arrPowerRangeTable[3,3].rIntegralHigh;
stI_Ctrl.rIntegralLow := arrPowerRangeTable[3,3].rIntegralLow;
stI_Ctrl.udiSecDelayHigh :=arrPowerRangeTable[3,3].udiSecDelayHigh;
stI_Ctrl.udiSecDelayLow :=arrPowerRangeTable[3,3].udiSecDelayLow; - Inhalte der Ausgangsstrukturen stAggregate3, stAggregate4, stAggregate5 und stI_Ctrl. Die Variablen der Ausgangsstrukturen stAggregate1, stAggregate2 und stAggregate6 haben den Wert 0.
- stAggregate3.iAggregateStep :=1;
stAggregate3.rY_Max := 0;
stAggregate3.rY_Min :=0;
stAggregate3.bBlock := FALSE; - stAggregate4.iAggregateStep :=1;
stAggregate4.rY_Max := 0;
stAggregate4.rY_Min :=0;
stAggregate4.bBlock := TRUE; - stAggregate5.iAggregateStep :=1;
stAggregate5.rY_Max := 0;
stAggregate5.rY_Min :=0;
stAggregate5.bBlock := FALSE; - stI_Ctrl.rIntegralHigh := 7;
stI_Ctrl.rIntegralLow := 7;
stI_Ctrl.udiSecDelayHigh :=400;
stI_Ctrl.udiSecDelayLow :=200;
Ausgangsstruktur stI_Ctrl abgestimmt auf das Beispiel

Ausgangsstrukturen stAggregate1-6 abgestimmt auf das Beispiel

VAR_INPUT
eDataSecurityType : E_HVACDataSecurityType;
bEnable : BOOL;
iNumberOfProfiles : INT;
iProfile : INT;
iStep : INT;
eCtrlModeProfile : E_HVACCtrlMode;
iManualProfile : INT;
eCtrlModeStep : E_HVACCtrlMode;
iManualStep : INT;
iNumberOfAggregates : INT;
bReset : BOOL;
eDataSecurityType:Wenn eDataSecurityType:= eHVACDataSecurityType_Persistent ist, werden die persistenten VAR_IN_OUT-Variablen des Funktionsbausteins bei einer Wertänderung im Flash des Rechners abgelegt. Dafür ist es zwingend erforderlich den Funktionsbaustein FB_HVACPersistentDataHandling einmalig im Hauptprogramm, das zyklisch aufgerufen wird, zu instanziieren. Ansonsten wird der instanziierte FB intern nicht freigegeben.
Eine Wertänderung kann vom Gebäudeleitsystem, einem lokalen Bediengerät oder von einem Schreibzugriff von TwinCAT aus erfolgen. Beim Neustart des Rechners werden die gesicherten Daten automatisch vom Flash in den RAM zurück gelesen.
Anwendungsbeispiel: example_persistent.zip
Bei eDataSecurityType:= eHVACDataSecurityType_Idle werden die persistent deklarierten Variablen nicht spannungsausfallsicher gespeichert.
Hinweis | |
Eine sich zyklisch ändernde Variable darf niemals mit der IN_OUT-Variablen eines Funktionsbausteins verbunden werden, wenn eDataSecurityType:= eHVACDataSecurityType_Persistent ist. Es würde zu einem frühzeitigen Verschleiß des Flashspeichers führen. |
bEnable: Über ein TRUE wird der Funktionsbaustein freigegeben. Ist bEnable = FALSE, so werden alle Ausgangsvariablen und Ausgangsstrukturen konstant auf 0 gesetzt. Die Überprüfung der Variablen iNumberOfProfiles, iProfile, iStep, iNumberOfStepInProfile, iNumberOfAggregates, arrPowerRangeTable[X,X].iAggregate, arrPowerRangeTable[X,X].iAggregateSteps, arrPowerRangeTable[iP,iS].udiSecDelayHigh, und arrPowerRangeTable[iP,iS].udiSecDelayLow sind weiterhin aktiv. Falls dort ein Fehler auftritt, so wird dieses mit bError = TRUE angezeigt und kann nach Behebung des Fehlers mit bReset quittiert werden.
iNumberOfProfiles: Anzahl der parametrierten Profile in der Leistungsstufentabelle arrPowerRangeTable. Die Angabe der Anzahl der Profile darf g_iMinNumberOfProfiles nicht unterschreiten und g_iMaxNumberOfProfiles nicht überschreiten. Ansonsten wird mit bError = TRUE ein Fehler angezeigt und die Abarbeitung des Funktionsbausteins wird gestoppt.
iProfile: Angabe des aktuellen Profils mit welchem der Funktionsbaustein aus der Leistungsstufentabelle arrPowerRangeTable[iCurrentProfile,iCurrentStep] arbeitet. Ist eCtrlModeProfile = eHVACCtrlMode_Auto, dann ist iCurrentProfile = iProfile. Die Angabe des Profils darf g_iMinNumberOfProfiles nicht unterschreiten und iNumberOfProfiles nicht überschreiten. Ansonsten wird mit bError = TRUE ein Fehler angezeigt und die Abarbeitung des Funktionsbausteins wird gestoppt.
iStep: Angabe der aktuellen Stufe mit welcher der Funktionsbaustein aus der Leistungsstufentabelle arrPowerRangeTable[iCurrentProfile, iCurrentStep] arbeitet. Ist eCtrlModeStep = eHVACCtrlMode_Auto, dann ist iCurrentStep = iStep. Die Angabe der Stufen darf g_iMinNumberOfSteps nicht unterschreiten und iNumberOfStepInProfile nicht überschreiten. Ansonsten wird mit bError = TRUE ein Fehler angezeigt und die Abarbeitung des Funktionsbausteins wird gestoppt.
eCtrlModeProfile: Über dieses Enum wird entschieden über welche Eingangsvariable die Vorgabe des Profils aus der Leistungsstufentabelle arrPowerRangeTable[iCurrentProfile,iCurrentStep] angegeben wird (siehe E_HVACCtrlMode). Ist eCtrlModeProfile = eHVACCtrlMode_Auto, dann ist iCurrentProfile = iProfile. Ist eCtrlModeProfile = eHVACCtrlMode_Manual, dann ist iCurrentProfile = iManualProfile.
iManualProfile: Angabe mit welchem Profil aus der Leistungsstufentabelle arrPowerRangeTable[iCurrentProfile,iCurrentStep] gearbeitet wird. Ist eCtrlModeProfile = eHVACCtrlMode_Manual, dann ist iCurrentProfile = iManualProfile. Die Angabe des Profils darf g_iMinNumberOfProfiles nicht unterschreiten und iNumberOfProfiles nicht überschreiten. Ansonsten wird intern iManualProfile =g_iMinNumberOfProfiles bei Unterschreitung von g_iMinNumberOfProfiles oder iManualProfile = iNumberOfProfiles bei Überschreitung von iNumberOfProfiles gesetzt.
eCtrlModeStep: Über dieses Enum wird entschieden über welche Eingangsvariable die Vorgabe der Stufen aus der Leistungsstufentabelle arrPowerRangeTable[iCurrentProfile, iCurrentStep] angegeben wird (siehe E_HVACCtrlMode). Ist eCtrlModeStep = eHVACCtrlMode_Auto, dann ist iCurrentStep = iStep. Ist eCtrlModeStep = eHVACCtrlMode_Manual, dann ist iCurrentStep = iManualStep.
iManualStep: Angabe mit welcher Stufe aus der Leistungsstufentabelle arrPowerRangeTable[iCurrentProfile,iCurrentStep] gearbeitet wird. Ist eCtrlModeStep = eHVACCtrlMode_Manual, dann ist iCurrentStep = iManualStep. Die Angabe der Stufen darf g_iMinNumberOfSteps nicht unterschreiten und iNumberOfStepInProfile nicht überschreiten. Ansonsten wird intern iManualStep =g_iMinNumberOfSteps bei Unterschreitung von g_iMinNumberOfProfiles oder iManualStep = iNumberOfStepInProfile bei Überschreitung von iNumberOfStepInProfile gesetzt.
iNumberOfAggregates: iNumberOfAggregates bestimmt die Anzahl der Aggregate in der Leistungserzeugersequenz. Ist z.B. iNumberOfAggregates = 4, so werden die Ausgangsstrukturen stAggregate1-4 je nach Vorgabe von iCurrentStep/iCurrentProfile mit den Parametern aus dem Array arrPowerRangeTable beschrieben. Die Angabe darf g_iMinNumberOfAggregates nicht unterschreiten und g_iMaxNumberOfAggregates nicht überschreiten. Ansonsten wird mit bError = TRUE ein Fehler angezeigt und die Abarbeitung des Funktionsbausteins wird gestoppt.
bReset: Eingang zur Quittierung der Störungen nach deren Behebung. Intern wird auf eine steigende Flanke reagiert.
VAR_OUTPUT
bEnablePowerRangeTable : BOOL;
iNumberOfStepInProfile : INT;
iCurrentProfile : INT;
iCurrentStep : INT;
stI_Ctrl : ST_HVACI_Ctrl;
stAggregate1 : ST_HVACAggregate;
stAggregate2 : ST_HVACAggregate;
stAggregate3 : ST_HVACAggregate;
stAggregate4 : ST_HVACAggregate;
stAggregate5 : ST_HVACAggregate;
stAggregate6 : ST_HVACAggregate;
bError : BOOL;
eErrorCode : E_HVACErrorCodes;
iErrorPosArrayProfile : INT;
iErrorPosArrayStep : INT;
bEnablePowerRangeTable: Anzeige, dass der Funktionsbaustein frei gegeben ist. bEnablePowerRangeTable ist TRUE, wenn bEnable = TRUE AND bError = FALSE sind.
iNumberOfStepInProfile: Zeigt die Anzahl der parametrierten Stufen aus dem vorgegebenen Profil iCurrentProfile der Leistungsstufentabelle arrPowerRangeTable an. Jede einzelne Stufe beinhaltet die für die Anlagensteuerung benötigte Parameterstruktur ST_HVACPowerRange. Jedes Profil kann bis zu 33 Stufen haben. Das Feld für die Stufen in der Leistungsstufentabelle arrPowerRangeTable fängt bei 0 an und endet bei 32. Die Anzahl der parametrieten Stufen in einem Profil iNumberOfStepInProfile wird von der Stufe 1 aufwärts bis zur Stufe 32 bestimmt. Die Zählung der parametrieten Stufen endet in der Stufe in der alle Variablen der Parameterstruktur ST_HVACPowerRange den Wert 0 haben. Minimal kann iNumberOfStepInProfile den Wert 1 haben, maximal 32. Die Stufe 0 wird nicht berücksichtigt, weil in dieser Stufe die Leistungserzeuger ausgeschaltet werden. Die Stufe kann als Bereitschaftsstufe gesehen werden. Die Werte der Variablen der Ausgangsstrukturen stAggregate1-6 geben den Wert 0 aus. In der Bereitschaftsstufe werden dem vorgelagerten Regler FB_HVACI_Ctrl_Step über die Ausgangsstruktur stI_Ctrl die Parameter übergeben, die für das Starten der Leistungsstufensequenz der Energieerzeuger verantwortlich sind.
![]() | iNumberOfStepInProfile kann als Begrenzung der Stufen für andere Funktionsbausteine verwendet werden wie z.B. für den Eingang iNumberOfStepInProfile des Funktionsbausteines FB_HVACI_CtrlStep. Über die Ausgangsvariable iStep des FB_HVACI_CtrlStep kann wiederum die Stufenvorgabe der Leistungsstufentabelle FB_HVACPowerRangeTable über den Eingang iStep vorgegeben werden. |
iCurrentProfile: Angabe des aktuellen Profils mit welchem der Funktionsbaustein aus der Leistungsstufentabelle arrPowerRangeTable[iCurrentProfile,iCurrentStep] arbeitet. Die Angabe ist abhängig von den Eingangsvariablen iProfile, iManualProfile und eCtrlModeProfile. Ist eCtrlModeProfile = eHVACCtrlMode_Auto, dann ist iCurrentProfile = iProfile. Ist eCtrlModeProfile = eHVACCtrlMode_Manual, dann ist iCurrentProfile = iManualProfile.
iCurrentStep: Angabe der aktuellen Leistungsstufe mit welcher der Funktionsbaustein aus der Leistungsstufentabelle arrPowerRangeTable[iCurrentProfile,iCurrentStep] arbeitet. Die aktuellste Stufe ist immer höchste Stufe von 1 an aufwärts gesehen. Die Angabe ist abhängig von den Eingangsvariablen iStep, iManualStep und eCtrlModeStep. Ist eCtrlModeStep = eHVACCtrlMode_Auto, dann ist iCurrentStep = iStep. Ist eCtrlModeStep = eHVACCtrlMode_Manual, dann ist iCurrentStep = iManualStep.
stI_Ctrl: Ausgabestruktur der Parameter ST_HVACI_Ctrl für den Funktionsbaustein FB_HVACI_CtrlStep.
Welche Werte die Variablen der Ausgangsstruktur stI_Ctrl aus der Leistungsstufentabelle arrPowerRangeTable annehmen, ist abhängig vom ausgewählten Profil und der aktuellen Stufe. Ist das ausgewählte Profil iCurrentProfile = 2 und die Stufe iCurrentStep = 3, dann wird die Struktur stI_Ctrl mit den Inhalten der folgenden Variablen aus der Leistungsstufentabelle beschrieben:
stI_Ctrl.rIntegralHigh := arrPowerRangeTable[iCurrentProfile, iCurrentStep].rIntegralHigh;
stI_Ctrl.rIntegralLow := arrPowerRangeTable[iCurrentProfile, iCurrentStep].rIntegralLow;
stI_Ctrl.udiSecDelayHigh :=arrPowerRangeTable[iCurrentProfile, iCurrentStep].udiSecDelayHigh;
stI_Ctrl.udiSecDelayLow :=arrPowerRangeTable[iCurrentProfile, iCurrentStep].udiSecDelayLow;
stI_Ctrl.rIntegralHigh := arrPowerRangeTable[2,3].rIntegralHigh;
stI_Ctrl.rIntegralLow := arrPowerRangeTable[2,3].rIntegralLow;
stI_Ctrl.udiSecDelayHigh :=arrPowerRangeTable[2,3].udiSecDelayHigh;
stI_Ctrl.udiSecDelayLow :=arrPowerRangeTable[2,3].udiSecDelayLow;
stI_Ctrl.rIntegralHigh: Positiver Wert für das obere Limit an dem die Integration des I-Übertragungsgliedes angehalten wird.
stI_Ctrl.rIntegralLow: Positiver Wert für das untere Limit an dem die Integration des I-Übertragungsgliedes angehalten wird.
stI_Ctrl.udiSecDelayHigh: Verzögerungszeit nach deren Ablauf das I-Übertragungsglied aktiviert wird.
stI_Ctrl.udiSecDelayLow: Verzögerungszeit nach deren Ablauf das I-Übertragungsglied aktiviert wird.
stAggregate1-6: Ausgabestrukturen der Parameter ST_HVACAggregate für das Ansteuern der Aggregate 1 bis 6. iNumberOfAggregates bestimmt die Anzahl der Aggregate in der Leistungserzeugersequenz. Welche Werte die Variablen der Ausgangsstrukturen stAggregate1-6 aus der Leistungsstufentabelle arrPowerRangeTable annehmen, ist abhängig vom ausgewählten Profil und der aktuellen Stufe. Ist das ausgewählte Profil iCurrentProfile = 8 und die Stufe iCurrentStep = 5, dann ist entscheidend, dass die VariablearrPowerRangeTable[8, 5].iAggregate den Wert 1 hat. Die in der Leistungsstufentabelle parametrierten Werte werden dann über die Ausgangsstruktur stAggregate1 ausgegeben.
stAggregate1.rY_Max := arrPowerRangeTable[iCurrentProfile, iCurrentStep].rY_Max;
stAggregate1.rY_Min :=arrPowerRangeTable[iCurrentProfile, iCurrentStep].rY_Min;
stAggregate1.iAggregateStep :=arrPowerRangeTable[iCurrentProfile, iCurrentStep].iAggregateStep;
stAggregate1.bBlock := arrPowerRangeTable[iCurrentProfile, iCurrentStep].bBlock;
stAggregate1.rY_Max := arrPowerRangeTable[8,5].rY_Max;
stAggregate1.rY_Min :=arrPowerRangeTable[8,5].rY_Min;
stAggregate1.iAggregateStep :=arrPowerRangeTable[8,5].iAggregateStep;
stAggregate1.bBlock := arrPowerRangeTable[8,5].bBlock;
Wenn der Wert der Variable arrPowerRangeTable[8,3].iAggregate ebenfalls 1 ist, so werden in die dementsprechende Ausgangsstruktur stAggregate1 die Werte der höchsten Leistungsstufe iCurrentStep = 5 geschrieben, weil auch hier arrPowerRangeTable[8,5].iAggregate = 1 ist. Erst wenn iCurrentStep = 3 ist, bedeutet das über die Ausgangsstruktur stAggregate1 folgende Werte ausgegeben werden:
stAggregate1.rY_Max := arrPowerRangeTable[8,3].rY_Max;
stAggregate1.rY_Min :=arrPowerRangeTable[8,3].rY_Min;
stAggregate1.iAggregateStep :=arrPowerRangeTable[8,3].iAggregateStep;
stAggregate1.bBlock := arrPowerRangeTable[8,3].bBlock;
Ist iCurrentStep = 4 undarrPowerRangeTable[8,4].iAggregate = 2, dann bedeutet dies, dass über die Ausgangsstruktur stAggregate1 und stAggregate2 folgende Werte ausgegeben werden:
stAggregate2.rY_Max := arrPowerRangeTable[8,4].rY_Max;
stAggregate2.rY_Min :=arrPowerRangeTable[8,4].rY_Min;
stAggregate2.iAggregateStep :=arrPowerRangeTable[8,4].iAggregateStep;
stAggregate2.bBlock := arrPowerRangeTable[8,4].bBlock;
stAggregate1.rY_Max := arrPowerRangeTable[8,3].rY_Max;
stAggregate1.rY_Min :=arrPowerRangeTable[8,3].rY_Min;
stAggregate1.iAggregateStep :=arrPowerRangeTable[8,3].iAggregateStep;
stAggregate1.bBlock := arrPowerRangeTable[8,3].bBlock;
bError: Der Ausgang signalisiert mit einem TRUE, dass ein Fehler anliegt. Die Abarbeitung des Funktionsbausteins wird gestoppt. Das Enum eErrorCode zeigt die Fehlernummer an.
Nach Behebung des Fehlers muss die Meldung bError mit bReset quittiert werden.
eErrorCode: Liefert bei einem gesetzten bError-Ausgang die Fehlernummer (siehe E_HVACErrorCodes).
Folgende Fehler können in diesem Funktionsbaustein vorkommen:
eHVACErrorCodes_InvalidParam_iStep: Fehler bei der Überprüfung der angegebenen Stufen. Der Wert von iStep muss größer gleich g_iMinNumberOfSteps oder kleiner gleich iNumberOfStepInProfile sein.
eHVACErrorCodes_InvalidParam_iNumberOfStepInProfile: Fehler bei der Überprüfung der Anzahl der Profile, ob jedes der angegebenen Profile parametrierte Stufen hat. Die Überprüfung der Profile wird in Stufe 0 durchgeführt. Ist dort kein Variablenwert der Struktur ST_HVACPowerRange größer 0, so liegt ein Fehler vor.
Mit der Variablen iErrorPosArrayProfile wird das fehlerhafte Profil in der Leistungsstufentabelle arrPowerRangeTable[x1,x2] angegeben: x1 = iErrorPosArrayProfile;
eHVACErrorCodes_InvalidParam_iNumberOfAggregates: Fehler bei der Überprüfung der angegebenen Anzahl der Aggregate. Der Wert von iNumberOfAggregates muss kleiner als g_iMinNumberOfAggregates und größer als g_iMaxNumberOfAggregates sein.
eHVACErrorCodes_InvalidParam_iAggregateSteps: Fehler bei der Überprüfung der angegebenen Stufen für das Aggregat. Der Wert von arrPowerRangeTable[x1,x2].iAggregateStep muss größer gleich g_iAggregateMinNumberOfSteps und kleiner gleich g_iAggregateMaxNumberOfSteps sein.
Mit den Variablen iErrorPosArrayProfile und iErrorPosArrayStep wird die fehlerhafte Stelle in der Leistungsstufentabelle arrPowerRangeTable[x1,x2] angegeben: x1 = iErrorPosArrayProfile; x2 = iErrorPosArrayStep
eHVACErrorCodes_InvalidParam_iNumberOfProfiles: Fehler bei der Überprüfung der Anzahl der Profile. Der Wert von iNumberOfProfiles muss größer gleich g_iMinNumberOfProfiles und kleiner gleich g_iMaxNumberOfProfiles sein.
eHVACErrorCodes_InvalidParam_iProfile: Fehler bei der Überprüfung der angegebenen Profile. Der Wert von iProfile muss größer gleich g_iMinNumberOfProfiles und kleiner gleich iNumberOfProfiles sein.
eHVACErrorCodes_InvalidParam_iAggregate: Fehler bei der Überprüfung der angegebenen Aggregate. Der Wert von arrPowerRangeTable[x1,x2].iAggregate muss größer gleich g_iMinNumberOfAggregates und kleiner gleich g_iMaxNumberOfAggregates sein.
Mit den Variablen iErrorPosArrayProfile und iErrorPosArrayStep wird die fehlerhafte Stelle in der Leistungsstufentabelle arrPowerRangeTable[x1,x2] angegeben: x1 = iErrorPosArrayProfile; x2 = iErrorPosArrayStep
eHVACErrorCodes_InvalidParam_udiSecDelayUp: Fehler bei der Überprüfung von arrPowerRangeTable[x1,x2].udiSecDelayUp. Der Wert von arrPowerRangeTable[x1,x2].udiSecDelayUp darf nicht größer als g_udiMaxSec sein.
Mit den Variablen iErrorPosArrayProfile und iErrorPosArrayStep wird die fehlerhafte Stelle in der Leistungsstufentabelle arrPowerRangeTable[x1,x2] angegeben: x1 = iErrorPosArrayProfile; x2 = iErrorPosArrayStep
eHVACErrorCodes_InvalidParam_udiSecDelayDown: Fehler bei der Überprüfung von arrPowerRangeTable[x1,x2].udiSecDelayDown. Der Wert von arrPowerRangeTable[x1,x2].udiSecDelayDown darf nicht größer als g_udiMaxSec sein.
Mit den Variablen iErrorPosArrayProfile und iErrorPosArrayStep wird die fehlerhafte Stelle in der Leistungsstufentabelle arrPowerRangeTable[x1,x2] angegeben: x1 = iErrorPosArrayProfile; x2 = iErrorPosArrayStep
![]() | Um in der SPS an die Fehlernummern des Enums zu gelangen, kann eErrorCode einer Variablen vom Datentyp WORD zugewiesen werden. |
iErrorPosArrayProfile: Mit der Variablen iErrorPosArrayProfile wird das Profil angegeben, in der die fehlerhafte Stelle in der Leistungsstufentabelle arrPowerRangeTable[iErrorPosArrayProfile,iErrorPosArrayStep] zu finden ist.
Ist iErrorPosArrayProfile > 0, dann liegt einer der folgenden Fehler an eErrorCode an:
- eHVACErrorCodes_InvalidParam_iNumberOfStepInProfile
- eHVACErrorCodes_InvalidParam_iAggregateSteps
- eHVACErrorCodes_InvalidParam_iAggregate
- eHVACErrorCodes_InvalidParam_udiSecDelayUp
- eHVACErrorCodes_InvalidParam_udiSecDelayDown
Mit Hilfe der Variablen iErrorPosArrayStep kann die genaue Position der Stufe ermittelt werden.
Beispiel 1 zur Lokalisierung eines Fehlers:
Folgende Werte stehen an den Ausgangsvariablen an:
bError =TRUE;
eErrorCode= eHVACErrorCodes_InvalidParam_iNumberOfStepInProfile;
iErrorPosArrayProfile = 2;
In der Leistungsstufentabelle arrPowerRangeTable[2,x]ist in dem Profil 2in Stufe 0 kein Variablenwert der Struktur ST_HVACPowerRange größer 0. Bei diesem Fehler wird iErrorPosArrayStep nicht berücksichtigt.
Beispiel 2 zur Lokalisierung eines Fehlers:
Folgende Werte stehen an den Ausgangsvariablen an:
bError =TRUE;
eErrorCode= eHVACErrorCodes_InvalidParam_iAggregateSteps;
iErrorPosArrayProfile = 2;
iErrorPosArrayStep = 3;
In der Leistungsstufentabelle arrPowerRangeTable steht an der folgenden Variable ein falscher Wert an:
arrPowerRangeTable[2,3].iAggregateStep
iErrorPosArrayStep: Ist iErrorPosArrayProfile > 0, dann wird mit der Variablen iErrorPosArrayStep die Stufe im Profil angegeben, in der die fehlerhafte Stelle in der Leistungsstufentabelle zu finden ist.
Beispiel zur Lokalisierung eines Fehlers:
Folgende Werte stehen an den Ausgangsvariablen an:
bError =TRUE;
eErrorCode= eHVACErrorCodes_InvalidParam_iAggregate;
iErrorPosArrayProfile = 5;
iErrorPosArrayStep = 15;
In der Leistungsstufentabelle arrPowerRangeTable steht an der folgenden Variable ein falscher Wert an:
arrPowerRangeTable[5,15].iAggregate
VAR_IN_OUT
arrPowerRangeTable : ARRAY [1..g_iMaxNumberOfProfiles,0..g_iMaxNumberOfSteps] OF ST_HVACPowerRange;
arrPowerRangeTable: Alle für die Anlagensteuerung relevanten Informationen bzw. Parameter sind in der Leistungsstufentabelle arrPowerRangeTable zusammengefasst. Die Leistungsstufentabelle ist ein zweidimensionales Feld (Array) der Struktur ST_HVACPowerRange. Die Leistungsstufentabelle kann mit einer normalen Tabelle verglichen werden, in der die waagerechten Einträge als Zeilen, die Senkrechten als Spalten bezeichnet werden. Ein einzelnes Element ist also durch Nennung von Zeile und Spalte eindeutig bezeichnet. Der Feldbereich 1..g_iMaxNumberOfProfiles der Leistungsstufentabelle wäre der senkrechte Teil, also die Spalten. Dieser Bereich wird als Profil bezeichnet und anhand von iCurrentProfile wird angegeben, welches Profil angesprochen wird. Der Feldbereich 0..g_iMaxNumberOfSteps wird als der waagerechte Teil, also die Zeilen, angesehen. Dieser Bereich wird als Stufe bezeichnet und anhand von iCurrentStep wird angegeben, welche Stufe angesprochen wird.
Die Leistungsstufentabelle besteht aus 16 Profilen. Jedes Profil kann bis zu 33 Stufen besitzen. Jede einzelne Stufe beinhaltet die für die Anlagensteuerung benötigte Parameterstruktur ST_HVACPowerRange. Die hier angegebenen Parameter werden über die Ausgangsstrukturen stI_Ctrl dem Funktionsbaustein FB_HVACI_CtrlStep zur Steuerung der Stufen und über stAggregate1-6 den Funktionsbausteinen zur Energieerzeugung übergeben.
Wie viele Stufen sich in einem Profil befinden, wird über die Ausgangsvariable iNumberOfStepInProfile angegeben. Die Anzahl ist abhängig von den Einträgen in der Leistungsstufentabelle und vom ausgewählten Profil iCurrentProfile. Es wird intern im Baustein das ausgewählte Profil von der Stufe 1 bis zu der Stufe überprüft, in der alle Variablen der Struktur ST_HVACPowerRange den Wert 0 haben. iNumberOfStepInProfile wird immer nur für das vorgegebene Profil bestimmt. Jedes Profil kann bis zu 33 Stufen haben von 0 bis 32, die Stufe 0 wird bei der Auswertung der Anzahl der Stufen über iNumberOfStepInProfile nicht berücksichtigt.
Struktur ST_HVACPowerRange
arrPowerRangeTable[x,x].iAggregate: Parameterangabe in welche Ausgangsstruktur stAggregate1-6 des Funktionsbausteins FB_HVACPowerRangeTable die Variablen rY_Min, rY_Max, iAggregateStep und bBlock geschrieben werden.
arrPowerRangeTable[x,x].iAggregateStep: Parameterangabe in welcher Stufe das angesprochene Aggregat fixiert oder regeln soll, siehe bBlock.
iAggregateStep wird über die Struktur stAggregateX ausgegeben.
arrPowerRangeTable[x,x].rY_Max: Parameterangabe für stetige Aggregate. rY_Max wird über die Struktur stAggregateX ausgegeben.
arrPowerRangeTable[x,x].rY_Min: Parameterangabe für stetige Aggregate. rY_Min wird über die Struktur stAggregateX ausgegeben.
arrPowerRangeTable[x,x].rIntegralHigh: Positiver Wert für das obere Limit an dem die Integration des I-Übertragungsgliedes angehalten wird, siehe der VAR_IN_OUT-Variable rIntegralHigh im FB_HVACI_CtrlStep.
rIntegralHigh wird über die Struktur stI_Ctrl ausgegeben.
arrPowerRangeTable[x,x].rIntegralLow : Positiver Wert für das untere Limit an dem die Integration des I-Übertragungsgliedes angehalten wird, siehe der VAR_IN_OUT-Variable rIntegralHigh im FB_HVACI_CtrlStep.
rIntegralLow wird über die Struktur stI_Ctrl ausgegeben.
arrPowerRangeTable[x,x].udiSecDelayHigh: Verzögerungszeit nach deren Ablauf das I-Übertragungsglied aktiviert wird, siehe der VAR_IN_OUT-Variable udiSecDelayHigh im FB_HVACI_CtrlStep.
udiSecDelayHigh wird über die Struktur stI_Ctrl ausgegeben.
arrPowerRangeTable[x,x].udiSecDelayLow: Verzögerungszeit nach deren Ablauf das I-Übertragungsglied aktiviert wird, siehe der VAR_IN_OUT-Variable udiSecDelayHigh im FB_HVACI_CtrlStep.
udiSecDelayLow wird über die Struktur stI_Ctrl ausgegeben.
arrPowerRangeTable[x,x].bBlock: Ist bBlock = FALSE, so wird das angesprochene Aggregat in der vorgegebenen Stufe über iAggregateStep fixiert. Ist bBlock = TRUE, so wird die Regelung des angesprochenen Aggregats frei gegeben von der Ausstufe (0) bis zur vorgegebenen Stufe über iAggregateStep.
bBlock wird über die Struktur stAggregateX ausgegeben.
Die Variable wir persistent gespeichert.
Voraussetzungen
Entwicklungsumgebung | erforderliche Bibliothek | Erforderliche Function |
---|---|---|
TwinCAT 3.1 ab Build 4022.16 | Tc2_HVAC V3.3.1.0 | TF8000 | TC3 HVAC V1.0.0.0 |