MDB_DATA_COMM

A função deste bloco é encaminhar um serviço de comunicação, permitindo obter e enviar dados da aplicação para um dispositivo remoto qualquer através de qualquer dos canais de comunicação disponíveis no equipamento. Este bloco trata o protocolo de comunicação utilizado de forma agnóstica.

Nota

Esta função foi classificada como obsoleta e é mantida na biblioteca apenas para compatibilidade como aplicações legadas.

Para novos projetos utilize a função MDB_DATA_COMM_EX, disponível na biblioteca HI_STD.

Bloco

            MDB_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
        |                  |
        +------------------+

Parâmetros

Nome

Parâmetro

Tipo Dado

V. Ini.

Descrição

EN

Entrada

BOOL

TRUE

Habilitação de entrada

START

Entrada

BOOL

FALSE

Inicia uma transacao de comunicação (ativa na transição de subida)

COMM_SRC

Entrada

UINT

0

Identificador do canal de comunicação (0: COM1, 1:COM2, 11: SOCKET 1 … )

DEV_ADDR

Entrada

UINT

0

Endereço de comunicação do equipamento remoto

RD_WR

Entrada

BOOL

FALSE

Tipo de transferencia FALSE= RD, TRUE= WR

DT_TYPE

Entrada

UINT

0

Tipo de dado a ser transferido (BIT, BYTE, WORD … )

DT_SIZE

Entrada

UINT

1

Quantidade de variáveis do tipo especificado a serem transferidas

REM_VAR

Entrada

UINT

0

Variável inicial no equipamento remoto

ENO

Saída

BOOL

FALSE

Saida de habilitação (Ativa se a entrada EN igual a TRUE)

READY

Saída

BOOL

FALSE

Quando igual a TRUE indica transação de comunicação concluida

RESULT

Saída

INT

0

Código de retorno da ultima transação executada. É atualizado quando a saída READY for para TRUE.

DATA

Entrada/Saída

ANY

Dado a ser transferido (recebido se RD_WR igual a FALSE, a ser enviado se RD_WR igual a true)

COMM_SRC

O canal de comunicação utilizado é especificado por um identificador (valor númerico) conforme indicado na tabela a seguir:

Nome

Ident.

Descrição

HILS.COM1_PORT_ID

0

Canal serial COM1

HILS.COM2_PORT_ID

1

Canal serial COM2

HILS.COM3_PORT_ID

2

Canal serial COM3

HILS.COM4_PORT_ID

3

Canal serial COM4

HILS.COM5_PORT_ID

4

Canal serial COM5

HILS.COM6_PORT_ID

5

Canal serial COM6

HILS.COM7_PORT_ID

6

Canal serial COM7

HILS.COM8_PORT_ID

7

Canal serial COM8

HILS.SOCK0_PORT_ID

8

Controlador Ethernet 1: Socket 0

HILS.SOCK1_PORT_ID

9

Controlador Ethernet 1: Socket 1

HILS.SOCK2_PORT_ID

10

Controlador Ethernet 1: Socket 2

HILS.SOCK3_PORT_ID

11

Controlador Ethernet 1: Socket 3

HILS.SOCK4_PORT_ID

12

Controlador Ethernet 1: Socket 4

HILS.SOCK5_PORT_ID

13

Controlador Ethernet 1: Socket 5

HILS.SOCK6_PORT_ID

14

Controlador Ethernet 1: Socket 6

HILS.SOCK7_PORT_ID

15

Controlador Ethernet 1: Socket 7

HILS.ETH2_SOCK0_PORT_ID

16

Controlador Ethernet 2: Socket 0

HILS.ETH2_SOCK1_PORT_ID

17

Controlador Ethernet 2: Socket 1

HILS.ETH2_SOCK2_PORT_ID

18

Controlador Ethernet 2: Socket 2

HILS.ETH2_SOCK3_PORT_ID

19

Controlador Ethernet 2: Socket 3

HILS.ETH2_SOCK4_PORT_ID

20

Controlador Ethernet 2: Socket 4

HILS.ETH2_SOCK5_PORT_ID

21

Controlador Ethernet 2: Socket 5

HILS.ETH2_SOCK6_PORT_ID

22

Controlador Ethernet 2: Socket 6

HILS.ETH2_SOCK7_PORT_ID

23

Controlador Ethernet 2: Socket 7

Este texto pode ser utilizado como parâmetro pois esta definido no tipo COMM_CHAN_ID disponível na biblioteca HI_STD.

Cada equipamento possui um sub-conjunto dos recursos de comunicação indicados na tabela acima. Para identificar quais recursos estão disponíveis em um dado equipamento, consulte o manual do mesmo.

DT_TYPE_ID

Este identificador especifica o tamanho em bits da variável a ser transferida na transação de dados, conforme indicado na tabela a seguir:

ID

LABEL [3]

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 x 2

5

DTL_LWORD_ID

HOLDING REGISTER x 4

6

DTL_STRING_ID

HOLDING REGISTER x 123 (246 caracteres)

7

DTL_DIG_IO_ID

DISCRETE INPUTS

8

DTL_ANA_IO_ID

INPUT REGISTER

DT_SIZE

Especifica a quantidade de variáveis do tipo especificado a serem transferidas (lidas ou escritas). É importante observar que o tamanho total dos dados não pode ultrapassar o tamanho de um pacote de comunicação no protocolo selecionado. O protocolo MODBUS suporta a leitura simutânea de até 125 HOLDING REGISTER´s ou 2000 COIL´s consecutivos, ou a escrita simultânea de 123 HOLDING REGISTER´s ou 1968 COIL´s consecutivos.

DATA

Este parâmetro especifica o dado a ser transferido. Este dado pode ser um valor escalar, um vetor de um tipo de dado ou uma estrutura.

RESULT

Tipo Dado

Descrição

INT

Código de retorno na execução da função, do tipo RET_CODE, onde:

  • Se for igual a 0: Função executada com sucesso - código HILS.SUCCESS

  • Se for diferente de 0: Falha na execução da função indica o respectivo código de erro. [4]

Exemplo

Declaração de Tipos de Dados

Exemplo de declaração de uma estrutura de dados definida pelo usuário, a ser utilizada para especificar os registros de dados a serem lidos/escritos na tabela em flash.

Tipos de Dados

Derivação

Nome

Tipo

Dimensão

Descrição

VET_COIL

Array

BOOL

[0..4]

Base de status do processo

VET_HREG

Array

INT

[0..2]

Base de parâmetros de configuração

Declaração de Variáveis

Nome

Tipo

Descrição

my_DATA_COMM

HILS.DATA_COMM

Instancia do bloco de comunicação DATA_COMM

data_coil

VET_COIL

Variável do tipo “VET_COIL” definida pelo usuário

data_hreg

VET_HREG

Variável do tipo “VET_HREG” definida pelo usuário

Clique aqui para baixar a tabela de variáveis

Código ST

(* Exemplo de leitura de variável do tipo "coil" *)
(* ... *)
(* Le os "coil" número 10 a 14 do controlador remoto *)
my_DATA_COMM(
          EN        := TRUE,              // Habilitação de entrada
          START     := TRUE,              // Inicia uma transacao de comunicação (ativa na transição de subida)
          COMM_SRC  := HILS.COM1_PORT_ID, // Identificador do canal de comunicacação (COM1)
          DEV_ADDR  := 1,            // Endereço de comunicação do equipamento remoto
          RD_WR     := FALSE,        // Tipo de transferencia FALSE= RD, TRUE= WR
          DT_TYPE   := DTL_BIT_ID,   // Tipo de dado a ser acessado (Coil)
          DT_SIZE   := 5,            // Quantidade de variáveis do tipo especificado a serem acessadas
          REM_VAR   := 10,           // Variável inicial no equipamento remoto a ser lida
          DATA      := data_coil     // Variável para armazenar os valores lidos do equipamento remoto
          );

(* aguarda conclusão da transação de comunicação *)
if (my_DATA_COMM.READY = TRUE) then
  (* testa se transação de comunicação foi realizada com SUCESSO *)
  if (my_DATA_COMM.RESULT = HILS.SUCCESS) then
      (* transação de comunicação com SUCESSO *)
      (* data_coil[0] a data_coil[4] possuem os valores lidos do equipamento remoto *)
      (* ... *)
  else
      (* transação de comunicação com FALHA *)
      (* ... *)
  end_if;
end_if;
(* ... *)

(* Exemplo de escrita de variável do tipo "coil" *)
(* ... *)
(* escreve os valores data_coil[0] a data_coil[4] nos coil número 10 a 14 do equipamento remoto *)
my_DATA_COMM(
          EN        := TRUE,         // Habilitação de entrada
          START     := TRUE,         // Inicia uma transacao de comunicação (ativa na transição de subida)
          COMM_SRC  := HILS.COM1_PORT_ID, // Identificador do canal de comunicacação (COM1)
          DEV_ADDR  := 1,            // Endereço de comunicação do equipamento remoto
          RD_WR     := TRUE,         // Tipo de transferencia FALSE= RD, TRUE= WR
          DT_TYPE   := DTL_BIT_ID,   // Tipo de dado a ser acessado (Coil)
          DT_SIZE   := 5,            // Quantidade de variáveis do tipo especificado a serem acessadas
          REM_VAR   := 10,           // Variável inicial no equipamento remoto a ser escrito
          DATA      := data_coil     // Variável para obter os valores a serem escritos no equipamento remoto
          );
(* aguarda conclusão da transação de comunicação *)
if (my_DATA_COMM.READY = TRUE) then
  (* testa se transação de comunicação foi realizada com SUCESSO *)
  if (my_DATA_COMM.RESULT = HILS.SUCCESS) then
      (* transação de comunicação com SUCESSO *)
      (* ... *)
  else
      (* transação de comunicação com FALHA *)
      (* ... *)
  end_if;
end_if;
(* ... *)

(* Exemplo de leitura de variável do tipo "holding register" *)
(* ... *)
(* Le os "holding register" número 100 a 102 do controlador remoto *)
my_DATA_COMM(
          EN        := TRUE,         // Habilitação de entrada
          START     := TRUE,         // Inicia uma transacao de comunicação (ativa na transição de subida)
          COMM_SRC  := HILS.COM1_PORT_ID, // Identificador do canal de comunicacação (COM1)
          DEV_ADDR  := 1,            // Endereço de comunicação do equipamento remoto
          RD_WR     := FALSE,        // Tipo de transferencia FALSE= RD, TRUE= WR
          DT_TYPE   := DTL_WORD_ID,  // Tipo de dado a ser acessado (Holding register)
          DT_SIZE   := 3,            // Quantidade de variáveis do tipo especificado a serem acessadas
          REM_VAR   := 100,          // Variável inicial no equipamento remoto a ser lida
          DATA      := data_hreg     // Variável para armazenar os valores lidos do equipamento remoto
          );
(* aguarda conclusão da transação de comunicação *)
if (my_DATA_COMM.READY = TRUE) then
  (* testa se transação de comunicação foi realizada com SUCESSO *)
  if (my_DATA_COMM.RESULT = HILS.SUCCESS) then
      (* transação de comunicação com SUCESSO                 *)
      (* data_hreg[0] a data_hreg[2] possuem os valores lidos do equipamento remoto *)
      (* ... *)
  else
      (* transação de comunicação com FALHA *)
      (* ... *)
  end_if;
end_if;
(* ... *)

(* Exemplo de escrita de variável do tipo "holding register" *)
(* ... *)
(* escreve os valores data_hreg[0] a data_hreg[2] nos holding register número 100 a 102 do equipamento remoto *)
my_DATA_COMM(
          EN        := TRUE,         // Habilitação de entrada
          START     := TRUE,         // Inicia uma transacao de comunicação (ativa na transição de subida)
          COMM_SRC  := HILS.COM1_PORT_ID, // Identificador do canal de comunicacação (COM1)
          DEV_ADDR  := 1,            // Endereço de comunicação do equipamento remoto
          RD_WR     := TRUE,         // Tipo de transferencia FALSE= RD, TRUE= WR
          DT_TYPE   := DTL_WORD_ID,  // Tipo de dado a ser acessado (Holding register)
          DT_SIZE   := 3,            // Quantidade de variáveis do tipo especificado a serem acessadas
          REM_VAR   := 100,          // Variável inicial no equipamento remoto a ser escrito
          DATA      := data_hreg     // Variável para obter os valores a serem escritos no equipamento remoto
          );
(* aguarda conclusão da transação de comunicação *)
if (my_DATA_COMM.READY = TRUE) then
  (* testa se transação de comunicação foi realizada com SUCESSO *)
  if (my_DATA_COMM.RESULT = HILS.SUCCESS) then
      (* transação de comunicação com SUCESSO *)
      (* ... *)
  else
      (* transação de comunicação com FALHA *)
      (* ... *)
  end_if;
end_if;
(* ... *)