# Beckhoff Motoren - variable Geschwindigkeit



## moon (30 November 2012)

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


----------



## Baschankun (30 November 2012)

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


----------



## trinitaucher (1 Dezember 2012)

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.


----------



## moon (7 Dezember 2012)

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?

```
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();
```


```
// 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


----------



## trinitaucher (7 Dezember 2012)

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?


----------



## moon (17 Dezember 2012)

*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


----------



## vista (3 Juni 2015)

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


----------



## Knaller (3 Juni 2015)

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


----------



## vista (4 Juni 2015)

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


----------



## Knaller (12 Juni 2015)

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


----------



## vista (5 August 2015)

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


----------



## ostermann (6 August 2015)

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


----------



## vista (19 August 2015)

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


----------



## ostermann (20 August 2015)

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


----------



## Larry Laffer (21 August 2015)

vista schrieb:


> 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


----------



## friki (18 September 2015)

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.


----------



## kuti (13 Dezember 2016)

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


----------



## ostermann (13 Dezember 2016)

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


----------



## kuti (13 Dezember 2016)

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


----------



## weißnix_ (13 Dezember 2016)

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.


----------



## ostermann (13 Dezember 2016)

Vor dem Referenzieren muss die Achse erstmal bereit sein. Sonst klappt auch die Referenzfahrt nicht.

Die Verlinkung besteht aus mehr als 2 Variablen. Da kann durchaus ein Statusbyte falsch oder nicht verlinkt sein, und dann läuft es nicht.

Das SPS-Programm ist erstmal uninteressant, so lange du die Achse nicht manuell aus dem NC-View fahren kannst. Mach mal einen Screenshot im Systemmanager mit aufgeklapptem Knoten in der NC. Da sieht man schnell, wo was fehlt.

Mit freundlichen Grüßen
Thorsten Ostermann


----------



## kuti (13 Dezember 2016)

Das hatte ich auch schon gemacht, im FCT-Programm von Festo. Er hat dann erfolgreich refernziert. (Habe einen Inkrementalgeber)


----------



## kuti (13 Dezember 2016)

Hier der screenshot:
Komplettes Programm ist aber auch oben als zip-Datei angehängt.


----------



## ostermann (19 Dezember 2016)

Klapp bitte mal die Variablen State und Control auf. Was da drunter hängt ist noch interessant. ich sehe aber auch keine Verlinkung auf SetPos oder SetVelo? Als was für ein Typ ist die Achse denn Konfiguriert? Und wo soll der Lageregler geschlossen werden, in der NC (Drehzahlsollwert an den Antrieb) oder im Antriebsregler (Lagesollwert an den Antrieb)?

Mit freundlichen Grüßen
Thorsten Ostermann


----------

