MDB_DATA_COMM_EX

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.

Comparando com o o bloco MDB_DATA_COMM este bloco adiciona os mecanismos de gerência de conexão e desconexão TCP quando o canal associado é ethernet.

Bloco

             MDB_DATA_COMM_EX
          +--------------------+
 BOOL ----|START          READY|---- BOOL
          |                    |
 BOOL ----|RD_WR         RESULT|---- INT
          |                    |
 BOOL ----|TCP_CONN      RD_CHG|---- BOOL
          |                    |
UDINT ----|ETH_IP     CONNECTED|---- BOOL
          |                    |
 UINT ----|ETH_PORT            |
          |                    |
 UINT ----|COMM_SRC            |
          |                    |
 UINT ----|DEV_ADDR            |
          |                    |
 UINT ----|DT_TYPE             |
          |                    |
 UINT ----|DT_SIZE             |
          |                    |
 UINT ----|REM_VAR             |
          |                    |
      ----|DATA -------------- |----
          +--------------------+

Parâmetros

Nome

Classe

Tipo

Dim.

V. Ini.

Descrição

START

Entrada

BOOL

FALSE

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

RD_WR

Entrada

BOOL

FALSE

Tipo de transferência FALSE= RD, TRUE= WR

TCP_CONN

Entrada

BOOL

FALSE

Flag para habilitar tratamento de conexão TCP

ETH_IP

Entrada

UDINT

16#C0A800C8

Endereço IP de acesso ao equipamento remoto (se conexão ethernet)

ETH_PORT

Entrada

UINT

502

Porta ethernet de acesso ao equipamento remoto (se conexão ethernet)

COMM_SRC

Entrada

UINT

0

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

DEV_ADDR

Entrada

UINT

1

Endereço MODBUS de acesso ao equipamento remoto

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

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)

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.

RD_CHG

Saída

BOOL

FALSE

Quando igual a TRUE em uma transação de leitura indica que houveram valores alterados

CONNECTED

Saída

BOOL

FALSE

Indica que existe conexão aberta com equipamento remoto (utilizado em conexões ethernet)

TCP_CONN

Este parâmetro de entrada define o comportamento do bloco quando o canal de comunicação associado é do tipo ethernet. Neste caso, quando ativado juntamente com o sinal START habilita o processo de conexão TCP para acesso ao equipamento remoto antes do envio do pacote de dados. Os parâmetros de conexão são obtidos das entradas ETH_IP e ETH_PORT. Quando a entrada START é desativada e a entrada TCP_CONN mantida ativa, o bloco mantém a conexão IP corrente aberta, permitindo a continuação da troca de pacotes dentra da conexão corrente. Se a entrada START novamente ativada e os parâmetros de conexão alterados, o bloco fecha a conexão corrente e abre uma nova conexão com os novos parâmetros (IP/PORT) especificados antes do iniciar a troca de dados. Quando a entrada START é desativada em conjunto com entrada TCP_CONN a conexão TCP corrente é fechada. Esta entrada é ignorada quando o canal de comunicação associado não for ethernet.

ETH_IP ETH_PORT

Parâmetros para abertura de conexão TCP/IP com o equipamento remoto. Estes parâmetros são ignorados quando o canal de comunicação associado não for ethernet.

COMM_SRC

O canal de comunicação utilizado é especificado por um identificador (valor numérico) 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 simultâ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(
          START     := TRUE,              // Inicia uma transacao de comunicação (ativa na transição de subida)
          COMM_SRC  := HILS.COM1_PORT_ID, // Identificador do canal de comunicaçã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(
          START     := TRUE,         // Inicia uma transacao de comunicação (ativa na transição de subida)
          COMM_SRC  := HILS.COM1_PORT_ID, // Identificador do canal de comunicaçã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   := HILS.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(
          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   := HILS.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(
          START     := TRUE,         // Inicia uma transacao de comunicação (ativa na transição de subida)
          COMM_SRC  := HILS.COM1_PORT_ID, // Identificador do canal de comunicaçã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   := HILS.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;
(* ... *)