Innere Prozeduren einer Klasse (FB) anpassen
Manche Klassen enthalten innere Abläufe/Prozeduren, welche durch Vererbungsstufen sich erweitern/ändern oder durch die Applikation angepasst werden sollen. Dies wird mit der FB_AdaptableSequence Klasse realisiert.
- 1. Legen Sie eine neue Klasse (FB) an und lassen Sie diese von einer Klasse mit innerer Prozedur erben.
FUNCTION_BLOCK FB_AdaptableClass EXTENDS FB_Extruder
VAR
END_VAR
- 2. Überschreiben Sie die interne Callback Methode mit der integrierten Prozedur.
Im Falle derFB_Extruder
Klasse ist die interne Prozedur in derPowerStates()
Methode implementiert.
METHOD PROTECTED PowerStates
VAR_INPUT
END_VAR
- 3. Fügen Sie der Callback-Methode eine Abfrage für ihren Prozessschritt hinzu, ob Sie einen bestehenden Prozedurschritt erweitern oder einen neuen hinzufügen und ob Sie bei einer bestehenden Implementation diese ausführen oder überspringen möchten.
- 4. Evaluieren Sie, ob der Aufruf der bestehenden Implementation vor oder nach ihrer neuen Implementation sinnvoll ist. Der Aufruf der SUPER^ Methode ist nur erforderlich, wenn Sie die bestehenden Prozedurschritte weiterhin nutzen.
// React on existing sequence state
IF aSeqBaseMembers[E_ExtruderPowerStates.eStartVeloFeed].IsActive THEN
;
// Call return to replace exisiting implementation
RETURN;
END_IF
// Define additional/replacing sequence state
IF fbSetProdTurnrate.IsActive THEN
;
RETURN;
END_IF
Platzieren Sie den SUPER^ Aufruf der Callback Methode.
- 5. Definieren Sie die Bedingung, zu der der Prozedurschritt fertiggestellt ist.
// React on existing sequence state
IF aSeqBaseMembers[E_ExtruderPowerStates.eStartVeloFeed].IsActive THEN
// Set FB_AdaptableSequence interface locally
iSeq := aSeqBaseMembers[E_ExtruderPowerStates.eStartVeloFeed];
IF bAdditionalAction THEN
nSaveValueToThis := 10;
// command a jump to a state that is not the default "next" element
iSeq.Jump(fbSetProdTurnrate);
// feedback on finishing the sequence state
iSeq.Done := TRUE;
END_IF
// Call return to replace exisiting implementation
RETURN;
END_IF
// Define additional/replacing sequence state
IF fbSetProdTurnrate.IsActive THEN
// Set FB_AdaptableSequence interface locally
iSeq := fbSetProdTurnrate;
IF bAdditionalAction THEN
nSaveValueToThis := 10;
iSeq.Done := TRUE;
END_IF
RETURN;
END_IF
// Call implementation of other sequence steps
SUPER^.PowerStates();
- 6. [Nur beim Hinzufügen]: Instanziieren Sie in der Klasse eine Instanz vom Typ
FB_AdaptableSequence
mit der Bezeichnung des Prozedurschrittes.
FUNCTION_BLOCK FB_AdaptableClass EXTENDS FB_Extruder
VAR
fbSetProdTurnrate: FB_AdaptableSequence;
END_VAR
- 7. Fügen Sie den Prozedurschritt in der Initialisierung an der gewünschten Stelle ein.
IF NOT F_SucceededHr(SUPER^.Init(), Init) THEN
RETURN;
END_IF
fbPowerStates.Insert(
iCurrent := aSeqBaseMembers[E_ExtruderPowerStates.eMasterMode],
iNew := fbSetProdTurnrate,
bOverwrite := FALSE);
- 8. Spielen Sie die Änderungen auf ihr Zielsystem und starten Sie die PLC neu.
- Sie haben erfolgreich eine innere Prozedur einer Klasse erweitert.