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:
|
Para consultar a lista completa dos códigos de retorno acesse: RET_CODE - Códigos de retorno do firmware G5. |
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 |
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;
(* ... *)