Modulo in Endlosposition rechnen

TP-Inc

Level-3
Beiträge
1.102
Reaktionspunkte
247
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi, ab und zu gibt es Anwendungen bei denen ich die Modulo-Position eines Drehantriebs, aber auch die „Endlos“-Position brauche. Wie zählt man vernünftig Umdrehungen mit? Übergang von 360 auf 0 erkennen erscheint mir nicht so elegant und sicher… Braucht ihr das auch ab und zu?
Das sollte Telegramm und Antriebsunabhängig funktionieren.
 
Wir erfassen Drehzahl über das technologiemodul TM Count.
Sensorik von z.b. Braun oder Emerson
Auf die Welle wo wir Drehzahl messen ist aber ein ganz einfaches Polrad.

Das Impulssignal wird aber erst erfasst im Überdrehzahlschutz und dann als impuls an die SPS weitergegeben
 
Übergang von 360 auf 0 erkennen erscheint mir nicht so elegant und sicher…
Nicht sicher, weil evtl. die exakten Werte 359 und 0 "überlesen" werden?
Z.B. Wechsel von > 270 nach < 90 (vorwärts) bzw. Wechsel von < 90 nach > 270 (rückwärts) sollten gut dekodierbar sein.

Code:
bA := iWinkel < 90 ;
bB := iWinkel > 270 ;
IF bA AND bsB_zuvor THEN
    iZähl := iZähl + 1 ;
ELSIF bB AND bsA_zuvor THEN
    iZähl := iZähl - 1 ;
END_IF ;
bsA_zuvor := bA ;
bsB_zuvor := bB ;
 
Zuletzt bearbeitet:
... je nach Drehzahl, Abtastzeit nochmal plausibilisieren.
Z.B. 3000rpm - würde ich maximal alle 10ms abtasten da eine Umdrehung 20ms dauern würde.
Falls Drehzahlistwert auch bekannt ist, dann könnte man Heinileini`s Code entsprechend erweitern.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Falls Drehzahlistwert auch bekannt ist, dann könnte man Heinileini`s Code entsprechend erweitern.
Leider kann auch eine Erweiterung meines CodeBeispiels verlorengegangene Informationen nicht verlässlich rekonstruieren ...
Da wäre mir zu viel Plausibilität im Spiel.

PS:
Statt - wie in meinem Beispiel - 1 zu addieren/subtrahieren, könnte man direkt 360 addieren/subtrahieren, da ergibt die Summe aus Winkel und Zähl direkt die "neue" Position in °. Für Zähl dann aber tunlichst den DatenTyp DINT wählen und prüfen, ob dies ausreicht.
 
Zuletzt bearbeitet:
Sieht eigentlich total simpel aus. Dankeschön 😀 muss ich mal austesten beim nächsten Drehantrieb der mir unterkommt.
 
Hi, ab und zu gibt es Anwendungen bei denen ich die Modulo-Position eines Drehantriebs, aber auch die „Endlos“-Position brauche. Wie zählt man vernünftig Umdrehungen mit? Übergang von 360 auf 0 erkennen erscheint mir nicht so elegant und sicher… Braucht ihr das auch ab und zu?
Das sollte Telegramm und Antriebsunabhängig funktionieren.
Das selber mitzählen ist eine Variante, bei vielen Antrieben geht das aber auch einfacher.
Wenn du das machst rate ich dir aber, den Überlaufzähler öbb einen eigenen Speicherbeteich zu legen der nie neu initialisiert wird (eigener DB mit fixer Nummer bei S7, Permanentspeicher bei B&R,...)

Sew Movidrive B:
Wenn du die Modulopositionierung nutzt wird die Modulo Position als 0-3600 oder 0-65535 zur Steuerung geladen. In der IPOS-Variable H511 ist aber weiterhin die Geberrohposition als i32 mit Überlaufzähler verfügbar. Die kann man mittels IPOS oder anderer Wege zur Steuerung laden und muss dann nur von Inkrementen auf weg umrechnen.

Profidrive (simatic To)
Die Moduloumrechnung wird von der Steuerung durchgeführt. Im Profidrive - Telegramm von Antrieb selbst kommt die Geberrohposition ebenfalls als i32 herauf, somit du den gesamten Absolutbereich des Gebers zur Verfügung hast.

Bei Inkrementalgebern stellte ich mir die Frage nach der Sinnhaftigkeit.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab's mal etwas ausführlicher geschrieben (ungetestet!):
Code:
VAR_INPUT
    iiWinkel  : INT  ; // Winkel 0..359
END_VAR

VAR_IN_OUT
    iodZähl   : DINT ; // Position := 360 * Umdrehung + Winkel
END_VAR

VAR_STATIC // (optional IN_OUT)
    sbA_zuvor : BOOL ; // vorheriger Winkel <  90°
    sbB_zuvor : BOOL ; // vorheriger Winkel > 270°
END_VAR

VAR_TEMP
    tbA       : BOOL ; // aktueller Winkel <  90°
    tbB       : BOOL ; // aktueller Winkel > 270°
    tdWinkel  : DINT ; // Winkel 0..359
    tdZähl    : DINT ; // HilfsVariable, um in '360 * Umdrehung + Winkel' den "alten" Winkel durch den "neuen" zu ersetzen
END_VAR

tdWinkel  := INT_TO_DINT(iiWinkel) ;
tdZähl    := iodZähl / 360 ;  // zweizeilig, damit Compiler nicht / 360 * 360 "wegrationalisiert" ...
tdZähl    := tdZähl * 360 + tdWinkel ; // ... ersetzt den vorherigen Winkel durch den aktuellen
tbA       := tdWinkel <  90 ; // aktueller Winkel im Bereich 0..89
tbB       := tdWinkel > 270 ; // aktueller Winkel im Bereich 271..359
IF tbA AND sbB_zuvor THEN     // wenn Winkel 271..359 --> Winkel 0..89, dann ...
    iodZähl := tdZähl + 360 ; // ... Anzahl Umdrehungen korrigieren (inkrementieren)
ELSIF tbB AND sbA_zuvor THEN  // wenn Winkel 0..89 --> Winkel 271..359, dann ...
    iodZähl := tdZähl - 360 ; // ... Anzahl Umdrehungen korrigieren (dekrementieren)
ELSE
    iodZähl := tdZähl ;    
END_IF ;
sbA_zuvor   := tbA ; // für Auswertung im nächsten Zyklus
sbB_zuvor   := tbB ; // für Auswertung im nächsten Zyklus

Bei Inkrementalgebern stellte ich mir die Frage nach der Sinnhaftigkeit.
Geht mir auch so.
Wenn beides (mit und "mit ohne" Modulo) benötigt wird (warum auch immer), warum dann nicht den Wert ohne Modulo als "Leitwert" nehmen und daraus jeweils den ModuloWert berechnen?
 
Zuletzt bearbeitet:
Wenn beides (mit und "mit ohne" Modulo) benötigt wird (warum auch immer), warum dann nicht den Wert ohne Modulo als "Leitwert" nehmen und daraus jeweils den ModuloWert berechnen?
Sobald ein bisschen Getriebe und Vorgelegte im Spiel sind, dürften die meisten Leute mit der dahinterliegenden notwendigen Ganzzahlarithmetik im 2er-System überfordert sein und sich noch nie darüber Gedanken gemacht haben was beim Überlauf passiert, oder sich vielleicht wundern warum bei ihrer Methode der Modulo-Wert Weg driftet....
 
... oder sich vielleicht wundern warum bei ihrer Methode der Modulo-Wert Weg driftet....
Ein driftender ModuloWert? Du meinst, wenn sich zwischen MessSystem und ModuloAchse ein Getriebe befindet und man auf die geniale Idee kommt, das Über- oder Unter-SetzungsVerhältnis auszurechnen und für die weitere Verwendung als (L)REAL-Zahl abzuspeichern?
Das kannte ich bisher nur von LinearAchsen. Aber, Du hast Recht, das kann man eigentlich auch bei ModuloAchsen schaffen. ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke nochmal für die ausführlichen Antworten. Es geht bei mir nicht um besonders hohe Werte oder Genauigkeiten. Als Beispiel hätte ich zB eine Station die mit dem Drehteller eine bestimmte Position anfahren soll, damit sie beladen werden kann. Danach passiert eine Bearbeitung die oft auf volle Umdrehungen passieren soll. Zum anfahren der Einlegeposition ist Modulo praktisch, da man sich das zurückdrehen bzw. das Rechnen spart. Beim Fahren auf volle Umdrehungen wäre Endlos wieder praktischer, da man sich die hier gefragte Rechnerei spart. Ich weiß, bei manchen Antrieben kann man das zur Laufzeit umschalten, bei manchen kriegt man beide Positionen übers Telegramm. Ich denke die erste Lösung von Heinileini ist für mich erstmal ausreichend.
 
Ein driftender ModuloWert? Du meinst, wenn sich zwischen MessSystem und ModuloAchse ein Getriebe befindet und man auf die geniale Idee kommt, das Über- oder Unter-SetzungsVerhältnis auszurechnen und für die weitere Verwendung als (L)REAL-Zahl abzuspeichern?
Das kannte ich bisher nur von LinearAchsen. Aber, Du hast Recht, das kann man eigentlich auch bei ModuloAchsen schaffen. ;)
Der Klassiker ist eher, dass man auf 360,00 positioniert und dann eine Geberjustage auf 0 durchführt, und das wiederkehrend.
Je nach Anwendung, Positioniergüte und Taktzeit kann das schon mal einige Wochen gut gehen 😂

An der Genauigkeit der REAL-Arithmetik bin ich bei linearen Achsen bis dato noch nie gescheitert, aber ich habe schon oft erlebt, dass Kollegen mit den auf 2 Nachkommastellen gerundeten Getriebe Übersetzungen gearbeitet haben, oder noch besser: die vom Hersteller mit 0 Nachkommastellen angegebenen Abtriebsdrehzahlen für ihre Rechnungen verwendet haben und sich dann wundern, wenn sie im einstelligen Prozent erreicht daneben sind.
 
Der Klassiker ist eher, dass man auf 360,00 positioniert und dann eine Geberjustage auf 0 durchführt, und das wiederkehrend.
Je nach Anwendung, Positioniergüte und Taktzeit kann das schon mal einige Wochen gut gehen 😂

An der Genauigkeit der REAL-Arithmetik bin ich bei linearen Achsen bis dato noch nie gescheitert, aber ich habe schon oft erlebt, dass Kollegen mit den auf 2 Nachkommastellen gerundeten Getriebe Übersetzungen gearbeitet haben, oder noch besser: die vom Hersteller mit 0 Nachkommastellen angegebenen Abtriebsdrehzahlen für ihre Rechnungen verwendet haben und sich dann wundern, wenn sie im einstelligen Prozent erreicht daneben sind.
Deshalb sollte man bei Rundachsen immer beim Antriebshersteller
immer das Zähler / Nennerverhältnis des Getriebe angeben lassen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Deshalb sollte man bei Rundachsen immer beim Antriebshersteller
immer das Zähler / Nennerverhältnis des Getriebe angeben lassen.
:unsure: Wie meinst Du das, Helmut? Das (ausgerechnete) Verhältnis oder die separate Angabe von Zähler und Nenner?
Ich plädiere eindeutig für letzteres.
 
Das entspricht den wirklichen Übersetzungsverhältnis des Getriebes,
wir setzen zb SEW ein, ich frage das immer an, auf Anraten von SEW.
Was ich nicht verstehe, warum Sie es nicht gleich auf das Typenschild
drucken.
 
..., ich frage das immer an, auf Anraten von SEW.
Was ich nicht verstehe, warum Sie es nicht gleich auf das Typenschild
drucken.
Donnerwetter! Auf Anraten von SEW. Also bei SEW Problem zumindest erkannt, aber nicht gebannt.
Tja, ein GetriebeMotor besteht aus Getriebe und aus Motor. Zwei verschiedene Abteilungen und zwei verschiedene Zuständigkeiten.
Und je 1 TypenSchild für Getriebe und für Motor wäre wohl Luxus ... das verhindert dann die dritte (die Rotstift-) Abteilung!?

Die denken bestimmt, Du hast doch den GetriebeMotor ausgewählt und bestellt und Du weisst nicht mehr, was Du bestellt hast??? ;)
 
Donnerwetter! Auf Anraten von SEW. Also bei SEW Problem zumindest erkannt, aber nicht gebannt.
Tja, ein GetriebeMotor besteht aus Getriebe und aus Motor. Zwei verschiedene Abteilungen und zwei verschiedene Zuständigkeiten.
Und je 1 TypenSchild für Getriebe und für Motor wäre wohl Luxus ... das verhindert dann die dritte (die Rotstift-) Abteilung!?

Die denken bestimmt, Du hast doch den GetriebeMotor ausgewählt und bestellt und Du weisst nicht mehr, was Du bestellt hast??? ;)
nein ein Typenschild ist bei SEW immer vorhanden, sogar zwei
eins am Motor und ein zweites das der Maschinenbauer dann
noch einmal extra anbringen kann, damit man es lesen kann wenn
der Motor verbaut ist.
Das einzige ist das da eine berechnete Getriebe übersetzung
eingestanzt ist, diese ist nicht Genau genug für eine Modulo
Positionierung.
Es gibt aber für die Getriebe aber immer ein Zähler - Nennerverhältnis
das sich aus den "Ritzeln" ergibt. Diese kann man sogar in der Parametrier
Software eingeben, leider muss man sich das immer explizit bei SEW
anfragen. Besser währe es wenn es gleich auf den Typenschild stehen
würede.
 
Zurück
Oben