FP_ASCII_CHECK

Controllo dati ASCII

Questa istruzione FP controlla se i codici ASCII memorizzati nell'area specificata da s2_AsciiData possano essere convertiti correttamente utilizzando il metodo di conversione specificato da s1_Format.

  • Se i risultati sono corretti, la variabile di sistema sys_bIsEqual e l’uscita d_IsValid passano a TRUE.

  • Se i risultati non sono corretti, la variabile di sistema sys_bIsEqual e l’uscita d_IsValid passano a FALSE.

NOTA

Le istruzioni FP FP_ASCII_TO_BIN e FP_ASCII_CHECK non distinguono tra maiuscole e minuscole

Parametri

Ingresso

s1_Format (STRING)

Formato stringa e controllo impostati tra virgolette

s2_AsciiData (BOOL, INT, UINT, WORD, DINT, UDINT, DWORD, REAL, DATE, TOD, DT, STRING)

Indirizzo iniziale per memorizzare i dati ASCII

n_Conversions (WORD, INT, UINT)

Quantità di numeri da convertire: 0–65535

n_AsciiDataStartPosition (INT)

Posizione iniziale nel dato ASCII: 0–255

Uscita

d_IsValid (BOOL)

TRUE, se il datoASCII consiste di numeri binari convertibili nel formato desiderato

Spiegazione di ogni cifra del codice di controllo s1_Format:

Posizione nel codice di controllo

Descrizione

s1_Format

PLC a 16 bit

PLC a 32 bit

Direzione di conversione

     

+

Avanti (solo per numeri esadecimali con tipo di dato convertito x, X)

'+%4X'

se il segno più viene omesso: inversa (impostazione di default)

'%4X'

%

tipo di dato convertito per formato stringa (obbligatorio)

 

formato riempimento elementi mancanti

     

0

carattere 0 utilizzato come riempitivo

'%06x'

-

+

aggiungere un segno più

'%+4d'

-

-

allineamento a sinistra

'%-6d'

-

˽

(spazio) aggiunta di uno spazio al posto del segno più

'%˽4d'

-

#

inserire 0x per numeri esadecimali

'%#4X'

-

aggiungere sempre un punto decimale per un numero reale

'%#8.0f'

-

8

ampiezza del dato ASCII

'%08d'

nessuna ampiezza

  • FP_BIN_TO_ASCII: si suppone l’ampiezza minima richiesta

  • FP_ASCII_TO_BIN e FP_ASCII_CHECK: viene richiesto un separatore a virgola

'%d,'

-

precisione dopo il punto decimale

     

.5

qualsiasi cifra dopo il punto decimale

'%8.5f'

-

I

tipo di dato convertito doppio

p.es. tipo di dato convertito con l = Ii -> DINT

'+%4ld'

formato del tipo di dato convertito

     

i

INT

'%10i'

u

UINT

'%10u'

-

d

INT

'%6d'

x

esadecimale minuscolo

'+%4x'

X

esadecimale maiuscolo

'+%4X'

b

BCD

'+%5b'

-

f

Numero in virgola mobile

'+%-6.2f'

-

e

esponenziale 1.23e10

'+%9.3e'

-

E

esponenziale maiuscolo 1.23E10

'+%9.3E'

-

g

mobile o esponenziale

'+%12g'

-

G

maiuscolo mobile o esponenziale

'+%9.3G'

-

  • Per FP_BIN_TO_ASCII: è possibile aggiungere qualsiasi stringa alla conversione, p.es. 'PANA'

  • Per FP_ASCII_TO_BIN e FP_ASCII_CHECK: è consentita solo la virgola

'+%8dPANA'

-

disponibile su PLC a 16 bit/32 bit

Esempi di stringa di controllo s1_Format

  • Esempio: '+%4X' converte un valore binario in un valore con un'ampiezza di quattro caratteri in maiuscolo in direzione avanti (valido per PLC a 16 bit/32 bit)

    Dati ASCII validi per questo esempio: '˽12A'

  • Esempio: '%4X' converte un valore binario in un valore con un'ampiezza di quattro caratteri in maiuscolo in direzione indietro (valido per PLC a 16 bit/32 bit)

    Dati ASCII validi per questo esempio: '˽B2A'

  • Esempio: '%06d' converte un valore binario in un valore con un'ampiezza di sei caratteri, valore decimale con tre zeri iniziali (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '000100'

  • Esempio: '%+4d' converte un valore binario in un valore con un'ampiezza di quattro caratteri, valore decimale, segno + aggiunto (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '+100 ˽ ˽'

  • Esempio: '%-6d' converte un valore binario in un valore con un'ampiezza di sei caratteri, allineamento a sinistra (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '100˽ ˽ ˽'

  • Esempio: '%˽4d' converte un valore binario in un valore con un'ampiezza di quattro caratteri con uno spazio iniziale (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '˽100'

  • Esempio: '%#8.0f' converte un valore binario in un valore con un'ampiezza di otto caratteri, numero in virgola mobile, quattro spazi iniziali (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '˽ ˽ ˽ ˽123.'

  • Esempio: '%8.3f' converte un valore binario in un valore con un'ampiezza di otto caratteri, precisione tre caratteri dopo il punto decimale (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '˽123.456'

  • Esempio: '+%10u' converte un valore binario in un valore con un'ampiezza di 10 caratteri, sette spazi iniziali, intero senza segno (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '˽ ˽ ˽ ˽ ˽ ˽ ˽100'

  • Esempio: '%06d' converte un valore binario in un valore con un'ampiezza di sei caratteri con tre spazi iniziali (valido per PLC a 16 bit/32 bit)

    Dati ASCII validi per questo esempio: '˽ ˽ ˽100'

    Intervallo utilizzabile per il valore prima del tipo di dato convertito:

    '˽ ˽ ˽ ˽ ˽100PANA'

    se non viene specificata alcuna ampiezza, la virgola viene aggiunta p.es. '%d,' (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '100,'

    • FP_BIN_TO_ASCII: si suppone l’ampiezza minima richiesta

    • FP_ASCII_TO_BIN e FP_ASCII_CHECK: viene richiesto un separatore a virgola

  • Esempio: '+%4ld' converte un valore binario in un valore con un'ampiezza di quattro caratteri, richiede DINT o DWORD per il risultato convertito (valido per PLC a 16 bit/32 bit)

    Dati ASCII validi per questo esempio: '˽100'

  • Esempio: '+%6i' converte un valore binario in un valore con un'ampiezza di sei caratteri, tre spazi iniziali, intero con segno in direzione avanti (valido per PLC a 16 bit/32 bit)

    Dati ASCII validi per questo esempio: '˽ ˽ ˽-100'

  • Esempio: '+%6d' converte un valore binario in un valore con un'ampiezza di sei caratteri con tre zeri iniziali in direzione avanti (valido per PLC a 16 bit/32 bit)

    Dati ASCII validi per questo esempio: '000100'

  • Esempio: '+%4X' converte un valore binario in un valore con un'ampiezza di quattro caratteri, numero esadecimale in maiuscolo in direzione avanti (valido per PLC a 16 bit/32 bit)

    Dati ASCII validi per questo esempio: '˽12A'

  • Esempio: '+%5b' converte un valore binario in un valore con un'ampiezza di cinque caratteri, dati BCD (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '˽123'

  • Esempio: '+%-6.2f' converte un valore binario in un valore con un'ampiezza di sei caratteri, allineamento a sinistra, precisione due cifre dopo il punto decimale (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '1.23˽'

  • Esempio: '+%9.3e' converte un valore binario in un valore con un'ampiezza di 9 caratteri, precisione 3 cifre dopo il punto decimale, minuscolo esponenziale (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '1.235e+03'

  • Esempio: '1.235E+03' converte un valore binario in un valore con un'ampiezza di 9 caratteri, precisione 3 cifre dopo il punto decimale, maiuscolo esponenziale (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '1.235E+03'

  • Esempio: '+%12g' converte un valore binario in un valore con un'ampiezza di 12 caratteri, numero in virgola mobile (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '˽ ˽ ˽ ˽ ˽1234.57'

  • Esempio: '+%9.3G' converte un valore binario in un valore con un'ampiezza di nove caratteri, precisione tre caratteri dopo il punto decimale, numero in virgola mobile, maiuscolo esponenziale (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '˽ ˽ ˽1.E+03'

  • Per FP_BIN_TO_ASCII: è possibile aggiungere qualsiasi stringa alla conversione

    Esempio: '+%8dPANA' converte un valore binario in un valore con un'ampiezza di otto caratteri, numero decimale, 'PANA' viene aggiunto (valido solo per PLC a 32 bit)

    Dati ASCII validi per questo esempio: '˽ ˽ ˽ ˽ ˽100PANA'

Flag di errore

sys_bIsOperationErrorHold (passa a TRUE e resta TRUE)
  • se è presente un errore nella stringa di controllo specificata da sFormat.

  • se la direzione in avanti (+) viene specificata in sFormat quando il formato è decimale.

  • se il numero di caratteriASCII per unità convertita specificata da n_Conversions supera 4 per dato a 16 bit o 8 per dato a 32 bit quando il formato esadecimale è specificato da s1_Format.

  • se 0 viene specificato per il n. di unità da 16 o 32 bit (word da 1 o 2) da convertire in n_Conversions.

  • Se la quantità di numeri decimali da 16 o 32 bit da convertire specificato da n_Conversions supera l'area per memorizzare i dati ASCII.

  • se il risultato della conversione supera l'area.

sys_bIsOperationErrorNonHold (passa a TRUE per una scansione)
  • se è presente un errore nella stringa di controllo specificata da sFormat.

  • se la direzione in avanti (+) viene specificata in sFormat quando il formato è decimale.

  • se il numero di caratteriASCII per unità convertita specificata da n_Conversions supera 4 per dato a 16 bit o 8 per dato a 32 bit quando il formato esadecimale è specificato da s1_Format.

  • se 0 viene specificato per il n. di unità da 16 o 32 bit (word da 1 o 2) da convertire in n_Conversions.

  • Se la quantità di numeri decimali da 16 o 32 bit da convertire specificato da n_Conversions supera l'area per memorizzare i dati ASCII.

  • se il risultato della conversione supera l'area.

Esempio

Intestazione del POU

Tutte le variabili di ingresso e uscita utilizzate per programmare questa funzione sono state dichiarate nell'intestazione del POU. La stessa intestazione del POU è utilizzata per tutti i linguaggi di programmazione.

	VAR
		bStart: BOOL:=FALSE;
		sExample1: STRING[32]:='*1234,5678,';
		bIsAsciiValid: BOOL:=FALSE;
	END_VAR

Corpo del POU

Se bStart viene impostato su TRUE, l’istruzione verifica se i dati connessi in s2_AsciiData possano essere convertiti in dati decimali quando il formato stringa è '%d'.

Corpo LD

BODY
    WORKSPACE
        NETWORK_LIST_TYPE := NWTYPELD ;
        ACTIVE_NETWORK := 0 ;
    END_WORKSPACE
    NET_WORK
        NETWORK_TYPE := NWTYPELD ;
        NETWORK_LABEL :=  ;
        NETWORK_TITLE :=  ;
        NETWORK_HEIGHT := 8 ;
        NETWORK_BODY
B(B_VARIN,,'%d~',26,2,28,4,);
B(B_VARIN,,2,26,4,28,6,);
B(B_VARIN,,1,26,5,28,7,);
B(B_F,Adr_Of_VarOffs_I!,,14,2,23,6,,?D@'Var'?DOffs?CAdr);
B(B_VARIN,,sExample1,12,3,14,5,);
B(B_VARIN,,2,12,4,14,6,);
B(B_VAROUT,,bIsAsciiValid,41,2,43,4,);
B(B_F,FP_ASCII_CHECK!,,28,0,41,7,,?DEN?hs1_Format?ds2_AsciiData?dn_Conversions?dn_AsciiDataStartPosition?AENO?cd_IsValid);
B(B_CONTACT,,bStart,5,1,7,3,);
L(23,4,28,4);
L(1,2,5,2);
L(7,2,28,2);
L(1,0,1,8);
        END_NETWORK_BODY
    END_NET_WORK
END_BODY

Corpo ST

If (bStart) then
    FP_ASCII_CHECK(s1_Format := '%d,',
                   s2_AsciiData := Adr_Of_VarOffs(Var := sExample1, Offs := 2),
                   n_Conversions := 2, 
                   n_AsciiDataStartPosition := 1,
                   d_IsValid => bIsAsciiValid);
End_if;

L'ultima revisione: 2024-12-18Feedback su questa paginaPanasonic hotline