MC_MoveAbsolute in Schleife verwenden

Divad

Level-1
Beiträge
19
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,

ich möchte einen Schrittmotor von Beckhoff zwischen zwei Positionen hin und her fahren lassen.
Um eine Position anzufahren nutze ich den Baustein MC_MoveAbsolute. Um einmalig auf eine angegebene Position zu fahren, logge ich mich auf der CPU ein, führe einen "Reset kalt" durch, setzte die "Enable"-Werte des Bausteins MC_Power auf TRUE.
Um den Motor zwischen zwei Positionen pendeln zu lassen, möchte ich den Funktionsbaustein MC_MoveAbsolute in einer FOR-Schleife verwenden. Leider funktioniert das so aber nicht. Es liegt vermutlich daran, dass bei jeder Bewegung dem Baustein eine steigende Flanke über die Funktion "Werte-Schreiben" gegeben werden muss und man ihn deshalb aus der Schleife heraus nicht mehrmals aufrufen kann. Ich verstehe den Hintergrund dazu aber nicht vollständig, weshalb ich nicht weiß wie sich das Problem umgehen lässt. Auf der Beckhoff-Infoseite werde ich auch nicht wirklich schlauer.


Zunächst habe ich versucht den Motor überhaupt mehrmals in der FOR-Schleife anzusteuern. Hier der Anweisungsteil des Programms dazu:


// Wenn Startsignal gegeben: Freischalten des Reglers und der Vorschübe (über fbAxisPower)
IF start THEN
fbAxisPower.Enable :=TRUE;
fbAxisPower.Override:=100;
fbAxisPower.Enable_Positive:=TRUE;
fbAxisPower.Enable_Negative:=TRUE;
ELSE
fbAxisPower.Enable :=FALSE;
fbAxisPower.Override:=100;
fbAxisPower.Enable_Positive:=FALSE;
fbAxisPower.Enable_Negative:=FALSE;
END_IF;




//Baustein zur Freigabe der Achse
fbAxisPower(
Axis:= axis,
Enable:=,
Enable_Positive:=,
Enable_Negative:=,
Override:= ,
BufferMode:= ,
Options:= ,
Status=> ,
Busy=> ,
Active=> ,
Error=> ,
ErrorID=> );


//Baustein zur Positionserfassung
Actual_Position(
Axis:=axis,
Enable:=TRUE,
Valid=> ,
Busy=> ,
Error=> ,
ErrorID=> ,
Position=> );


// Bei Startsignal und Reserving fährt Achse zu gegebener Position
IF start AND Reserving THEN


FOR Zaehler := 5 TO 25 BY 1 DO

fbAxisMoveAbsolute(
Axis:= axis,
Execute:=TRUE,
Position:=Actual_Position.Position+Zaehler, // Zielposition
Velocity:= fTargetVelocity,
Acceleration:= ,
Deceleration:= ,
Jerk:= ,
BufferMode:= ,
Options:= ,
Done=> ,
Busy=> ,
Active=> ,
CommandAborted=> ,
Error=> ,
ErrorID=> );
//testzaehler := testzaehler +1;


END_FOR;
END_IF;
 
Du hast eine falsche Vorstellung von der Arbeitsweise einer SPS.
In einer For-Schleife geht das so nicht.

genereller SPS-Ablauf ganz grob:

1. Die SPS liest die Eingänge ein.
2. Die SPS arbeitet das Programm einmal ab von Anfang bis Ende.
3. Die SPS schreibt die Ausgänge
4. Die SPS springt zu 1.

Wenn du also in einer For-Schleife Eingänge einliest und Ausgänge schreibst, dann wird nicht viel passieren, denn die SPS kommt nie an 1 und 3 vorbei.

Du mußt also dein Programm ganz anders aufbauen.
I.d.R. macht man das mit einer Schrittkette. Dafür gibt es eine ganze Menge Möglichkeiten. Am BEsten du suchst erst einmal hier im Forum oder auch bei Googel nach "Schrittkette".
Dann weitere Fragen hier.

PS: 1 bis 4 macht die SPS immer, ohne dein Zutun, sie läuft also in einer Dauerschleife.
 
Zuletzt bearbeitet:
Zurück
Oben