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

Page 2 of 2 FirstFirst 12
Results 11 to 13 of 13

Thread: Umwandlungsfehler (DWORD -> REAL)

  1. #11
    Join Date
    13.12.2011
    Location
    Bückeburg
    Posts
    2,362
    Danke
    275
    Erhielt 336 Danke für 296 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Quote Originally Posted by Heinileini View Post
    Ja, wenn DWORD_TO_REAL das tut, was auch DINT_TO_REAL bzw. UDINT_TO_REAL tun tut bzw. täte, dann ist diese Funktion tatsächlich Luxus = "overfluid".
    Ja, tut sie, aber ich verstehe auch nicht so ganz welche Erwartungen Du an diese Funktionen stellst. Woher sollen die Funktionen denn ahnen, dass der Wert den sie konvertieren sollen in Wahrheit eigentlich eine Zahl mit Nachkommastellen ist und woher sollen sie wissen, um wie viele Nachkommastellen es sich handelt.
    Überflüssig, bzw. Luxus sind sie übrigens, wenn man nicht so leichtsinnig ist sich darauf zu verlassen, dass eine automatische Typkonvertierung schon alles abfängt, mitnichten. Angenommen der übertragene Wert wurde mit 10 multipliziert, dann sollte man ihn vor einer Division durch 10 zunächst erst in eine REAL-Zahl oder LREAL-Zahl wandeln und zwar genau mit dieser Funktion. OK, UDINT_TO_REAL könnte das mit übernehmen, aber dann passt die Bezeichnung ja nicht ganz.

  2. #12
    Join Date
    25.06.2017
    Location
    Oerlinghausen
    Posts
    1,587
    Danke
    137
    Erhielt 295 Danke für 239 Beiträge

    Default

    Quote Originally Posted by oliver.tonn View Post
    . . . aber ich verstehe auch nicht so ganz welche Erwartungen Du an diese Funktionen stellst . . .
    DINT_TO_REAL: Konvertierung einer Ganzzahl (+2147483647 … 0 … -2147483648 ) in REAL bzw.
    UDINT_TO_REAL: Konvertierung einer positiven Ganzzahl (0 … +4294967295) in REAL.
    Niederwertige VorKommaStellen gehen dabei zwangsläufig verloren, wenn die Mantisse der RealZahl diese nicht (sondern nur "zufällig") darstellen kann. NachKommaStellen werden nicht hinzugedichtet.
    Wenn die Dint- bzw. UdintZahl "heimliche" NachKommaStellen enthält, so muss die in REAL gewandelte Zahl noch durch 10-hoch-AnzahlNachKommaStellen dividiert werden - dies ist aber NICHT Bestandteil der DINT_TO_REAL- bzw. UDINT_TO_REAL-Konvertierung.
    Der Programmierer muss also wissen, dass z.B. die Ganzzahl die Einheit MilliEuro hat, er aber die RealZahl in der Einheit Euro verstanden wissen will und muss dementsprechend handeln.

    DWORD_TO_REAL (besser DWORD_AS_REAL): keine Konvertierung, nur TypeCast. D.h. das BitMuster, das bereits dem der RealZahl entspricht bzw. entsprechen muss, wird nicht verändert.

    PS:
    Letzteres entspricht dem Beispiel des TE, wobei zusätzlich die ByteReihenfolge "umendianifiziert" wird.
    Last edited by Heinileini; 01.04.2019 at 19:14.

  3. #13
    Join Date
    22.06.2009
    Location
    Sassnitz
    Posts
    13,684
    Danke
    1,114
    Erhielt 4,049 Danke für 3,273 Beiträge

    Default


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Quote Originally Posted by oliver.tonn View Post
    wie kommst Du auf das schmale Brett, dass DWORD_TO_REAL nicht macht was es soll, es macht genau das was es soll. Es wandelt eine Ganzzahl in eine Real-Zahl um
    Und genau diese Wandlung sollte es eigentlich nicht machen. DWORD ist ein Bitstring-Datentyp, kein numerischer Datentyp (keine Ganzzahl) - mit DWORD dürfte man gar nicht rechnen dürfen. Und folglich auch nicht von einem numerischen Datentyp (Ganzzahl) in einen anderen numerischen Datentyp (REAL) umwandeln.

    Das Problem kommt daher, weil in allen Codesys-Dialekten DWORD = UDINT gleichgesetzt wird und deshalb bei DWORD_TO_REAL immer eine numerische Konvertierung stattfindet anstatt den Bitstring des DWORD als REAL zu interpretieren (wie bei Siemens SCL). Diesen Designfehler kann man nur umgehen, indem man per Pointer so tut als ob man eine REAL-Variable lesen würde (eigentlich auch unsauber), oder indem man ab Codesys 3 per UNION eine DWORD-Variable und eine REAL-Variable auf den selben Speicherplatz legt ("AT" bei Siemens SCL), und da das DWORD hineinspeichert und als REAL wieder herausliest.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  4. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    DeltaMikeAir (02.04.2019)

Similar Threads

  1. TIA SCL - dword als Real interprätieren
    By martin.wagner in forum Simatic
    Replies: 8
    Last Post: 21.04.2016, 12:57
  2. FB gesucht:In1=1(real)/In2=2(real),usw...
    By egro in forum CODESYS und IEC61131
    Replies: 31
    Last Post: 31.08.2014, 14:17
  3. Step 7 DWORD to REAL
    By basstscho in forum Simatic
    Replies: 5
    Last Post: 06.12.2013, 18:35
  4. Replies: 7
    Last Post: 11.01.2013, 17:37
  5. Word,DWORD oder doch Real
    By Thor´sHammer in forum CODESYS und IEC61131
    Replies: 3
    Last Post: 24.09.2011, 14:22

Tags for this Thread

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •