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

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

Thema: Datentypwandlung Real nach 4 Byte BCD

  1. #11
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.686 Danke für 1.225 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Stimmt, kleine Zahlen habe ich gepflegt ignoriert
    Ist aber nicht schwer, man braucht nur zu sagen dass es immer eine Vorkommastelle gibt.
    Die For-Schleifen braucht man auch nicht mehr.
    Code:
    FUNCTION_BLOCK FB999
    VAR_INPUT
        E_REAL      :REAL;
    END_VAR
    
    VAR_OUTPUT
        _1_Byte:BYTE;
        _2_Byte:BYTE;
        _3_Byte:BYTE;
        _4_Byte:BYTE;
    END_VAR
    
    VAR_TEMP
        vk : DINT;
        nk : DINT;
        bb : DWORD;
        at_bb AT bb : ARRAY[1..4] OF BYTE;
        nstellen_vk : INT;
        i : INT;    
        vk_bcd : DWORD;
        nk_bcd : DWORD;
        mask : DWORD;
        n : INT;
    END_VAR
    
    BEGIN
    // Auf Grenzen prüfen, max. 7 Stellen ohne Komma
    IF E_REAL > 9999999 THEN
        bb := 16#B9999999;
    ELSIF E_REAL < -9999999 THEN
        bb := 16#D9999999;
    ELSE
        // Init
        bb := 16#B0000000;
        // Vorzeichen
        IF E_REAL < 0.0 THEN
           bb := 16#D0000000;
        END_IF;
        
        // Vor und Nachkommastellen
        E_REAL := ABS(E_REAL);  // Vorzeichen wurde schon abgearbeitet
        IF E_REAL >= 1.0 THEN
            nstellen_vk := DINT_TO_INT(TRUNC(LOG(E_REAL))) +1;
        ELSE
            nstellen_vk := 1;   // Eine Stelle für führende Null
        END_IF;
        vk := REAL_TO_DINT(TRUNC(E_REAL));    
        nk := REAL_TO_DINT((E_REAL - vk) * 10000000);
        
        vk_bcd := DINT_TO_BCD_DWORD(vk);
        nk_bcd := DINT_TO_BCD_DWORD(nk);
        
        // Vorkommastellen einbauen
        n := (7 - nstellen_vk) * 4;
        vk_bcd := SHL(IN := vk_bcd, N := n);
        mask := SHL(IN := 16#0FFFFFFF, N := n);
        bb := bb OR (mask AND vk_bcd);
        // Komma
        n := (nstellen_vk + 1) * 4;
        mask := SHR(IN := 16#E0000000, N := n);
        bb := bb OR mask;
        // Nachkommastellen einbauen
        nk_bcd := SHR(IN := nk_bcd, N := n);
        mask := SHR(IN := 16#0FFFFFFF, N := n - 4);
        bb := bb OR (mask AND nk_bcd);
    END_IF;
    
    _1_Byte := at_bb[1];
    _2_Byte := at_bb[2];
    _3_Byte := at_bb[3];
    _4_Byte := at_bb[4];
    
    END_FUNCTION_BLOCK

  2. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    CNC840D (20.12.2012)

  3. #12
    Registriert seit
    21.09.2004
    Beiträge
    95
    Danke
    50
    Erhielt 3 Danke für 3 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Thomas,

    Du bist mein "Held" vielen vielen Dank für deine Hilfe.

    Viele Grüße

    Bernd

Ähnliche Themen

  1. Umwandeln von INT nach Byte u Byte + n
    Von Gerold im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 07.04.2009, 10:07
  2. Byte to Real
    Von uwemiess im Forum Simatic
    Antworten: 40
    Letzter Beitrag: 09.07.2008, 14:46
  3. Antworten: 4
    Letzter Beitrag: 08.07.2008, 08:52
  4. REAL in BYTE umwandeln
    Von Terence_Hill im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 18.01.2008, 20:03
  5. Umwandlung von BCD nach REAL
    Von Anonymous im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 20.07.2005, 15:07

Lesezeichen

Berechtigungen

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