MDB_GATEWAY_EX
Este bloco implementa um gateway de comunicação para o protocolo MODBUS, permitindo obter valores de um ou mais equipamentos remotos e enviar variáveis automaticamente baseado em critérios de tempo ou de alteração de valores.
Utiliza o recurso de mapeamento de dados através dos canais de mapeamento de dados.
Este bloco é uma evolução do bloco de função MDB_GATEWAY, possuindo todas as funcionalidades do bloco anterior e incorporando novos recursos para configuração dinâmica dos parâmetros de acesso aos dados remotos a serem obtidos.
Bloco
MDB_GATEWAY_EX
+-------------------------+
BOOL ---|START BTR_EV|--- BOOL
| |
USINT ---|DMAP_ID ETR_EV|--- BOOL
| |
USINT ---|COMM_SRC RD_WR|--- BOOL
| |
INT ---|DYN_ID RD_CHG_EV|--- BOOL
| |
UDINT ---|DYN_ETH_IP TR_ID|--- INT
| |
UINT ---|DYN_ETH_PORT TR_CODE|--- INT
| |
TIME ---|POLL_TME TR_MDB_ID|--- INT
| |
TIME ---|PACK_TME END_CYC_EV|--- BOOL
| |
| POLL_FAIL|--- BOOL
| |
INT ---|WR_CACHE --------------- |---
+-------------------------+
Para utilização deste bloco, o usuário deverá inicialmente, utilizando o recurso de Mapeamento de dados criar um canal de mapeamento e associá-lo ao protocolo MODBUS. Em seguida, no canal de mapeamento. criado, definir os itens a serem obtidos remotamente e os itens a serem enviados. Note que todos os itens criados devem estar associados a variáveis globais exportadas.
Na lista das variáveis a serem lidas, agrupe as variáveis por endereço de comunicação se utilizado um canal serial ou por IP/Porta se utilizado um canal ethernet. Desta forma, quando o correr um erro de comunicação na leitura de uma determinada variável, as variáveis subsequentes que possuírem o mesmo endereço de comunicação ou IP/Porta serão descartadas no ciclo de aquisição corrente, evitando uma demora no processo gerada pelo timeout de falha em cada transação de leitura.
Importante
Para a utilização desse bloco, os canais de comunicação utilizados para acesso aos equipamentos devem possuir as seguintes configurações:
O protocolo de aplicação deve estar configurado como MODBUS-TCP ou MODBUS-RTU em função do equipamento remoto a ser acessado.
Se o canal for ethernet o socket associado deve estar configurado como cliente TCP/IP e com auto conexão desativada.
Se o canal for serial os parâmetros de baudrate, data bits, stop bits e paridade devem ser compatíveis com as configurações dos equipamentos a serem acessados. Adicionalmente configure o modo de operação do canal serial como MESTRE apenas.
É possível utilizar várias instâncias deste bloco em uma aplicação desde que o canal de comunicação associado não esteja operando simultaneamente em duas ou mais instâncias. Ou seja, se por exemplo a aplicação utilizar duas instâncias do MDB_GATEWAY_EX associadas ao canal COM1, estas instâncias não podem estar habilitadas simultaneamente.
Atenção
Se o bloco utilizar um socket como TCP/IP que estiver configurado como servidor escutando na porta default (502), ao ser ativado poderá bloquear os acessos de equipamentos externos via TCP/IP. Para evitar esta condição faça:
Se possível sempre programe o socket para operação como cliente TCP/IP.
Se necessária operação como servidor TCP/IP altere o número da porta de comunicação para um valor diferente do programado em todos os outros sockets configurados como servidor TCP/IP no equipamento;
Dica
Assista ao vídeo tutorial utilizando o bloco de função MDB_GATEWAY para o seu respectivo cenário:
Cenário de comunicação |
Vídeo de exemplo |
Comunicação em rede serial |
|
Comunicação em rede ethernet |
Caso tenha dúvidas sobre como configurar um socket assista ao tutorial: Configurando recursos de conectividade do equipamento.
Parâmetros
Nome |
Classe |
Tipo |
Dim. |
V. Ini. |
Opções |
Descrição |
START |
Entrada |
BOOL |
n_retain |
Inicia operação do gateway |
||
DMAP_ID |
Entrada |
USINT |
Id do mapeamento de dados associado ao bloco |
|||
COMM_SRC |
Entrada |
USINT |
Canal de comunicação utilizado para acesso equipamento Modbus (ex: COM1_PORT_ID) |
|||
DYN_ID |
Entrada |
INT |
0 |
n_retain |
Quando BTR_EV estiver ativo permite definir um novo ID de comunicação para aproxima transação |
|
DYN_ETH_IP |
Entrada |
UDINT |
16#00000000 |
n_retain |
Quando BTR_EV estiver ativo permite definir um novo IP para a proxima transação de comunicação |
|
DYN_ETH_PORT |
Entrada |
UINT |
0 |
n_retain |
Quando BTR_EV estiver ativo permite definir uma nova PORTA ethernet para a proxima transação de comunicação |
|
POLL_TME |
Entrada |
TIME |
T#20ms |
Tempo a ser aguardado entre um ciclo de comunicação (lista de transações de leitura) |
||
PACK_TME |
Entrada |
TIME |
T#10ms |
Tempo a ser aguardado entre cada transação de comunicação |
||
WR_CACHE |
Entrada/Saída |
INT |
[*] |
Cache de itens a serem enviados ao equipamento remoto (deve ser fornecido um vetor de tipos INT) |
||
BTR_EV |
Saída |
BOOL |
n_retain |
Sinaliza o início de uma nova transação de leitura ou escrita. |
||
ETR_EV |
Saída |
BOOL |
n_retain |
Sinaliza o fim da transação corrente. |
||
RD_WR |
Saída |
BOOL |
n_retain |
Indica o tipo de transação em execução (0: leitura, 1: escrita) |
||
RD_CHG_EV |
Saída |
BOOL |
n_retain |
Indica que a variavel adquirida é diferente do valor anterior presente na base global |
||
TR_ID |
Saída |
INT |
n_retain |
Id do item no canal de mapeamento da transação corrente (na ativação de TR_EV) |
||
TR_CODE |
Saída |
INT |
n_retain |
Código de retorno da transação corrente (na ativação de ETR_EV) |
||
TR_MDB_ID |
Saída |
INT |
n_retain |
Id de comunicação da transação corrente (na ativação de BTR_EV) |
||
END_CYC_EV |
Saída |
BOOL |
n_retain |
Quando ativo, indica que terminou um ciclo de aquisição de items nos equipamentos remotos |
||
POLL_FAIL |
Saída |
BOOL |
n_retain |
Ativa quando ao final de um ciclo de comunicação ocorrer alguma transação com falha |
Entradas
START
Entrada de controle do bloco. Quando inativa o bloco interrompe todas as transações de comunicação. Neste cenário itens não são enviados nem mantidos na WR_CACHE para envio. Quando ativada esta entrada, o bloco inicia o processo de polling de dados no equipamento remoto e aceita itens na WR_CACHE para serem enviados.
MAP_ID
Esta entrada define qual o canal de remapeamento está associado ao bloco. Note que este canal deve ser configurado com o protocolo MODBUS ou o bloco ira gerar um código de erro indicando que o recurso não foi encontrado.
Importante
Este parâmetro só pode ser alterado quando o bloco estiver inativo ou seja, o parâmetro START deve ser igual a FALSE.
Alterações neste parametro com o bloco em operação irão gerar erro no processamento do mesmo.
COMM_SRC
Identificador do canal serial ou do socket ethernet a ser utilizado para acesso aos equipapamentos remotos. Este canal de comunicação utilizado é especificado por um identificador (valor numérico) conforme indicado na tabela a seguir:
Nome [1] |
Ident. |
Descrição [3] |
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 |
HILS.CBUS_ID |
24 |
Interface CBUS (disponível no P7C) |
O bloco MDB_GATEWAY_EX permite que a aplicação altere dinamicamente este parâmetro, possibilitando que uma única instância de comunicação utilize mais de um canal de comunicação para acesso aos equipamentos remotos. Quando necessário utilizar este recurso, o valor de COMM_SRC deve ser alterado apenas quando a saída BTR_EV estiver ativa, indicando que uma nova transação de comunicação ira iniciar. Neste instante, o parâmetro TR_ID irá informar para a aplicação qual a transação que será realizada através do número do item no canal de mapeamento de dados de leitura.
DYN_ID
Esta entrada é utilizada quando:
A aplicação necessitar configurar dinamicamente o endereço de comunicação MODBUS do equipamento a ser acessado na próxima transação de comunicação. Se o endereço de comunicação for o definido no canal de mapeamento, apenas mantenha esta entrada com o valor ZERO.
Quando o usuário necessitar ignorar a transação corrente.
Quando necessário utilizar este recurso, o valor de DYN_ID deve ser alterado apenas quando a saída BTR_EV estiver ativa, indicando que uma nova transação de comunicação irá iniciar. Neste instante, o parâmetro TR_ID juntamente com o parâmetro RD_WR informarão para a aplicação qual a transação que será realizada através do número do item no canal de mapeamento de dados recebidos (se RD_WR igual a FALSE), ou no canal de mapeamento de dados enviados (se RD_WR igual a TRUE). Altere DYN_ID com o endereço de comunicação a ser utilizado na transação a ser iniciada. Note que, quando este parâmetro for alterado para um valor diferente de ZERO nas transações seguintes (de leitura ou escrita) o valor de DYN_ID continuará a ser utilizado, até que seja retornado para ZERO novamente e, neste caso o endereço de comunicação a ser utilizado será o valor presente no campo Com. Id definido na especificação da transação no canal de mapeamento.
Se o usuário necessitar cancelar a transação corrente basta colcar o valor -1 no campo DYN_ID. Nesta condição, é gerado um evento na saída ETR_EV e a saída TR_CODE retornará o valor HILS.GL_CMD_CANC.
DYN_ETH_PORT
Esta entrada é utilizada quando a aplicação necessitar configurar dinamicamente o valor da porta ethernet para acesso ao equipamento remoto na próxima transação de comunicação. Se a porta ethernet for a definida no canal de mapeamento, apenas mantenha esta entrada com o valor ZERO.
Quando necessário utilizar este recurso, o valor de DYN_ETH_PORT deve ser alterado apenas quando a saída BTR_EV estiver ativa, indicando que uma nova transação de comunicação irá iniciar. Neste instante, o parâmetro TR_ID juntamente com o parâmetro RD_WR informarão para a aplicação qual a transação que será realizada através do número do item no canal de mapeamento de dados recebidos (se RD_WR igual a FALSE), ou no canal de mapeamento de dados enviados (se RD_WR igual a TRUE). Altere DYN_ETH_PORT com o número da porta ethernet a ser utilizada na transação a ser iniciada. Note que, quando este parâmetro for alterado para um valor diferente de ZERO nas transações seguintes (de leitura ou escrita) o valor de DYN_ETH_PORT continuará a ser utilizado, até que seja retornado para ZERO novamente e, neste caso a porta a ser utilizada será o valor presente no campo Acesso TCP/IP definido na especificação da transação no canal de mapeamento.
DYN_ETH_IP
Esta entrada é utilizada quando a aplicação necessitar configurar dinamicamente o valor do IP para acesso ao equipamento remoto na próxima transação de comunicação. Se o IP a ser utilizado for o definida no canal de mapeamento, apenas mantenha esta entrada com o valor ZERO.
Quando necessário utilizar este recurso, o valor de DYN_ETH_IP deve ser alterado apenas quando a saída BTR_EV estiver ativa, indicando que uma nova transação de comunicação irá iniciar. Neste instante, o parâmetro TR_ID juntamente com o parâmetro RD_WR informarão para a aplicação qual a transação que será realizada através do número do item no canal de canal de mapeamento de dados recebidos (se RD_WR igual a FALSE), ou no canal de mapeamento de dados enviados (se RD_WR igual a TRUE). Altere DYN_ETH_IP com o número do IP a ser utilizado na transação a ser iniciada. Note que, quando este parâmetro for alterado para um valor diferente de ZERO nas transações seguintes (de leitura ou escrita) o valor de DYN_ETH_IP continuará a ser utilizado, até que seja retornado para ZERO novamente e, neste caso o IP a ser utilizada será o valor presente no campo Acesso TCP/IP definido na especificação da transação no canal de mapeamento.
POLL_TME
Esta entrada define o tempo a ser aguardado sempre que for concluído um ciclo de comunicação. Este ciclo compreende a leitura de todos os itens configurados no canal de mapeamento de dados recebidos. O valor default para esta entrada é de 20 ms (T#20ms).
PACK_TME
Esta entrada define o tempo a ser aguardado sempre que for concluída uma transação de comunicação ou seja a leitura de um bloco de dados de um equipamento remoto. O valor default para esta entrada é de 10 ms (T#10ms).
Entradas/Saídas
WR_CACHE
Este parâmetro fornece para o bloco uma cache onde serão inseridos os ID’s dos itens a serem enviados para os equipamentos remotos pelo canal MODBUS associado ao bloco. Um ID representa o valor numérico associado a linha do canal de mapeamento. Cada ID consequentemente mapeia uma variável global da aplicação com um endereço MODBUS de um dado equipamento remoto. Esta cache portanto deve ser um vetor de tipos INT com o tamanho definido pela aplicação. Os itens a serem enviados para os equipamentos remotos devem ser inseridos nesta cache através da função COMM_NOTIFY_ITEM. Uma vez inserido um item, o bloco é responsável por remover este item e enviá-lo para o equipamento remoto.
Importante
A declaração de WR_CACHE deverá incluir um tamanho mínimo de 1, mesmo que o bloco não seja utilizado para enviar itens.
Saídas
BTR_EV
Sinaliza o início do uma nova transação de comunicação. Esta saída permanece ativa durante o ciclo imediatamente antes do início de uma nova transação de leitura ou escrita de dados. Através da saída RD_WR pode-se identificar se a transação foi de leitura (RD_WR = FALSE) ou de escrita (RD_WR = TRUE).
É utilizada para permitir ao programa de aplicação:
Cancelar a transação corrente;
Alterar o canal de comunicação a ser utilizado na próxima transação de comunicação;
Alterar o endereço de comunicação a ser utilizado na próxima transação de comunicação;
Alterar a porta ethernet a ser utilizado na próxima transação de comunicação, quando o canal associado for um sockt ethernet;
Alterar o IP a ser utilizado na próxima transação de comunicação, quando o canal associado for um sockt ethernet.
ETR_EV
Sinaliza o fim da transação de comunicação corrente. Esta saída permanece ativa durante o ciclo imediatamente após o término da transação de leitura ou escrita de dados corrente. Através da saída RD_WR pode-se identificar se a transação foi de leitura (RD_WR = FALSE) ou de escrita (RD_WR = TRUE).
Neste instante a aplicação consegue obter o resultado da transação encerrada, interpretando o valor presente na saída TR_CODE.
RD_WR
Indica o tipo de transação que será iniciada ou foi encerrada (0: leitura, 1: escrita). Este parâmetro deve ser avaliado apenas na ocorrência do evento BTR_EV ou ETR_EV.
TR_ID
Informa o número da transação de comunicação que será iniciada ou foi encerrada. Este parâmetro deve ser avaliado apenas na ocorrência do evento BTR_EV ou ETR_EV.
TR_CODE
Informa o resultado da transação de comunicação que foi encerrada. Este parâmetro deve ser avaliado apenas na ocorrência do evento ETR_EV. O valor ZERO indica que a transação de comunicação foi executada com sucesso e, neste caso o valor da variável global associada a transação foi atualizada. Valores diferentes de ZERO indicam uma condição de erro na transação. Consulte RET_CODE - Códigos de retorno do firmware G5 para mais informações.
TR_MDB_ID
Saída que especifica o ID de comunicação do item associado ao último processo de leitura do equipamento remoto. É valido no momento que a saída ETR_EV for sinalizada.
RD_CHG_EV
Indica que a variavel adquirida na transação de leitura corrente é diferente do valor anterior presente na base de variaveis globais. No instante que este evento for sinalizado, o parâmetro TR_ID fornecerá a informação do item associado na base de dados recebidos do canal de mapeamento. Esta saída, quando ocorrer é sincronizada com o a saída ETR_EV e portando os parâmetros TR_ID e TR_CODE estão disponíveis para serem avaliados pela aplicação.
END_CYC_EV
Saída lógica que gera um pulso (se mantém ativa por um ciclo de scan da aplicação) para indicar o final de um ciclo de aquisição (aquisição de todos os itens de leitura da lista do canal de mapeamento de dados recebido associado ao bloco).
POLL_FAIL
Esta saída quando ativa, indica que, no processo de polling de leitura pelo menos uma das transações ocorreu com falha. Para identificar quais transações ocorreram com falha a aplicação deve tratar os códigos de retorno fornecidos pelo bloco (TR_CODE) nos eventos de ETR_EV. Nesta condição ao parâmetro TR_ID identifica a transação com falha.
Ver também
Bloco de função MDB_DATA_COMM_EX para enviar e receber um pacote MODBUS por um canal de comunicação.
Bloco de função COMM_NOTIFY_ITEM para inserir um item a ser enviado pelo gateway.
Bloco de função MQTT_MDB_BRIDGE para criar uma bridge de comunicação para os protocolos MQTT e MODBUS.
Bloco de função MDB_MDB_CEL_BRIDGE para criar uma bridge de comunicação MODBUS via rede celular.
Exemplo
Declaração de Variáveis
Nome |
Classe |
Tipo |
Dimensão |
Valor Inicial |
Descrição |
|---|---|---|---|---|---|
COM_START |
Local |
BOOL |
0 |
Controla a ativação do bloco |
|
COM_CACHE |
Local |
INT |
[0..9] |
Cache para escrita de itens no equipameto remoto |
|
COM_CNT_SUCCESS |
Local |
DINT |
Contador de transações de comunicação com sucesso |
||
COM_CNT_ERROR |
Local |
DINT |
Contador de transações de comunicação com falha |
||
COM_LAST_ERROR |
Local |
DINT |
Código da ultima mensagem de falha |
||
GTW_MDB_COM |
Local |
HILS.MDB_GATEWAY_EX |
Gateway MODBUS |
Código ST
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// GATEWAY MODBUS operando no canal serial COM1 utilzando o canal de mapeamento nro 3
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Cenário de teste
// +------------+
// | MESTRE MDB |
// | | RS485
// | COM1 |-----------+-----------------+
// | | | |
// | ID=1 | +------+------+ +------+------+
// +------------+ | ESCRAVO MDB | | ESCRAVO MDB |
// | | | |
// | ID=2 | | ID=4 |
// +-------------+ +-------------+
//
// A aplicação esta rodando no MESTRE MDB e le as variaveis:
// DEV_2_SEC -> MW30050 : valor do segundo do relogio do controlador com ID = 2
// DEV_2_SN -> MW30003 : nro de série do controlador com ID = 2
// DEV_4_SEC -> MW30050 : valor do segundo do relogio do controlador com ID = 4
// DEV_4_SN -> MW30003 : nro de série do controlador com ID = 4
//
// Esta lista esta configurada no canal de mapeamento nro 3
GTW_MDB_COM( // MDB_GATEWAY_EX
START := COM_START, // [BOOL] Inicia operação do gateway
DMAP_ID := 3, // [USINT] Id do mapeamento de dados associado ao bloco
COMM_SRC := HILS.COM1_PORT_ID, // [USINT] Canal de comunicação utilizado para acesso equipamento Modbus (ex: COM1_PORT_ID)
WR_CACHE := COM_CACHE // [INT] Cache de itens a serem enviados ao equipamento (deve ser fornecido um vetor de tipos INT)
);
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Avalia o resultado de cada transação de comunicação e reporta o nro de transações
// OK e o com Falha e o ultimo código de falha obtido
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
if GTW_MDB_COM.ETR_EV then // aguarda o termino de uma transação (escrita ou leitura)
// Fim de transação
if GTW_MDB_COM.TR_CODE = 0 then
// sucesso na transação corrente
COM_CNT_SUCCESS := COM_CNT_SUCCESS + 1; // Incrementa contador de sucesso para o ID atual
else
// falha na transação corrente
COM_CNT_ERROR := COM_CNT_ERROR + 1; // Incrementa contador de falhas para o ID atual
COM_LAST_ERROR := GTW_MDB_COM.TR_CODE; // Registra o código de erro
end_if;
end_if;