F70_BCC

Calcul du code de contrôle de bloc

Cette fonction calcule le caractère de contrôle de bloc (BCC) utilisé pour détecter les erreurs de transmission d’un message composé d’un nombre d’octets de données ASCII, défini par s3_Number. Le calcul est réalisé à partir de la zone de 16 bits indiquée par s2_Start et selon la méthode de calcul désignée par s1_Control. Le code de contrôle de bloc (BCC) est sauvegardé dans l’octet de poids faible de la zone de 16 bits désignée par d. (BCC est un octet. L’octet de poids fort de d reste inchangé.)

Paramètres

Entrée

s1_Control (INT)

Désigne la méthode de calcul du code BCC :

  • 0 : Addition (SYS_BCC_CALCULATION_METHOD_ADD)

  • 1 : Soustraction (SYS_BCC_CALCULATION_METHOD_SUB)

  • 2 : OU exclusif (SYS_BCC_CALCULATION_METHOD_XOR)

  • 16#A : CRC-16 (SYS_BCC_CALCULATION_METHOD_CRC16)

s2_Start (WORD, INT, UINT)

Zone de 16 bits à partir de laquelle le code BCC est calculé

s3_Number (INT)

Indique le nombre d’octets nécessaires au calcul du code BCC

Sortie

d (WORD, INT, UINT)

Zone de 16 bits de sauvegarde du code BCC

Remarques

Au lieu d’utiliser cette instruction F, nous recommandons d’utiliser l’instruction FP7 correspondante : FP_CRC, FP_BCC

Paramétrer le code de contrôle s1_Control

  1.  (1) Méthode de calcul

    0 : Addition (SYS_BCC_CALCULATION_METHOD_ADD)

    1 : Soustraction (SYS_BCC_CALCULATION_METHOD_SUB)

    2 : OU exclusif (SYS_BCC_CALCULATION_METHOD_XOR)

    16#A : CRC-16 (SYS_BCC_CALCULATION_METHOD_CRC16)

  2.  (2) Position de départ de l’octet pour le calcul (nombre d’octets à partir de s2)

    0–F

  3.  (3) Position de départ de l’octet pour la sauvegarde des résultats (nombre d’octets à partir de d)
  4.  (4) Données de conversion
    • 0 : Données binaires (CRC : 2 octets/sans CRC : 1 octet)
    • 1 : Données ASCII (2 octets)
NOTA

Si CRC-16 est indiqué comme méthode de calcul, le code ASCII ne peut pas être désigné comme données de conversion.

Drapeaux d’erreur

sys_bIsOperationErrorHold (passe à TRUE et reste TRUE)

Si le nombre d’octets défini pour le calcul du code est en dehors de la zone de données spécifiée.

sys_bIsOperationErrorNonHold (passe à TRUE pendant un cycle)

Si le nombre d’octets défini pour le calcul du code est en dehors de la zone de données spécifiée.

Exemple

En-tête du POU

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*)
		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

Corps en LD

Un calcul du caractère de contrôle de bloc est exécuté sur ASCII_String lorsque Start devient TRUE. La méthode de calcul est OU exclusif. (Utilisez cette méthode lorsque de larges quantités de données sont transmises).

Comment le BCC est calculé à l’aide du OU exclusif :

bvar_1

bvar_2

bvar_3

0

0

0

0

1

1

1

0

1

1

1

0

  1.  (1) Code ASCII HEX
  2.  (2) Code ASCII BIN
  3.  (3) Joint torique spécial
  4.  (4) Calcul
  5.  (5) Caractère de contrôle de bloc (BCC)
  6.  (6) Le résultat du calcul (16#1D) est sauvegardé dans d.

Les bits du code ASCII BIN des deux premiers caractères sont comparés l’un à l’autre pour générer le résultat de l’opération OU exclusif à 8 caractères :

Signal pour comparaison

Code ASCII BIN

%

00100101

0

00110000

Résultat OU exclusif

00010101

Ce résultat est ensuite comparé au code ASCII BIN du caractère suivant, soit "1".

Signal pour comparaison

Code ASCII BIN

Résultat OU exclusif

00010101

1

00110001

OU exclusif suivant

00100100

Et ainsi de suite jusqu’au dernier caractère.

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

Corps 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;

Modifié le : 2022-06-17Feedback on this pagePanasonic hotline