Probleme bei der State Machine in einer Homing Methode bei mehrfacher Ausführung

ProbierEsAus

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin relativ neu und habe mir Dank diesem Forum schon viel anlesen können. Aktuell bin ich dann wirklich praktisch bei der Umsetzung während einer Inbetriebnahme einer Achse mit TwinCat 3.
Ich arbeite objektorientiert und habe einen Funktionsblock für die Achse geschrieben, wobei die verschiedenen Methoden MoveAbsolut, Homing ... lauten.

Ich habe irgenwie noch ein Problem mit der StateMachine.

Mit dem aktuellen Aufbau kann ich das Homing nur einmal ausführen weil danach der Schritt 10 einfach übersprungen wird. Das das passiert macht Sinn, aber mir fällt keine Alternative ein.

(Twincat3)
Code:
Deklaration
...
mcHoming            : MC_Home;    
stHomingOut        : ST_McOutputs;
...
Schrittekette
...
    5: 
    IF ibEndSwitch0=FALSE THEN
        nSwitchHoming        :=100;
    ELSIF ibEndSwitch0=TRUE THEN
        nSwitchHoming        :=10;
    END_IF
    
    10:    
    (* homing block*)
    mcHoming(     Axis              := Axis1,
                Execute          := TRUE,
            (* set by NC Control  
                Position          := -5,
                HomingMode      := MC_DefaultHoming,  *)
                bCalibrationCam   := ibEndSwitch0,
                Done              =>StHomingOut.Done,
                Busy              =>stHomingOut.Busy,
                Active          =>stHomingOut.Active,
                CommandAborted=>stHomingOut.CommandAborted,
                Error              =>stHomingOut.Error,
                ErrorID          =>stHomingOut.ErrorID
            );
    IF mcHoming.Done THEN //alt StHomingOut.Done:
        nSwitchHoming:=20;
    END_IF

    20:
    ...

Das Problem ist, dass beim zweiten mal den .Done ausgang bereits aktiviert ist, unabhängig von der aktuellen Position. Beim Homing mag das eventuell sogar ok sein, dass ich die Methode nur einmal ausführen kann. Bei anderen Methoden, wie MoveAbsolut hingegen ist es ein noch größeres Problem
 
Zuletzt bearbeitet:
Mache zwar nur Siemens aber das erste was mir auffällt das du den MC Baustein in deinem Case aufrufst das ist schonmal unschön. Ich rufe die immer am Ende auf und beschreibe im Case nur die Parameter. Warum dein Done nicht auf False geht liegt sehr warscheinlich auch daran. Das Done geht bei den MC Bausteinen nämlich meist dann weg wenn das Execute FALSE wird. In deinem Fall bleibt es aber immer auf TRUE.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich vermute, es liegt im Aufruf des Bausteins in der CASE Anweisung.
Der Baustein bekommt kein Wechsel der Signale mit und somit bleibt das DONE immer sitzen.
Du musst entweder in dem CASE dafür sorgen, das der Baustein das Absteuern des Startsignals mitbekommt und dann erst in den nächsten Schritt gehen, oder den Bausteinaufruf außerhalb der CASE Anweisung machen und diesen über einen Schrittmerker starten. Somit bekommt der Baustein immer 0/1/0 Signal mit und somit geht bestimmt auch das DONE weg und dein Problem sollte gelöst sein :cool:
 
Ok das verstehe ich, die Lösung wäre also, dass ich in der Case Anweisung die Variable für die immer aufgerufenen Motion Block Bausteine zuweise.
Da die Methoden ja nur lokale Variablen besitzen muss ich diese Variablen im Funktionsbaustein deklarieren, oder?

Bei der Anzahl an Methoden führt das zu einer großen Anzahl an methodenspezifischen Variablen die alle im Funktionsblock stehen müssen. Das wird dann schon etwas unübersichtlich, oder sehe ich das falsch?
 
So ich habe es so implementiert wie vorgeschlagen und es funktioniert alles einwandfrei. Vielen Dank!

Edit: Kann man das Thema irgendwo als gelöst markieren?
 
Zurück
Oben