2xUSINT in UINT und umgekehrt

merlin

Level-1
Beiträge
184
Reaktionspunkte
1
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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;
 
Zuletzt bearbeitet:
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:
[COLOR=#008080]//2x USINT -> UINT[/COLOR]
MyUINT:=[COLOR=#0000ff]SHL[/COLOR](MyUSINT2,8) [COLOR=#0000ff]OR[/COLOR] MyUSINT1;

[COLOR=#008080]//UINT -> 2xUSINT[/COLOR]
MyUSINT1:=[COLOR=#0000ff]UINT_TO_USINT[/COLOR](MyUINT);
MyUSINT2:=[COLOR=#0000ff]UINT_TO_USINT[/COLOR]([COLOR=#0000ff]SHR[/COLOR](MyUINT,8));
Hier mit Pointer:
Code:
[COLOR=#008080]//2xUSINT -> UINT[/COLOR]
pby:=[COLOR=#0000ff]ADR[/COLOR](MyUINT);[COLOR=#008080] //pby ist type: POINTER TO BYTE[/COLOR]
pby[0]:=MyUSINT1;
pby[1]:=MyUSINT2;

[COLOR=#008080]//UINT -> 2xUSINT[/COLOR]
pby:=[COLOR=#0000ff]ADR[/COLOR](MyUINT);
MyUSINT1:=pby[0];
MyUSINT2:=pby[1];

@CoinHunter: mit dem Button "#" (Code einfügen) wird es etwas übersichtlicher ;)
 
Guten Morgen,

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

Hier mit Pointer:
Code:
[COLOR=#008080]//2xUSINT -> UINT[/COLOR]
pby:=[COLOR=#0000ff]ADR[/COLOR](MyUINT);[COLOR=#008080] //pby ist type: POINTER TO BYTE[/COLOR]
pby[0]:=MyUSINT1;
pby[1]:=MyUSINT2;

[COLOR=#008080]//UINT -> 2xUSINT[/COLOR]
pby:=[COLOR=#0000ff]ADR[/COLOR](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??
 
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:=[COLOR=#ff0000]pby^[/COLOR];
[COLOR=#ff0000]pby:=(pby+1); [/COLOR][COLOR=#008080]//Ernöhe die Pointeraddress um 1 BYTE (geht aus dem Datentype hervor POINTER to BYTE)[/COLOR][COLOR=#ff0000]
[/COLOR]MacNetSlave_Out_B2:=[COLOR=#ff0000]pby^[/COLOR];

(* 2xUSINT -> UINT *)
pby:=ADR(DpMaster_In[0]);
[COLOR=#ff0000]pby^[/COLOR]:=MacNetSlave_In_B1;
[COLOR=#ff0000]pby:=(pby+1);[/COLOR]
[COLOR=#ff0000]pby^[/COLOR]:=MacNetSlave_In_B2;

StructuredTrash schrieb:
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!? :confused:
 
Zurück
Oben