SysVsscanf, extracts values from string

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

Questa funzione legge la stringa Str e ne interpreta il contenuto basandosi sulla stringa definita in Format che specifica il formato con il quale interpretare la variabile. In VarType è indicato il tipo di variabile ed in VarAdd il suo indirizzo.

La funzione ritorna TRUE se valore variabile trovato, in caso contrario FALSE.

Sostituisce “SysVarsscanf”

Sostituisce la funzione SysVarsscanf modificando il tipo di parametri in ingresso da stringa a puntatore a stringa. La precedente dichiarazione:

i:=SysVarsscanf(ADR(AStr), 'Value:%d', UDINT_TYPE, ADR(AVar)); 

Diventa:

i:=SysVsscanf(ADR(AStr), ADR('Value:%d'), VR_TYPE#UDINT_TYPE, ADR(AVar)); 
Information Circle

Funzione

CODESYS: Non disponibile

LogicLab: eLLabXUnified12Lib

Descrizione

Str (@STRING) Pointer alla variabile stringa da cui estrarre la variabile.
Format (@STRING) Ha due tipi di argomenti, i caratteri ordinari che vengono controllati nella variabile String da leggere e le specifiche di conversione, contraddistinte dal simbolo percentuale (%) e da un carattere che specifica il formato con il quale interpretare la variabile definita (Definizione).
VarType (VR_TYPE) Tipo variabile da estrarre (Definizione).
VarAdd (PVOID) Indirizzo variabile.

La funzione ritorna una variabile (BOOL), FALSE se errore, TRUE se la variabile è stata acquisita.

Immagine F SysVsscanf
Note per gestire variabili stringa

Questa funzione valorizza la variabile il cui indirizzo di allocazione è definito in VarAdd, e tutti sappiamo quanto sia pericoloso uscire dalla dimensione definita per una variabile. Ora per le variabili numeriche la dimensione è insita nel tipo, ma nelle variabili STRING occorre garantire che il risultato della scansione valore non superi la dimensione del buffer allocato per la stringa.

A questo proposito consiglio di definire sempre nel campo Format oltre alle specifiche di conversione anche la dimensione massima della stringa che è possibile acquisire. Quindi come vedete nell’esempio sotto nel campo Format il simbolo % è sempre seguito dalla definizione della lunghezza massima definita per la variabile risultato.

Utilizzo delle regular expression

Lo specificatore della funzione può essere definito anche utilizzando le regular expression, di seguito alcuni esempi.

// Some regular expression usage examples

    i:=SysVsscanf(ADR('Example 10+3=13$r$n'), ADR('%16[ -~]'), STRING_TYPE, ADR(SVar)); //SVar='Example 10+3=13'
    i:=SysVsscanf(ADR('Example 10+3=13$r$n'), ADR('%16[$20-$7E]'), STRING_TYPE, ADR(SVar)); //SVar='Example 10+3=13'
    i:=SysVsscanf(ADR('Example 10+3=13$r$n'), ADR('%16[a-zA-Z]'), STRING_TYPE, ADR(SVar)); //SVar='Example'
    i:=SysVsscanf(ADR('Example 10+3=13$r$n'), ADR('%16[a-z]'), STRING_TYPE, ADR(SVar)); //SVar=''
    i:=SysVsscanf(ADR('Example 10+3=13$r$n'), ADR('%16[0-9a-zA-Z]'), STRING_TYPE, ADR(SVar)); //SVar='Example'
    i:=SysVsscanf(ADR('Example 10+3=13$r$n'), ADR('%16[ 0-9a-zA-Z]'), STRING_TYPE, ADR(SVar)); //SVar='Example 10'
    i:=SysVsscanf(ADR('Example 10+3=13$r$n'), ADR('%16[+= 0-9a-zA-Z]'), STRING_TYPE, ADR(SVar)); //SVar='Example 10+3=13'

// [End of file]

Esempi

Come utilizzare gli esempi.
Sono riportati alcuni esempi di acquisizione valore variabile da una stringa.

LogicLab (Ptp116, ST_SysVsscanf)
PROGRAM ST_SysVsscanf
VAR
    AStr : STRING[ 32 ]; (* Auxiliary string *)
    Res : ARRAY[0..19] OF BOOL; (* Scanf results *)
    UDVar : ARRAY[0..2] OF UDINT; (* UDINT variable *)
    RVar : ARRAY[0..3] OF REAL; (* REAL variable *)
    SVar1 : STRING[ 8 ]; (* String variable *)
    USVar : ARRAY[0..1] OF USINT; (* USINT variable *)
    SVar2 : STRING[ 8 ]; (* String variable *)
    SVar3 : STRING[ 8 ]; (* String variable *)
    SVar4 : STRING[ 8 ]; (* String variable *)
    SVar5 : STRING[ 8 ]; (* String variable *)
    SVar6 : STRING[ 8 ]; (* String variable *)
    ULVar : ARRAY[0..1] OF ULINT; (* ULINT variable *)
    LVar : ARRAY[0..1] OF LINT; (* LINT variable *)
    LRVar : LREAL; (* LREAL variable *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysVsscanf"
// *****************************************************************************
// Some examples of read formatted data from string.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // READ INTEGER DATA
    // -------------------------------------------------------------------------

    AStr:='Value:1234'; //Auxiliary string
    Res[0]:=SysVsscanf(ADR(AStr), ADR('Value:%ld'), UDINT_TYPE, ADR(UDVar[0])); //UDVar[0]=1234
    Res[1]:=SysVsscanf(SysStrFind(ADR(AStr), ADR('Value:'), FIND_GET_END), ADR('%ld'), UDINT_TYPE, ADR(UDVar[1])); //UDVar[10]=1234
    Res[2]:=SysVsscanf(ADR(AStr), ADR('%ld'), UDINT_TYPE, ADR(UDVar[2])); //UDVar[2]=0

    // -------------------------------------------------------------------------
    // READ REAL DATA
    // -------------------------------------------------------------------------

    AStr:='Value:12.34'; //Auxiliary string
    Res[3]:=SysVsscanf(ADR(AStr), ADR('Value:%f'), REAL_TYPE, ADR(RVar[0])); //RVar[0]=12.34
    Res[4]:=SysVsscanf(SysStrFind(ADR(AStr), ADR('Value:'), FIND_GET_END), ADR('%f'), REAL_TYPE, ADR(RVar[1])); //RVar[10]=12.34

    // -------------------------------------------------------------------------
    // READ DATA WITH DIGIT DEFINITION
    // -------------------------------------------------------------------------

    AStr:=' 124.5 '; //Auxiliary string
    Res[5]:=SysVsscanf(ADR(AStr), ADR('%d'), USINT_TYPE, ADR(USVar[0])); //USVar[0]=124
    Res[6]:=SysVsscanf(ADR(AStr), ADR('%2d'), USINT_TYPE, ADR(USVar[1])); //USVar[1]=12

    Res[7]:=SysVsscanf(ADR(AStr), ADR('%f'), REAL_TYPE, ADR(RVar[2])); //RVar[2]=124.5
    Res[8]:=SysVsscanf(ADR(AStr), ADR('%2f'), REAL_TYPE, ADR(RVar[3])); //RVar[3]=12.0

    // -------------------------------------------------------------------------
    // READ LONG INTEGER DATA
    // -------------------------------------------------------------------------

    AStr:='Value:1234567890123456789'; //Auxiliary string
    Res[9]:=SysVsscanf(ADR(AStr), ADR('Value:%llu'), ULINT_TYPE, ADR(ULVar[0])); //ULVar[0]=1234567890123456789
    Res[10]:=SysVsscanf(ADR(AStr), ADR('Value:%4llu'), ULINT_TYPE, ADR(ULVar[1])); //ULVar[1]=1234

    AStr:='Value:-1234567890123456789'; //Auxiliary string
    Res[11]:=SysVsscanf(ADR(AStr), ADR('Value:%lld'), LINT_TYPE, ADR(LVar[0])); //LVar[0]=-1234567890123456789
    Res[12]:=SysVsscanf(ADR(AStr), ADR('Value:%4lld'), LINT_TYPE, ADR(LVar[1])); //LVar[10]=-123

    // -------------------------------------------------------------------------
    // READ LONG REAL DATA
    // -------------------------------------------------------------------------

    AStr:='Value:1234.12345'; //Auxiliary string
    Res[13]:=SysVsscanf(ADR(AStr), ADR('Value:%llf'), LREAL_TYPE, ADR(LRVar)); //LVar=1234.12345

    // -------------------------------------------------------------------------
    // READ STRING EXAMPLES
    // -------------------------------------------------------------------------

    AStr:='ab+cd:e'; //Auxiliary string
    Res[14]:=SysVsscanf(ADR(AStr), ADR('%8s'), STRING_TYPE, ADR(SVar1)); //SVar1='ab+cd:e'
    Res[15]:=SysVsscanf(ADR(AStr), ADR('%3s'), STRING_TYPE, ADR(SVar2)); //SVar2='ab+'
    Res[16]:=SysVsscanf(ADR(AStr), ADR('%3[a-z]'), STRING_TYPE, ADR(SVar3)); //SVar3='ab'
    Res[17]:=SysVsscanf(ADR(AStr), ADR('%8[a-z]'), STRING_TYPE, ADR(SVar4)); //SVar4='ab'
    Res[18]:=SysVsscanf(ADR(AStr), ADR('%8[^+]'), STRING_TYPE, ADR(SVar5)); //SVar5='ab'
    Res[19]:=SysVsscanf(ADR(AStr), ADR('%8[^:]'), STRING_TYPE, ADR(SVar6)); //SVar5='ab+cd'

// [End of file]
Was this article helpful?