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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Real in zwei Bytes

  1. #1
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.298
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    irgendwie steh ich grade auf den Schlauch, oder es liegt am Wetter.

    Unzwar habe ich einen Realwert der von -50,0 bis 100,0 geht.
    Dieses muss ich in zwei Bytes übertragen.
    Den Wert vor dem Komma in ein Byte (inkl. Vorzeichen) und die Nachkommastelle in das andere Byte.

    Ein einfacher Tipp könnte mir schon helfen, so als Anstoss.
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).
    Zitieren Zitieren Real in zwei Bytes  

  2. #2
    Registriert seit
    12.04.2010
    Beiträge
    300
    Danke
    22
    Erhielt 54 Danke für 52 Beiträge

    Standard

    Hallo,
    also ein 'echter' Real-Wert hat 4 Byte.

    Was du hier brauchst (oder beschreibst) ist eine 'Eigendefinition'. Darum musst du dich selber kümmern.

    Aber: von wo nach wo überträgst du ? Welcher Übertragungsweg ??
    Format Quelle ?
    Format Ziel ?

    bg
    bb

  3. #3
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.327
    Danke
    932
    Erhielt 3.332 Danke für 2.690 Beiträge

    Standard

    Hallo,
    ich weiß nicht in welcher Programmiersprache Du das brauchst, deshalb in Pseudocode.

    Zerlegen:
    Code:
    Byte1 := TRUNC(Realwert) ; // in Ganzzahl umwandeln durch Abschneiden der Nachkommastellen
    Byte2 := TRUNC(Realwert * 10) MOD 10 ; // erste Nachkommastelle isolieren
    Zusammensetzen:
    Code:
    Realwert : = INT_TO_REAL(Byte2) / 10.0 + INT_TO_REAL(Byte1) ;
    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:

    Mobi (18.08.2011)

  5. #4
    Avatar von Mobi
    Mobi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.298
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard

    Das Real-Werte 32 Bit groß sind weiß ich. Nur ich brauche halt nicht die ganze Bandbreite.

    Ich will eine Temperatur mit hilfe eines Byte-Arrays an eine Visu senden. Und dafür möchte ich von dem Array zwei Bytes nehmen.
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

  6. #5
    Avatar von Mobi
    Mobi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.298
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard

    Danke PN/DP.

    Ich hatte nochmal was getestet. Unzwar habe ich manuell in der Visu mal -2 eingetragen ins Array, daraus wird dann 254. Bei -10 ist es 246 als Byte. Kann mir das mal jemand erklären warum es so im negativen Bereich ist und wie man das umrechnet?
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

  7. #6
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.327
    Danke
    932
    Erhielt 3.332 Danke für 2.690 Beiträge

    Standard

    Für Siemens-Panels mit ProTool oder WinCCflex geht auch kurz:
    Code:
    Intwert := TRUNC(Realwert * 10) ; // -3276,8 ... +3276,7
    Am Panel in der Anzeige einfach 1 Stelle von hinten ein Dezimalkomma einfügen.

    Vielleicht kannst Du in Deiner VISU den Intwert auch einfach wieder 1:10 skalieren.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.327
    Danke
    932
    Erhielt 3.332 Danke für 2.690 Beiträge

    Standard

    Zitat Zitat von Mobi Beitrag anzeigen
    Unzwar habe ich manuell in der Visu mal -2 eingetragen ins Array, daraus wird dann 254. Bei -10 ist es 246 als Byte.
    Es wird einfach das höherwertige Byte abgeschnitten (das FF) und das niederwertige Byte immer als positive Ganzzahl angesehen.
    Oder Deine Visu kennt den Datentyp "signed Byte" (oder "signed Char") und in Deiner Steuerung beobachtest Du das Byte als unsigned.
    Es ist nur eine Frage, wie man das Bitmuster im Byte interpretiert.

    Harald
    Geändert von PN/DP (18.08.2011 um 23:14 Uhr)
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

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

    Mobi (19.08.2011)

  10. #8
    Avatar von Mobi
    Mobi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.06.2008
    Ort
    Blomberg/Lippe
    Beiträge
    1.298
    Danke
    51
    Erhielt 130 Danke für 124 Beiträge

    Standard

    Super hat funktioniert. Für die, die es auch mal brauchen, siehe Anhang.
    Der ABS ist drin, da ich ja die Nachkommastelle immer positiv haben will.

    Die Steuerung macht die -10 auch zu 246.
    Angehängte Grafiken Angehängte Grafiken
    Gruß
    Mobi


    „Das Einfache kompliziert zu machen ist alltäglich. Das Komplizierte einfach zu machen –
    das ist Kreativität“ (Charles Mingus).

  11. #9
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.327
    Danke
    932
    Erhielt 3.332 Danke für 2.690 Beiträge

    Standard

    Zitat Zitat von Mobi Beitrag anzeigen
    Der ABS ist drin, da ich ja die Nachkommastelle immer positiv haben will.
    Na, ich bin mir nicht sicher, ob das für Deine Aufgabe richtig ist ...

    Machst Du in der Visu zwei getrennte Ausgabefelder für Byte1 und Byte2 nebeneinander?

    Falls Du aus den Byte1 und Byte2 die Realzahl wieder zusammensetzen willst, dann verkompliziert Dein ABS die ganze Sache. Dann müßtest Du die nun vorzeichenlose Nachkommastelle abhängig vom Vorzeichen des Byte1 addieren (bei +) oder subtrahieren (bei -).
    Bei einfach immer nur zusammenaddieren ergibt sich z.B. folgendes:
    Code:
                         Byte1 | Byte2     Byte1 + (Byte2/10.0)
    Ohne ABS:  -1.5  --->   -1 | -5   --->     -1.5 
    Mit  ABS:  -1.5  --->   -1 | +5   --->     -0.5 !!!
    Ehrlich gesagt gefällt mir der einfache Weg über einen verzehnfachten INT besser als Dein kompliziertes Eigenformat (siehe #6). Ein INT kann auch leicht in 2 Byte zerlegt und wieder zusammengesetzt werden.


    Da fällt mir noch eine Verbesserung ein: die Nachkommastelle sollte unter Berücksichtigung eventuell folgender weiterer Nachkommastellen gerundet werden, damit z.B. 1.48 in 1 und 5 zerlegt wird und dann als 1.5 angezeigt wird. Achtung: dann muß man auch dafür sorgen, daß -1.98 in -2 und 0 zerlegt wird!

    Gibt es in Deinem Programmiersystem auch eine RND-Funktion (Runden und wandeln in Ganzzahl)?
    Code:
    temp_INT := RND(Realwert * 10.0) ;
    Byte1 := temp_INT / 10 ;
    Byte2 := temp_INT MOD 10 ;
    Alternativ geht's auch so, allerdings kennt diese Formel nicht die Geradzahl-Rundungsregel:
    Code:
    temp_INT := TRUNC((Realwert * 10.0) + (Realwert / ABS(Realwert) / 2.0)) ;
    Byte1 := temp_INT / 10 ;
    Byte2 := temp_INT MOD 10 ;
    (habe zur Verdeutlichung der Rechenreihenfolge mal zusätzliche Klammern gesetzt)

    Wenn Du die Nachkommastelle tatsächlich vorzeichenlos brauchst, dann eben so:
    Code:
    ...
    Byte2 := ABS(temp_INT MOD 10) ;
    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  12. #10
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.327
    Danke
    932
    Erhielt 3.332 Danke für 2.690 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von Mobi Beitrag anzeigen
    Die Steuerung macht die -10 auch zu 246.
    Ist das nun ein Problem für Dich oder nur eine Feststellung?
    Nicht die Steuerung macht die -10 zu 246, sondern die Interpretation Deines Beobachtungsprogramms.

    Wenn Du in der Visu in ein signed Byte eine -10 eingibst, dann steht in dem Byte F9 hex drin.
    Diese F9 hex werden zur Steuerung übertragen. Ob die Steuerung die F9 hex dann als -10 oder als 246 interpretieren soll ergibt sich aus Deinen weiteren Verarbeitungs-Befehlen. Dein Beobachtungsprogramm zeigt die F9 hex halt als 246 an.

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

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 16.08.2011, 16:31
  2. in SCL zwei bytes zu einem int zusammensetzen
    Von Züttu im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 27.04.2011, 20:07
  3. REAL wert in zwei worte aufteilen (SCL)
    Von SPS-newbie im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 23.04.2010, 16:00
  4. Antworten: 9
    Letzter Beitrag: 16.12.2007, 21:20
  5. scl bytes in temp_var
    Von volker im Forum Simatic
    Antworten: 7
    Letzter Beitrag: 25.02.2007, 11:38

Lesezeichen

Berechtigungen

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