Conversion BCD -> ASCII
Cette instruction FP convertit le code BCD à s1 en code ASCII lorsque le déclencheur EN est TRUE. s2_Control désigne le nombre d’octets devant être convertis et le sens de la conversion.
Le résultat est sauvegardé dans la zone spécifiée par d_Start. Le code ASCII requiert 8 bits (un octet) pour exprimer un caractère BCD. Après conversion en code ASCII, les données converties sont deux fois plus longues que les données sources.
Entrée
Code BCD
Nombre d’octets devant être convertis et sens de la conversion
Sortie
Adresse de départ de la zone de données dans laquelle le résultat est sauvegardé. La taille est de n_Bits * 2 mots.
Paramétrer le code de contrôles2_Control
16 bits : 1–2 octets à convertir
32 bits : 1–4 octets à convertir
0 : avant
1 : inverse
Les deux caractères qui forment un octet sont interchangés lorsqu’ils sont sauvegardés. Deux octets sont convertis en un segment de données.
Conversion avant :
Conversion inverse :
Codes ASCII HEX exprimant des caractères BCD :
Caractère BCD |
Code ASCII HEX |
---|---|
0123456789 |
16#3016#31 16#32 16#33 16#34 16#35 16#36 16#37 16#38 16#39 |
Si la zone spécifiée à l’aide du modificateur d’adresse est en dehors des limites autorisées.
Si les données spécifiées par s1_Start ne sont pas des données BCD.
Si le nombre d’octets désigné par s2_Control est supérieur à la zone spécifiée par s1_Start.
Si le résultat de la conversion est supérieur à la zone de données spécifiée par d_Start.
Si s2_Control = 0
Si le sens de la conversion est en dehors de l’intervalle autorisé
Si le nombre d’octets désigné par s2_Control est supérieur à 4.
Si la zone spécifiée à l’aide du modificateur d’adresse est en dehors des limites autorisées.
Si les données spécifiées par s1_Start ne sont pas des données BCD.
Si le nombre d’octets désigné par s2_Control est supérieur à la zone spécifiée par s1_Start.
Si le résultat de la conversion est supérieur à la zone de données spécifiée par d_Start.
Si s2_Control = 0
Si le sens de la conversion est en dehors de l’intervalle autorisé
Si le nombre d’octets désigné par s2_Control est supérieur à 4.
Offset |
Caractères BCD |
Offset |
Codes ASCII convertis |
Equivalent BCD |
|||
s1 |
0 |
16#1234 |
Þ |
d_Start |
0 |
16#3433 |
43 |
s2_Control |
16#0002 |
16#3231 |
21 |
||||
Offset |
Caractères BCD |
Offset |
Codes ASCII convertis |
Equivalent BCD |
|||
s1 |
0 |
16#1234 |
Þ |
d_Start |
0 |
16#3231 |
21 |
s2_Control |
16#1002 |
16#3433 |
43 |
||||
Offset |
Caractères BCD |
Offset |
Codes ASCII convertis |
Equivalent BCD |
|||
s1 |
0 |
16#5678 |
Þ |
d_Start |
0 |
16#3837 |
87 |
1 |
16#1234 |
1 |
16#3635 |
65 |
|||
s2_Control |
16#0004 |
16#3433 |
43 |
||||
16#3231 |
21 |
Offset |
Caractères BCD |
Offset |
Codes ASCII convertis |
Equivalent BCD |
|||
s1 |
0 |
16#5678 |
Þ |
d_Start |
0 |
16#3231 |
21 |
1 |
16#1234 |
1 |
16#3433 |
43 |
|||
s2_Control |
16#1004 |
16#3635 |
65 |
||||
16#3837 |
87 |
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
bStart: BOOL:=FALSE;
wInput: WORD:=16#1234;
awResult: ARRAY [0..2] OF WORD:=[3(0)];
END_VAR
La fonction est exécutée lorsque la variable bStart est définie sur TRUE. Deux octets à partir de s1_Start sont convertis en une valeur ASCII dans le sens inverse.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 8 ;
NETWORK_BODY
B(B_COMMENT,,After conversion: ø^awResult[0]=16#3231ø^awResult[1]=16#3433ø^awResult[2] is not written,24,1,39,5,);
B(B_CONTACT,,bStart,4,4,6,6,R);
B(B_F,FP_BCD_TO_ASCII!,,12,3,22,8,,?DEN?D@'s1'?Ds2_Control?AENO?Cd_Start);
B(B_VARIN,,wInput,10,5,12,7,);
B(B_VAROUT,,awResult[0],22,5,24,7,);
B(B_VARIN,,16#1002,10,6,12,8,);
L(1,0,1,8);
L(1,5,4,5);
L(6,5,12,5);
END_NETWORK_BODY
END_NET_WORK
END_BODY
If (DF(bStart)) Then
FP_BCD_TO_ASCII(s1 := wInput, s2_Control := 16#1002,
d_Start => awResult[0]);
(* After conversion:
awResult[0]=16#3231
awResult[1]=16#3433
awResult[2] is not written *)
End_if;