Real-Module

kiestumpe

Level-1
Beiträge
726
Reaktionspunkte
84
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:

Code:
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.
 
rechne es hoch, also wenn du eine nachkommastelle benötigst mal 10 ...dann kannst du ganzzahlig weitermachen
 
...ich dachte eigentlich an ne allgemeine Lösung.
Aber trotzdem danke für den Ansatz
 
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
 
Dividiere den Winkelwert durch 360.0

z.B. 361/360 = 1.x

dann :

1.x - Trunc(1.x) = Nachkommastelle
 
Ja, das geht.

Nennt sich dann implizierte Typkonvertierung.
 
Zuletzt bearbeitet:
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.
 
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:

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

rechnen? ... auch ne möglichkeit
 
Für die Nutzung dieser Website sind Cookies erforderlich. Du musst diese akzeptieren, um die Website weiter nutzen zu können. Erfahre mehr…