COMM_REC_SEND

Aguarda a recepção de um pacote de dados por um canal de comunicação e, opcionalmente, envia um pacote de resposta na mesma transação, tratando o conteúdo de forma agnóstica. É um bloco de função (mantém estado entre scans; requer instância) e exige o canal previamente configurado para o protocolo ASCII (com ou sem SOF/EOF).

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

Bloco de função

             COMM_REC_SEND
         +--------------------+
BOOL ----|START       REC_SIZE|---- UINT
         |                    |
 INT ----|SEND_SIZE     RESULT|---- INT
         |                    |
 INT ----|COMM_SRC            |
         |                    |
     ----|I_PACK ------------ |----
         |                    |
     ----|O_PACK ------------ |----
         +--------------------+

Quando ativado, o bloco aguarda no canal especificado por COMM_SRC a recepção de um pacote enviado pelo equipamento remoto. Recebido o pacote, a aplicação pode montar um buffer de resposta e devolvê-lo na mesma transação; o envio da resposta é opcional, sendo possível apenas tratar o pacote recebido sem devolver nada ao equipamento remoto.

SEND_SIZE é avaliada no ciclo seguinte ao instante em que REC_SIZE se torna maior que zero (indicando que há um pacote em I_PACK a tratar). O comportamento depende do valor presente na entrada:

  • SEND_SIZE igual a zero — o bloco aguarda sem ação. Se a aplicação demorar a montar a resposta, pode ocorrer timeout na transação, encerrando-a com erro (reportado em RESULT).

  • SEND_SIZE maior que zero — o bloco inicia a transmissão do pacote presente em O_PACK; o número de bytes transferidos é definido por SEND_SIZE.

  • SEND_SIZE menor que zero — a transação é encerrada, retornando REC_SIZE para 0 e RESULT para SUCCESS (0). Quando não for necessário enviar resposta, é importante executar este encerramento para que a transação corrente seja finalizada corretamente. Caso contrário, o bloco só poderá receber um novo pacote após o timeout da transação — e, se o canal for TCP/IP, a conexão com o equipamento remoto será fechada.

Os parâmetros I_PACK e O_PACK podem ser vetores de qualquer tipo de dados ou estruturas. O pacote recebido é transferido para I_PACK tal como foi recebido; se o canal associado possuir SOF ou EOF, esses dados não são transferidos para o parâmetro.

Importante

Caso a aplicação precise enviar o pacote com SOF e/ou EOF, é de sua responsabilidade inserir esses valores no buffer de retorno O_PACK. Os valores de SOF e EOF configurados na base de comunicação são utilizados apenas para a recepção dos pacotes.

Para conhecer melhor o recurso e suas funcionalidades, acesse o vídeo tutorial Trabalhando com Bloco de Função COMM_REC_SEND.

O canal de comunicação em COMM_SRC é identificado por um valor numérico (tipo COMM_CHAN_ID), conforme a tabela:

Identificador (namespace HILS)

Valor

Canal

COM1_PORT_ID .. COM8_PORT_ID

0 .. 7

Portas seriais COM1 a COM8.

SOCK0_PORT_ID .. SOCK7_PORT_ID

8 .. 15

Sockets TCP/IP 0 a 7 (interface Ethernet principal).

ETH2_SOCK0_PORT_ID .. ETH2_SOCK7_PORT_ID

16 .. 23

Sockets TCP/IP 0 a 7 da segunda interface Ethernet.

Parâmetros

Nome

Direção

Tipo

Padrão

Faixa / Unidade

Descrição

START

IN

BOOL

FALSE

—

Ativa/cancela o processamento do bloco. Opera por transição.

SEND_SIZE

IN

INT

0

bytes

Tamanho do pacote a retornar ao cliente. Aguarda enquanto 0; envia se > 0; encerra a transação se < 0.

COMM_SRC

IN

INT

0

COMM_CHAN_ID

Identificador do canal de comunicação a utilizar.

I_PACK

IN_OUT

ANY

—

—

Pacote recebido do cliente no canal especificado.

O_PACK

IN_OUT

ANY

—

—

Pacote enviado como resposta ao cliente no canal especificado.

REC_SIZE

OUT

UINT

0

bytes

Se > 0, número de bytes recebidos e disponíveis em I_PACK.

RESULT

OUT

INT

0

RET_CODE

Código de retorno da última transação (ver Códigos de retorno).

Códigos de retorno

RESULT carrega o código de retorno da última transação. Use os identificadores com o namespace HILS (ex.: HILS.CO_REC_TMO). Códigos mais comuns deste bloco:

Código

Identificador

Significado

0

SUCCESS

Transação executada com sucesso.

10

GL_CMD_TMO

Timeout na execução do comando.

63

CO_CONEX_FAIL

Falha no processo de conexão.

64

CO_DEV_UNCONN

Desconexão realizada pelo equipamento remoto.

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.

78

CO_TRA_TMO

Timeout na transmissão do frame.

79

CO_REC_TMO

Timeout na recepção do frame.

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

Pré-condições

  • O canal indicado em COMM_SRC deve estar configurado para o protocolo ASCII (com ou sem SOF/EOF).

  • O_PACK deve estar montado antes de ativar o envio via SEND_SIZE > 0.

Observações

  • RESULT é atualizado enquanto a transação está em andamento.

  • Quando não houver resposta a enviar, force SEND_SIZE < 0 para encerrar a transação e liberar o bloco para receber um novo pacote.

  • Para canais TCP/IP, um timeout de transação fecha a conexão com o equipamento remoto.

Ver também

COMM_SEND_REC

Exemplo

Clique aqui para baixar a tabela de variáveis

Código ST

 VAR
     MY_START   : BOOL;                 (* Flag de inicialização do processo *)
     MY_TRANS   : HILS.COMM_REC_SEND;   (* Instancia do bloco de comunicação COMM_REC_SEND *)
     MY_IBUF    : ARRAY [0..9] OF SINT; (* Buffer que receberá o pacote remoto *)
     MY_OBUF    : ARRAY [0..9] OF SINT; (* Buffer utilizado para enviar a resposta *)
     O_PACK_LEN : INT := 0;             (* Tamanho do pacote a ser enviado *)
 END_VAR

 (* ... *)
 (* aguarda recepção do pacote remoto e envia pacote de resposta *)

 MY_TRANS(
   START     := MY_START,          // Inicia uma transacao de comunicação (ativa na transição de subida)
   SEND_SIZE := O_PACK_LEN,        // tamanho da resposta
   COMM_SRC  := HILS.COM1_PORT_ID, // Identificador do canal de comunicacação (COM1)
   I_PACK    := MY_IBUF,           // buffer para receber o pacote de dados remoto
   O_PACK    := MY_OBUF            // buffer utilizado para montar a resposta para o equipamento remoto
   );
 (* aguarda recepção do pacote remoto *)
 IF (MY_TRANS.REC_SIZE > 0) THEN

   IF (O_PACK_LEN = 0) THEN
     (* pacote de dados recebido. Monta o pacote de resposta 'OK'+CR+LF *)
     MY_OBUF[0] := 16#4F; // O
     MY_OBUF[1] := 16#4B; // K
     MY_OBUF[2] := 16#0D; // CR
     MY_OBUF[3] := 16#0A; // LF
     O_PACK_LEN := 4; // tamanho do buffer de resposta
   END_IF;

 END_IF;

 // Aguarda o fim do processo de transmissão
 IF ((O_PACK_LEN > 0) AND (MY_TRANS.REC_SIZE = 0)) THEN
   (* Fim da transação corrente *)
   (* ... *)
   // Reseta o flag de inicializacao
   MY_START := FALSE;
   // reseta condição inicial do processo
   O_PACK_LEN := 0;
   IF (MY_TRANS.RESULT = HILS.SUCCESS) THEN
     (* transação realizada com sucesso *)
     (* ... *)

   ELSE
     (* transação realizada com falha *)
     (* ... *)

   END_IF;

 END_IF;
 (* ... *)