TIA Servomotor mit Resolver, Umdrehungen mitzählen

litlegerman

Level-2
Beiträge
312
Reaktionspunkte
7
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
Anlagenbeschreibung:
Ich habe eine Umrichter (Lenze Topline) mit angeschlossenem Servo Motor (Resolver als Rückführung).
Als Steuerung haben ich eine S7-1214c die via Profinet an dem Teil angeschlossen ist (Tia V15.1).

Aufgabe:
Umdrehungen der Motorwelle auswerten

Problem:
Im Engineering von Lenze habe ich einen passenden Wert gefunden den ich dafür wervenden kann "dActMotorpos" oder so...
Dieser Wer liefert eine Dint Wert der aktuell gelaufenen Inkremente der Motorwelle eine Umdrehung entspricht hier 65535 Inkremente.
Wenn ich die Welle Linksrum dreh steigt der Wert, Rechts rum fällt er.
Jetzt kann man diesen Wert nicht Zrücksetzen, außer man schaltet den Umrichter aus (wegen Resolver = intialisert sich beim Neustart mit 0)
Dieses Problem habe ich schon gelöst, indem ich einen Offset nach meinem Wunsch setze und das dann vom aktuellen Wert abzihe, so arbeite ich schonmal absolut.

Jetzt gibt es aber noch das Problem des Wert überlaufs... Der Wert im Engineering ist ein Dint Wert der reicht von -2147483647 bis +
2147483647 wen dieser Wert Unter/Überschritten wird, ändert sich die Zählrichtung...
Wie kann ich das Problem lösen?
Diese Überlauf erkenne ist relativ einfach, aber der wie komm ich damit klar das mein Absolut wert den ich mir mit dem Offset gebildet hab von dem Punkt weiter zählt und das auch in die richtige Richtung?

Danke für eure Hilfe!
 
Verwendest du die Serie 8400?
Diese kann nicht unendlich zählen. Die bleibt bei max. Wert stehen. Laut lenze ist das so absichtlich. Glaub irgendwo konnte man die impulse anzeigen lassen

In der 9400 Serie kann man das unendlich zählen aktivieren.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Verwendest du die Serie 8400?
Diese kann nicht unendlich zählen. Die bleibt bei max. Wert stehen. Laut lenze ist das so absichtlich. Glaub irgendwo konnte man die impulse anzeigen lassen

In der 9400 Serie kann man das unendlich zählen aktivieren.
Ich verwende die 8400er, das kann ich leider auch nicht ändern, da diese in der Anlage schon vorhanden sind.
Ich hab es auch getestet, ich habe den Antrieb über den Wert von 2147483647 laufen lassen danach hat er nicht angehalten, sondern er fing an rückwärts zu zählen, ich denke er würde dann bei erreichen von -2147483647 würde er erneut die Zählrichtung ändern.
Das mit dem Richtungswechsel kann man ja erkennen, aber ich hab irgend wie ein Brett vorm Kopf die Formel zum umrechnen der Zählrichtung und das umspeichern...
 
Welches Format hast du gewählt ? Parameter C01296?
Da gibts des 32 bit Format mit 214748,3647 units
Bzw. Welchen Parameter schaust du an ?Welchen Parameter liest du aus ?
Sorry oben hast ja geschrieben welcher Parameter.
Das einzige was mir jetzt noch einfällt wäre mal highword mit lowword zu tauschen. Das wäre zumindest mal ein Versuch wert.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Dieser Wer liefert eine Dint Wert der aktuell gelaufenen Inkremente der Motorwelle eine Umdrehung entspricht hier 65535 Inkremente.
Sicher? Ich würde behaupten: 1 Umdrehung ist 65536 Inkremente

Jetzt gibt es aber noch das Problem des Wert überlaufs... Der Wert im Engineering ist ein Dint Wert der reicht von -2147483647 bis +2147483647 wen dieser Wert Unter/Überschritten wird, ändert sich die Zählrichtung...
Ich hab es auch getestet, ich habe den Antrieb über den Wert von 2147483647 laufen lassen danach hat er nicht angehalten, sondern er fing an rückwärts zu zählen
Da hast Du Dich bestimmt verguckt... der hat nach dem Sprung nicht rückwärts gezählt sondern weiter vorwärts. Hast Du das Minus vor den Zahlen gesehen?

Da ändert sich nicht die Zählrichtung. Es bleibt dabei: bei Linksdrehung steigt der Wert und bei Rechtsdrehung fällt der Wert. Schau Dir mal einen Zahlenstrahl von -2147483648 .. -1, 0 , +1 .. +2147483647 an: von links nach rechts werden die Werte größer, auch wenn bei den negativen Zahlen der Betrag kleiner wird :cool: -1000 ist weiter links als -1, also: -1000 ist kleiner als -1 !

Der Überlauf ist dank Zweierkomplement-Darstellung von INT/DINT/LINT überhaupt kein Problem, wenn man "relativ" mit Differenzen arbeitet. Differenz-Bildung funktioniert auch über den Überlauf hinweg korrekt. Stelle Dir den Zahlenstrahl -2147483648 .. -1, 0 , +1 .. +2147483647 zusammengebogen als Kreis vor, wo die "Enden" -2147483648 und +2147483647 sich berühren, und es ist nur ein Schritt von einem "Ende" zum Anderen. Wenn der Wert in positiver Richtung überläuft, dann passiert folgendes: +2147483647 + 1 ergibt -2147483648


So kann man den Wert eines 16-Bit-Encoders auf eine DINT-Position verrechnen (entspricht 65536 Umdrehungen)
(die Position kann man an irgendeiner Referenzposition auf 0 setzen):
Code:
VAR_IN
  iEncoder : INT; //falls der Encoderwert ein DINT ist: die unteren 16 Bit (INT) reichen schon
END_VAR
END_
VAR
  iEncoder_Alt : INT;
  iEncDiff     : INT;
  diPosition   : DINT;  // LINT funktioniert auch
END_VAR

iEncDiff := iEncoder - iEncoder_Alt;
iEncoder_Alt := iEncoder;

diPosition := diPosition + INT_TO_DINT(iEncDiff);
(ungetestet)
Falls Du noch größere Positionswerte brauchst, dann geht das ganze auch genauso mit Position als LINT.

Harald
 
Sicher? Ich würde behaupten: 1 Umdrehung ist 65536 Inkremente



Da hast Du Dich bestimmt verguckt... der hat nach dem Sprung nicht rückwärts gezählt sondern weiter vorwärts. Hast Du das Minus vor den Zahlen gesehen?

Da ändert sich nicht die Zählrichtung. Es bleibt dabei: bei Linksdrehung steigt der Wert und bei Rechtsdrehung fällt der Wert. Schau Dir mal einen Zahlenstrahl von -2147483648 .. -1, 0 , +1 .. +2147483647 an: von links nach rechts werden die Werte größer, auch wenn bei den negativen Zahlen der Betrag kleiner wird :cool: -1000 ist weiter links als -1, also: -1000 ist kleiner als -1 !

Der Überlauf ist dank Zweierkomplement-Darstellung von INT/DINT/LINT überhaupt kein Problem, wenn man "relativ" mit Differenzen arbeitet. Differenz-Bildung funktioniert auch über den Überlauf hinweg korrekt. Stelle Dir den Zahlenstrahl -2147483648 .. -1, 0 , +1 .. +2147483647 zusammengebogen als Kreis vor, wo die "Enden" -2147483648 und +2147483647 sich berühren, und es ist nur ein Schritt von einem "Ende" zum Anderen. Wenn der Wert in positiver Richtung überläuft, dann passiert folgendes: +2147483647 + 1 ergibt -2147483648


So kann man den Wert eines 16-Bit-Encoders auf eine DINT-Position verrechnen (entspricht 65536 Umdrehungen)
(die Position kann man an irgendeiner Referenzposition auf 0 setzen):
Code:
VAR_IN
  iEncoder : INT; //falls der Encoderwert ein DINT ist: die unteren 16 Bit (INT) reichen schon
END_VAR
END_
VAR
  iEncoder_Alt : INT;
  iEncDiff     : INT;
  diPosition   : DINT;  // LINT funktioniert auch
END_VAR

iEncDiff := iEncoder - iEncoder_Alt;
iEncoder_Alt := iEncoder;

diPosition := diPosition + INT_TO_DINT(iEncDiff);
(ungetestet)
Falls Du noch größere Positionswerte brauchst, dann geht das ganze auch genauso mit Position als LINT.

Harald
Das hört sich alles sehr schlüssig an... das werde ich direkt mal versuchen...
 
Verwendest du die Serie 8400?
Diese kann nicht unendlich zählen. Die bleibt bei max. Wert stehen. Laut lenze ist das so absichtlich. Glaub irgendwo konnte man die impulse anzeigen lassen

In der 9400 Serie kann man das unendlich zählen aktivieren.

Bist du dir denn Sicher, das der 8400er irgendwann aufhört zu zählen, das wäre noch ein weiteres Problem, das ich angehen müßte!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ja ich habe den ist wert vom motorinterface verwendetet. Siehe auch unter Diagnose istposition Parameter.
wie oben beschrieben kann es sein da du einen anderen Parameter verwendest und der wieder bei Null anfängt.
Hast du mal den wert im enginieer und tia gleichzeitig beobachtet?
 
Engineer.png
Den Wert "dnMotorPosAct_p" verwende ich...
den habe ich in 2 Wörter verteilt, die übergebe ich dan Via Profinet auf die S7, da führe ich sie wieder zu Dint zusammen, genau der Wert zueigt dieses Verhalten, welchses Harald beschreibt.
Mit seine Methodes funktioniert es auch tadellos, aber wenn es jetzt ist wie du sagst, dass der Wird irgendwann nicht mehr weite zählt, kann ich den nicht verwenden.
 
Der könnte der Parameter sein der unendlich zählt. Lenze hat mir damals einen gesagt der das so macht, weiß aber nicht mehr welcher...

Ich habe damals vom L_pMckStateInterface_1 die wPosUnitsLW und HW verwendet. Die blieben stehen siehe auch unter Diagnose MCK:Istposition der bleibt stehen
 
Zurück
Oben