bitswaps in a byte SCL

userxyz

Member
Join Date
May 2002
Location
any
Posts
2,768
Anyone know how to write this in SCL:

MB10

M10.0 = M10.7
M10.1 = M10.6
M10.2 = M10.5
M10.3 = M10.4
M10.4 = M10.3
M10.5 = M10.2
M10.6 = M10.1
M10.7 = M10.0

Mirror the bits in the byte.
 
How about this (untested):

Code:
FUNCTION_BLOCK FB200
VAR
byStore: BYTE;
Store AT byStore:ARRAY[1..8] OF BOOL;
END_VAR	 
BEGIN
byStore:=MB10;
M10.0:=Store[8];
M10.1:=Store[7];
M10.2:=Store[6];
M10.3:=Store[6];
M10.4:=Store[4];
M10.5:=Store[3];
M10.6:=Store[2];
M10.7:=Store[1];
END_FUNCTION_BLOCK
 
Hi

Can you make my code better, it works, but is giant:

Code:
[font=Arial][size=2]
FUNCTION_BLOCK FB200

VAR_INPUT

HW_OFFSET: INT;

HEIGHT_OFFSET: INT;

END_VAR 

VAR

FIRST_BEAM: BYTE;

LAST_BEAM: BYTE;

STATUS: BYTE;

BEAM_BYTES: ARRAY [1..12] OF BYTE; 

BEAM_BITS AT BEAM_BYTES: ARRAY [1..96] OF BOOL;

SWAPPED_BITS: ARRAY [1..96] OF BOOL;

HEIGHT: DINT;

OFFSET: DINT;

i: INT;

RESULT_0_255: DINT;

FIRST_BYTE: INT;

LAST_BYTE: INT;

END_VAR 

VAR_OUTPUT

BOT: BYTE;

ACT_HEIGHT: INT;

END_VAR 

BEGIN

FIRST_BEAM:= PIB[HW_OFFSET];

LAST_BEAM:= PIB[HW_OFFSET + 1];

STATUS:= PIB[HW_OFFSET + 2];

FOR i := 1 TO 12 DO

BEAM_BYTES[i]:= PIB[HW_OFFSET + 2 + i]; 

END_FOR;

HEIGHT:= ((BYTE_TO_DINT(LAST_BEAM)) * 1780) / 90;

ACT_HEIGHT:= (DINT_TO_INT(HEIGHT)); 

OFFSET:= (INT_TO_DINT(HEIGHT_OFFSET)); 

RESULT_0_255 := (255 * (HEIGHT - OFFSET)) / (1780 - OFFSET); 

BOT:= (DINT_TO_BYTE(RESULT_0_255)); 

FIRST_BYTE:= (BYTE_TO_INT(FIRST_BEAM) - 1) / 8; 

LAST_BYTE:= (BYTE_TO_INT(LAST_BEAM) -1) / 8; 

 

IF BEAM_BITS[1]= TRUE THEN

SWAPPED_BITS[8]:=TRUE; 

ELSE 

SWAPPED_BITS[8]:=FALSE;

END_IF; 

IF BEAM_BITS[2]= TRUE THEN

SWAPPED_BITS[7]:=TRUE; 

ELSE 

SWAPPED_BITS[7]:=FALSE;

END_IF; 

IF BEAM_BITS[3]= TRUE THEN

SWAPPED_BITS[6]:=TRUE; 

ELSE 

SWAPPED_BITS[6]:=FALSE; 

END_IF; 

IF BEAM_BITS[4]= TRUE THEN

SWAPPED_BITS[5]:=TRUE; 

ELSE 

SWAPPED_BITS[5]:=FALSE; 

END_IF; 

IF BEAM_BITS[5]= TRUE THEN

SWAPPED_BITS[4]:=TRUE; 

ELSE 

SWAPPED_BITS[4]:=FALSE; 

END_IF; 

IF BEAM_BITS[6]= TRUE THEN

SWAPPED_BITS[3]:=TRUE; 

ELSE 

SWAPPED_BITS[3]:=FALSE; 

END_IF; 

IF BEAM_BITS[7]= TRUE THEN

SWAPPED_BITS[2]:=TRUE; 

ELSE 

SWAPPED_BITS[2]:=FALSE; 

END_IF; 

IF BEAM_BITS[8]= TRUE THEN

SWAPPED_BITS[1]:=TRUE; 

ELSE 

SWAPPED_BITS[1]:=FALSE; 

END_IF; 

FOR i:= 1 TO 12 DO 

IF BEAM_BITS[(i * 8) + 1]= TRUE THEN

SWAPPED_BITS[(i * 8) + 8]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 8]:=FALSE;

END_IF; 

IF BEAM_BITS[(i * 8) + 2]= TRUE THEN

SWAPPED_BITS[(i * 8) + 7]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 7]:=FALSE;

END_IF; 

IF BEAM_BITS[(i * 8) + 3]= TRUE THEN

SWAPPED_BITS[(i * 8) + 6]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 6]:=FALSE; 

END_IF; 

IF BEAM_BITS[(i * 8) + 4]= TRUE THEN

SWAPPED_BITS[(i * 8) + 5]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 5]:=FALSE; 

END_IF; 

IF BEAM_BITS[(i * 8) + 5]= TRUE THEN

SWAPPED_BITS[(i * 8) + 4]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 4]:=FALSE; 

END_IF; 

IF BEAM_BITS[(i * 8) + 6]= TRUE THEN

SWAPPED_BITS[(i * 8) + 3]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 3]:=FALSE; 

END_IF; 

IF BEAM_BITS[(i * 8) + 7]= TRUE THEN

SWAPPED_BITS[(i * 8) + 2]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 2]:=FALSE; 

END_IF; 

IF BEAM_BITS[(i * 8) + 8]= TRUE THEN

SWAPPED_BITS[(i * 8) + 1]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 1]:=FALSE; 

END_IF; 

END_FOR;

END_FUNCTION_BLOCK

[/size][/font][font=Arial][size=2]FUNCTION_BLOCK FB200

VAR_INPUT

HW_OFFSET: INT;

HEIGHT_OFFSET: INT;

END_VAR 

VAR

FIRST_BEAM: BYTE;

LAST_BEAM: BYTE;

STATUS: BYTE;

BEAM_BYTES: ARRAY [1..12] OF BYTE; 

BEAM_BITS AT BEAM_BYTES: ARRAY [1..96] OF BOOL;

SWAPPED_BITS: ARRAY [1..96] OF BOOL;

HEIGHT: DINT;

OFFSET: DINT;

i: INT;

RESULT_0_255: DINT;

FIRST_BYTE: INT;

LAST_BYTE: INT;

END_VAR 

VAR_OUTPUT

BOT: BYTE;

ACT_HEIGHT: INT;

END_VAR 

BEGIN

FIRST_BEAM:= PIB[HW_OFFSET];

LAST_BEAM:= PIB[HW_OFFSET + 1];

STATUS:= PIB[HW_OFFSET + 2];

FOR i := 1 TO 12 DO

BEAM_BYTES[i]:= PIB[HW_OFFSET + 2 + i]; 

END_FOR;

HEIGHT:= ((BYTE_TO_DINT(LAST_BEAM)) * 1780) / 90;

ACT_HEIGHT:= (DINT_TO_INT(HEIGHT)); 

OFFSET:= (INT_TO_DINT(HEIGHT_OFFSET)); 

RESULT_0_255 := (255 * (HEIGHT - OFFSET)) / (1780 - OFFSET); 

BOT:= (DINT_TO_BYTE(RESULT_0_255)); 

FIRST_BYTE:= (BYTE_TO_INT(FIRST_BEAM) - 1) / 8; 

LAST_BYTE:= (BYTE_TO_INT(LAST_BEAM) -1) / 8; 

 

IF BEAM_BITS[1]= TRUE THEN

SWAPPED_BITS[8]:=TRUE; 

ELSE 

SWAPPED_BITS[8]:=FALSE;

END_IF; 

IF BEAM_BITS[2]= TRUE THEN

SWAPPED_BITS[7]:=TRUE; 

ELSE 

SWAPPED_BITS[7]:=FALSE;

END_IF; 

IF BEAM_BITS[3]= TRUE THEN

SWAPPED_BITS[6]:=TRUE; 

ELSE 

SWAPPED_BITS[6]:=FALSE; 

END_IF; 

IF BEAM_BITS[4]= TRUE THEN

SWAPPED_BITS[5]:=TRUE; 

ELSE 

SWAPPED_BITS[5]:=FALSE; 

END_IF; 

IF BEAM_BITS[5]= TRUE THEN

SWAPPED_BITS[4]:=TRUE; 

ELSE 

SWAPPED_BITS[4]:=FALSE; 

END_IF; 

IF BEAM_BITS[6]= TRUE THEN

SWAPPED_BITS[3]:=TRUE; 

ELSE 

SWAPPED_BITS[3]:=FALSE; 

END_IF; 

IF BEAM_BITS[7]= TRUE THEN

SWAPPED_BITS[2]:=TRUE; 

ELSE 

SWAPPED_BITS[2]:=FALSE; 

END_IF; 

IF BEAM_BITS[8]= TRUE THEN

SWAPPED_BITS[1]:=TRUE; 

ELSE 

SWAPPED_BITS[1]:=FALSE; 

END_IF; 

FOR i:= 1 TO 12 DO 

IF BEAM_BITS[(i * 8) + 1]= TRUE THEN

SWAPPED_BITS[(i * 8) + 8]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 8]:=FALSE;

END_IF; 

IF BEAM_BITS[(i * 8) + 2]= TRUE THEN

SWAPPED_BITS[(i * 8) + 7]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 7]:=FALSE;

END_IF; 

IF BEAM_BITS[(i * 8) + 3]= TRUE THEN

SWAPPED_BITS[(i * 8) + 6]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 6]:=FALSE; 

END_IF; 

IF BEAM_BITS[(i * 8) + 4]= TRUE THEN

SWAPPED_BITS[(i * 8) + 5]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 5]:=FALSE; 

END_IF; 

IF BEAM_BITS[(i * 8) + 5]= TRUE THEN

SWAPPED_BITS[(i * 8) + 4]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 4]:=FALSE; 

END_IF; 

IF BEAM_BITS[(i * 8) + 6]= TRUE THEN

SWAPPED_BITS[(i * 8) + 3]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 3]:=FALSE; 

END_IF; 

IF BEAM_BITS[(i * 8) + 7]= TRUE THEN

SWAPPED_BITS[(i * 8) + 2]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 2]:=FALSE; 

END_IF; 

IF BEAM_BITS[(i * 8) + 8]= TRUE THEN

SWAPPED_BITS[(i * 8) + 1]:=TRUE; 

ELSE 

SWAPPED_BITS[(i * 8) + 1]:=FALSE; 

END_IF; 

END_FOR;

END_FUNCTION_BLOCK

[/size][/font]


L D[AR2 said:
How about this (untested):

Code:
FUNCTION_BLOCK FB200
VAR
byStore: BYTE;
Store AT byStore:ARRAY[1..8] OF BOOL;
END_VAR	 
BEGIN
byStore:=MB10;
M10.0:=Store[8];
M10.1:=Store[7];
M10.2:=Store[6];
M10.3:=Store[6];
M10.4:=Store[4];
M10.5:=Store[3];
M10.6:=Store[2];
M10.7:=Store[1];
END_FUNCTION_BLOCK
 

Similar Topics

Our system utilises INPUT_BYTE to capture NMEA0183 ASCII stream which sends data to the NOM multiple times a second. The NOM module can either be...
Replies
0
Views
365
Hello everyone, friends. I need help with something. I want to read and change Bit and Byte numbers via HMI. I found a code snippet for this as...
Replies
18
Views
3,010
Hello everyone :) I just want to start with learning PLC programming, so I need advice. I have SIMATIC S7-1200, CPU with integrated memory...
Replies
5
Views
907
I have a C-More HMI that changes my PLC String from "Machine Status" to "aMhcni etStasu" . There is an option with other objects that have string...
Replies
15
Views
3,413
Hello I have got a problem with positive edge from "system clock memory byte" in Tia Portal. I would like to change byte"system clock memory"...
Replies
27
Views
3,537
Back
Top Bottom