COMM_SEND_REC
Encaminha um serviço de comunicação enviando o pacote de dados presente em
O_PACK por qualquer canal disponível no equipamento e, opcionalmente, aguarda
um pacote de resposta em I_PACK; exige que o canal esteja previamente
configurado para protocolo ASCII (com ou sem SOF/EOF). É um bloco de função
(mantém estado entre scans; requer instância).
Biblioteca: HI_STD · Namespace: HILS · Tipo: bloco de função
Bloco de função
COMM_SEND_REC
+----------------------+
BOOL ----|START READY|---- BOOL
| |
BOOL ----|REPLY REC_BYTES|---- INT
| |
UINT ----|COMM_SRC RESULT|---- INT
| |
UINT ----|SEND_BYTES |
| |
----|O_PACK -------------- |----
| |
----|I_PACK -------------- |----
+----------------------+
Quando ativado (START na transição de subida), o bloco envia pelo canal
indicado em COMM_SRC os SEND_BYTES presentes no buffer O_PACK. Concluído
o envio, a aplicação é notificada e, se REPLY for TRUE, o bloco aguarda um pacote
de resposta do equipamento remoto, que é depositado em I_PACK. A resposta é
opcional: com REPLY em FALSE o tratamento termina após o envio. A saída READY
vai para TRUE ao concluir a transação, instante em que RESULT e REC_BYTES são
atualizados. O conteúdo dos dados enviados e recebidos é tratado de forma agnóstica.
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 exatamente como foi
recebido; se o canal associado possuir SOF ou EOF configurados, esses bytes não são
transferidos para o parâmetro.
Importante
Para operação correta, o canal de comunicação utilizado deve ser previamente configurado para operação com protocolo ASCII, com ou sem SOF e EOF.
Importante
Caso a aplicação necessite enviar o pacote com SOF e/ou EOF, é de responsabilidade
da aplicação inserir esses valores no buffer O_PACK. Os valores de SOF e EOF
configurados na base de comunicação são utilizados apenas para a recepção dos pacotes.
Parâmetros
Nome |
Direção |
Tipo |
Padrão |
Faixa / Unidade |
Descrição |
|---|---|---|---|---|---|
START |
IN |
BOOL |
FALSE |
— |
Inicia uma transação de comunicação (ativa na transição de subida). |
REPLY |
IN |
BOOL |
FALSE |
— |
Se TRUE, o bloco aguarda uma resposta do equipamento remoto após o envio. |
COMM_SRC |
IN |
UINT |
0 |
ver Canal de comunicação |
Identificador do canal de comunicação a ser utilizado. |
SEND_BYTES |
IN |
UINT |
0 |
bytes |
Quantidade de bytes de |
O_PACK |
IN_OUT |
ANY |
— |
— |
Buffer de bytes a ser enviado pelo canal de comunicação especificado. |
I_PACK |
IN_OUT |
ANY |
— |
— |
Buffer de bytes recebido pela transação (se a recepção estiver habilitada). |
READY |
OUT |
BOOL |
FALSE |
— |
TRUE indica transação de comunicação concluída. |
REC_BYTES |
OUT |
INT |
0 |
bytes |
Número de bytes recebidos do equipamento remoto. |
RESULT |
OUT |
INT |
0 |
RET_CODE |
Código de retorno da última transação (ver Códigos de retorno). Atualizado quando |
Códigos de retorno
RESULT é do tipo RET_CODE. 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. |
5 |
GL_INV_PAR |
Parâmetro(s) inválido(s). |
9 |
GL_INA_BLK |
Bloco inativo. |
10 |
GL_CMD_TMO |
Timeout na execução do comando. |
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. |
78 |
CO_TRA_TMO |
Timeout na transmissão de um frame. |
79 |
CO_REC_TMO |
Timeout na recepção de um frame. |
Lista completa dos códigos de retorno: RET_CODE - Códigos de retorno do firmware G5.
Canal de comunicação
O canal utilizado em COMM_SRC é especificado por um identificador (valor
numérico) conforme a tabela a seguir:
Identificador |
Ident. |
Descrição |
|---|---|---|
|
0 .. 7 |
Canais seriais COM1 a COM8. |
|
8 .. 15 |
Controlador Ethernet 1: sockets 0 a 7. |
|
16 .. 23 |
Controlador Ethernet 2: sockets 0 a 7. |
Pré-condições
O canal indicado em
COMM_SRCdeve estar configurado para protocolo ASCII (com ou sem SOF/EOF) e disponível no equipamento.O_PACKdeve conter o pacote montado eSEND_BYTESdeve refletir seu tamanho antes de ativarSTART.
Observações
O conteúdo dos dados enviados e recebidos é tratado de forma agnóstica pelo bloco.
Com
REPLYem FALSE, a transação encerra logo após o envio, sem aguardar resposta.Bytes de SOF/EOF configurados no canal são usados apenas na recepção e não são copiados para
I_PACK.
Ver também
Exemplo
Clique aqui para baixar a tabela de variáveis
Código ST
VAR
MY_TRANS : HILS.COMM_SEND_REC; (* Instancia do bloco de comunicação COMM_SEND_REC *)
MY_SEND : BOOL; (* Inicia uma transação *)
MY_IBUF : ARRAY [0..9] OF USINT; (* Buffer que receberá a resposta do equipamento remoto *)
MY_OBUF : ARRAY [0..9] OF USINT; (* Buffer utilizado para enviar o pacote *)
O_PACK_LEN : USINT := 0; (* Tamanho do pacote a ser enviado *)
END_VAR
(* ... *)
(* Ative a variavel MY_SEND quando desejar iniciar uma transação *)
IF (MY_SEND) THEN
(* pacote de dados a ser enviado *)
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 pacote a ser enviado
END_IF;
(* ... *)
(* aguarda envio do pacote e a resposta do equipamento remoto *)
MY_TRANS(
START := MY_SEND, // Inicia uma transação de comunicação (ativa na transição de subida)
REPLY := TRUE, // aguarda resposta do equipamento remoto
COMM_SRC := HILS.COM1_PORT_ID, // Identificador do canal de comunicação (COM1)
SEND_BYTES := O_PACK_LEN, // tamanho do pacote a ser enviado
I_PACK := MY_IBUF, // buffer para receber o pacote de resposta do equipamento remoto
O_PACK := MY_OBUF // buffer utilizado para montar o pacote a ser enviado
);
(* aguarda final da transação *)
IF (MY_TRANS.READY) THEN
IF (MY_TRANS.RESULT = 0) THEN
(* transação realizada com sucesso. Trata os dados recebidos em I_PACK *)
(* ... *)
ELSE
(* transação realizada com falha *)
(* ... *)
END_IF;
MY_SEND := FALSE; // prepara para proxima transação
END_IF;
(* ... *)