Desplazamiento a la izquierda de varios bits en un bloque de datos de 16 bits
Esta función desplaza a la izquierda 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 F109_BITL es equivalente a F111_WSHL.
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 y d2 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#2340,16#6781,16#9012]*)
END_VAR
Cuando la variable start pasa de FALSE a TRUE, se ejecuta la función.
Desplaza a la izquierda 4 bits (equivalentes a una posición en representación hexadecimal). Se rellena con ceros los 4 bits desplazados en data_field[0]. Se asigna la constante 4 directamente en la entrada de la función n. También se puede declarar una variable de entrada en la cabecera de la POU.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,,4,7,2,9,4,);
B(B_VAROUT,,data_field[0],16,2,18,4,);
B(B_VAROUT,,data_field[2],16,3,18,5,);
B(B_CONTACT,,start,3,1,5,3,R);
B(B_F,F109_BITL!,Instance,9,0,16,5,,?DEN?Dn?AENO?Cd1_Start?Cd2_End);
L(1,0,1,5);
L(1,2,3,2);
L(5,2,9,2);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF DF(start) then
F109_BITL( n:=4,
d1_Start=> data_field[0],
d2_End=> data_field[2]);
END_IF;