Sinus de données BCD
La fonction calcule le sinus de la valeur d’un angle codé BCD (entrée s) et enregistre le résultat (sortie d) en tant que valeur BCD dans un tableau (Array) à trois éléments.
Entrée
Zone de 16 bits dans laquelle la valeur d’angle est sauvegardée
Sortie
Résultat sauvegardé dans 3 mots
Les valeurs BCD pour l’entrée s sont situées entre 0° et 360° (16#0 à 16#360) par étapes de 1°. Le résultat indiqué en sortie d est quant à lui situé entre -1,0000 et 1,0000. Le résultat de la fonction est le suivant :
Signe positif ou négatif (0 lorsque l’entrée est positive, 1 lorsque l’entrée est négative)
Nombre entier avant le point décimal (0 ou 1)
Nombres après le point décimal arrondis à 4 chiffres comme valeur BCD (16#0000 à 16#9999).
Si s n’est pas une valeur BCD
Si s n’est pas entre 0° et 360°.
Si s n’est pas une valeur BCD
Si s n’est pas entre 0° et 360°.
Si le résultat est 0.
Si le résultat provoque un dépassement positif.
Toutes les variables d’entrée et de sortie utilisées pour programmer cette fonction ont été déclarées dans l’en-tête du POU. Le même en-tête de POU est utilisé pour tous les langages de programmation.
VAR
start: BOOL:=FALSE;
(*activates the function*)
input_value: WORD:=16#30;
(*corresponds to 30°*)
output_value: ARRAY [0..2] OF WORD:=[3(0)];
(*result after a 0->1 leading
edge from start:
[0,0,5000]*)
input_181_to_359: BOOL:=FALSE;
input_90_or_270: BOOL:=FALSE;
END_VAR
Dans cet exemple, la variable d’entrée input_value est déclarée. Cependant, vous pouvez entrer directement une constante (par ex. 16#45 pour 45°) au contact d’entrée de la fonction.
Dans le corps, la valeur 90° est affectée à la variable input_value. La fonction F300_BSIN est exécutée lorsque la variable start est sur TRUE. Le résultat est sauvegardé dans la variable output_value. Si la valeur d’entrée input_value est entre 181° et 359°, la valeur de sortie output_value est négative. La fonction WORD_TO_BOOL définit la variable input_181_to_359 sur TRUE. Avec une valeur d’entrée input_value de 90° ou 270°, la valeur de sortie output_value est 1, soit la valeur avant le point décimal. Dans ce cas, la fonction WORD_TO_BOOL définit la valeur de la variable input_90_or_270 sur TRUE.
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#90,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 := 4 ;
NETWORK_BODY
B(B_F,F300_BSIN,,10,0,19,4,,?DEN?D@'s'?AENO?Cd);
B(B_VARIN,,input_value,8,2,10,4,);
B(B_VAROUT,,output_value,19,2,21,4,);
B(B_VARIN,,output,8,1,10,3,);
L(1,0,1,4);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 3 ;
NETWORK_BODY
B(B_VARIN,,output_value[0],8,1,10,3,);
B(B_F,WORD_TO_BOOL,,10,0,21,3,,?Da_Word?C);
B(B_VAROUT,,input_181_to_359,21,1,23,3,);
L(1,0,1,3);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 3 ;
NETWORK_BODY
B(B_VARIN,,output_value[1],8,1,10,3,);
B(B_F,WORD_TO_BOOL,,10,0,21,3,,?Da_Word?C);
B(B_VAROUT,,input_90_or_270,21,1,23,3,);
L(1,0,1,3);
END_NETWORK_BODY
END_NET_WORK
END_BODY
input_value:=16#90;
IF start THEN
F300_BSIN( input_value, output_value );
END_IF;
input_181_to_359:=WORD_TO_BOOL(output_value[0]);
input_90_or_270:=WORD_TO_BOOL(output_value[1]);