SysVsscanf, extrage valori din șir

Listă

Această pagină face parte din Manual de programare IEC 61131-3. Mergeți la index.

Această funcție citește șirul Str și interpretează conținutul său pe baza șirului definit în Format care specifică formatul în care să interpretezi variabila. În VarType tipul variabilei este indicat în și VarAdd adresa lui.

Funcția revine TRUE dacă este găsită o valoare variabilă, în caz contrar FALSE.

Înlocuiește „SysVarsscanf”

Înlocuiește funcția SysVarsscanf schimbarea tipului de parametri de intrare de la string la pointer la string. Declarația anterioară:

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

devine:

i:=SysVsscanf(ADR(AStr), ADR('Value:%d'), VR_TYPE#UDINT_TYPE, ADR(AVar)); 
Cercul de informații

funzione

CODESYS: Indisponibil

LogicLab: eLLabXUnified12Lib

Descriere

Str (@STRING) Indicator către variabila șir din care să extrageți variabila.
Format (@STRING) Are două tipuri de argumente, caractere obișnuite care sunt bifate în variabilă String de citit și specificațiile de conversie, distinse prin simbolul procentual (%) și printr-un caracter care specifică formatul cu care să interpreteze variabila definită (definiție).
VarType (VR_TYPE) Tipul variabilei de extras (definiție).
VarAdd (PVOID) Adresă variabilă.

Funcția returnează o variabilă (BOOL), FALSE if error, TRUE dacă variabila a fost achiziționată.

Imagine F SysVsscanf
Note pentru manipularea variabilelor șir

Această funcție evaluează variabila a cărei adresă de alocare este definită în VarAdd, și știm cu toții cât de periculos este să ieși din dimensiunea definită pentru o variabilă. Acum, pentru variabilele numerice dimensiunea este inerentă tipului, dar în variabilele STRING este necesar să ne asigurăm că rezultatul scanării valorii nu depășește dimensiunea buffer-ului alocat șirului.

În acest sens recomand definirea mereu în domeniu Format pe lângă specificațiile de conversie și dimensiunea maximă a șirului care poate fi achiziționată. Deci, după cum vedeți în exemplul de mai jos în câmp Format simbolul % este întotdeauna urmată de definirea lungimii maxime definite pentru variabila rezultat.

Utilizarea expresiilor regulate

Specificatorul funcției poate fi definit și folosind expresii regulate, iată câteva exemple.

// 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]

Exemple

Cum se utilizează exemplele.
Iată câteva exemple de achiziție de valori variabile dintr-un șir.

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]
A fost util acest articol?