SysVsscanf, extrai valores da string

Lista

Esta página faz parte do Manual de Programação IEC 61131-3. Acesse o índice.

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)); 
Círculo de Informação

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.

Imagem F SysVsscanf
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]
Esse artigo foi útil?