MDB_DATA_COMM_EX

Encaminha um serviço de comunicação MODBUS para ler ou escrever dados em um dispositivo remoto por qualquer canal do equipamento. Comparado a MDB_DATA_COMM, acrescenta a gerência de conexão/desconexão TCP quando o canal associado é Ethernet. É um bloco de função (requer instância).

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

Bloco de função

             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

Direção

Tipo

Padrão

Faixa / Unidade

Descrição

START

IN

BOOL

FALSE

—

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

RD_WR

IN

BOOL

FALSE

—

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

TCP_CONN

IN

BOOL

FALSE

—

Habilita o tratamento de conexão TCP (canais Ethernet). Ver Observações.

ETH_IP

IN

UDINT

16#C0A800C8

IP

Endereço IP do equipamento remoto (conexão Ethernet).

ETH_PORT

IN

UINT

502

porta

Porta Ethernet do equipamento remoto (conexão Ethernet).

COMM_SRC

IN

UINT

0

0 .. 23

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

DEV_ADDR

IN

UINT

1

—

Endereço MODBUS do equipamento remoto.

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 (ver limites em Observações).

REM_VAR

IN

UINT

0

—

Variável inicial no equipamento remoto.

DATA

IN_OUT

ANY

—

—

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

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).

RD_CHG

OUT

BOOL

FALSE

—

Em uma leitura, TRUE indica que houve valores alterados.

CONNECTED

OUT

BOOL

FALSE

—

Indica conexão aberta com o equipamento remoto (conexões Ethernet).

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 (tipicamente da família CO_*). Lista completa: RET_CODE - Códigos de retorno do firmware G5.

Observações

  • TCP_CONN (canais Ethernet): quando ativo junto com START, abre a conexão TCP (usando ETH_IP/ETH_PORT) antes de enviar os dados. Com START desativado e TCP_CONN mantido ativo, a conexão permanece aberta para novas trocas. Reativar START com parâmetros de conexão alterados fecha a conexão atual e abre outra. Desativar START junto com TCP_CONN fecha a conexão. Ignorado em canais não-Ethernet.

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

  • Aguarde READY antes de avaliar RESULT.

Ver também

MDB_DATA_COMM, DATA_COMM

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_MDB_COMM : HILS.MDB_DATA_COMM_EX; (* Instância do bloco de comunicação *)
    data_coil   : VET_COIL;             (* Variável do tipo VET_COIL (usuário) *)
    data_hreg   : VET_HREG;             (* Variável do tipo VET_HREG (usuário) *)
    start_read  : BOOL;                 (* comando para início de leitura (usuário) *)
    start_write : BOOL;                 (* comando para início de escrita (usuário) *)
END_VAR

(* Lê os coils 10 a 14 do controlador remoto (COM1, endereço 1) *)
my_MDB_COMM(
          START    := start_read,   (* Ative o start_read para iniciar o processo de leitura *)
          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_MDB_COMM.READY = TRUE) THEN
  IF (my_MDB_COMM.RESULT = HILS.SUCCESS) THEN
    (* data_coil[0..4] contêm os coils lidos *)
  ELSE
    (* tratar falha de comunicação *)
  END_IF;
  start_read := FALSE; // termina a transação de leitura
END_IF;

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

(* Lê os holding registers 100 a 102 do controlador remoto *)
my_MDB_COMM(
          START    := start_write,   (* Ative o start_write para iniciar o processo de escrita *)
          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_MDB_COMM.READY = TRUE) THEN
  IF (my_MDB_COMM.RESULT = HILS.SUCCESS) THEN
    (* data_hreg[0..2] contêm os registradores lidos *)
  END_IF;
  start_write := FALSE; // termina a transação de escrita
END_IF;