Real-Module

kiestumpe

Level-1
Beiträge
726
Reaktionspunkte
84
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 :D
 
Zurück
Oben