Beckhoff Motoren - variable Geschwindigkeit

moon

Level-1
Beiträge
35
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen!

Ich möchte bei 2 Servomotoren von Beckhoff (AM3121-0200-0001), die an je einer EL7201 Servomotorklemme hängen, im Betrieb die Geschwindigkeit ändern.
Soweit ich das bisher ausprobiert habe, ist eine Änderung der Geschwindigkeit mit den vorgefertigten Funktionsbausteinen (wie z.B. MC_MoveVelocity) nicht ohne ein Anhalten der Achse möglich.
Nun habe ich versucht, die Achsen direkt über ihre E/A-Variablen anzusprechen.
Durch setzten der Eingänge->FromPLC->ControlIDWord->Enable / FeedEnablePlus / FeedEnableMinus (TwinCat3) kann ich die Achse immerhin schon manuell "scharf" schalten.
Nun gelingt es mir aber leider nicht, diese auch in Bewegung zu versetzen, die Variable "ExtSetPos" scheint hierfür ungeeignet...?
Über ein paar Ideen würde ich mich sehr freuen.

Danke & lg
moon
 
Hi Moon,
bei den meisten PLCopen FBs erwartet das Execute eine steigende Flanke. Dies steht auch so in der Hilfe:
Execute The command is executed with a rising edge at input Execute.


Mit einer steigenden Flanke an Deinem FB sollte die Geschwindigkeit (oder die anderen geänderten Variablen) angepasst werden.

Baschankun
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Richtig, manche FBs können nachgetriggert werden. Beim MC_MoveVelocity müsste das gehen.
Bei anderen FBs müssen mehrere Instanzen verwendet werden, da sie die Bewegung überwachen, so zB beim MC_MoveAbsolute.
 
Hallo und Danke für Eure Tipps!
Leider bin ich momentan nicht im Stande die Motoren zum Laufen zu bekommen, bevor ich das überhaupt versuchen kann.
Wenn ich am Anfang MC_Power aufrufe, um die Motoren in Betrieb zu nehmen, bekomme ich einen Fehler 19209. Findet jemand meinen Fehler oder habe ich ein HW-Problem?
Code:
PROGRAM MAIN
VAR
     axis1 : AXIS_REF;    
     power1 : MC_Power;
END_VAR
[HR][/HR]power1.Enable := TRUE;
power1.Enable_Positive := TRUE;
power1.Enable_Negative := TRUE;
power1.Override := 100;
A_Power();
Code:
// Aktion [I]A_Power[/I], in der power1 aufgerufen wird (FUP):
                                        __________________power 1________________
axis1                               -| Axis                      MC_Power               Status | -  
power1.Enable                -| Enable                                                  Busy   | -
power1.Enable_Positive    -| Enable_Positive                                     Active | -
power1.Enable_Negative  -| Enable_Negative                                   Error   | -
power1.Override             -| Override                                              ErrorId | -
MC_Aborting                   -| BufferMode                                                     | 
                                       ----------------------------------------------------------
// sry, der FB sah so schön aus im Editor =(
Danke & viele Grüße
moon
 
Zuletzt bearbeitet:
Der Fehler besagt nur, dass die Achse nicht betriebsbereit ist: http://infosys.beckhoff.com/index.php?content=../content/1031/tcncerrcode/html/tcncerrorcodesplc.htm
Kannst du den Motor denn über den Handfahrdialog der NC verfahren http://infosys.beckhoff.com/index.p...stemmanager/ncconfig/tcsysmgr_ncmanualdlg.htm ?

Ansonsten schreib bitte mal was zu deinem System, um auszuschließen, dass ein grundlegender Fehler vorliegt:

- Systemaufbau: EL7201 an welchem PC? Welches TwinCAT? Auch Ausbaustufe "NC PTP" (mind.)?
- Klemme mit NC verknüpft, und NC-Prozessabbild mit dem SPS-Prozessabbild?
- EL7201 korrekt parametriert?
(http://infosys.beckhoff.com/index.php?content=../content/1031/el7201/html/bt_el7201_link_to_nc.htm ff)
- EtherCAT-seitig alles in Ordnung?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke!

Vielen Dank für Eure Hilfe!
Hat zwar etwas gedauert, aber nun kann ich die Geschwindigkeit während der Fahrt neu einstellen =)
Für alle die ein ähnliches Problem haben, hier einen kurzen Abriss meiner Lösung:

- die MC_Power und MC_MoveVelocity Funktionsbausteine stecken je in einer eigenen Aktion
- Main: Init-Zustand: Motor mit MC_Power freischalten

- Main: Move-Zustand: dem Move-FB alle Paramter übergeben & Execute := TRUE;
- sobald InVelocity = TRUE; --> Execute := FALSE; setzen, dann die neuen Parameter übergeben (Schritt vorher)

- am Ende von Main immer die Aktionen aufrufen

Die Zustandsmaschine habe ich an das PTP-Beispiel von Beckhoff angelehnt: http://infosys.beckhoff.com/italian.../description/tcplclibmc_sampleprogram.htm&id=

lg
moon
 
Hallo,

die meldung ist zwar 3 Jahren alt schon.
Ich würde gern wissen, wie ihr genau das Anfahren des Motor programmiert habt?
Ich versuche im momment mit dem Bautein MC_Power der Motor anzufahren, was aber noch nicht funktioniert.

PS: ich Habe die gleichen Klemmen wie du und mein Motor ist der Bezeichnung: AM8121.

Danke im Voraus.

vista
 
Moin
Der MC_power reicht nicht. Dieser schaltet nur die Endstufen scharf.
MC_moveVelocity gibt dann die Geschwindigkeit vor


Sent from my iPhone using Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Knaller,
vielen dank für deine Rückmeldung.
Heisst es, dass ich beide Bausteine erstmal programmieren muss?
MC_power und MC_Velocity?

Was ist mit MC_Reset?

vielen Dank im voraus
Vista
 
Moin
Bin jetzt erst wieder im Lande . MC_Reset wird zum ablöschen von Fehlern benutzt.
Ja du brauchst beide Bausteine



Sent from my iPhone using Tapatalk
 
Hallo alle zusammen,

die Kommentaren haben mir sehr geholfen . Nun komme ich mit einen ganz anderen Frage.
Ich programmiere momentan auch Beckhoff motoren und würde 2 Motoren gleichzeitig anfahren mit einem Befehll, denn jeder einzelnen Motor kann ich schon allein anfahren.

könnte mir jemand dabei helfen bitte?
Welche Befehle ich dafür brauche?
Ich habe schon alles versucht, was ich konnte aber immer noch nichts passiert.

mfg

Vista
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du brauchst für jede Achse eigene MC-Aufrufe, wenn du keine CNC-Lizenz hast. Du kannst natürlich das Execute von zwei mc_velocity Bausteinen simultan setzen, dann laufen die Achsen auch gleichzeitig los. Das sie auch gleichzeitig stoppen, ist bei PTP allerdings nicht gewährleistet. Es sei denn, du suchst eigentlich nach einer Achs-Kopplung. Dann solltest du dir mc_gearin mal ansehen.

Mit freundlichen Grüßen
Thorsten Ostermann
 
Hallo Herr Ostermann,
Ich habe die Achse zum laufen bekommen.
Es ist mir jetzt ein weiteres Problem aufgetaucht.
Ich sehe gerade auf Ihren Profil, dass Sie einen erfahrenen Nutzer sind. Würden Sie mich villeicht Privatmäßig Nachhilfe
zu Twincat anbieten wollen? Ich frage es so weil ich noch ein paar Frage hätte, und bereits dafür ein bischen Geld auszugeben, da der Projekt für mich so wichtig ist.
Mit freundlichen Grüßen
Stephanie Mawa
 
Hallo Stephanie,

grundsätzlich gerne, aber in den nächsten 2 Monaten fehlt mir dafür leider die Zeit. Ich kann aber versuchen die eine oder andere Frage hier noch zu beantworten. Ich bin auch eher in der Projektierung und Konfiguration zu Hause, weniger in der PLC-Programmierung.

Mit freundlichen Grüßen
Thorsten Ostermann
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich frage es so weil ich noch ein paar Frage hätte, und bereits dafür ein bischen Geld auszugeben, da der Projekt für mich so wichtig ist.

Hallo Stephanie,

wäre es dann nicht sinnvoll, sich direkt an Beckhoff wegen einer Schulung zu wenden ?

Gruß
Larry
 
Virtuelle Achse als Master und die beiden realen Achsen als Slave und mit MC_GearIn(Dyn) koppeln. Somit musst du "nur" die virtuelle Achse ansteuern und die realen Achsen fahren je nach Kopplungszustand mit oder nicht.
 
Hallo zusammen,

ich arbeite momentan auch mit diesen Bausteinen.
Ich habe einen Festo-Controller CMMP-AS... mit einem angeschlossenen Festo-Motor EMME... und arbeite mit TwinCat2.
Mein aktuelles Programm habe ich angefügt, welches ich von der Beckhoff-Seite habe.
Wenn ich den MC_Power aktiviere (Execute =TRUE), dann hört man wie der Motor freigegeben wird, sprich er geht in die Lageregelung. Wenn ich ihn dann mit fbMoveAbsolute aus Testzwecken irgendwohin positionieren möchte, dann kommt nach 4,5 Sekunden ein Error, ohne das der Motor gedreht hat.
Ich weiß leider nicht wo das Problem ist, den auf den Regler-LED's leuchtet alles grün und er müsste fahren, tut es aber nicht, stattdessen kriege ich vom fbMoveAbsolute auch den Fehler 19209.

Wäre dankbar für jeden Tipp.

Grüße
 

Anhänge

  • Example_NC_Stepper_Interface.zip
    352,1 KB · Aufrufe: 5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hinter der Fehlernummer verbirgt sich natürlich auch eine Bedeutung, in diesem Fall ""Achse ist nicht bereit". *) Die Achse ist nicht bereit und kann nicht bewegt werden.". Das sieht man im NC-View auch leicht daran, dass die Checkbox für "Achse bereit" nicht gesetzt ist. Vermutlich stimmt also mit der Verknüpfung zwischen NC-Achse und Regler etwas nicht.

*) http://infosys.beckhoff.de/content/1031/tcncerrcode2/63050395296338187.html?id=6736669570181703524

Mit freundlichen Grüßen
Thorsten Ostermann
 
Hallo,

danke für die schnelle Antwort. Im Systemmanager von Beckhoff habe ich die Variablen eigentlich richtig verknüpft.
Man muss ja nur bei der NC-Achse den Eingang und Ausgang mit der jeweiligen Variable verknüpfen. Dann habe ich noch den Skalierungsfaktor und die Bezugsgeschwindigkeit angegeben. Warum der jetzt nicht bereit ist, weiß ich leider nicht.

Hier der code:

PROGRAM MAIN
VAR
Direction: MC_Direction; (* Aufzählungstyp mit Bewegungsrichtungen für MC_MoveVelocity *)
fbMoveAbsolute_Axis_1: MC_MoveAbsolute; (* Es wird eine absolute Positionierung durchgeführt *)
fbMoveVelocity_Axis_1: MC_MoveVelocity; (* Es wird eine Endlosfahrt durchgeführt *)
fbPower_Axis_1: MC_Power; (* Es werden die Freigaben für die Achse gesetzt *)
fbReadActualPosition_1: MC_ReadActualPosition; (* Es wird die aktuelle Position der Achse gelesen *)
fbReset_Axis: MC_Reset; (* Es wird ein Reset der Achse durchgeführt *)
fbStop: MC_Stop; (* Die Achse wird gestoppt *)

bAxis_Ready: BOOL; (* Überprüft, ob die Achse bereit ist *)
bMove_Absolut_Aborted: BOOL; (* Wird true, wenn die Positionierung nicht vollständig ausgeführt werden konnte *)
bMove_Absolut_Done: BOOL; (* Zeigt, ob die Positionierung abgeschlossen ist *)
bReset_Done: BOOL; (* Zeigt, ob ein Resetvorgang absgeschlossen ist *)
lrAcc_Axis_1: LREAL ; (* Beschleunigung bei absoluter Positionierung, beim Wert 0 wirkt Standard *)
lrActual_Position: LREAL; (* Aktuelle Position der Achse *)
lrDecel_Axis_1: LREAL ; (* Verzögerung bei absoluter Positionierung, beim Wert 0 wirkt Standard *)
lrJerk_Axis_1: LREAL; (* Ruck bei absoluter Positionierung, beim Wert 0 wirkt Standard *)
lrPosition_Drive_to: LREAL; (* Position, die bei einer absoluten Positionierung angefahren werden soll *)
lrVelocity_Move_Ab_Axis_1: LREAL; (* Geschwindigkeit, mit der bei einer absoluten Positionierung gefahren werden soll *)

InVelocity : BOOL;
CommandAborted : BOOL;
bError : BOOL;
ErrorId : UDINT;

MC_Home : MC_Home;
Start : BOOL;
bTest : BOOL;

PowerStatus : BOOL; (* B *)
Busy : BOOL; (* V *)
Active : BOOL; (* V *)
PowerError : BOOL; (* B *)
PowerErrorID : UDINT; (* E *)


StopDone : BOOL;
StopError : BOOL;
StopErrorID : UDINT;
END_VAR


(* Freigabesignale werden gesetzt *)
fbPower_Axis_1(
Enable := bEnable,
Enable_Positive := bEnable,
Enable_Negative := bEnable,
Override := 100.000,
AxisRefIn := strNC_TO_PLC,
AxisRefOut := strPLC_TO_NC,
Status => PowerStatus,
Error => PowerError,
ErrorID => PowerErrorID);


(* Überprüft, ob die Achse bereit ist *)
bAxis_Ready := AxisIsReady(strNC_TO_PLC.nStateDWord );

(* Reset der Achse *)
fbReset_Axis(
Execute := bReset_Axis,
Axis := strNC_TO_PLC,
Done => bReset_Done,
Error => ,
ErrorID => );

(* Führt eine Absolutbewegung durch *)
fbMoveAbsolute_Axis_1(
Execute := bMove_Absolut,
Position := lrPosition_Drive_to,
Velocity := lrVelocity_Move_Ab_Axis_1 ,
Acceleration := lrAcc_Axis_1,
Deceleration := lrDecel_Axis_1,
Jerk := lrJerk_Axis_1 ,
Axis := strNC_TO_PLC,
Done => bMove_Absolut_Done ,
CommandAborted => bMove_Absolut_Aborted ,
Error => ,
ErrorID => );
IF fbMoveAbsolute_Axis_1.Done THEN
bMove_Absolut := FALSE;
END_IF

(* Führt eine Endlosbewegung durch *)
IF bMoveRight THEN
Direction := MC_Positive_Direction;
ELSIF bMoveLeft THEN
Direction := MC_Negative_Direction;
END_IF
fbMoveVelocity_Axis_1(
Execute := bMoveRight OR bMoveLeft OR bMove_Absolut,
Velocity := 1000,
Acceleration := lrAcc_Axis_1,
Deceleration := lrDecel_Axis_1,
Jerk := ,
Direction := Direction,
Axis := strNC_TO_PLC,
InVelocity => InVelocity,
CommandAborted => CommandAborted,
Error => bError,
ErrorId => ErrorId);

IF bMove_Absolut OR bMoveLeft OR bMoveRight THEN
bStop := FALSE;
ELSE
bStop := TRUE;
END_IF

(*
(* Stoppt die Achse *)
fbStop(
Execute := bStop,
Deceleration := 500,
Jerk := ,
Axis := strNC_TO_PLC,
Done => StopDone,
Error => StopError,
ErrorId => StopErrorID);
*)

(* Auslesen der aktuellen Position *)
fbReadActualPosition_1(
Enable := TRUE ,
Axis := strNC_TO_PLC ,
Done => ,
Error => ,
ErrorID => ,
Position => lrActual_Position);
 
Zuletzt bearbeitet:
Ist vor dem Positionieren nicht erstmal referenzieren angesagt? Will heißen, mindestens einmal muss der Achse ein Nullpunkt gegeben werden, wenn kein absoluter Geber verbaut ist.
 
Zurück
Oben