Esta função lê a string Str e interpreta seu conteúdo com base na sequência definida em Format que especifica o formato no qual interpretar a variável. No VarType o tipo de variável é indicado em e VarAdd seu endereço.
A função retorna TRUE se valor variável encontrado, caso contrário FALSE.
Substitui "SysVarsscanf"
Substitui a função SysVarsscanf alterando o tipo de parâmetros de entrada de string para ponteiro para string. A declaração anterior:
i:=SysVarsscanf(ADR(AStr), 'Value:%d', UDINT_TYPE, ADR(AVar));
Torna-se:
i:=SysVsscanf(ADR(AStr), ADR('Value:%d'), VR_TYPE#UDINT_TYPE, ADR(AVar));
Função
CoDeSys: Indisponível
Laboratório de lógica: eLLabXUnified12Lib
descrição
Str (@STRING) Ponteiro para a variável de string da qual extrair a variável.
Format (@STRING) Possui dois tipos de argumentos, caracteres comuns que são verificados na variável String para ler e as especificações de conversão, distinguidos pelo símbolo de porcentagem (%) e por um caractere que especifica o formato com o qual interpretar a variável definida (Definição).
VarType (VR_TYPE) Tipo de variável para extrair (Definição).
VarAdd (PVOID) Endereço variável.
A função retorna uma variável (BOOL), FALSE se erro, VERDADEIRO se a variável tiver sido adquirida.
Notas para lidar com variáveis de string
Esta função valoriza a variável cujo endereço de alocação está definido em VarAdd, e todos sabemos como é perigoso sair da dimensão definida para uma variável. Já para variáveis numéricas o tamanho é inerente ao tipo, mas nas variáveis STRING é necessário garantir que o resultado da varredura do valor não ultrapasse o tamanho do buffer alocado para a string.
Nesse sentido, recomendo sempre definir em campo Format além das especificações de conversão também o tamanho máximo da string que pode ser adquirida. Então, como você vê no exemplo abaixo no campo Format o símbolo % é sempre seguido pela definição do comprimento máximo definido para a variável de resultado.
Uso de expressões regulares
O especificador de função também pode ser definido usando expressões regulares, aqui estão alguns exemplos.
// 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]
Exemplos
Como usar os exemplos.
Aqui estão alguns exemplos de aquisição de valor variável de uma sequência.
Laboratório 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]