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.)
Entrada
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)
Área de inicio de 16 bits para calcular el BCC
Especifica el número de bytes para el cálculo del BCC
Salida
área de 16 bits para almacenar el BCC
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
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)
0–F
Si se selecciona CRC-16 como método de cálculo, no se puede especificar código ASCII en la conversión de datos.
si el número de bytes excede el límite del área asignada para su almacenamiento.
si el número de bytes excede el límite del área asignada para su almacenamiento.
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
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 |
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
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;