Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 7 von 7 ErsteErste ... 567
Ergebnis 61 bis 65 von 65

Thema: RANT: Konstrukte bei denen man sich manchmal fragt

  1. #61
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.739
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich würde sogar den Vergleich auf >0 bzw <0 noch zusätzlich nach vorne stellen. Dann sieht man nämlich auch noch besser, dass nur dann die ganze Rechnerei von Bedeutung ist:
    Code:
    (*Auf nächste ganze Zahl aufrunden*)
    IF    (nSV > 0.0) AND (nSV - TRUNC(nSV) <> 0.0) THEN    // nSV Positiv, aufrunden auf nächstgrössere ganze Zahl
        Betrieb_Soll := TRUNC(nSV) + 1;
    ELSIF (nSV < 0.0) AND (nSV + TRUNC(nSV) <> 0.0) THEN    // nSV Negativ, abrunden auf nächstkleinere ganze Zahl
        Betrieb_Soll := TRUNC(nSV) - 1;
    ELSE                                                    // nSV genau 0.0
        Betrieb_Soll := 0;
    END_IF;
    Ob man bei der Rechnerei jetzt auf 0 oder 0.0 vergleicht, wär' mir egal, da man eh' (Real - DINT) hat.
    Aber irgendwie ist der ELSE-Zweig nicht das Gleiche wie oben. Wenn nämlich nSV zufällig eine genau ganze Zahl ist, wird bei Deinem Code auch 0 zugewiesen, was oben (zumindest in dem zu sehenden Auszug) nicht der Fall ist.

    Ich hätte mir wahrscheinlich insgesamt eher sowas in der Art hier gebastelt:
    Code:
    // Betrag aufrunden (zu erwartende Nachkommastellen beachten!)
    Betrieb_Soll:= TRUNC( ABS( nSV ) + 0.99999 );
    
    // Vorzeichen hinzufügen
    Betrieb_Soll:= Betrieb_Soll * SEL( G:= nSV < 0.0, IN0:= 1, IN1:= -1);
    Btw, warum gibt's eigentlich die AWL-Funktion RND+ nicht unter SCL? Die wär' ja hier ganz hilfreich gewesen.
    Geändert von hucki (30.09.2014 um 02:24 Uhr) Grund: Da waren beim 1. Code schon von vollmi noch zuviel Klammern im Spiel

  2. #62
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.649
    Danke
    789
    Erhielt 655 Danke für 498 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen
    Ob man bei der Rechnerei jetzt auf 0 oder 0.0 vergleicht, wär' mir egal, da man eh' (Real - DINT) hat.
    Ich weiss. Allerdings finde ich es gut wenn man gleich sieht dass das Ziel eine REAL ist ohne in die Schnittstelle zu wechseln (welche mit den vielen Abkürzungen übrigens komplett undokumentiert ist)

    Aber irgendwie ist der ELSE-Zweig nicht das Gleiche wie oben. Wenn nämlich nSV zufällig eine genau ganze Zahl ist, wird bei Deinem Code auch 0 zugewiesen, was oben (zumindest in dem zu sehenden Auszug) nicht der Fall ist.
    Das macht in oberem Code ja dies. Einschaltsperre gehört IMHO hier nicht her.

    Code:
    IF nSV = 0 OR Einschaltsperre = 1 THEN    
    Res := 0; 
    END_IF;
    Ich hätte mir wahrscheinlich insgesamt eher sowas in der Art hier gebastelt:
    Das gefällt mir.

    mfG René

  3. #63
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.739
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Zitat Zitat von vollmi Beitrag anzeigen
    Das macht in oberem Code ja dies. Einschaltsperre gehört IMHO hier nicht her.

    Code:
    IF nSV = 0 OR Einschaltsperre = 1 THEN    
    Res := 0; 
    END_IF;
    Ich meinte auch nur den nSV.
    Wenn der 0.0 ist, bekommt Res im Original bzw. Betrieb_Soll in Deiner Version die 0 zugewiesen.
    Wenn der Wert jedoch genau 2.0, dann passiert im Original nichts (alter Wert bleibt), während bei Dir auch die 0 zugewiesen wird, da es ja nichts zum Aufrunden gibt (soll bei beiden Versionen ja nur bei vorhandenen Nachkommastellen passieren). Die Frage ist, wie wahrscheinlich ist ein Wert von genau 2.0 und was passiert dann vlt. noch beim Original (weil man das oben nicht sieht).



    Zitat Zitat von hucki Beitrag anzeigen
    Ich hätte mir wahrscheinlich insgesamt eher sowas in der Art hier gebastelt:
    Code:
    // Betrag aufrunden (zu erwartende Nachkommastellen beachten!)
    Betrieb_Soll:= TRUNC( ABS( nSV ) + 0.99999 );
    
    // Vorzeichen hinzufügen
    Betrieb_Soll:= Betrieb_Soll * SEL( G:= nSV < 0.0, IN0:= 1, IN1:= -1);
    Btw, warum gibt's eigentlich die AWL-Funktion RND+ nicht unter SCL? Die wär' ja hier ganz hilfreich gewesen.
    Zitat Zitat von vollmi Beitrag anzeigen
    Das gefällt mir.
    Ich versuch' sowas eigentlich immer lieber mathematisch zu lösen.
    Soweit es dann noch halbwegs verständlich bleibt, hat es bei mir auf jedenfall Vorrang vor so 'ner IF...THEN-Orgie. Selbst das SEL nervt mich hier noch etwas, aber das Negativbit zu isolieren ist ja auch ziemlich aufwendig.


    Was bleibt, ist meine letzte Frage.

  4. #64
    Registriert seit
    17.07.2009
    Ort
    Am Rande der Ostalb
    Beiträge
    5.542
    Danke
    1.154
    Erhielt 1.254 Danke für 983 Beiträge

    Standard

    @vollmi
    Vielleicht gleich der etwas radikalere Ansatz:
    Warum muss nSV überhaupt eine REAL sein?

  5. #65
    Avatar von vollmi
    vollmi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.649
    Danke
    789
    Erhielt 655 Danke für 498 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von hucki Beitrag anzeigen
    Ich meinte auch nur den nSV.
    Wenn der 0.0 ist, bekommt Res im Original bzw. Betrieb_Soll in Deiner Version die 0 zugewiesen.
    Wenn der Wert jedoch genau 2.0, dann passiert im Original nichts (alter Wert bleibt),
    Stimmt eigentlich müsste dann nSV durchgereicht werden. garnicht 0. 0 null beim sperren.

    nSV muss überhaupt keine REAL sein. Wird nirgends benötigt überall wird ein INT draus gemacht. manchmal halt faktor 10. manchmal gerundet und hier halt auf und abgerundet. Aber ich kann jetzt schlecht das ganze Programm durchackern. Da bau ich nur Fehler ein wie man grad gesehen hat.

    Ich bin da nur drüber gestolpert weil im gleichen Baustein Temporäre Var genutzt werden welche nicht zwingend beschrieben werden. Dadurch hat ein zusätzlicher Baustein von mir eine Fehlfunktion in einem ganz anderen Bereich ausgelöst.

    Erklär das mal dem Kunden dass ein getestetes Programm wegen einer Erweiterung welche in meinen anderen Anlagen einwandfrei läuft (da gekapselt und nur auswertend keine Funktionen auslösend) auf dieser Anlage unvorhergesehene Reaktionen hervorruft.

Ähnliche Themen

  1. Strukturen Vergleichen in denen Arrays vorkommen
    Von SteffenD im Forum CODESYS und IEC61131
    Antworten: 3
    Letzter Beitrag: 31.07.2013, 09:18
  2. WCf 2008 SP2 HF3 hängt sich manchmal auf
    Von Günni1977 im Forum HMI
    Antworten: 3
    Letzter Beitrag: 26.11.2010, 09:14
  3. CX hängt sich manchmal auf bei "Route hinzufügen"
    Von karlheinzsps im Forum CODESYS und IEC61131
    Antworten: 17
    Letzter Beitrag: 03.03.2010, 13:15
  4. blutender Anfänger fragt .....
    Von Martha72 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 16.07.2009, 11:46
  5. Warum man sich OPC sparen sollte...
    Von seeba im Forum Stammtisch
    Antworten: 8
    Letzter Beitrag: 19.06.2006, 10:58

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •