Auslesen eines Byte aus einem DWORD (SCL)

tahren

Level-1
Beiträge
28
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich habe gerade folgendes Problem. Ich habe ein ARRAY aus DWORDS. Ich muss nun ein Byte innerhalb des DWORDS auslesen.

Beispiel:

VAR_INPUT
Daten : ARRAY[0..9] OF DWORD;
END_VAR

VAR
Inhalt_1 : BYTE;
Inhalt_2 : BYTE;
Inhalt_3 : BYTE;
Inhalt_4 : BYTE;
END_VAR

Nun muss ich die einzelnen Bytes von Daten[0] separat auslesen, so dass es wie folgt aussieht...

angenommen sei:
Daten[0] = 12345678

so soll der Inhalt aus Daten[0] folgendermaßen aufgeteilt sein:
Inhalt_1 = 12
Inhalt_2 = 34
Inhalt_3 = 56
Inhalt_4 = 78

Bekommt man das irgendwie hin?

Vielen Dank schonmal für die Hilfe!

Mit freundlichen Grüßen
tahren
 
Hallo,
sowas könntest du z.B. über shiften und ausmaskieren lösen, oder über eine passende AT Sicht auf ein DWORD. Die AT Sicht wird meistens in effizienten AWL-Code umgesetzt.

Beispiel:
Code:
VAR_TEMP
    dwTemp : DWORD;
    ATdwTemp AT dwTemp : ARRAY[0..3] OF BYTE;
END_VAR

dwTemp := Daten[0];
Inhalt_1 := ATdwTemp[0];
Inhalt_2 := ATdwTemp[1];
Inhalt_3 := ATdwTemp[2];
Inhalt_4 := ATdwTemp[3];
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Super! Genau so hatte ich mir das vorgestellt. Vielen Dank! Das über shiften zu lösen hatte ich mir zunächst auch überlegt. Bin dann daran gescheitert, wie ich die anderen Werte im DWORD ausblende. Wenn ich z.B. einzelne Bits ausblenden möchte, dann kann ich das ja einfach über eine UND-Verknüpfung machen. Oder geht das vom Prinzip beim DWORD auch so?
 
Das über shiften zu lösen hatte ich mir zunächst auch überlegt. Bin dann daran gescheitert, wie ich die anderen Werte im DWORD ausblende. Wenn ich z.B. einzelne Bits ausblenden möchte, dann kann ich das ja einfach über eine UND-Verknüpfung machen. Oder geht das vom Prinzip beim DWORD auch so?

Das Ausblenden der anderen Bits macht das DWORD_TO_BYTE schon automatisch.

Code:
dwTemp := Daten[0];
Inhalt_1 := DWORD_TO_BYTE(SHR(IN := dwTemp, N := 24));
Inhalt_2 := DWORD_TO_BYTE(SHR(IN := dwTemp, N := 16));
Inhalt_3 := DWORD_TO_BYTE(SHR(IN := dwTemp, N := 8));
Inhalt_4 := DWORD_TO_BYTE(dwTemp);

Der Vorteil an der Lösung mit dem Shiften ist dass es nicht nur auf Siemens SCL beschränkt ist. Aber so ganz plattformunabhängig wird es wegen der unterschiedlichen Byte-Reihenfolge z.B. bei Zahlwerten eh nicht.
 
Wie einfach das sein kann :) gewusst wie sag ich nur...
Vielen Dank für deine Hilfe!!

mit freundlichen Grüßen
tahren
 
Zurück
Oben