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.

FB_EnumStringNumbers 2: Eingänge

VAR_INPUT
    sSearch   : T_MaxString;
    eCmd      : E_EnumCmdType := eEnumCmd_First;
    eType     : E_NumGroupTypes := eNumGroup_Float;
END_VAR

Name

Typ

Beschreibung

sSearch

T_MaxString

Suchstring in dem nach Zahlen gesucht werden soll

eCmd

E_EnumCmdType

Steuerkommando für den Aufzählungsbaustein

eType

E_NumGroupTypes

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).

FB_EnumStringNumbers 3: Ausgänge

VAR_OUTPUT
    sNumber    : T_MaxString;
    nPos       : INT;
    bEOS       : BOOL;
END_VAR

Name

Typ

Beschreibung

sNumber

T_MaxString

Die zuletzt gefundene Zahl als String

nPos

INT

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

BOOL

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)