F70_BCC

Calcular el Chequeo Bloque Caracteres

Calcula el Chequeo de Códigos por Bloques (BCC = Block Check Code), que se emplea para detectar errores en la transmisión de mensajes, de datos ASCII de s3_Number bytes comenzando en el área de 16 bits especificado por s2_Start según el método de cálculo especificado por s1_Control. El Chequeo de Códigos por Bloques (BCC) se almacena en el byte de menor peso del área de 16 bits especificado por d. (El código BCC ocupa un byte. El byte de mayor peso d no cambia.)

Parámetros

Entrada

s1_Control (INT)

Especifica el método de cálculo BCC:

  • 0: Suma (SYS_BCC_CALCULATION_METHOD_ADD)

  • 1: Sustracción (SYS_BCC_CALCULATION_METHOD_SUB)

  • 2: OR exclusiva (SYS_BCC_CALCULATION_METHOD_XOR)

  • 16#A: CRC-16 (SYS_BCC_CALCULATION_METHOD_CRC16)

s2_Start (WORD, INT, UINT)

Área de inicio de 16 bits para calcular el BCC

s3_Number (INT)

Especifica el número de bytes para el cálculo del BCC

Salida

d (WORD, INT, UINT)

área de 16 bits para almacenar el BCC

Observaciones

En lugar de utilizar esta instrucción F, se recomienda utilizar la instrucción FP7 correspondiente: FP_CRC, FP_BCC

Especificación del código de control s1_Control

  1.  (1) Método de cálculo

    0: Suma (SYS_BCC_CALCULATION_METHOD_ADD)

    1: Sustracción (SYS_BCC_CALCULATION_METHOD_SUB)

    2: OR exclusiva (SYS_BCC_CALCULATION_METHOD_XOR)

    16#A: CRC-16 (SYS_BCC_CALCULATION_METHOD_CRC16)

  2.  (2) Posición del byte inicial para el cálculo (Nº de bytes de s2)

    0–F

  3.  (3) Posición del byte inicial para el guardado de resultados (Nº de bytes de d)
  4.  (4) Datos de conversión
    • 0: Datos binarios (CRC: 2 bytes/No CRC: 1 byte)
    • 1: Datos ASCII (2 bytes)
NOTA

Si se selecciona CRC-16 como método de cálculo, no se puede especificar código ASCII en la conversión de datos.

Banderas de error

sys_bIsOperationErrorHold (pasa a TRUE y permanece TRUE)

si el número de bytes excede el límite del área asignada para su almacenamiento.

sys_bIsOperationErrorNonHold (pasa a TRUE para un ciclo de scan)

si el número de bytes excede el límite del área asignada para su almacenamiento.

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*)
		BCC_Calc_Method: INT:=2;
		ASCII_String: STRING[32]:='%01#RCSX0000';
			(*specifies the operation:
0: addition
1: subtraction
2:XOR*)
		BCC: WORD:=0;
			(*result after a 0->1 leading
edge from start: 10#172*)
	END_VAR

Cuerpo LD

Se realiza un cálculo de Chequeo Bloque Caracteres (BCC) en ASCII_String cuando Start pasa a TRUE. El método de cálculo es OR exclusiva. (Utilice este método en caso de transmitirse grandes cantidades de datos).

Cómo se calcula el BCC utilizando una OR exclusiva:

bvar_1

bvar_2

bvar_3

0

0

0

0

1

1

1

0

1

1

1

0

  1.  (1) Código ASCII-HEXADECIMAL
  2.  (2) Código ASCII-BINARIO
  3.  (3) OR exclusiva
  4.  (4) cálculo
  5.  (5) Chequeo Bloque Caracteres (BCC)
  6.  (6) El resultado del cálculo (16#1D) se guarda en d.

Los bits del código ASCII BINARIO de los dos primeros caracteres se comparan entre ellos.

Dato a comparar

Código ASCII BINARIO

%

00100101

0

00110000

Resultado de la OR exclusiva

00010101

El resultado se compara con el código ASCII BINARIO del siguiente carácter, es decir, "1".

Dato a comparar

Código ASCII BINARIO

Resultado de la OR exclusiva

00010101

1

00110001

Siguiente OR exclusiva

00100100

Y así sucesivamente hasta el último carácter.

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 11 ;
        NETWORK_BODY
B(B_F,F70_BCC!,Instance,26,1,34,7,,?DEN?Ds1_Control?Ds2_Start?Ds3_Number?AENO?Cd);
B(B_CONTACT,,Start,3,2,5,4,);
B(B_VARIN,,BCC_Calc_Method,24,3,26,5,);
B(B_F,Adr_Of_VarOffs_I!,Instance,16,5,25,9,,?D@'Var'?DOffs?CAdr);
B(B_VAROUT,,BCC,34,3,36,5,);
B(B_VARIN,,ASCII_String,11,4,13,6,);
B(B_VARIN,,2,14,7,16,9,);
B(B_F,LEN!,Instance,16,8,21,11,,?DIN?C);
L(16,5,16,7);
L(13,5,16,5);
L(13,5,13,10);
L(13,10,16,10);
L(25,5,25,7);
L(25,5,26,5);
L(26,6,26,10);
L(21,10,26,10);
L(5,3,26,3);
L(1,3,3,3);
L(1,0,1,11);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

Cuerpo en ST

IF start then
    F70_BCC( s1_Control:= BCC_Calc_Methode,
         s2_Start:= Adr_Of_VarOffs( Var:= ASCII_String,
         Offs:= 2),
         s3_Number:= LEN( ASCII_String),
         d=> BCC);
END_IF;

Modificado el: 2022-04-19Comentarios sobre esta páginaPanasonic hotline