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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: Dumme Frage zu Zykluszeit

  1. #11
    bastler ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    03.10.2008
    Beiträge
    232
    Danke
    8
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Beitrag 9 ist habe ich gerade geändert

    Eigentlich sollte der Wert genau 14,13 sein.

  2. #12
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.339
    Danke
    449
    Erhielt 688 Danke für 513 Beiträge

    Standard

    Du könntest einfach bei deinem Code mit dem < bleiben und dann ein
    Code:
    IF A > B THEN
    A := B;
    END_IF; . .
    dran hängen.
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  3. #13
    bastler ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    03.10.2008
    Beiträge
    232
    Danke
    8
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Das hab ich gemacht hat auch weitergeholfen, aber nocht nicht komplett.
    Ich habe jetzt noch ein anderes Problem festgestellt.
    Ich habe folgende Rechnung:
    Code:
    A:=(4*2.86) / ((2*2) * 3.14);
    Codesys errechnet 0.9, wenn ich mit einen Taschenrechner nachrechne, komme ich auf 0.910828.
    Wieso verrechnet sich hier Codesys)? A ist eine Realzahl, die müsste das doch korrekt anzeigen können.

  4. #14
    Registriert seit
    10.02.2014
    Beiträge
    89
    Danke
    12
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Du könntest nach dem aufrechnen der 0,05 nochmals vergleichen ob beim erneuten aufrechnen der Max-Wert von 14,13 überschritten werden würde.

  5. #15
    Registriert seit
    25.02.2010
    Beiträge
    618
    Danke
    35
    Erhielt 121 Danke für 110 Beiträge

    Standard

    Hallo bastler
    Codesys errechnet 0.9
    Dies sollte eigentlich nicht sein. Eventuell hast du A falsch deklariert.
    Rechnen mit Real ist meistens etwas ungenau, da dur nur 23bit in der Mantisse zur Verfügung hast und damit deine Zahl gerundet wird,
    3.14
    hört sich nach Pi an?
    Ich würde folgendermaßen vorgehen.
    -> Festlegen wie genau das Ergebnis sein soll (z.B. 2 Stellen nach dem Komma)
    -> alle Zahlen mit 100 multiplizieren
    -> als DINT verarbeiten
    Grüsse Holger

  6. #16
    Registriert seit
    23.07.2009
    Ort
    Österreich
    Beiträge
    2.339
    Danke
    449
    Erhielt 688 Danke für 513 Beiträge

    Standard

    Zitat Zitat von holgermaik Beitrag anzeigen
    Hallo bastler
    Dies sollte eigentlich nicht sein. Eventuell hast du A falsch deklariert.
    Rechnen mit Real ist meistens etwas ungenau, da dur nur 23bit in der Mantisse zur Verfügung hast und damit deine Zahl gerundet.
    Jetzt komm aber, sooo ungenau ist der IEE754-Real nun auch wieder nicht.

    Bei mir (Simatic PLCSIM) ergibt die genannte Formel (A:=(4.0*2.86) / ((2.0*2.0) * 3.14) problemlose 0.9108281.
    Ich glaub die Ursache liegt wo anders, ich würd auch auf irgendwelche falschen Typdeklarationen tippen.
    Geändert von RONIN (24.05.2015 um 13:09 Uhr)
    If at first you don't succeed, you're not Van Damme!
    ... or maybe using TIA!

  7. #17
    Registriert seit
    25.02.2010
    Beiträge
    618
    Danke
    35
    Erhielt 121 Danke für 110 Beiträge

    Standard

    Jetzt komm aber, sooo ungenau ist der IEE754-Real nun auch wieder nicht
    Da hast du völlig recht Sollte auch nur ein Hinweis sein, auf das Zahlenformat "Real" mit seinen Besonderheiten.

  8. #18
    Registriert seit
    13.12.2011
    Beiträge
    1.414
    Danke
    147
    Erhielt 160 Danke für 151 Beiträge

    Standard

    Das kann aber auch einen anderen Grund haben. Achte mal bei Codesys auf die Warnungen, soweit da was von implizieter Konvertierung steht hast Du die Ursache für Dein Problem. Eventuell musst Du bei der Multiplikation der beiden Ganzzahlen noch ein "INT_TO_REAL" vorsetze.

    Von irgendwas mit Internetzugang gesendet.
    Geändert von oliver.tonn (24.05.2015 um 15:30 Uhr)

  9. #19
    Registriert seit
    15.02.2011
    Ort
    Stromness, Scotland, UK
    Beiträge
    339
    Danke
    25
    Erhielt 34 Danke für 33 Beiträge

    Standard

    Du bist da eventuell gerade auf zwei Phänomene getroffen:
    1. eine REAL (auch float genannt) Zahl ist nicht exakt, wie du dass aus der Mathematik kennst! Du die begrenzte Anzahl an bits gehen "Informationen" verloren. Kleines Beispiel aus wiki: [Weitere Infos bei Wikipedia: http://de.wikipedia.org/wiki/Gleitko...sl.C3.B6schung
    Code:
    0.362 * 100.0 ist nicht gleich 36.2!
    0.362 * 100.0/100.0 ist nicht gleich 0.362!
    2. Wird in CoDeSys (zumindest) die Typkonvertierung nur ungenügend automatisch erledigt. Dass heisst, die Steuerung beginnt mit Integer zu rechnen:
    Code:
    4*2.86 = 11 -> Hier wird mit INTEGER gerechnet, also keine Kommazahlen
    aber 2.86*4 = 11.44 -> Hier wird mit REAL gerechnet
    Die einfachste Lösung ist, du schreibst alle Zahlen mit Kommas, aus 4 wird 4.0 und aus 2 wird 2.0. So rechnet der Prozessor immer mit Gleitzahlen. Alternativ kannst du alle Integer auch mit INT_TO_REAL() wie bereits erwäht wurde, umwandeln, und so den Prozessor dazubringen, auch mit Gleitkommazahlen zu rechnen.

  10. #20
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von gloeru Beitrag anzeigen
    2. Wird in CoDeSys (zumindest) die Typkonvertierung nur ungenügend automatisch erledigt. Dass heisst, die Steuerung beginnt mit Integer zu rechnen:
    Code:
    4*2.86 = 11 -> Hier wird mit INTEGER gerechnet, also keine Kommazahlen
    aber 2.86*4 = 11.44 -> Hier wird mit REAL gerechnet
    Die einfachste Lösung ist, du schreibst alle Zahlen mit Kommas, aus 4 wird 4.0 und aus 2 wird 2.0. So rechnet der Prozessor immer mit Gleitzahlen. Alternativ kannst du alle Integer auch mit INT_TO_REAL() wie bereits erwäht wurde, umwandeln, und so den Prozessor dazubringen, auch mit Gleitkommazahlen zu rechnen.
    Welche Codesys Version verwendest du denn?

    Für alles ab Codesys 2.x ist das was du geschrieben hast falsch.

    Eine implizite Typenwandlung geschieht nur vom kleineren zu größeren Typ.
    4*2.86 = INT * REAL -> REAL ist größer als INT, implizite Konvertierung von 4 zu REAL.

    Eine REAL Variable wird niemals automatisch zu einem INT gewandelt.

    Es bietet sich aber an, "4.0 * 2.86" zu schreiben, dann wird 4.0 automatisch als Real erkannt. Alternativ lässt sich auch mit typisierten Konstanten der Typ von Literalen festlegen. Z.B. REAL#4.0, oder wenn es ein LREAL sein soll LREAL#4.0.

Ähnliche Themen

  1. Mal ne dumme Frage
    Von roman06 im Forum Stammtisch
    Antworten: 30
    Letzter Beitrag: 07.02.2015, 02:33
  2. Dumme Frage UND-Verknüpfung
    Von student2010 im Forum Programmierstrategien
    Antworten: 26
    Letzter Beitrag: 01.02.2011, 11:56
  3. Dumme Frage zu USB - MPI Adapter
    Von Killereintopf im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 28.12.2006, 13:33
  4. Dumme Frage zu Timern.
    Von Tigerkroete im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 31.08.2006, 09:26
  5. Dumme Frage
    Von Anonymous im Forum Simatic
    Antworten: 52
    Letzter Beitrag: 28.09.2005, 23:18

Lesezeichen

Berechtigungen

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