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