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

Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 17 von 17

Thema: Problem mit floating point Operationen

  1. #11
    Registriert seit
    07.06.2007
    Beiträge
    143
    Danke
    2
    Erhielt 24 Danke für 24 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Die "Überprüfungsfunktion" von der Oliver spricht nennt sich "CheckFunctions". In V3 weiß ich nicht wie die da genau heißen. Bei V2 gibt es diese. Das kann man über die Hilfe rausfinden wie diese zu definieren sind.

    Es handelt sich hierbei um Callbacks die implizit aufgerufen werden bei z.B. Division durch Null. Eine andere CheckFunction die es gibt wäre "CheckBounds" da kannst du sicherstellen, dass du bei einem indizierten Zugriff auf ein Array nicht ein Index angibst der nicht existiert.

    Beispiel:

    myArray : ARRAY [0..10] OF BOOL;

    wenn du nun auf das Element myArray[11] zugreifst wird implizit die Funktion aufgerufen und du kannst die Grenzen prüfen ob diese verletzt wurden. Das Gibt's auch für Nulldivision CheckDivZero dann kannst du den Nenner auf 0 prüfen und dann z.B. eine 1 zurückgeben damit zumindest die PLC nicht mit Fehler stehen bleibt.

    Aber Achtung: Die Checkfunktionen sind nur für die Entwicklungszeit gedacht. Bei Checkbounds kannst du dir vorstellen, dass diese sehr viel Performance benötigt. Muss ja bei jedem Zugriff auf jedes Arrayelement die Funktion als Callback durchlaufen werden. Wenn alles läuft habe ich die Funktionen immer wieder entfernt bevor die Anlage in Betrieb geht.

  2. #12
    Registriert seit
    13.12.2011
    Beiträge
    1.502
    Danke
    163
    Erhielt 180 Danke für 163 Beiträge

    Standard

    Hallo Bone666,
    Zitat Zitat von bone666 Beitrag anzeigen
    was genau meinst du mit einer Überprüfungsfunktion?
    im InfoSys findest Du hier alle Infos dazu:
    http://127.0.0.1:47873/help/1-3392/m...ersion=0&SQM=2

    Du legst eine neue Überwachungs-POU an:
    AddPOU.png

    Die von TwinCAT vorgeschlagene Implementierung verhindert zunächst "nur", dass ein Divisor 0 sein kann indem die Funktion ihn auf 1 setzt.
    TemplateCode.png

    Diese Funktion kannst Du dann nach Deinen Wünschen noch erweitern (nur nicht den Deklarationsteil), z.B. kannst Du eine globale Variable anlegen und diese in der Funktion setzen um in Deinem Programm zu erkennen, dass eine Division durch 0 erfolgte und Dein Programm dann abbrechen. Allerdings ist mir, wo ich gerade so darüber nachdenke, nicht ganz klar, wo der Vorteil dieser Funktion liegt. Die Funktion macht wohl nur wirklich Sinn, wenn es nichts ausmacht, dass im Falle einer 0 durch 1 geteilt wird, bei allen anderen Fällen müsste man ja noch weiteren Aufwand treiben und da könnte man auch gleich noch eine If-Abfrage auf 0 mit einbauen. Oder wie sehen das die Experten hier?

    Gruß

    Oliver

  3. #13
    Registriert seit
    24.02.2009
    Beiträge
    1.244
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Der Vorteil der Funktion wird wohl sein, das die CPU nicht in den Fehlerzustand geht und neu gestartet werden muss. Man kann also selber eine Fehlerreaktion erstellen, die im Einfachsten Fall das Ergebnis einfach verwirft oder meldet das mit dem Divisor was faul ist.
    Oftmals kann es ja auch durch Rundungsfehler, unglücklichen Typenkonvertierungen oder Überläufen zu einer Division durch 0 kommen.

    Die impliziten Funktionen laufen dann immer automatisch mit so wie ich das verstehe. D.h. sie werden bei jeder Division mit aufgerufen. Man muss also nicht selber jeden Divisor im Code überprüfen.
    Geändert von MasterOhh (25.02.2016 um 15:09 Uhr)
    Sänd from mei Kombjudder mitse Dastadurr.

  4. #14
    Registriert seit
    13.12.2011
    Beiträge
    1.502
    Danke
    163
    Erhielt 180 Danke für 163 Beiträge

    Standard

    Hallo MasterOhh,
    Zitat Zitat von MasterOhh Beitrag anzeigen
    Der Vorteil der Funktion wird wohl sein, das die CPU nicht in den Fehlerzustand geht und neu gestartet werden muss.
    das stimmt, aber das Ergebnis ist ja dann falsch und das Programm läuft fröhlich weiter, wenn ich also dann noch Abfragen in meinem Programm machen muss, ob die DivByZero Funktion zugeschlagen hat ist der Aufwand den ich dann noch treiben müsste für die Abfrage auf 0 vernachlässigbar und ich kann mir die Funktion eigentlich schenken.
    Im Moment ist die Funktion, außer ein falsches Ergebnis spielt keine Rolle, für mich Spielerei, widersprecht mir falls ich mich irre.
    Geändert von oliver.tonn (25.02.2016 um 21:55 Uhr)

  5. #15
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.314
    Danke
    932
    Erhielt 3.329 Danke für 2.688 Beiträge

    Standard

    Ich vermute mal, daß nicht nur 0.0 gefährlich ist. Es gibt doch bestimmt auch einen maximal zulässigen Wert für den Divisor. Man könnte/sollte einfach den Eingangswert auf einen Wert innerhalb zulässiger Grenzen limitieren, z.B. LIMIT(0.01, var, 1000.0)

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  6. #16
    Registriert seit
    19.06.2003
    Beiträge
    2.200
    Danke
    85
    Erhielt 259 Danke für 175 Beiträge

    Standard

    Wenn man keine Lust hat, auf 0 zu prüfen, kann man auch noch dem Divisor eine Winzigkeit hinzuaddieren: x=Dividend/(Divisor+1.0e-19) oder 1.0e-29 oder was auch immer in der jeweiligen floating-point-Darstellung noch sicher eine von 0 verschiedene Zahl ist und andererseits den Wert nicht zu sehr verfälscht. Ermöglicht einerseits die exakt selben Programmschritte (ohne Abfrage/Sprünge/Verzweigungen) zu durchlaufen und andererseits geht das Ergebnis in die richtige Richtung (Richtung unendlich).

  7. #17
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Zottel Beitrag anzeigen
    Wenn man keine Lust hat, auf 0 zu prüfen, ....
    Genau das nicht! Es geht hier nicht um Lust sondern was macht man bei dem Fall null.

    In der Regel ist da was schwer faul und die NichtPrüfung auf 0 ist "Augen zu und durch".

    Das rächt sich in einer nicht Spielzeug Umgebung langfristig immer!

    Also, wenn Nenner = null, dann eine angemessene Reaktion im ELSE Zweig!
    Als Freelancer immer auf der Suche nach interessanten Projekten.

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 31.10.2011, 15:07
  2. Bildaufbau-Operationen Liste
    Von Oele im Forum Simatic
    Antworten: 0
    Letzter Beitrag: 23.05.2011, 08:59
  3. Antworten: 1
    Letzter Beitrag: 17.09.2010, 08:45
  4. string to floating point
    Von noeppkes im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 31.10.2007, 10:29
  5. Potenzieren mit S7-Operationen?
    Von Andrew im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 05.05.2004, 11:48

Lesezeichen

Berechtigungen

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