Convertir ASCII -> BCD
Estas instrucciones FP convierten los códigos ASCII hexadecimales de s1_Start a caracteres BCD si la entrada de trigger EN es TRUE. s2_Control especifica el número de bytes a convertir y la dirección de conversión.
El resultado se guarda en d.
Entrada
Dirección de inicio
Número de bytes y dirección de conversión
Salida
Bytes convertidos
Especificación del código de control s2_Control
16 bits: 1–2 bytes a convertir
32 bits: 1–4 bytes a convertir
0: directo
1: inverso
Cuando se almacenan, se intercambian los dos caracteres que forman un byte. Los dos bytes se convierten como un solo segmento de datos.
Dirección directa:
Dirección inversa:
Códigos ASCII HEX para representar caracteres BCD:
Carácter BCD |
Código ASCII HEX |
---|---|
0123456789 |
16#30 16#31 16#32 16#33 16#34 16#35 16#36 16#37 16#38 16#39 |
EjemploDatos de 16 bits con signo/sin signo, dirección directa, 4 caracteres
Offset |
Códigos ASCII |
Equivalente BCD |
Offset |
Caracteres BCD convertidos |
|||
s1_Start |
0 |
16#3231 |
21 |
Þ |
d |
0 |
16#3412 |
1 |
16#3433 |
3 |
1 |
||||
s2_Control |
16#0004 |
EjemploDatos de 16 bits, dirección inversa, 4 caracteres
Offset |
Códigos ASCII |
Equivalente BCD |
Offset |
Caracteres BCD convertidos |
|||
s1_Start |
0 |
16#3231 |
21 |
Þ |
d |
0 |
16#1234 |
1 |
16#3433 |
43 |
1 |
||||
s2_Control |
16#1004 |
EjemploDatos de 32 bits, dirección directa, 8 caracteres
Offset |
Códigos ASCII |
Equivalente BCD |
Offset |
Caracteres BCD convertidos |
|||
s1_Start |
0 |
16#3231 |
21 |
Þ |
d |
0 |
16#3412 |
1 |
16#3433 |
3 |
1 |
16#7856 |
|||
2 |
16#3635 |
65 |
2 |
||||
3 |
16#3837 |
87 |
3 |
||||
s2_Control |
16#0008 |
EjemploDatos de 32 bits, dirección inversa, 8 caracteres
Offset |
Códigos ASCII |
Equivalente BCD |
Offset |
Caracteres BCD convertidos |
|||
s1_Start |
0 |
16#3231 |
21 |
Þ |
d |
0 |
16#5678 |
1 |
16#3433 |
43 |
1 |
16#1234 |
|||
2 |
16#3635 |
65 |
2 |
||||
3 |
16#3837 |
87 |
3 |
||||
s2_Control |
16#1008 |
EjemploDatos de 32 bits, dirección inversa, 7 caracteres
Si el número de caracteres a convertir es impar, se introducen ceros en las posiciones de bit 0–3 del último byte convertido si la dirección de conversión es "directa". Si la dirección de conversión es "inversa", se introducirán ceros para las posiciones de bit 4–7:
Offset |
Códigos ASCII |
Equivalente BCD |
Offset |
Caracteres BCD convertidos |
|||
s1_Start |
0 |
16#3231 |
21 |
Þ |
d |
0 |
16#4567 |
1 |
16#3433 |
43 |
1 |
16#0123 |
|||
2 |
16#3635 |
65 |
2 |
||||
3 |
16#3837 |
87 |
3 |
||||
s2_Control |
16#1007 |
si el área especificada utilizando el modificador índice supera el límite.
si se especifican caracteres ASCII diferentes a 16#30–16#39
si el número de bytes especificado por s2_Control es superior al área especificada por s1_Start
si el resultado de la conversión es superior al área de datos especificada por d
si s2_Control = 0
si la dirección de conversión está fuera de rango
si el número de bytes especificado en s2_Control es superior a 8
si el área especificada utilizando el modificador índice supera el límite.
si se especifican caracteres ASCII diferentes a 16#30–16#39
si el número de bytes especificado por s2_Control es superior al área especificada por s1_Start
si el resultado de la conversión es superior al área de datos especificada por d
si s2_Control = 0
si la dirección de conversión está fuera de rango
si el número de bytes especificado en s2_Control es superior a 8
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*)
wASCIIInput: WORD:=16#3031;
wControlCode: WORD:=16#2;
(*specifies the operation:
digit 0: the number of bytes
to convert
digit 1,2: has to be zero
digit 3: nomal or reverse direction*)
wConversionResult: WORD:=0;
(*result after a 0->1 leading
edge from start:
[16#2033,0]*)
END_VAR
Cuando la variable bStart se encuentra a TRUE, se ejecuta la función. Se convierten dos caracteres del valor de entrada ASCII en dirección directa
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,bStart,5,2,7,4,);
B(B_VARIN,,wASCIIInput,11,3,13,5,);
B(B_VARIN,,wControlCode,11,4,13,6,);
B(B_VAROUT,,wConversionResult,23,3,25,5,);
B(B_F,FP_ASCII_TO_BCD!,,13,1,23,6,,?DEN?Ds1_Start?Ds2_Control?AENO?Cd);
L(1,3,5,3);
L(7,3,13,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
if bStart then
FP_ASCII_TO_BCD(s1_Start := wASCIIInput,
s2_Control := wControlCode,
d => wConversionResult);
END_IF;