F300_BSIN

Seno BCD

La función calcula el seno 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.

Parámetros

Entrada

s (WORD)

Área de 16 bits donde se almacena el ángulo

Salida

d ARRAY [0..2] of (WORD)

El resultado se almacena en un array de 3 palabras

Observaciones

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:

ARRAY[0]

signo (0 si es +, 1 si es -)

ARRAY[1]

parte entera antes de la coma (0 ó 1)

ARRAY[2]

parte decimal después de la coma con 4 cifras como valor BCD (de 16#0000 a 16#9999).

Banderas de error

sys_bIsOperationErrorHold (pasa a TRUE y permanece TRUE)
  • si s no es un dato BCD

  • si s no está entre 0° y 360°.

sys_bIsOperationErrorNonHold (pasa a TRUE para un ciclo de scan)
  • si s no es un dato BCD

  • si s no está entre 0° y 360°.

sys_bIsEqual (pasa a TRUE y permanece TRUE)

si el resultado es 0.

sys_bIsCarry (pasa a TRUE para un ciclo de scan)

en caso de desbordamiento del resultado.

Ejemplo

Cabecera de la POU

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#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

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.

Cuerpo LD

Se asigna el valor de 90° a la variable input_value. Cuando la variable start pasa a TRUE, se ejecuta la función F300_BSIN. Almacena el resultado en la variable output_value. Si el valor de input_value se encuentra entre 181° y 359°, el valor output_value tiene un signo negativo. La función WORD_TO_BOOL pone la variable input_181_to_359 a TRUE. Si el valor de input_value es 90° ó 270°, el valor de salida output_value es 1, que representa el valor antes de la coma. Si este es el caso, WORD_TO_BOOL pone a TRUE el valor de la variable input_90_or_270.

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

Cuerpo en ST

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]);

Cuerpo IL

Modificado el: 2021-07-14Comentarios sobre esta páginaLínea directa de Panasonic