FB_EnumStringNumbers

FB_EnumStringNumbers 1:

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 (Typ: T_MaxString).

eCmd: Steuerkommando für den Aufzählungsbaustein (Typ: E_EnumCmdType).

eType: Zahlenformat der gesuchten Zahl (Typ: E_NumGroupTypes). 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 (Typ: T_MaxString).

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:

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:

eType-Parameter eNumGroup_Signed liefert folgende Ergebnisse:

eType-Parameter eNumGroup_Unsigned liefert folgende Ergebnisse:

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken (Kategoriegruppe)

TwinCAT v3.1.0

PC oder CX (x86, x64, ARM)

Tc2_Utilities (System)