DATA_COMM_SCAN

Adquire ciclicamente conjuntos de pacotes de dados de equipamentos remotos através de um canal de comunicação, atualizando uma estrutura de dados local com os valores obtidos. É um bloco de função (mantém estado entre scans; requer instância). Recurso obsoleto, mantido apenas por compatibilidade com aplicações legadas.

Biblioteca: HI_STD · Namespace: HILS · Tipo: bloco de função

Bloco de função

            DATA_COMM_SCAN
         +------------------+
BOOL ----|EN             ENO|---- BOOL
         |                  |
BOOL ----|START          EOT|---- BOOL
         |                  |
UINT ----|COMM_SRC       EOC|---- BOOL
         |                  |
TIME ----|IPOLL_TME    BLOCK|---- INT
         |                  |
TIME ----|IPACK_TME   RESULT|---- INT
         |                  |
     ----|SPEC ------------ |----
         |                  |
     ----|DATA ------------ |----
         +------------------+

Cada pacote de dados corresponde a uma ou mais variáveis sequenciais de um mesmo tipo, obtidas de um equipamento com endereço distinto. A aplicação define em SPEC um vetor da estrutura DATA_PACK_SPEC (uma entrada por bloco a ser lido) e fornece em DATA a estrutura que receberá os valores adquiridos.

Enquanto ativado por START, o bloco varre os pacotes especificados, gerando um pulso em EOT ao final de cada bloco (com BLOCK e RESULT referentes a esse bloco) e um pulso em EOC ao concluir a varredura de todos os blocos.

O canal de comunicação em COMM_SRC é um valor do tipo enumerado COMM_CHAN_ID (ex.: HILS.COM1_PORT_ID = 0 para a COM1, HILS.SOCK0_PORT_ID = 8 para o socket 0). Consulte o manual do equipamento para saber quais canais estão disponíveis.

Nota

Esta função foi classificada como obsoleta e é mantida na biblioteca apenas para compatibilidade com aplicações legadas. Para novos projetos utilize o recurso de Recurso de mapeamento de dados.

Importante

O bloco de dados especificado deve poder ser obtido pelo driver de comunicação em um único pacote. Se necessário, divida-o em blocos menores.

Parâmetros

Nome

Direção

Tipo

Padrão

Faixa / Unidade

Descrição

EN

IN

BOOL

TRUE

—

Habilitação de entrada do bloco.

START

IN

BOOL

FALSE

—

Ativa o ciclo de comunicação (varredura dos pacotes).

COMM_SRC

IN

UINT

0

COMM_CHAN_ID

Canal de comunicação utilizado (identificador do tipo COMM_CHAN_ID).

IPOLL_TME

IN

TIME

T#10ms

ms

Tempo entre ciclos de comunicação.

IPACK_TME

IN

TIME

T#100ms

ms

Tempo entre pacotes de comunicação.

SPEC

IN_OUT

ANY

—

—

Vetor de DATA_PACK_SPEC com a especificação dos blocos a adquirir.

DATA

IN_OUT

ANY

—

—

Estrutura de dados que recebe os valores adquiridos remotamente.

ENO

OUT

BOOL

FALSE

—

Saída de habilitação.

EOT

OUT

BOOL

FALSE

—

Pulso ao final da transação de cada bloco de dados.

EOC

OUT

BOOL

FALSE

—

Pulso ao final da varredura de todos os blocos especificados.

BLOCK

OUT

INT

0

—

Nro. do bloco de dados tratado (inicia em zero), válido quando EOT está ativo.

RESULT

OUT

INT

0

RET_CODE

Código de retorno da transação do bloco BLOCK (ver Códigos de retorno).

Códigos de retorno

RESULT é do tipo RET_CODE e reflete a última transação concluída (EOT ativo). Use os identificadores com o namespace HILS (ex.: HILS.CO_CONEX_FAIL). Códigos mais comuns deste bloco:

Código

Identificador

Significado

0

SUCCESS

Bloco de dados adquirido com sucesso.

5

GL_INV_PAR

Parâmetro(s) inválido(s) na especificação do bloco.

10

GL_CMD_TMO

Timeout na execução do comando.

62

CO_PENDING

Comando de comunicação com tratamento pendente.

63

CO_CONEX_FAIL

Falha no processo de conexão.

70

CO_COM_ERR

Erro genérico de comunicação.

74

CO_INV_CHA

Canal de comunicação inválido.

75

CO_INV_STA

Número da estação (endereço do equipamento) inválido.

79

CO_REC_TMO

Timeout na recepção do frame.

87

CO_COM_BRO

Comunicação interrompida.

Lista completa: RET_CODE - Códigos de retorno do firmware G5.

Pré-condições

  • O canal indicado em COMM_SRC deve estar configurado e disponível no equipamento.

  • SPEC deve ser um vetor válido de DATA_PACK_SPEC e DATA deve ter capacidade suficiente para receber todos os valores adquiridos.

  • Cada bloco especificado deve caber em um único pacote de comunicação do driver.

Observações

  • Cada entrada de SPEC é uma estrutura DATA_PACK_SPEC com os campos:

    Campo

    Tipo

    Descrição

    DEV_ADDR

    UINT

    Endereço de comunicação do equipamento remoto a ser acessado.

    DATA_TYPE

    UINT

    Tipo de dado da variável a obter (vide enumerado TYPE_LEN_ID).

    DATA_SIZE

    UINT

    Quantidade de variáveis a obter no bloco solicitado.

    REM_VAR

    UINT

    Nro. da variável inicial (do tipo especificado) no equipamento remoto.

  • BLOCK e RESULT só são significativos no instante em que EOT está ativo.

Ver também

DATA_COMM, CONFIG_SERIAL, Recurso de mapeamento de dados

Exemplo

Clique aqui para baixar a tabela de variáveis

Programa que, pelo canal COM1, obtém 2 blocos de dados: o bloco 0 lê 10 variáveis WORD (Holding registers 20 a 29) do equipamento 1 a partir da variável 5; o bloco 1 lê 6 variáveis BIT (Coils 10 a 15) do equipamento 1 a partir da variável 20.

Código ST

TYPE
    (* Estrutura de destino: 10 inteiros do bloco 0 e 6 booleanos do bloco 1 *)
    USER_DATA : STRUCT
        HOLDING_REG_20_29 : ARRAY[0..9] OF UINT; (* Holding registers 20 a 29 *)
        COIL_10_15        : ARRAY[0..5] OF BOOL; (* Coils 10 a 15 *)
    END_STRUCT;
END_TYPE

VAR
    ST_SCAN   : BOOL := FALSE;                                  (* Ativa scan de dados remotos *)
    C_SRC     : UINT := 0;                                      (* Canal de comunicação (0 = COM1) *)
    BK_SPEC   : ARRAY[0..1] OF HILS.DATA_PACK_SPEC :=
                [[1,3,10,5],[1,1,6,20]];                        (* Definição dos blocos a adquirir *)
    BK_DATA   : USER_DATA;                                      (* Base de dados a receber os valores *)
    SCAN      : HILS.DATA_COMM_SCAN;                            (* Bloco de varredura de dados remotos *)
    OK_CNT    : ULINT := 0;                                     (* Nro. de ciclos de comunicação OK *)
    NOK_CNT   : ULINT := 0;                                     (* Nro. de ciclos de comunicação com falha *)
END_VAR

(* Controla o scan dos dados a serem obtidos *)
SCAN(
  (* EN        := TRUE, <- já inicializa com TRUE *)
  START     := ST_SCAN,
  COMM_SRC  := C_SRC,
  (* IPOLL_TME :=  <- mantém o default (10 ms) *)
  (* IPACK_TME :=  <- mantém o default (100 ms) *)
  SPEC      := BK_SPEC,
  DATA      := BK_DATA
  );

(* Contabiliza pacotes com sucesso e com falha *)
IF SCAN.EOT AND (SCAN.BLOCK = 1) THEN
  (* Término de um ciclo de aquisição dos pacotes *)
  IF (SCAN.RESULT = 0) THEN
    OK_CNT := OK_CNT + 1;   (* pacotes recebidos com sucesso *)
  ELSE
    NOK_CNT := NOK_CNT + 1; (* transações com falha *)
  END_IF;
END_IF;