Calcular el Chequeo Bloque Caracteres
Estas instrucciones FP calculan el Chequeo Bloque Caracteres (BCC) conforme al cálculo especificado por s1_Control. Los datos se especifican por la dirección de inicio s2_Start y el número de bytes n_Bytes. El BCC se guarda en el área de 16 bits especificada por d.
Entrada
Método de cálculo
Dirección de inicio
Número de bytes
Salida
Chequeo Bloque Caracteres
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)
16#0–16#F
0: Datos binarios (1 byte)
1: Datos ASCII (2 bytes)
si el área especificada utilizando el modificador índice supera el límite.
si el área especificada utilizando el modificador índice supera el límite.
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
bStart: BOOL:=FALSE;
(*activates the function*)
iBCC_Calc_Method: INT:=2;
sASCII_String: STRING[32]:='%01#RCSX0000';
(*specifies the operation:
0: addition
1: subtraction
2:XOR*)
wBCC: WORD:=0;
(*result after a 0->1 leading
edge from start: 10#172*)
END_VAR
Si bStart cambia a TRUE, se realiza un cálculo de Chequeo Bloque Caracteres en sASCII_String. El método de cálculo es OR exclusiva. (Utilice este método en caso de transmitirse grandes cantidades de datos).
OR exclusiva:
bvar_1 |
bvar_2 |
bvar_3 |
![]() |
0 |
0 |
0 |
|
0 |
1 |
1 |
|
1 |
0 |
1 |
|
1 |
1 |
0 |
Los códigos binarios de los dos primeros caracteres se comparan entre sí para devolver un resultado de OR exclusiva de 8 caracteres. A continuación, este resultado se compara con el código binario del siguiente carácter y, así, sucesivamente hasta el último carácter. El último resultado de la OR exclusiva corresponde al Chequeo Bloque Caracteres.
Cálculo de BCC utilizando OR exclusiva:
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_CONTACT,,bStart,3,2,5,4,);
B(B_VARIN,,iBCC_Calc_Method,24,3,26,5,);
B(B_F,Adr_Of_VarOffs_I!,,16,5,25,9,,?D@'Var'?DOffs?CAdr);
B(B_VAROUT,,wBCC,33,3,35,5,);
B(B_VARIN,,sASCII_String,11,4,13,6,);
B(B_VARIN,,2,14,7,16,9,);
B(B_F,LEN!,,16,8,21,11,,?DIN?C);
B(B_F,FP_BCC!,,26,1,33,7,,?DEN?Ds1_Control?Ds2_Start?Dn_Bytes?AENO?Cd);
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
En este ejemplo se utiliza Adr_Of_VarOffs_I para crear un offset de 2 palabras para compensar el código de inicio de la cadena. Utilizando LEN, el cálculo de BCC se realiza en la cadena de datos completa.
IF bStart then
FP_BCC(s1_Control := iBCC_Calc_Method,
s2_Start := Adr_Of_VarOffs( Var:= sASCII_String, Offs:= 2),
n_Bytes := LEN( sASCII_String),
d => wBCC);
END_IF;