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

Ergebnis 1 bis 10 von 10

Thema: 2xUSINT in UINT und umgekehrt

  1. #1
    Registriert seit
    16.03.2004
    Beiträge
    173
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo

    Ich habe bei TwinCAT2 ein kleines Verständnissproblem:
    Ich habe einmal eine Variable vom Type UINT. In diese sollen 2 Variablen vom Type USINT. In der Siemens-Welt geht das mit der direkten Byte-Kopy ja einfach, aber wie mach ich das heier am Besten?

    Und amgekehrt sollts auch funktionieren. 2 USINT Variablen sollen mit dem High- und Low-Byte einer UINT-Variable befüllt werden.

    Dank euch
    Thomas
    greetings from upper austria

    ... merlin ...
    Zitieren Zitieren 2xUSINT in UINT und umgekehrt  

  2. #2
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    752
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard

    Da gibt es verschiedene Möglichkeiten, z. B. die Funktion MEMCPY aus der TcSystem.Lib. Man kann aber auch ein UINT und ein ARRAY[0..1] OF USINT auf die selbe Speicheradresse legen.

  3. #3
    Registriert seit
    14.12.2011
    Beiträge
    2
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    kleine Beispiele:

    PROGRAM PLC_PRG
    VAR
    var_USINT_1: USINT := 100;
    var_USINT_2: USINT := 10;
    short : ARRAY[1..2] OF USINT;
    Var_UINT_1,VAR_uint_2 : UINT;
    wp1 : POINTER TO UINT;
    END_VAR

    Var_UINT_1 := var_USINT_1;
    Var_UINT_1 := SHL(var_UINT_1, 8 ) + var_USINT_2;
    (* oder auch *)
    Var_UINT_1 := var_USINT_1 * 256 + var_USINT_2;


    oder mittels Pointer

    wp1 := ADR(short);

    wp1^ := 16#FFFF;

    short[1] := short[1] / 4;

    short[2] := short[2] / 8;
    Geändert von CoinHunter (15.12.2011 um 13:25 Uhr)

  4. #4
    Registriert seit
    17.10.2007
    Ort
    35043 Marburg
    Beiträge
    176
    Danke
    4
    Erhielt 30 Danke für 29 Beiträge

    Standard

    Guten Morgen,

    In folgenden Beispielen wird MyUSINT1 ins low byte und MyUSINT2 ins high byte von MyUINT kopiert und umgekehrt.

    Hier mal mit Schiebe Befehl:
    Code:
    //2x USINT -> UINT
    MyUINT:=SHL(MyUSINT2,8) OR MyUSINT1;
    
    //UINT -> 2xUSINT
    MyUSINT1:=UINT_TO_USINT(MyUINT);
    MyUSINT2:=UINT_TO_USINT(SHR(MyUINT,8));
    Hier mit Pointer:
    Code:
    //2xUSINT -> UINT
    pby:=ADR(MyUINT); //pby ist type: POINTER TO BYTE
    pby[0]:=MyUSINT1;
    pby[1]:=MyUSINT2;
    
    //UINT -> 2xUSINT
    pby:=ADR(MyUINT);
    MyUSINT1:=pby[0];
    MyUSINT2:=pby[1];
    @CoinHunter: mit dem Button "#" (Code einfügen) wird es etwas übersichtlicher
    Grüße...
    Paradox ist, wenn sich jemand im Handumdrehen den Fuß bricht.

  5. #5
    Registriert seit
    14.12.2011
    Beiträge
    2
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Zitat Zitat von Simatiker Beitrag anzeigen
    Guten Morgen,

    In folgenden Beispielen wird MyUSINT1 ins low byte und MyUSINT2 ins high byte von MyUINT kopiert und umgekehrt.

    Hier mit Pointer:
    Code:
    //2xUSINT -> UINT
    pby:=ADR(MyUINT); //pby ist type: POINTER TO BYTE
    pby[0]:=MyUSINT1;
    pby[1]:=MyUSINT2;
    
    //UINT -> 2xUSINT
    pby:=ADR(MyUINT);
    MyUSINT1:=pby[0];
    MyUSINT2:=pby[1];
    @CoinHunter: mit dem Button "#" (Code einfügen) wird es etwas übersichtlicher
    Danke für den Hinweis.

    Hast Du das mal probiert??

  6. #6
    Registriert seit
    17.10.2007
    Ort
    35043 Marburg
    Beiträge
    176
    Danke
    4
    Erhielt 30 Danke für 29 Beiträge

    Standard

    Der Code läuft mit CODeSys V3 bzw. mit allen Tools die darauf basieren z.Bsp.: SoMachine von Schneider Electric.
    Grüße...
    Paradox ist, wenn sich jemand im Handumdrehen den Fuß bricht.

  7. #7
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    752
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard

    Zitat Zitat von merlin Beitrag anzeigen
    Ich habe bei TwinCAT2 ein kleines Verständnissproblem:
    Zitat Zitat von Simatiker Beitrag anzeigen
    Der Code läuft mit CODeSys V3.
    Hm, ja.
    In V3 würde ich es auch nicht mit einem Pointer machen, sondern mit einer Union.

  8. #8
    Registriert seit
    16.03.2004
    Beiträge
    173
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo

    Also ich hab die Pointer-Variante versucht.

    Code:
    VAR
        pby : POINTER TO BYTE;
    END_VAR
    Code:
    (* UINT -> 2xUSINT *)
    pby:=ADR(DpMaster_Out[0]);
    MacNetSlave_Out_B1:=pby[0];
    MacNetSlave_Out_B2:=pby[1];
        
    (* 2xUSINT -> UINT *)
    pby:=ADR(DpMaster_In[0]);
    pby[0]:=MacNetSlave_In_B1;
    pby[1]:=MacNetSlave_In_B2;
    Ergebniss ist folgende Fehlermeldung:
    Fehler 4110: MAIN (7): '[<index>]' ist nur für Arrayvariablen zulässig.

    Ich denke, die Deklaration des Pointers ist noch nicht korrekt. Oder?

    Danke
    Thomnas
    greetings from upper austria

    ... merlin ...

  9. #9
    Registriert seit
    17.10.2007
    Ort
    35043 Marburg
    Beiträge
    176
    Danke
    4
    Erhielt 30 Danke für 29 Beiträge

    Standard

    Zitat Zitat von merlin Beitrag anzeigen
    Hallo

    Also ich hab die Pointer-Variante versucht.

    Code:
    VAR
        pby : POINTER TO BYTE;
    END_VAR
    Code:
    (* UINT -> 2xUSINT *)
    pby:=ADR(DpMaster_Out[0]);
    MacNetSlave_Out_B1:=pby[0];
    MacNetSlave_Out_B2:=pby[1];
        
    (* 2xUSINT -> UINT *)
    pby:=ADR(DpMaster_In[0]);
    pby[0]:=MacNetSlave_In_B1;
    pby[1]:=MacNetSlave_In_B2;
    Ergebniss ist folgende Fehlermeldung:
    Fehler 4110: MAIN (7): '[<index>]' ist nur für Arrayvariablen zulässig.

    Ich denke, die Deklaration des Pointers ist noch nicht korrekt. Oder?

    Danke
    Thomnas
    Okay, liegt vielleicht an CoDeSys V2.
    Müsste dann auf diese Weise funktionieren:
    Code:
    (* UINT -> 2xUSINT *)
    pby:=ADR(DpMaster_Out[0]);
    MacNetSlave_Out_B1:=pby^;
    pby:=(pby+1); //Ernöhe die Pointeraddress um 1 BYTE (geht aus dem Datentype hervor POINTER to BYTE)
    MacNetSlave_Out_B2:=pby^;
    
    (* 2xUSINT -> UINT *)
    pby:=ADR(DpMaster_In[0]);
    pby^:=MacNetSlave_In_B1;
    pby:=(pby+1);
    pby^:=MacNetSlave_In_B2;
    Zitat Zitat von StructuredTrash
    Hm, ja.
    In V3 würde ich es auch nicht mit einem Pointer machen, sondern mit einer Union.
    Dann musst du aber in der Union ein ARRAY [0..1] OF USINT definieren!?
    Grüße...
    Paradox ist, wenn sich jemand im Handumdrehen den Fuß bricht.

  10. Folgender Benutzer sagt Danke zu Simatiker für den nützlichen Beitrag:

    merlin (16.12.2011)

  11. #10
    Registriert seit
    16.03.2004
    Beiträge
    173
    Danke
    11
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Supa, danke schön!!!
    greetings from upper austria

    ... merlin ...

Ähnliche Themen

  1. Bits auslesen aus UINT
    Von Cococabana im Forum CODESYS und IEC61131
    Antworten: 11
    Letzter Beitrag: 02.12.2011, 11:51
  2. UINT to Float
    Von Raydien im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 19.01.2010, 09:17
  3. TwinCat - 2 Uint in Dword (SSI KL5001)
    Von Gerri im Forum CODESYS und IEC61131
    Antworten: 4
    Letzter Beitrag: 14.11.2009, 10:17
  4. Real-Format von S5 nach S7 und umgekehrt
    Von clausi im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 20.08.2009, 09:20
  5. Antworten: 15
    Letzter Beitrag: 20.01.2009, 17:51

Lesezeichen

Berechtigungen

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