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 KlasseFB_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 KlasseFB_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