Zählerwert - > Winkel 0....359,9°

clumsi

Level-2
Beiträge
140
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin!

Ich bin gerade dabei, einen Drehgeber auszuwerten, der an ein Zählermodul angeschlossen ist. Erfasst wird immer eine Umdrehung immer in die gleiche Richtung, d.h. der Zähler zählt von etwa 4.000.000 nach Anlage EIN immer eine bestimmte Anzahl Schritte herunter.

Ganz grob habe ich es wie folgt realisiert: "aktueller Zählerstand" MOD "Schritte pro Umdrehung"

Das Ganze dann auf 0-360° skaliert und dadurch habe ich den Winkel.

Jetzt soll aber ein Offset dazu. Beispiel:

Offset: -14°
Roh-Winkel ist 200° -> Winkel = 200° - 14° = 186° -> Passt alles.
Roh-Winkel ist 5,5° -> Winkel = 5,5° - 14° = -8,5° -> Passt nicht, richtig wäre 351,5°

Klar, ich muss bei unter 0 von 360 abziehen und bei über 360 bei 0 beginnen. Aber wie geht das programmtechnisch am elegantesten? Gibt es da eine "Rechenoperation", oder nur per if/switch?

Habe etwas mit WolframAlpha rumgespielt, der kann MOD auch mit REAL: https://www.wolframalpha.com/input?i=(5.5+-+14)+mod+360
(5.5 - 14) mod 360 ergibt 351,5, also genau so, wie es sein soll.

TwinCAT kann MOD mit REAL aber nicht.

Wie würde man das programmtechnisch richtig lösen? Muss man da dann wirklich per if-Abfragen unterscheiden, "in welche Richtung" man rechnet?

VG,
clumsi
 
Spontan fällt mir gerade am einfachsten nur folgendes ein ->
Code:
IF Winkel < 0 THEN
    Winkel := Winkel + 360;
END_IF;
Somit bekommt alles unter 0 eine Drehung on Top
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Spontan fällt mir gerade am einfachsten nur folgendes ein ->
Code:
IF Winkel < 0 THEN
    Winkel := Winkel + 360;
END_IF;
Somit bekommt alles unter 0 eine Drehung on Top
Ja, aber "1 Drehung on Top" kann auch zu wenig sein.
Man müsste solange 360 addieren bzw. subtrahieren, bis das Ergebnis >= 0.0 und < 360.0 ist.
Abkürzen kann man dieses Verfahren, indem man die Zahl durch 360.0 dividiert und das GanzahlErgebnis wieder mit 360 multipliziert, um dies dann vom ursprünglichen Dividenden zu subtrahieren.
Sprachabhängig gibt's meistens irgendwelche Funktionen (INT, FRAC, TRUNC, FLOOR, oder wie sie alle heissen mögen ...), mit denen man die Vorkomma- oder die Nackkomma-Stellen "abschneiden" kann. Zur Not tut es auch eine TypKonvertierung von REAL nach DINT und wieder zurück von DINT nach REAL. Wichtig ist, dass auch bei negativen Werten abgerundet wird.
Je nach Möglichkeiten der ProgrammierSprache und Anforderungen an die Anzahl möglicher VorkammaStellen seitens der jeweiligen Anwendung, kann man sich den passenden LösungsWeg aussuchen.

... d.h. der Zähler zählt von etwa 4.000.000 nach Anlage EIN immer eine bestimmte Anzahl Schritte herunter.
Kommst Du denn damit klar bzw. aus, wenn mit 4.000.000 gegonnen wird und immer nur heruntergezählt wird? Oder gibt es zwischen zwei EinschaltEreignissen auch den Fall, dass ein Unterlauf des Zählers auftritt?
Vermutlich wäre es besser den Zähler "frei laufen" zu lassen und die Differenzen zwischen zwei ZählerStänden zu bilden.

Über wie viele Impulse pro Umdrehung sprechen wir hier eigentlich? Anzahl "Striche" des Gebers? Wird jeder Impuls gezählt? Oder jeder zweite? Oder jeder vierte?
 
Ja, aber "1 Drehung on Top" kann auch zu wenig sein.
Man müsste solange 360 addieren bzw. subtrahieren, bis das Ergebnis >= 0.0 und < 360.0 ist.
Abkürzen kann man dieses Verfahren, indem man die Zahl durch 360.0 dividiert und das GanzahlErgebnis wieder mit 360 multipliziert, um dies dann vom ursprünglichen Dividenden zu subtrahieren.
Dafür ist ja gerade die Modulo Funktion da. Die macht genau das.
Kurz vor 360°
1658211920762.png


Kurz nach 360°
1658212032743.png
 
Nah, bei meiner Lösung fehlt natürlich noch die Skalierung für den Offset^^...Das würde wie folgt aussehen ->
1658212653996.png
Somit hast du Offsets in beiden Spannweiten abgedeckt. Sowohl negativ bis 360° als auch positiv bis 360°. Was ja genau das gleiche ist auf die Drehzahl gesehen, aber man muss es ja idiotensicher machen^^
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dafür ist ja gerade die Modulo Funktion da. Die macht genau das.
Richtig. Wenn die MOD-Funktion da ist und auch genau das macht, was sie soll, dann kann man sie dafür benutzen.
Wenn sie aber nicht da ist oder nicht ohne Macken funktioniert, dann darf man doch mal überlegen wie man sie realisieren kann ...
 
Zurück
Oben