# Real-Module



## kiestumpe (4 Juli 2008)

Hallo,

ich versuch gerade eine MOD-Funktion für Gleitkomma, REAL zu implementieren. Der Hintergrund: Ich möchte einen Nockenwerk simulieren, dass auch mit bei 20.1 z.B. Schalten kann.
Der Winkel muss imho zunächst mal auf Mod 360 Grad runtergekürzt werden
Als Vorgabe sind:


```
VAR_INPUT
  // Eingangsparameter
  Winkel:   REAL; // Aktueller Drehwinkel
  N0    :   REAL; // Nocken-Anfang (
  N1    :   REAL; // Nocken-Ende      
END_VAR

VAR_OUTPUT
 // Ausgangsparameter
    Nocken  :   BOOL; // Nocken betätigt
END_VAR

VAR_TEMP
    Winkel_zykl :     REAL; // Zyklischer Winkel
END_VAR    

    Winkel_zykl := TRUNC(Winkel) MOD 360; // + Realzahl
    IF (Winkel_zykl >= N0 ) AND (Winkel_zykl <= N1) THEN
        Nocken := TRUE;
    ELSE
        Nocken := FALSE;    
    END_IF;
END_FUNCTION
```
Mein Problem ist, dass die MOD-Funktion zwei Integer benötigt,
bei TRUNC funktionierts bei Einschalten korrekt, jedoch gehts dann bei N! nur ein ganzahligen Schritten, also N1 = 20.0 und N1 = 20.6 haben die gleiche Auswirkungen.
Aber wie komme ich an die Nachkommastelle von Winkel_zykl? Steh grad ein bisschen auf der Leitung :-?

Gruss K.


----------



## vierlagig (4 Juli 2008)

rechne es hoch, also wenn du eine nachkommastelle benötigst mal 10 ...dann kannst du ganzzahlig weitermachen


----------



## kiestumpe (4 Juli 2008)

...ich dachte eigentlich an ne allgemeine Lösung.
Aber trotzdem danke für den Ansatz


----------



## Larry Laffer (4 Juli 2008)

Ich fand den Vorschlag nicht schlecht ... würde ich selber auch nicht anders machen ...

Du kannst dir natürlich auch das, was der MOD-Befehl macht, selbst nach-programmieren. Das würde dann auch mit REAL's gehen. Aber ob das dann weniger Aufwand ist ...?

Gruß
LL


----------



## Grubba (4 Juli 2008)

Dividiere den Winkelwert durch 360.0

z.B. 361/360 = 1.x

dann :

1.x - Trunc(1.x) = Nachkommastelle


----------



## vierlagig (4 Juli 2008)

Grubba schrieb:


> 1.x - Trunc(1.x) = Nachkommastelle



real *-* dint? ... ja geht denn das?


----------



## Grubba (4 Juli 2008)

Ja, das geht.

Nennt sich dann implizierte Typkonvertierung.


----------



## kiestumpe (4 Juli 2008)

*Interessanter Einblick*

Yep, jedoch er rundet-berechnets auch nur auf 2 Stellen genau, leider ungünstig, aus 20.0 wird 20.00554
Ich werde die Methode von 4L nehmen, das passt dann.
Danke nochmal an alle für die Vorschläge.


----------



## vierlagig (4 Juli 2008)

Grubba schrieb:


> Ja, das geht.
> 
> Nennt sich dann implizierte Typkonvertierung.



ok, geht aber nur in SCL ... in AWL bekommste das nicht gebacken 

anyway...also würdest du:


```
*
    Winkel_zykl := (TRUNC(Winkel) MOD 360) + (Winkel/360 - TRUNC(Winkel)); // + Realzahl
```

rechnen? ... auch ne möglichkeit


----------



## Grubba (4 Juli 2008)

> Winkel_zykl := (TRUNC(Winkel) MOD 360) + (Winkel/360 - TRUNC(Winkel)); // + Realzahl


 
.... mach ich dann wenn ich bei Siemens anfange...*ROFL*


----------



## vierlagig (4 Juli 2008)

Grubba schrieb:


> .... mach ich dann wenn ich bei Siemens anfange...*ROFL*



wie? bist du denn schon entwickler?


----------



## Grubba (4 Juli 2008)

> wie? bist du denn schon entwickler?


 
Soll das heißen Siemens braucht kein Reinigungspersonal mehr?


----------

