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

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

Thema: LREAL_OF_BYTES, bin ich so richtig unterwegs?

  1. #11
    Jochen ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.09.2005
    Beiträge
    126
    Danke
    6
    Erhielt 2 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Klar, aber das ist ja kein Problem:

    Ich nehme mir den Exponenten mit seinen 11Bit als Integer raus, ziehe den Bias von 1023 ab. Ich erhalte dann einen Exponenten, auf den ich wieder einen Integer von 127 (Bias einer 32-Bit-Realzahl) draufaddieren kann.

    Den schreibe ich in erstmal in ein DWORD und shifte ihn um 23 nach links.

    Dann nehme ich das letzte Byte aus dem Bytestrom raus, also Byte 7, verodere es mit 80h, das gibt mir das Vorzeichenbit. Wenn das ungleich 0 ist, kommt das Ergebnisbyte dann in ein DWORD und wird um 24 nach links geshiftet und mit dem Exponenten-DWORD verodert.

    Nun zur Mantisse: Meine Bytes kommen rückwärts im TCP Buffer an. Daher nehme ich dann Byte sechs, fünf, vier und drei in ein DWORD. Darin stehen dann ja quasi die letzten 4 Exponentenbits, die letzten 23 Mantissenbits und noch 5 Bits von der großen Mantisse. Das DWORD also 4 mal Links und dann 9 mal rechts shiften. Dann das ganze mit dem obigen DWORD verodert und ein DWORD_TO_REAL drauf angewendet, sollte mir meine 32 Bit Fließkommazahl liefern.

    Jetzt muss ich das nur noch in Code packen
    Geändert von Jochen (12.03.2013 um 20:49 Uhr)

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

    Standard

    Und klappt es?
    Gruß
    Mobi


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

  3. #13
    Jochen ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.09.2005
    Beiträge
    126
    Danke
    6
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Das berichte ich nächste Woche,

    ich bin jetzt erstmal eine Woche im Klausurstress und habe daher Urlaub.
    Nächsten Donnerstag wieder im Büro, dann teste ich das.

    Gruß

    JOchen

  4. #14
    Jochen ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.09.2005
    Beiträge
    126
    Danke
    6
    Erhielt 2 Danke für 2 Beiträge

    Standard

    So es hat nun etwas länger gedauert, aber ich habe es jetzt fertig und es funktioniert auch:

    Code:
    TYPE
    
    (* Result structure *)
    
    
    TCP_RESULT_STRUCT :
    	STRUCT
    	ERCL : BYTE;
    	ERCD0 : BYTE;
    	ERCD1 : BYTE;
    	RSLT0 : BYTE;
    	RSLT1 : BYTE;
    	RSLT2 : BYTE;
    	RSLT3 : BYTE;
    	RSLT4 : BYTE;
    	RSLT5 : BYTE;
    	RSLT6 : BYTE;
    	RSLT7 : BYTE;
    	END_STRUCT;
    
    
    
    
    (* Result Array *)
    TCP_RESULT_ARRAY : ARRAY[0..13] OF TCP_RESULT_STRUCT;
    
    
    TCP_RECEIVE_RESULTS :
    	STRUCT
    	PHOENIX_DLEN : WORD;
    	REST : BYTE;
    	MSID0 : BYTE; 
    	MSID1 : BYTE; 
    	SICM0 : BYTE;
    	SICM1 : BYTE;
    	OFST0 : BYTE;
    	OFST1 : BYTE;
    	CCNT0 : BYTE;
    	CCNT1 : BYTE;
    	RESD : TCP_RESULT_ARRAY;
    	END_STRUCT;
    
    
    END_TYPE
    
    
    VAR_OUTPUT
    realOut	: REAL;
    END_VAR
    
    
    VAR_INPUT
    lrealStructIn :	TCP_RESULT_STRUCT;
    END_VAR
    
    
    VAR
    exponent11 : INT;	
    workingDword : DWORD;	
    mantissa23 : DWORD;	
    exponent8 : INT;	
    workingDword1 : DWORD;	
    realOutDword : DWORD;	
    DW_TO_REAL_1 : DW_TO_REAL;	
    END_VAR
    
    
    (* 11 Bit exponent to 8 bit Exponent *)
    exponent11:=WORD_TO_INT(SHR(SHL(WORD_OF_BYTE(lrealStructIn.RSLT7,lrealStructIn.RSLT6),1),5))-1023;
    exponent8:=exponent11+127;
    
    
    (* Shift exponentent to second front bit *)
    workingDword1:=SHL(INT_TO_DWORD(exponent8),23);
    
    
    (* Sign Bit *)
    workingDword:=(workingDword1 OR SHL(BYTE_TO_DWORD(lrealStructIn.RSLT7),30));
    
    
    (* Cut Mantissa *)
    mantissa23:=SHR(SHL(DWORD_OF_BYTE(lrealStructIn.RSLT6,lrealStructIn.RSLT5,lrealStructIn.RSLT4,lrealStructIn.RSLT3),4),9);
    
    
    realOutDword:=workingDword or mantissa23;
    DW_TO_REAL_1(X:=realOutDword);
    realOut:=DW_TO_REAL_1.DW_TO_REAL;

  5. #15
    Registriert seit
    29.03.2004
    Beiträge
    5.741
    Danke
    143
    Erhielt 1.687 Danke für 1.226 Beiträge

    Standard

    @Jochen
    Ich würde zumindest ein paar Sonderfälle (Unendlich, Not A Number, Denormalisierte Zahlen) für Real-Zahlen abfragen, siehe Code hier:
    Wandeln Double/Float in S7- dword

  6. #16
    Jochen ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    29.09.2005
    Beiträge
    126
    Danke
    6
    Erhielt 2 Danke für 2 Beiträge

    Standard

    Danke, kenne das Codebeispiel.
    Baue das natürlich entsprechend noch aus.
    Aber das eigentliche Problem ist halt behoben.
    Wobei ich nicht immer noch nicht verstehe, wieso das doofe PC-Worx es nicht checkt, einen TCP-Buffer byteweise in eine passende UDT-Struktur mit LREALS einzulesen. Die CPU kann ja LREAL.

    Gruß

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Schön, dass es jetzt endlich funktioniert und Hauptsache es funktioniert. Ich denke mal der Grund warum das einlesen nicht klappt, ist einfach nur der, das wohl LREAL nicht ganz implementiert wurde sowie die anderen Typen. Wenn es mehr Kunden wünschen würden, würde es wahrscheinlich auch dann mal ganz einsatzfähig sein, ohne irgendwelche Workarounds. Genau wie bei mir mit dem DWORD_TO_IEEE754 und umgekehrt.
    Gruß
    Mobi


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

Ähnliche Themen

  1. Antworten: 21
    Letzter Beitrag: 24.02.2013, 13:28
  2. Antworten: 31
    Letzter Beitrag: 09.09.2011, 23:02
  3. Wenn ich alt bin und nicht mehr kann, werde ich:
    Von Lebenslang im Forum Stammtisch
    Antworten: 16
    Letzter Beitrag: 02.09.2008, 16:12
  4. Bin ich blind ?
    Von volker im Forum Stammtisch
    Antworten: 10
    Letzter Beitrag: 24.10.2005, 12:59

Lesezeichen

Berechtigungen

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