Inkremental Drehgeber und Lineargeber EL5151 Programm

Marsene

Level-2
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag zusammen,

ich schreibe gerade mein erstes SPS Programm und habe da ein paar fragen.
Ich habe ein inversen Pendel, das an einem Lineargeber und inkrementale Drehgeber zur Bestimmung von Position und Winkel angeschlossen ist.
Ich habe aber das Problem, dass die Daten der Encoder in UINT und UDINT herausgegeben werden. Ich benötige aber die Daten in LREAL für die Verknüpfung an der Steuerung.
Der Encoder hat eine Auflösung von 600 ppr und zwei Input (Counter value und Perio value). ich habe folgende Zeile geschrieben aber es klappt leider nicht.

q:=UINT_TO_REAL(IO.Winkel)/Auflösung;

An IO.Winkel habe ich der Input Counter Value verknüpft. Sollen hier beide Input verwendet werden? Ich habe gelesen, dass beide Inputs um 90° voneinander verschoben sind und zur Bestimmung der Drehrichtung dienen.

Wie kann ich daraus der Winkel und die Winkelgeschwindigkeit in ° und °/s erhalten.
Gibt es eine Formel, indem beide Input vorkommen?

1714813839465.png
Danke im Voraus für die Unterstützung
 
Hallo,

Im Projekt als Reference, die Bibliothek "TC2_MC2" hinzufügen.

am einfachsten, du erstellst in Motion, eine Achse als "Encoderachse".

1714890790125.png

Als Encodertyp, wählst du den 5151 aus, und verknüpft es mit der Klemme in den IO´s
1714890879701.png

In den Achseneinstellung selbst, wählst als Einheit ° aus.
1714890937397.png

Jetzt kannst du die Achse mit deiner Axis_Ref in der PLC verbinden.

Im Encoder Fenster "Parameter", noch den Numerator und Denumerator anpassen, bei dir sollten diese Einstellungen passen:
1714891475688.png


axis1..ReadStatus(); //zyklisches auslesen des Achsenstatus

aktuellePosition:= axis1.NcToPlc.ActPos; // auslesen der aktuellen Position
aktuelleGeschwindigkeit:= axis1.NcToPlc.ActVelo; // auslesen der aktuellen Geschwindigkeit
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe ein inversen Pendel, das an einem Lineargeber und inkrementale Drehgeber zur Bestimmung von Position und Winkel angeschlossen ist.
Das klingt nach zwei oder mehr Gebern. Wozu? 1 WinkelGeber sollte doch genügen?

An IO.Winkel habe ich der Input Counter Value verknüpft. Sollen hier beide Input verwendet werden? Ich habe gelesen, dass beide Inputs um 90° voneinander verschoben sind und zur Bestimmung der Drehrichtung dienen.
Von welchen beiden Inputs sprichst Du? Die beiden, die um 90° gegeneinander verschoben sein sollen, sind entweder vom Typ
- analog, also cosinus und sinus oder
- digital, sprich BOOLE.
Pro Geber muss es diese beiden Signale geben. Meist werden sie als A und B bezeichnet.
Die Inputs A und B unbedingt beide verwenden, denn dadurch vereinfacht sich die Anwendung.
Aber Dein 'IO.Winkel' dürfte nichts mit den genannten 90° zu tun haben.

Ich habe aber das Problem, dass die Daten der Encoder in UINT und UDINT herausgegeben werden. Ich benötige aber die Daten in LREAL für die Verknüpfung an der Steuerung.
Von den A-/B-Signalen zu den Positions- oder WinkelWerten vom Typ UINT oder UDINT ist noch ein "weiter Weg".
Die SignalPegel UND die FlankenWechsel der A-/B-Signale müssen ausgewertet und gezählt werden. Die erhaltenen ZählerStände haben dann ein GanzzahlFormat, z.B. UINT oder UDINT.
Mein "GeheimTipp": alle vier Flanken auswerten. Man glaubt gar nicht, wie viel Ärger man sich durch diesen vermeintlichen Umweg ersparen kann.
Ein GanzzahlFormat in ein GleitKommaFormat, z.B. in LREAL zu wandeln, dürfte das kleinste Problem sein. Wenn die CPU die Formate, die Du genannt hast (UINT, UDINT, LREAL) überhaupt "kennt", dann stellen die darauf laufenden ProgrammierSprachen mit ziemlicher Sicherheit auch die entsprechenden KonvertierFunktionen zur Verfügung, z.B. UINT_TO_LREAL(...).

Der Encoder hat eine Auflösung von 600 ppr und zwei Input (Counter value und Perio value). ich habe folgende Zeile geschrieben aber es klappt leider nicht.
'600 ppr' dürfte 600 pulses per revolution bedeuten und sich damit nur auf einen DrehGeber beziehen, nicht jedoch auf einen LinearGeber.
Nun kommt erst der GedankenSprung zu 'CounterValue' und 'PerioValue':

Wie kann ich daraus der Winkel und die Winkelgeschwindigkeit in ° und °/s erhalten.
Bei DrehGebern müsstest Du noch dafür sorgen, dass die ZählerStände nach 1 Umdrehung "überlaufen".
D.h., wenn der ZählerStand 0 unterschreitet, muss der ZählerStand 'PerioValue' - 1 folgen bzw. beim Überschreiten des ZählerStandes 'PerioValue' - 1 der ZählerStand 0. Dazu bietet sich die ModuloFunktion an (ZählerStand := ZählerStand MOD PerioValue ; ).
Der ZählerStand ist dann der Winkel. Allerdings muss der ZählerStand noch zur mechanischen Position synchronisiert werden.

Gibt es eine Formel, indem beide Input vorkommen?
Klär bitte erstmal, von welchen beiden Inputs die Rede ist!
Und ggfs, ob und wozu genau Du überhaupt 'die eine Formal' benötigst.
Wenn die Inputs A und B gemeint sind, behaupte ich einfach mal "Diese eine Formel gibt es nicht, weil sie nicht zielführend wäre".
Sind die Inputs 'CounterValue' und 'PerioValue' gemeint: s.o., StichWort Modulo.
 
Danke für die Antwort
Das klingt nach zwei oder mehr Gebern. Wozu? 1 WinkelGeber sollte doch genügen?
Der Drehgeber ist zur Bestimmung der Winkel. Der Lineargeber ist in Kombination mit der Servomotor zur Bestimmung der Position des Wagen. Das Pendel ist an einem Wagen angeschlossen.
Ich habe ein aufgebautes inverse Pendel vorgefunden und das sind die daten, die mir kommuniziert wurden.
Von welchen beiden Inputs sprichst Du? Die beiden, die um 90° gegeneinander verschoben sein sollen, sind entweder vom Typ
- analog, also cosinus und sinus oder
- digital, sprich BOOLE.
Pro Geber muss es diese beiden Signale geben. Meist werden sie als A und B bezeichnet.
Die Inputs A und B unbedingt beide verwenden, denn dadurch vereinfacht sich die Anwendung.
Aber Dein 'IO.Winkel' dürfte nichts mit den genannten 90° zu tun haben.
Ich habe mich falsch ausgedrückt. Auf der oben angefügte Aufnahme sind die Input und Output aufgelistet.
Mit beiden Input habe ich Counter value (geht von 0 bis 65535) und Period value (geht bis 33554430)
'600 ppr' dürfte 600 pulses per revolution bedeuten und sich damit nur auf einen DrehGeber beziehen, nicht jedoch auf einen LinearGeber.
Nun kommt erst der GedankenSprung zu 'CounterValue' und 'PerioValue':

Bei DrehGebern müsstest Du noch dafür sorgen, dass die ZählerStände nach 1 Umdrehung "überlaufen".
D.h., wenn der ZählerStand 0 unterschreitet, muss der ZählerStand 'PerioValue' - 1 folgen bzw. beim Überschreiten des ZählerStandes 'PerioValue' - 1 der ZählerStand 0. Dazu bietet sich die ModuloFunktion an (ZählerStand := ZählerStand MOD PerioValue ; ).
Der ZählerStand ist dann der Winkel. Allerdings muss der ZählerStand noch zur mechanischen Position synchronisiert werden.
Wie kann ich der zählerstand zur mechanischen Position synchronisieren?
Klär bitte erstmal, von welchen beiden Inputs die Rede ist!
Und ggfs, ob und wozu genau Du überhaupt 'die eine Formal' benötigst.
Wenn die Inputs A und B gemeint sind, behaupte ich einfach mal "Diese eine Formel gibt es nicht, weil sie nicht zielführend wäre".
Sind die Inputs 'CounterValue' und 'PerioValue' gemeint: s.o., StichWort Modulo.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... Der Lineargeber ist in Kombination mit der Servomotor zur Bestimmung der Position des Wagen...
Das ergibt bestimmt eine unterlagerte Regelstrecke beim Ausbalancieren?

... Wie kann ich der zählerstand zur mechanischen Position synchronisieren? ...
Im Ruhezustand hängt das Pendel senkrecht nach unten, selbst bei Schräglage der Linearführung. Das könnte man sich zunutze machen.
 
Klar, folgt der Schwehrkraft...

Die einfache Version ist das Pendel oben zu halten.

Für Fortgeschrittene das Pendel aufzuschwingen und dann zu halten.

Extreme Könner machen das dann mit einem doppelten Pendel.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Um diese Inhalte anzuzeigen, benötigen wir die Zustimmung zum Setzen von Drittanbieter-Cookies.
Für weitere Informationen siehe die Seite Verwendung von Cookies.

Um diese Inhalte anzuzeigen, benötigen wir die Zustimmung zum Setzen von Drittanbieter-Cookies.
Für weitere Informationen siehe die Seite Verwendung von Cookies.
 
danke dir für das Video aber das inverse Pendel habe ich schon in Simscape Multibody gebaut und ein RL-Agent für das Ausbalancieren und die Stabilisierung dazu implementiert.
Die Verknüpfung mit TwinCAT3 ist schon aufgebaut aber das Problem ist die Konfiguration der Encoder in TwinCAT3.
 
axis1..ReadStatus(); //zyklisches auslesen des Achsenstatus

aktuellePosition:= axis1.NcToPlc.ActPos; // auslesen der aktuellen Position
aktuelleGeschwindigkeit:= axis1.NcToPlc.ActVelo; // auslesen der aktuellen Geschwindigkeit
Danke dir für deine Nachricht.
Bei der Lineargeber hat es ganz gut geklappt ( Da habe ich die Einstellungen angepasst).
Bei der Drehgeber allerdings klappt es nicht. Nach jeder Umdrehung wird der Nullpunkt verschoben und mit den Skalierungsfaktoren für Nenner und Zähler entspricht eine Umdrehung weiterhin nicht 360°.
Hast du da vielleicht Tipps?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei der Drehgeber allerdings klappt es nicht. Nach jeder Umdrehung wird der Nullpunkt verschoben und mit den Skalierungsfaktoren für Nenner und Zähler entspricht eine Umdrehung weiterhin nicht 360°.
... entspricht 1 Umdrehung weiterhin nicht 360°, sondern ... ?
Kannst Du mal etwas konkreter werden, bitte?
Wie viele Striche pro Umdrehung hat der Geber?
Wie viele Flanken pro Periode werden ausgewertet? 1, 2 oder 4?
Ist noch eine Getriebe-Über-/-Untersetzung zwischen Drehgeber und weiss nicht was zu berücksichtigen?
1 Umdrehung entspricht z.Z. wie viel ° bei Deiner jetzigen Parametrierung?

Der NullPunkt wird bei jeder Umdrehung verschoben?
Liefert der Geber ausser A und B nicht noch ein drittes Signal, das einmal pro Umdrehung kommt und mit dem Du den Zähler auf z.B. 0 setzen könntest?
 
Zuletzt bearbeitet:
... entspricht 1 Umdrehung weiterhin nicht 360°, sondern ... ?
Kannst Du mal etwas konkreter werden, bitte?
Wie viele Striche pro Umdrehung hat der Geber?
Wie viele Flanken pro Periode werden ausgewertet? 1, 2 oder 4?
Ist noch eine Getriebe-Über-/-Untersetzung zwischen Drehgeber und weiss nicht was zu berücksichtigen?
1 Umdrehung entspricht z.Z. wie viel ° bei Deiner jetzigen Parametrierung?

Der NullPunkt wird bei jeder Umdrehung verschoben?
Liefert der Geber ausser A und B nicht noch ein drittes Signal, das einmal pro Umdrehung kommt und mit dem Du den Zähler auf z.B. 0 setzen könntest?
Das Problem wurde jetzt behoben. Der Fehler lag daran, dass die isolierten Adern miteinander verbunden waren.
Von der Encoder wurden nicht Alle Adern an EL5151 angeschlossen und die restlichen Adern wurde isoliert. Dadurch dass die isolierten Adern miteinander verbunden waren, kam es zu dem Problem, dass 1 Umdrehung nicht 360° entspricht, sondern sich ständig ändert (mal 240, mal 280, mal 400).
Die Adern wurden einzeln isoliert und jetzt entspricht eine Umdrehung 360°.

Ich habe eine weitere Frage. Ich habe den Encoder referenziert aber nach jeder Neustart der Konfi wird die Referenzierung zurückgesetzt. Ist es normal so? Kann man es festlegen, sodass es sich nicht mehr ändert?

Ein Servomotor ist für die Bewegung des Wagens zuständig. Ich habe ebenfalls für den Motor ein kontinuierliche Achse angelegt. Die Steuerung für den Servomotor kommt aus die TwinCAT Interface von Simulink. Soll ich bei der Konfi der Achse auf etwas achten?
Für die Steuerung des Motors wurde folgende Zeile geschrieben.

Motor.ReadStatus(); // Der MotorAchse heißt Motor

a:= Motor.PlcToNc.EctSetVelo;// a entspricht die Steuerung aus der RL-Agent in Simulink

Passt es?
 
Naja, das ist halt ein Inkrrmentalgeber und da fängt die SPS bei jedem Start bei 0 an. Woher soll sie auch wissen, wo die Achse steht. Nach dem Ausschalten kann man die Achse ja auch bewegen und da bekommt die Steuerung nichts von mit.
Um das zu verhindern müsstest Du einen singleturn Absolutencoder einsetzen, dann aber an einer anderen Klemme.
 
Den Geber Typ auf Inktemental Singlturn Absolute stellen und beim NC-SAF-Task
die Persistenz einschalten, dann sollte beim Neustart die alte Position geladen werden.
Aber der Sinn bei dieser Anwendung erschließt sich mir nicht so Recht...


 
Den Geber Typ auf Inktemental Singlturn Absolute stellen und beim NC-SAF-Task
die Persistenz einschalten, dann sollte beim Neustart die alte Position geladen werden.
Aber der Sinn bei dieser Anwendung erschließt sich mir nicht so Recht...


Und bringt auch nichts, wenn der OP die Achse im ausgeschaltetem Zustand bewegt.
 
Zurück
Oben