SysVsscanf, extrae valores de la cadena

Lista

Esta página es parte del Manual de programación IEC 61131-3. Ir al índice.

Esta función lee la cadena Str e interpreta su contenido en función de la cadena definida en Format que especifica el formato en el que interpretar la variable. En VarType el tipo de variable se indica en y VarAdd Su dirección.

La función vuelve TRUE si se encuentra un valor variable, de lo contrario FALSE.

Reemplaza "SysVarsscanf"

Reemplaza la función SysVarsscanf cambiando el tipo de parámetros de entrada de cadena a puntero a cadena. La declaración anterior:

i:=SysVarsscanf(ADR(AStr), 'Value:%d', UDINT_TYPE, ADR(AVar)); 

Se convierte en:

i:=SysVsscanf(ADR(AStr), ADR('Value:%d'), VR_TYPE#UDINT_TYPE, ADR(AVar)); 
Círculo de información

Funzione

CÓDIGOS: indisponible

Laboratorio lógico: eLLabXUnified12Lib

Descripción

Str (@STRING) Puntero a la variable de cadena desde la que extraer la variable.
Format (@STRING) Tiene dos tipos de argumentos, caracteres ordinarios que se marcan en la variable String a leer y las especificaciones de conversión, que se distinguen por el símbolo de porcentaje (%) y por un carácter que especifica el formato con el que interpretar la variable definida (definición).
VarType (VR_TYPE) Tipo de variable a extraer (definición).
VarAdd (PVOID) Dirección variable.

La función devuelve una variable (BOOL), FALSO si error, VERDADERO si la variable ha sido adquirida.

Imagen F SysVsscanf
Notas para el manejo de variables de cadena

Esta función valora la variable cuya dirección de asignación está definida en VarAdd, y todos sabemos lo peligroso que es salirse de la dimensión definida para una variable. Ahora, para las variables numéricas, el tamaño es inherente al tipo, pero en las variables STRING, es necesario asegurarse de que el resultado del escaneo de valor no exceda el tamaño del búfer asignado para la cadena.

En este sentido recomiendo siempre definir en el campo Format además de las especificaciones de conversión también el tamaño máximo de la cadena que se puede adquirir. Entonces, como puede ver en el ejemplo a continuación en el campo Format el símbolo % siempre va seguido de la definición de la longitud máxima definida para la variable de resultado.

Uso de expresiones regulares

El especificador de función también se puede definir usando expresiones regulares, aquí hay algunos ejemplos.

// 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]

Ejemplos

Cómo utilizar los ejemplos..
Aquí hay algunos ejemplos de adquisición de valor variable de una cadena.

Laboratorio lógico (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]
¿Le resultó útil este artículo?