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

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

Thema: Wandlung 32Bit Real nach 16Bit Gleitkomma

  1. #11
    Registriert seit
    30.08.2005
    Beiträge
    280
    Danke
    41
    Erhielt 96 Danke für 66 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Folgendes funktioniert für Wandlung von real nach lreal, ich habs mal schnell in CoDeSys V3 eingehackt. Ich weiss nicht ob das auch auf Motorola-Systemen funktioniert.

    FUNCTION realtolreal : LREAL
    VAR_INPUT
    rlin : REAL;
    END_VAR
    VAR
    ptrl : POINTER TO REAL;
    pdw : POINTER TO DWORD;
    dw : DWORD;
    lw : LWORD;

    bvz : BOOL;
    dwMantissa : DWORD;
    dwExp : DWORD;

    lwExp : LWORD;
    lwMantissa : LWORD;
    ptrlr: POINTER TO LREAL;
    END_VAR
    pdw := ADR(rlin);

    dw := pdw^;
    bvz := dw.31;
    dw.31 := 0;
    dwExp := SHR(dw, 23);
    dwMantissa := SHR(SHL(dw, 9), 9);

    lwExp := (dwExp-127) + 1023;
    lwExp := SHL(lwExp, 52);
    lwMantissa := dwMantissa;
    lwMantissa := SHL(lwMantissa, 52 - 23);

    lw := lwExp OR lwMantissa;
    lw.63 := bvz;

    ptrlr := ADR(lw);
    realtolreal := ptrlr^;

  2. #12
    Registriert seit
    04.10.2017
    Beiträge
    1
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Zusammen

    Ich beschäftige mich auch schon einweilchen mit diesem Thema 32Bit Real to 16 Bit Real.

    Ich habe schon folgendes ausprobiert:

    Code:
    FUNCTION_BLOCK Real_To_RealWord
    VAR_INPUT
        rData:REAL;
    END_VAR
    VAR_OUTPUT
        wOut:WORD;
        iZaehler:INT;
    END_VAR
    VAR
        stelle: INT:= 15;
        dwData:DWORD;
        baData_temp: ARRAY [0..20] OF BOOL;
        iaData_temp: ARRAY [0..30] OF INT;
        rest: INT;
        iZaehler_temp: INT;
    END_VAR
    Code:
    dwData := REAL_TO_DWORD (rData) ;
    
    iZaehler := TRUNC(rData * 100) / 100; (* Kommastellen bschneiden*)
    
    WHILE NOT (iZaehler=1 OR stelle<10 OR stelle <=1)  DO
     iZaehler_temp :=  iZaehler/2;
    
    IF(iZaehler_temp*2 = iZaehler)
    THEN baData_temp[stelle]:= FALSE; iaData_temp[stelle]:=4;
    ELSE baData_temp[stelle]:= TRUE; iaData_temp[stelle+10]:=3;
    END_IF;
    
    iZaehler:=iZaehler_temp;
     stelle:= stelle-1;
    iaData_temp[20]:=stelle;
    END_WHILE
    
    
    
    IF(dwData.0 OR dwData.1 OR dwData.2 OR dwData.3 OR dwData.4 OR dwData.5 OR dwData.6 OR dwData.7 OR dwData.8 OR dwData.9 OR dwData.10 OR dwData.11 OR dwData.12 AND NOT dwData.13 )
    THEN wOut.0 := TRUE;            (* Exponent 10 *)
    ELSE wOut.0 := FALSE;            (* Exponent 10 *)
    END_IF;
    
    IF(dwData.28 OR dwData.29 OR dwData.30 )
    THEN
    wOut.10 := TRUE;            (* Mantisse 5 *)
    wOut.11 := TRUE;            (* Mantisse 4 *)
    wOut.12 := TRUE;            (* Mantisse 3 *)
    wOut.13 := TRUE;            (* Mantisse 2 *)
    wOut.14 := TRUE;            (* Mantisse 1 *)
    ELSE
    wOut.10 := dwData.23;            (* Mantisse 5 *)
    wOut.11 := dwData.24;            (* Mantisse 4 *)
    wOut.12 := dwData.25;            (* Mantisse 3 *)
    wOut.13 := dwData.26;            (* Mantisse 2 *)
    wOut.14 := dwData.27;            (* Mantisse 1 *)
    END_IF;
    
    wOut.1 := dwData.14;            (* Exponent 9 *)
    wOut.2 := dwData.15;            (* Exponent 8 *)
    wOut.3 := dwData.16;            (* Exponent 7 *)
    wOut.4 := dwData.17;            (* Exponent 6 *)
    wOut.5 := dwData.18;            (* Exponent 5 *)
    wOut.6 := dwData.19;            (* Exponent 4 *)
    wOut.7 := dwData.20;            (* Exponent 3 *)
    wOut.8 := dwData.21;            (* Exponent 2 *)
    wOut.9 := dwData.30;            (* Exponent 1 *)
    wOut.15 := dwData.31;        (* Wert +/- *)
    Ich bin mir aber nicht wirklich sicher ob dies der richtige Ansatz für dieses Problem ist.

    evtl. kann mir jemand noch einen Tipp oder hilfestellung beim Code geben ?

    Ich arbeite mit Codesys 2.3 an diesem Problem.

    Danke Gruss W1z7rd64

Ähnliche Themen

  1. DTR - Ganzzahl-Wandlung to real - AWL
    Von schneijo im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 26.08.2011, 16:19
  2. Wandlung Real zu Int
    Von GerhardPtl im Forum Simatic
    Antworten: 46
    Letzter Beitrag: 07.03.2011, 14:24
  3. S7-200 - Wandlung Dezimalzahl nach Hex
    Von smartie im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 05.05.2009, 13:36
  4. Umwandlung Integer(32bit) in Integer(16bit)
    Von Kojote im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 18.08.2005, 10:56
  5. Wandlung von Real => INT
    Von Heinz im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 29.07.2005, 12:33

Lesezeichen

Berechtigungen

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