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_SIZEigual 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 emRESULT).SEND_SIZEmaior que zero — o bloco inicia a transmissão do pacote presente emO_PACK; o número de bytes transferidos é definido porSEND_SIZE.SEND_SIZEmenor que zero — a transação é encerrada, retornandoREC_SIZEpara 0 eRESULTparaSUCCESS(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 |
Valor |
Canal |
|---|---|---|
|
0 .. 7 |
Portas seriais COM1 a COM8. |
|
8 .. 15 |
Sockets TCP/IP 0 a 7 (interface Ethernet principal). |
|
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 |
|
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 |
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_SRCdeve estar configurado para o protocolo ASCII (com ou sem SOF/EOF).O_PACKdeve estar montado antes de ativar o envio viaSEND_SIZE > 0.
Observações
RESULTé atualizado enquanto a transação está em andamento.Quando não houver resposta a enviar, force
SEND_SIZE < 0para 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
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;
(* ... *)