COMM_BRIDGE

Implementa uma bridge (ponte) de comunicação entre dois canais quaisquer do equipamento: cada pacote recebido pelo canal fonte (COMM_SRC) pode ser lido, processado e reencaminhado pelo canal destino (COMM_DST). É um bloco de função (mantém estado entre scans; requer instância) e exige que o recurso PPE entre os dois canais esteja desabilitado.

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

Bloco de função

             COMM_BRIDGE
         +-----------------+
BOOL ----|START       GOTDT|---- BOOL
         |                 |
UINT ----|COMM_SRC     DONE|---- BOOL
         |                 |
UINT ----|COMM_DST   TCOUNT|---- UDINT
         |                 |
BOOL ----|SEND       RESULT|---- INT
         |                 |
UINT ----|PACK_LEN ------- |----
         |                 |
     ----|O_PACK --------- |----
         |                 |
     ----|I_PACK --------- |----
         +-----------------+

O processo é iniciado pela ativação de START, que deve permanecer ativa durante todo o tempo de execução do bloco.

O bloco sinaliza na saída GOTDT (pulso de um ciclo) sempre que um pacote de comunicação é recebido pelo canal COMM_SRC e transferido para o buffer I_PACK. Nesse evento, o conteúdo de I_PACK pode ser lido e processado e, opcionalmente, um pacote pode ser montado em O_PACK e enviado pelo canal COMM_DST ativando a entrada SEND.

Se o pacote recebido não exigir resposta, a entrada SEND deve ainda assim ser ativada, porém com PACK_LEN igual a zero. A conclusão de uma transação (recepção + envio, eventualmente com tamanho zero) é sinalizada por um pulso em DONE.

Importante

Para utilizar este bloco, o recurso PPE entre os dois canais deve estar desabilitado. É possível desabilitar/habilitar esse recurso por meio da variável de sistema F197.

Importante

Mesmo quando não há pacote a enviar ao canal de destino, a transação deve ser encerrada ativando SEND com PACK_LEN igual a zero.

Parâmetros

Nome

Direção

Tipo

Padrão

Faixa / Unidade

Descrição

START

IN

BOOL

FALSE

—

Inicia a transação de comunicação (ativa na transição de subida); deve permanecer TRUE durante a execução.

COMM_SRC

IN

UINT

0

COMM_CHAN_ID

Identificador do canal de comunicação que recebe o pacote (ver Observações).

COMM_DST

IN

UINT

0

COMM_CHAN_ID

Identificador do canal de comunicação que envia o pacote (ver Observações).

SEND

IN

BOOL

FALSE

—

Avaliado após GOTDT: envia pelo canal COMM_DST os bytes de O_PACK (ative com PACK_LEN = 0 quando não houver resposta).

PACK_LEN

IN_OUT

UINT

0

bytes

Quantidade de bytes de O_PACK a serem enviados pelo canal COMM_DST.

O_PACK

IN_OUT

ANY

—

—

Buffer de bytes a ser enviado pelo canal COMM_DST.

I_PACK

IN_OUT

ANY

—

—

Buffer de bytes recebido do canal COMM_SRC na transação.

GOTDT

OUT

BOOL

FALSE

—

Pulso emitido após receber um pacote e transferi-lo para I_PACK.

DONE

OUT

BOOL

FALSE

—

Pulso indicando a conclusão de uma transação (recepção e envio).

TCOUNT

OUT

UDINT

0

—

Contador acumulado de transações concluídas.

RESULT

OUT

INT

0

RET_CODE

Código de retorno da recepção (quando GOTDT = TRUE) e da transação (quando DONE = TRUE); ver Códigos de retorno.

Códigos de retorno

RESULT é do tipo RET_CODE: 0 ( HILS.SUCCESS ) indica sucesso e qualquer valor diferente de zero indica falha. Use os identificadores com o namespace HILS (ex.: HILS.CO_SOCK_ERR). Códigos comuns neste bloco:

Código

Identificador

Significado

0

SUCCESS

Transação executada com sucesso.

63

CO_CONEX_FAIL

Falha no processo de conexão.

67

CO_SOCK_ERR

Erro de socket.

68

CO_TRA_BUF_OVL

Overflow no buffer de transmissão.

69

CO_REC_BUF_OVR

Overrun no buffer de recepção.

70

CO_COM_ERR

Erro genérico de comunicação.

74

CO_INV_CHA

Canal de comunicação inválido.

Lista completa dos códigos de retorno: RET_CODE - Códigos de retorno do firmware G5.

Pré-condições

  • O recurso PPE entre COMM_SRC e COMM_DST deve estar desabilitado (variável de sistema F197).

  • Os canais indicados em COMM_SRC e COMM_DST devem existir e estar disponíveis no equipamento.

  • O_PACK deve estar montado e PACK_LEN definido antes de ativar SEND (use PACK_LEN = 0 quando não houver resposta).

Observações

  • A saída GOTDT é um pulso; leia/processe I_PACK no ciclo em que ela estiver ativa.

  • Uma transação corresponde à recepção de um pacote por COMM_SRC e ao envio (eventualmente de tamanho zero) de um pacote por COMM_DST, encerrada por um pulso em DONE.

  • Os canais COMM_SRC e COMM_DST são identificados por um valor numérico. O tipo COMM_CHAN_ID da biblioteca HI_STD fornece os identificadores correspondentes:

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.

Ver também

COMM_SEND_REC, COMM_REC_SEND, CONFIG_SERIAL

Exemplo

Clique aqui para baixar a tabela de variáveis

Código ST

VAR
    BF_COMM_BRIDGE : HILS.COMM_BRIDGE;       (* Bridge de comunicacao *)
    START          : BOOL := FALSE;          (* Start do bloco COMM_BRIDGE *)
    SEND_NOW       : BOOL := FALSE;          (* Habilita envio da resposta *)
    PACK_LEN       : UINT;                   (* Tamanho do pacote O_PACK a ser enviado *)
    BUFF           : ARRAY [0..99] OF USINT; (* Buffer de recepcao/envio *)
END_VAR

(* Implementa uma bridge transparente, encaminhando para o canal destino
   todos os pacotes recebidos no canal fonte. *)

BF_COMM_BRIDGE(
  START    := START,               (* Inicia a transacao (transicao de subida) *)
  COMM_SRC := HILS.SOCK1_PORT_ID,  (* Canal de comunicacao que recebe o pacote *)
  COMM_DST := HILS.SOCK2_PORT_ID,  (* Canal de comunicacao que envia o pacote *)
  SEND     := SEND_NOW,            (* Flag de envio pelo canal COMM_DST *)
  PACK_LEN := PACK_LEN,            (* Bytes de O_PACK a enviar *)
  O_PACK   := BUFF,                (* Buffer a ser enviado *)
  I_PACK   := BUFF                 (* Buffer recebido na transacao *)
  );

IF BF_COMM_BRIDGE.GOTDT THEN
  SEND_NOW := TRUE; (* Encaminha para o destino o pacote recebido *)
END_IF;

IF BF_COMM_BRIDGE.DONE THEN
  SEND_NOW := FALSE; (* Termina o processamento da transacao *)
END_IF;