Coseno BCD
La función calcula el coseno del dato angular en código BCD (entrada s) y almacena el resultado (salida d) como un dato BCD en un array con tres elementos.
Entrada
Área de 16 bits donde se almacena el ángulo
Salida
El resultado se almacena en un array de 3 palabras
Los valores BCD para la entrada s tienen que estar entre 0° y 360° (de 16#0 a 16#360) en pasos de 1°. Por ello, el resultado almacenado en d se encuentra dentro del rango de -1,0000 a 1,0000. El resultado se devuelve de la siguiente forma:
signo (0 si es +, 1 si es -)
parte entera antes de la coma (0 ó 1)
parte decimal después de la coma con 4 cifras como valor BCD (de 16#0000 a 16#9999).
si s no es un dato BCD
si s no está entre 0° y 360°.
si s no es un dato BCD
si s no está entre 0° y 360°.
si el resultado es 0.
en caso de desbordamiento del resultado.
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*)
input_value: WORD:=16#60;
(*corresponds to 60°*)
output_value: ARRAY [0..2] OF WORD:=[3(0)];
(*result after a 0->1 leading
edge from start:
[0,1,7321]*)
END_VAR
En este ejemplo se ha declarado la variable de entrada input_value. Sin embargo, se puede introducir una constante (por ejemplo 16#45 para 45°) directamente en la entrada de la función.
Se asigna el valor de 16#45° a la variable input_value. Cuando la variable start está ajustada a TRUE, se ejecuta la función. El resultado almacenado en d es output_value[0] = 0, output_value[1] = 0, output_value[2] = 7071.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 3 ;
NETWORK_BODY
B(B_VARIN,,16#45,8,0,10,2,);
B(B_VAROUT,,input_value,10,0,12,2,);
L(1,0,1,3);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_VARIN,,output,7,1,9,3,);
B(B_VARIN,,input_value,7,2,9,4,);
B(B_VAROUT,,output_value,18,2,20,4,);
B(B_F,F301_BCOS,,9,0,18,4,,?DEN?D@'s'?AENO?Cd);
B(B_COMMENT,,output_value[0] = 1ø^if input_valueø^between 91° and 269°,26,0,38,3,);
B(B_COMMENT,,output_value[1] = 1ø^if input_valueø^0° or 180°,26,3,38,6,);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
input_value:=16#45;
IF start THEN
F301_BCOS( input_value, output_value );
END_IF;