Handfunktion in eine Achse integrieren

Eine Handfunktion kann an mehreren Stellen in der Applikation angelegt werden. Im folgenden Beispiel wird erläutert, wie eine Handfunktion zum Verfahren und Einschalten der Achse in diese integriert werden kann.

1. Erweitern Sie eine bestehende Klasse durch Vererbung. In diesem Beispiel wird hierfür die Klasse FB_Carriage verwendet.
FUNCTION_BLOCK FB_CustomCarriage EXTENDS FB_Carriage
2. Instanziieren Sie die Handfunktion FB_ManualXyz in der Klasse der Achse. Für die Handfunktion der Vor-/Zurückbewegung ist dies nicht notwendig, da diese von der Klasse FB_Carriage bereits instanziiert wird.
FUNCTION_BLOCK FB_CustomCarriage EXTENDS FB_Carriage
VAR
    fbManualPower:        FB_ManualPower;
END_VAR
3. Die hier verwendete Klasse FB_CarriageHmi stellt für beide Handfunktionen bereits ein HMI-Interface zur Verfügung. Für weitere Handfunktionen müssen Sie die Klasse um jeweilige Instanzen der Klasse FB_ManualFunctionHmi erweitern.
4. Anschließend muss die neu instanziierte Handfunktion initialisiert werden. Zur Vereinfachung können Sie die Funktion F_SucceededHr() verwenden, um den Rückgabewert der Initialisierungsfunktion auf Erfolg zu überprüfen und auf eine lokale Variable zu kopieren.
METHOD Init : HRESULT



IF NOT F_SucceededHr(fbManualPower.Init(THIS^, iCarriageHmi), Init) THEN
    RETURN;
END_IF

Init := SUPER^.Init();
5. Zur Verarbeitung der inneren Algorithmen der Handfunktionen müssen Sie die jeweiligen Zyklusmethoden in der Cyclic() aufrufen.
METHOD Cyclic



fbManualPower.Cyclic();
fbManualForBack.Cyclic();
6. In derselben Methode können Sie zusätzlich definieren, wann die Handfunktion für die Benutzung aktiv geschaltet werden sollen und/oder welche Methode durch die Handfunktion aufgerufen wird.
fbManualPower.Enable := bManualMode OR bSetupMode OR bAutomaticMode;
fbManualPower.Cyclic();

fbManualForBack.Enable := bManualMode OR bSetupMode;
fbManualForBack.Cyclic();

IF bSetupMode THEN
    IF fbManualForBack.TrigCmdWorkPos.RQ THEN
        JogNegative(TRUE);
    ELSIF fbManualForBack.TrigCmdWorkPos.FQ THEN
        JogNegative(FALSE);
    ELSIF fbManualForBack.TrigCmdBasePos.Q THEN
        JogPositive(fbManualForBack.TrigCmdBasePos.Q);
    END_IF

ELSIF bManualMode THEN
    IF fbManualForBack.TrigCmdWorkPos.Q THEN
        MovePtp(1, fbManualForBack.TrigCmdWorkPos.Q, 8);
    ELSIF fbManualForBack.TrigCmdBasePos.Q THEN
        MovePtp(2, fbManualForBack.TrigCmdBasePos.Q, 8);
    END_IF
END_IF