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));
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ă.
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]