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

Seite 4 von 5 ErsteErste ... 2345 LetzteLetzte
Ergebnis 31 bis 40 von 47

Thema: Wandlung Real zu Int

  1. #31
    Registriert seit
    17.06.2004
    Ort
    Offenau
    Beiträge
    3.758
    Danke
    209
    Erhielt 421 Danke für 338 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von vierlagig Beitrag anzeigen
    wo du sowieso grad am testen bist:

    Code:
    *
          L      #zuIntZuWandelndeZahl
          L      0
          +I
    sollte IMHO OV setzen, wenn #zuIntZuWandelndeZahl außerhalb des Bereiches ist
    Sicher? Wertet +i nicht beide akkus nur als 16 bit wert aus, und somit bekommt es gar nicht mit das akku2 schon größer war? Gehört auf jeden fall getestet!
    ---------------------------------------------
    Jochen Kühner
    https://github.com/jogibear9988/DotN...ToolBoxLibrary - Bibliothek zur Kommunikation mit PLCs und zum öffnen von Step 5/7 Projekten

  2. #32
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von Jochen Kühner Beitrag anzeigen
    Sicher? Wertet +i nicht beide akkus nur als 16 bit wert aus, und somit bekommt es gar nicht mit das akku2 schon größer war? Gehört auf jeden fall getestet!
    sicher bin ich nicht, deswegen gab ich es zum testen
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  3. #33
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    gelöscht !
    Siehe beitrag #35.
    Geändert von JesperMP (07.03.2011 um 11:51 Uhr)
    Jesper M. Pedersen

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

    Standard

    Prüfung ob REAL -> DINT einen gültigen INT-Wert ergibt:
    Die Möglichkeit des für INT zu großen DINT-Wertes muß auf jeden Fall im Programm abgefangen werden.
    Die Zwischenwandlung nach BCD verkompliziert die Sache nur und bringt zusätzlich die Gefahr des OB121-Aufrufs bzw. CPU-STOP bei BTI.

    Ich würde die Übertragungs-Schleife und die INT-Prüfung etwa so machen:
    Code:
    //Code für FC optimiert! In FB noch AR2 + DINO sichern und wiederherstellen!
    //Initialisierung Pointer und Schleifenzähler
          L     P#0.0               //Startoffset des REAL-Arrays in DB "Remote_MW"
          LAR1                      //DB + AR1: Pointer auf REAL-Array
          AUF   "Remote_MW"
    
          L     P#80.0              //Startoffset des INT-Arrays in DB "DB LDD2"
          LAR2                      //DI + AR2: Pointer auf INT-Array
          TDB
          AUF   "DB LDD2"
          TDB
    
          L     8                   //Anzahl zu übertragender Werte
          T     #loopcount          //als Startwert des Schleifenzählers
    
    //Schleife: REAL lesen und als INT ablegen, Schleifenzähler zählt rückwärts
    loop: L     DBD [AR1,P#0.0]     //REAL lesen
          RND                       //REAL -> DINT
    
    //    prüfen ob der DINT-Wert in INT passt (-32768..0..+32767)
          PUSH                      //DINT-Wert in Akku2 merken
          ITD                       //Akku1 INT -> DINT
          ==D   
          SPB   abl
    
    //    !Fehlerbehandlung: Wert passt nicht in INT!
          L     0                   //z.B. 0 als Ersatzwert nehmen
    
    //    INT-Wert in Array speichern
    abl:  T     DIW [AR2,P#0.0]     //INT speichern
    
    //    alle Werte übertragen? (--Schleifenzähler <= 0 ?)
          L     #loopcount
          L     1
          -I    
          SPMZ  end
          T     #loopcount
    
    //    beide Pointer auf nächstes Element setzen
          +AR1  P#4.0               //REAL ist 4 Byte lang
          +AR2  P#2.0               //INT ist 2 Byte lang
          SPA   loop                //Schleife wiederholen
    
    end:  NOP   0
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    JesperMP (07.03.2011)

  6. #35
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Argh !

    Hatte ein Fehler gemacht.
    Dann wird das ergebnis leider, OV und OB121 werden beide nicht aktiviert !

    Code:
          L     MD   100
          RND   
          A     OV
          JC    _er1
          L     0
          +I    
          A     OV  // korrektur !
          JC    _er2
          T     MW   110
          JU    end
    _er1: S     M     10.0
          JU    end
    _er2: S     M     10.1
          JU    end
    end:  NOP   0
    Jesper M. Pedersen

  7. #36
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von JesperMP Beitrag anzeigen
    OB121 wird nicht ausgeführt.
    die OB121-Aussage bezog sich, nochmal, auf die BTI-Funktion!

    Zitat Zitat von JesperMP Beitrag anzeigen
    edit: Das einfache übertragen von ein wert ausserhalb -32768 ... +32767 setzt nicht OV, und OB121 wird nicht ausgeführt.
    eine einfaches Übertragen? L? wie auch, hast ja die volle 32bit-breite

    Zitat Zitat von JesperMP Beitrag anzeigen
    Ein wert grösser als +32767 rollt runter und bleibt einfach ein minus-wert.
    beim test mit L 0, +I ? ...eigenartig ... was passiert bei L 1, *I ?
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  8. #37
    Registriert seit
    08.08.2007
    Ort
    Dresden
    Beiträge
    9.648
    Danke
    1.059
    Erhielt 2.046 Danke für 1.627 Beiträge

    Standard

    Zitat Zitat von JesperMP Beitrag anzeigen
    Argh !

    Hatte ein Fehler gemacht.
    Dann wird das ergebnis leider, OV und OB121 werden beide nicht aktiviert !
    das heißt jetzt, das +I nicht zum gewünschten ergebnis führt ... jut jut, dann halt haralds lösung ... wie immer
    [SIGNATUR]
    Ironie setzt Intelligenz beim Empfänger voraus.
    [/SIGNATUR]

  9. #38
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Zitat Zitat von vierlagig Beitrag anzeigen
    die OB121-Aussage bezog sich, nochmal, auf die BTI-Funktion!
    Ruhig mann.
    Ich schreibe es nur so das die Frage später nicht auftaucht.
    Jesper M. Pedersen

  10. #39
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Leider dieselbe ergebnis.
    Code:
          L     MD   100
          RND   
          L     1
          *I                                // versuch OV auszulösen
          A     OV
          JC    _er1
          T     MW   110
          A     OV
          JC    _er2
          JU    end
    _er1: S     M     10.0                  // OV nach *I
          JU    end
    _er2: S     M     10.1                  // OV nach T MW
          JU    end
    end:  NOP   0
    Jesper M. Pedersen

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von vierlagig Beitrag anzeigen
    Code:
    *
          L      #zuIntZuWandelndeZahl
          L      0
          +I
    sollte IMHO OV setzen, wenn #zuIntZuWandelndeZahl außerhalb des Bereiches ist
    Setzt kein OV, weil +I einfach nur die unteren 16-Bit von #zuIntZuWandelndeZahl nimmt. + 0 ergibt dann auf jeden Fall einen gültigen INT-Wert.
    Wenn nach der + 0 allerdings das Ergebnis = #zuIntZuWandelndeZahl ist, dann ist #zuIntZuWandelndeZahl im für INT gültigen Bereich.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    vierlagig (07.03.2011)

Ähnliche Themen

  1. Wandlung 32Bit Real nach 16Bit Gleitkomma
    Von BadTaste im Forum CODESYS und IEC61131
    Antworten: 11
    Letzter Beitrag: 04.10.2017, 14:03
  2. DTR - Ganzzahl-Wandlung to real - AWL
    Von schneijo im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 26.08.2011, 16:19
  3. Wandlung Zahlenwerte
    Von Martin L. im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 10.04.2009, 20:05
  4. Wandlung von Real => INT
    Von Heinz im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 29.07.2005, 12:33
  5. Wandlung WSCAD -> Eplan
    Von PeterEF im Forum E-CAD
    Antworten: 12
    Letzter Beitrag: 25.01.2005, 22:06

Lesezeichen

Berechtigungen

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