FP_BCD_TO_ASCII

Convertir BCD -> ASCII

Estas instrucciones FP convierten el código BCD de s1 a un código ASCII 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 el área especificada por d_Start. El código ASCII necesita 8 bits (1 byte) para representar 1 carácter BCD. Después de la conversión a ASCII, la longitud de los datos será por tanto el doble de la longitud de los datos de origen.

Parámetros

Entrada

s1 (WORD, DWORD)

Código BCD

s2_Control (WORD)

Número de bytes y dirección de conversión

Salida

d_Start (WORD, INT, UINT)

Dirección de inicio del área de datos para los resultados. El tamaño es n_Bits * 2 palabras.

Observaciones

Especificación del código de control s2_Control

  1.  (1) tamaño de datos a convertir:

    16 bits: 1–2 bytes a convertir

    32 bits: 1–4 bytes a convertir

  2.  (2) siempre 0
  3.  (3) dirección de conversión:

    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#3016#31 16#32 16#33 16#34 16#35 16#36 16#37 16#38 16#39

Banderas de error

sys_bIsOperationErrorHold (pasa a TRUE y permanece TRUE)
  • si el área especificada utilizando el modificador índice supera el límite.

  • si los datos especificados por s1_Start no son datos BCD

  • 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_Start

  • 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 4

sys_bIsOperationErrorNonHold (pasa a TRUE para un ciclo de scan)
  • si el área especificada utilizando el modificador índice supera el límite.

  • si los datos especificados por s1_Start no son datos BCD

  • 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_Start

  • 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 4

EjemploDatos de 16 bits, dirección directa, 2 bytes (caracteres)

Offset

Caracteres BCD

Offset

Códigos ASCII convertidos

Equivalente BCD

s1

0

16#1234

Þ

d_Start

0

16#3433

43

s2_Control

16#0002

16#3231

21

EjemploDatos de 16 bits, dirección inversa, 2 bytes (caracteres)

Offset

Caracteres BCD

Offset

Códigos ASCII convertidos

Equivalente BCD

s1

0

16#1234

Þ

d_Start

0

16#3231

21

s2_Control

16#1002

16#3433

43

EjemploDatos de 32 bits, dirección directa, 4 bytes (caracteres)

Offset

Caracteres BCD

Offset

Códigos ASCII convertidos

Equivalente 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

EjemploDatos de 32 bits, dirección inversa, 4 bytes (caracteres)

Offset

Caracteres BCD

Offset

Códigos ASCII convertidos

Equivalente 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

Ejemplo

Cabecera de la POU

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;
		wInput: WORD:=16#1234;
		awResult: ARRAY [0..2] OF WORD:=[3(0)];
	END_VAR

Cuerpo de la POU

Cuando la variable bStart se encuentra a TRUE, se ejecuta la función. Se convierten dos bytes de s1_Start a un valor ASCII en dirección inversa.

Cuerpo LD

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

Cuerpo en ST

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;

Modificado el: 2021-09-27Comentarios sobre esta páginaPanasonic hotline