FB_EnumStringNumbers

Mit diesem Funktionsbaustein kann ein String in einer REPEAT- oder WHILE-Schleife nach Zahlen durchsucht werden. Der String kann mehrere Zahlen beinhalten. Die gefundenen Zahlen werden als Teilstrings am Baustein-Ausgang ausgegeben. Es wird ab der aktuellen Position, nach dem ersten Zeichen, das als Zahlenzeichen interpretiert werden kann, gesucht. Die Suche wird beim ersten nicht als Zahl interpretierbaren Zeichen abgebrochen. Der eCmd-Parameter bestimmt, ob nach der ersten oder der nächsten Zahl gesucht werden soll. Der eType-Parameter bestimmt das Zahlenformat der Zahlen im Suchstring.
VAR_INPUT
VAR_INPUT
sSearch : T_MaxString;
eCmd : E_EnumCmdType := eEnumCmd_First;
eType : E_NumGroupTypes := eNumGroup_Float;
END_VAR
sSearch: Suchstring in dem nach Zahlen gesucht werden soll.
eCmd: Steuerkommando für den Aufzählungsbaustein.
eType: Zahlenformat der gesuchten Zahl. Dieser Parameter bestimmt welche Zeichen ignoriert und welche als Zahlenzeichen interpretiert werden:
Wert | Bedeutung |
---|---|
eNumGroup_Float | Zahlen '0' bis '9', '+', '-' (Vorzeichen) und das 'e' oder 'E' (Exponentzeichen) werden als gültige Zahlenzeichen interpretiert. |
eNumGroup_Unsigned | Zahlen '0' bis '9' werden als gültige Zahlenzeichen interpretiert. '+', '-', 'e', 'E'-Zeichen werden als Zahlenzeichen ignoriert. |
eNumGroup_Signed | Zahlen '0' bis '9' '+', '-' (Vorzeichen) werden als gültige Zahlenzeichen interpretiert. 'e' und 'E'-Zeichen werden als Zahlenzeichen ignoriert. |
Beinhaltet der String z.B. Zahlen in der Exponentialdarstellung dann muss eType = eNumGroup_Float gesetzt werden (default).
VAR_OUTPUT
VAR_OUTPUT
sNumber : T_MaxString;
nPos : INT;
bEOS : BOOL;
END_VAR
sNumber: Die zuletzt gefundene Zahl als String.
nPos: Diese Variable liefert immer die Position hinter dem zuletzt gefundenen und richtig formatierten Zahlenzeichen. D.h. an dieser Stelle beginnt der Baustein beim nächsten Aufruf nach neuen Zahlenzeichen zu suchen. nPos ist Null wenn die abschließende Null des sSearch-Strings erreicht wurde. Das erste Zeichen im String hat die Positionsnummer = 1 (non-zero based position).
bEOS: Diese Variable ist FALSE wenn das Ende des Strings noch nicht erreicht wurde und eine neue Zahl gefunden wurde. In diesem Fall liefert sNumber eine gültige Zahl als String. Diese Variable ist TRUE wenn keine weitere Zahl gefunden wurde. Eine weitere Suche muss in diesem Fall abgebrochen werden (sNumber liefert keinen gültigen Wert).
Beispiel in ST:
Im folgenden Beispiel wird die sNumber-Variable nach gültigen Zahlen durchsucht. Die gefundenen Teilstrings werden in der Array-Variable arrNums abgespeichert.
TYPE ST_ScanRes :
STRUCT
sNumber : T_MaxString;
nPos : INT;
sRemain : T_MaxString;
END_STRUCT
END_TYPE
PROGRAM MAIN
VAR
sSearch : T_MaxString := 'Some numbers in string: +-12e-34, -56, +78';
fbEnum : FB_EnumStringNumbers := ( eType := eNumGroup_Float (* eNumGroup_Signed, eNumGroup_Unsigned *) );
arrNums : ARRAY[1..MAX_SCAN_NUMS] OF ST_ScanRes;
idx : INT;
length : INT;
bEnum : BOOL := TRUE;
END_VAR
VAR CONSTANT
MAX_SCAN_NUMS : INT := 10;
END_VAR
IF bEnum THEN
bEnum := FALSE;
MEMSET( ADR( arrNums ), 0, SIZEOF( arrNums ) );
idx := 0;
length := LEN( sSearch );
fbEnum( sSearch := sSearch, eCmd := eEnumCmd_First );
WHILE NOT fbEnum.bEOS DO
IF idx < MAX_SCAN_NUMS THEN
idx := idx + 1;
arrNums[idx].sNumber:= fbEnum.sNumber;
arrNums[idx].nPos := fbEnum.nPos;
IF fbEnum.nPos <> 0 THEN
arrNums[idx].sRemain:= RIGHT( sSearch, length - fbEnum.nPos + 1 );
END_IF
END_IF
fbEnum( eCmd := eEnumCmd_Next );
END_WHILE
END_IF
Die gefundenen Strings:
- '-12e-34'
- '-56'
- '+78'
eType-Parameter eNumGroup_Signed liefert folgende Ergebnisse:
- '-12'
- '-34'
- '-56'
- '+78'
eType-Parameter eNumGroup_Unsigned liefert folgende Ergebnisse:
- '12'
- '34'
- '56'
- '78'
Voraussetzungen
Entwicklungsumgebung | Zielplattform | Einzubindende SPS Bibliotheken |
---|---|---|
TwinCAT v2.10.0 Build > 1307 | PC or CX (x86) CX (ARM) | TcUtilities.Lib |