Desplazamiento a la derecha de varios bits en un bloque de datos de 16 bits
Esta función desplaza a la derecha los bits especificados dentro del rango determinado por las salidas d1 y d2. El número de bits a desplazar se especifica en n. El valor puede estar entre 0 y 16. Los bits desplazados se ponen a 0. Si la entrada n = 0, no se produce el desplazamiento. Cuando la entrada n = 16, se produce el desplazamiento de una palabra WORD, es decir, en este caso la función F108_BITR es equivalente a F110_WHSL.
Entrada
Número de bits a desplazar
Salida
Área de inicio de 16 bits
Área final de 16 bits
En lugar de utilizar esta instrucción F, se recomienda utilizar la instrucción FP7 correspondiente:
Las direcciones de las variables en las entradas d1_Start y d2_End deben ser del mismo tipo.
si las direcciones de las salidas d1_Start > d2_End ó n³ 16.
si las direcciones de las salidas d1_Start > d2_End ó n³ 16.
Todas las variables de entrada y de salida utilizadas para la programación de esta función han sido declaradas en la Cabecera de la POU. Se utiliza la misma cabecera de la POU para todos los lenguajes de programación.
VAR
start: BOOL:=FALSE;
(*activates the function*)
data_array: ARRAY [0..2] OF WORD:=[16#1234,16#5678,16#9012];
(*result after a 0->1 leading edge
from start:
[16#8123,16#0567,16#9012]*)
END_VAR
En este ejemplo se ha declarado la variable de entrada number_bits. Sin embargo, se puede introducir una constante directamente en la entrada de la función.
Cuando la variable start pasa de FALSE a TRUE, se ejecuta la función.
Desplaza a la derecha 4 bits (equivalentes a una posición en representación hexadecimal). Se rellena con ceros los 4 bits desplazados en data_field[2].BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_VARIN,,number_bits,5,2,7,4,);
B(B_VAROUT,,data field[0],16,2,18,4,);
B(B_VAROUT,,data field[2],16,3,18,5,);
B(B_F,F108_BITR,,7,0,16,5,,?DEN?Dn?AENO?Cd1?Cd2);
B(B_CONTACT,,output,3,1,5,3,R);
L(1,0,1,5);
L(1,2,3,2);
L(5,2,7,2);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF DF(start) then
F108_BITR( n:=number_bits,
d1_Start=> data_field[0],
d2_End=> data_field[2]);
END_IF;