Diese Funktion liest die Zeichenfolge Str und interpretiert seinen Inhalt basierend auf der in definierten Zeichenfolge Format Hiermit wird das Format angegeben, in dem die Variable interpretiert werden soll. Im VarType Der Variablentyp wird in und angegeben VarAdd seine Adresse.
Die Funktion kehrt zurück TRUE wenn variabler Wert gefunden wird, sonst FALSE.
Ersetzt "SysVarsscanf"
Ersetzt die Funktion SysVarsscanf Ändern des Typs der Eingabeparameter von Zeichenfolge zu Zeiger zu Zeichenfolge. Die vorherige Aussage:
i:=SysVarsscanf(ADR(AStr), 'Value:%d', UDINT_TYPE, ADR(AVar));
Wird:
i:=SysVsscanf(ADR(AStr), ADR('Value:%d'), VR_TYPE#UDINT_TYPE, ADR(AVar));
Funktion
CODESYS: nicht verfügbar
LogikLab: eLLabXUnified12Lib
Beschreibung
Str (@STRING) Zeiger auf die Zeichenfolgenvariable, aus der die Variable extrahiert werden soll.
Format (@STRING) Es hat zwei Arten von Argumenten, gewöhnliche Zeichen, die in der Variablen überprüft werden String zu lesenden und die Konvertierungsspezifikationen, unterschieden durch das Prozentzeichen (%) und durch ein Zeichen, das das Format angibt, mit dem die definierte Variable interpretiert werden soll (Definition).
VarType (VR_TYPE) Zu extrahierender Variablentyp (Definition).
VarAdd (PVOID) Variable Adresse.
Die Funktion gibt eine Variable zurück (BOOL), FALSE wenn Fehler, TRUE wenn die Variable erfasst wurde.
Hinweise zum Umgang mit String-Variablen
Diese Funktion bewertet die Variable, deren Zuordnungsadresse in definiert ist VarAdd, und wir alle wissen, wie gefährlich es ist, die definierte Dimension für eine Variable zu verlassen. Bei numerischen Variablen ist die Größe nun typimmanent, bei STRING-Variablen muss jedoch darauf geachtet werden, dass das Ergebnis der Wertesuche die Größe des für den String zugewiesenen Puffers nicht überschreitet.
Insofern empfehle ich immer im Feld zu definieren Format neben den Konvertierungsvorgaben auch die maximale Größe des Strings, der erfasst werden kann. So wie Sie im Beispiel unten im Feld sehen Format das Symbol % es folgt immer die Definition der maximalen Länge, die für die Ergebnisvariable definiert ist.
Verwendung von regulären Ausdrücken
Der Funktionsbezeichner kann auch mit regulären Ausdrücken definiert werden, hier sind einige Beispiele.
// 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]
Beispiele
Verwendung der Beispiele.
Hier sind einige Beispiele für die Erfassung variabler Werte aus einer Zeichenfolge.
LogikLab (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]