DATA_COMM

Encaminha um serviço de comunicação genérico (agnóstico ao protocolo) para ler ou escrever dados em um dispositivo remoto por qualquer canal de comunicação do equipamento. É um bloco de função (requer instância).

Aviso

Função obsoleta, mantida apenas para compatibilidade com aplicações legadas. Para novos projetos use COMM_SEND_REC, COMM_REC_SEND, STR_SEND_REC ou ASCII_SR (biblioteca HI_STD).

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

Bloco de função

            DATA_COMM
        +------------------+
        |                  |
BOOL ---| EN           ENO |--- BOOL
        |                  |
BOOL ---> START      READY |--- BOOL
        |                  |
UINT ---| COMM_SRC  RESULT |--- INT
        |                  |
UINT ---| DEV_ADDR         |
        |                  |
BOOL ---| RD_WR            |
        |                  |
UINT ---| DT_TYPE          |
        |                  |
UINT ---| DT_SIZE          |
        |                  |
UINT ---| REM_VAR          |
        |                  |
 ANY ---| DATA-------------|--- ANY
        |                  |
        +------------------+

A transação é iniciada por transição de subida em START e roda ao longo de múltiplos scans; aguarde READY = TRUE para então avaliar RESULT e os dados em DATA.

Parâmetros

Nome

Direção

Tipo

Padrão

Faixa / Unidade

Descrição

EN

IN

BOOL

TRUE

—

Habilitação de entrada.

START

IN

BOOL

FALSE

—

Inicia uma transação de comunicação (transição de subida).

COMM_SRC

IN

UINT

0

0 .. 23

Identificador do canal de comunicação (ver Canais de comunicação).

DEV_ADDR

IN

UINT

0

—

Endereço de comunicação do equipamento remoto.

RD_WR

IN

BOOL

FALSE

—

Tipo de transferência: FALSE = leitura (RD), TRUE = escrita (WR).

DT_TYPE

IN

UINT

0

1 .. 8

Tipo do dado transferido (ver Tipos de dado).

DT_SIZE

IN

UINT

1

—

Quantidade de variáveis do tipo especificado a transferir (ver limites em Observações).

REM_VAR

IN

UINT

0

—

Variável inicial no equipamento remoto.

ENO

OUT

BOOL

FALSE

—

Saída de habilitação (ativa se EN = TRUE).

READY

OUT

BOOL

FALSE

—

TRUE indica transação concluída; RESULT é atualizado nesse instante.

RESULT

OUT

INT

0

RET_CODE

Código de retorno da última transação (ver Códigos de retorno).

DATA

IN_OUT

ANY

—

—

Dado transferido (recebido se RD_WR = FALSE; enviado se TRUE). Escalar, vetor ou estrutura.

Canais de comunicação (COMM_SRC)

Use os identificadores do tipo COMM_CHAN_ID (namespace HILS). Cada equipamento suporta apenas um subconjunto — consulte o manual do equipamento.

Identificador

Ident.

Descrição

HILS.COM1_PORT_ID .. COM8_PORT_ID

0 .. 7

Canais seriais COM1 a COM8.

HILS.SOCK0_PORT_ID .. SOCK7_PORT_ID

8 .. 15

Controlador Ethernet 1: sockets 0 a 7.

HILS.ETH2_SOCK0_PORT_ID .. ETH2_SOCK7_PORT_ID

16 .. 23

Controlador Ethernet 2: sockets 0 a 7.

Tipos de dado (DT_TYPE)

Identificadores do tipo TYPE_LEN_ID (namespace HILS) e o mapeamento Modbus:

ID

Identificador

Mapeamento Modbus

1

DTL_BIT_ID

COIL

2

DTL_BYTE_ID

n.d.

3

DTL_WORD_ID

HOLDING REGISTER

4

DTL_DWORD_ID

HOLDING REGISTER × 2

5

DTL_LWORD_ID

HOLDING REGISTER × 4

6

DTL_STRING_ID

HOLDING REGISTER × 123 (246 caracteres)

7

DTL_DIG_IO_ID

DISCRETE INPUTS

8

DTL_ANA_IO_ID

INPUT REGISTER

Códigos de retorno

RESULT é do tipo RET_CODE: 0 (HILS.SUCCESS) indica transação bem-sucedida; qualquer valor diferente de 0 indica falha na comunicação (consulte o catálogo de códigos RET_CODE do ambiente, tipicamente da família CO_*).

Observações

  • O total de dados não pode exceder um pacote do protocolo selecionado. Em Modbus: leitura de até 125 HOLDING REGISTER ou 2000 COIL consecutivos; escrita de até 123 HOLDING REGISTER ou 1968 COIL consecutivos.

  • Aguarde READY antes de avaliar RESULT.

Ver também

COMM_SEND_REC, COMM_REC_SEND, STR_SEND_REC, ASCII_SR

Exemplo

Clique aqui para baixar a tabela de variáveis

Código ST

TYPE
    VET_COIL : ARRAY [0..4] OF BOOL;  (* Base de status do processo *)
    VET_HREG : ARRAY [0..2] OF INT;   (* Base de parâmetros de configuração *)
END_TYPE

VAR
    my_DATA_COMM : HILS.DATA_COMM; (* Instância do bloco DATA_COMM *)
    data_coil    : VET_COIL;       (* Variável do tipo VET_COIL (usuário) *)
    data_hreg    : VET_HREG;       (* Variável do tipo VET_HREG (usuário) *)
END_VAR

(* Lê os coils 10 a 14 do controlador remoto (COM1, endereço 1) *)
my_DATA_COMM(
          EN       := TRUE,
          START    := TRUE,
          COMM_SRC := HILS.COM1_PORT_ID,
          DEV_ADDR := 1,
          RD_WR    := FALSE,             (* leitura *)
          DT_TYPE  := HILS.DTL_BIT_ID,   (* coil *)
          DT_SIZE  := 5,
          REM_VAR  := 10,
          DATA     := data_coil
          );
IF (my_DATA_COMM.READY = TRUE) THEN
  IF (my_DATA_COMM.RESULT = HILS.SUCCESS) THEN
    (* data_coil[0..4] contêm os coils lidos *)
  ELSE
    (* tratar falha de comunicação *)
  END_IF;
END_IF;

(* Escreve data_coil[0..4] nos coils 10 a 14 do remoto: mesma chamada com RD_WR := TRUE *)

(* Lê os holding registers 100 a 102 do controlador remoto *)
my_DATA_COMM(
          EN       := TRUE,
          START    := TRUE,
          COMM_SRC := HILS.COM1_PORT_ID,
          DEV_ADDR := 1,
          RD_WR    := FALSE,
          DT_TYPE  := HILS.DTL_WORD_ID,  (* holding register *)
          DT_SIZE  := 3,
          REM_VAR  := 100,
          DATA     := data_hreg
          );
IF (my_DATA_COMM.READY = TRUE) THEN
  IF (my_DATA_COMM.RESULT = HILS.SUCCESS) THEN
    (* data_hreg[0..2] contêm os registradores lidos *)
  END_IF;
END_IF;