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 der FB_Extruder Klasse ist die interne Prozedur in der PowerStates() 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.