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



## clumsi (18 Juli 2022)

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


----------



## Salli1991 (18 Juli 2022)

Spontan fällt mir gerade am einfachsten nur folgendes ein ->

```
IF Winkel < 0 THEN
    Winkel := Winkel + 360;
END_IF;
```
Somit bekommt alles unter 0 eine Drehung on Top


----------



## Salli1991 (18 Juli 2022)

Oooder du nimmst halt den Offset direkt schon in deine Modulo Operation rein^^ Dann hast du es direkt erledigt.


----------



## Tschoke (18 Juli 2022)

In Oscat gibt es einen Real Modulo.









						OSCAT - Neuigkeiten
					

OSCAT




					www.oscat.de


----------



## StructuredTrash (18 Juli 2022)

Gibt es in TwinCat auch, in der Tc2Math-Bibliothek.


----------



## Heinileini (18 Juli 2022)

Salli1991 schrieb:


> Spontan fällt mir gerade am einfachsten nur folgendes ein ->
> 
> ```
> IF Winkel < 0 THEN
> ...


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 *ab*gerundet 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.



clumsi schrieb:


> ... 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?


----------



## Salli1991 (19 Juli 2022)

Heinileini schrieb:


> 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°




Kurz nach 360°


----------



## Salli1991 (19 Juli 2022)

Nah, bei meiner Lösung fehlt natürlich noch die Skalierung für den Offset^^...Das würde wie folgt aussehen ->


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^^


----------



## Heinileini (19 Juli 2022)

Salli1991 schrieb:


> 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 ...


----------



## Onkel Dagobert (20 Juli 2022)

Heinileini schrieb:


> .. Wenn sie aber nicht da ist oder nicht ohne Macken funktioniert ...


Ich dachte schon, du willst die MOD-Funktion direkt auf Real-Werte anwenden .


----------

