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