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 a serem enviados pelo canal especificado.

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 READY vai para TRUE.

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

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.

Pré-condições

  • O canal indicado em COMM_SRC deve estar configurado para protocolo ASCII (com ou sem SOF/EOF) e disponível no equipamento.

  • O_PACK deve conter o pacote montado e SEND_BYTES deve refletir seu tamanho antes de ativar START.

Observações

  • O conteúdo dos dados enviados e recebidos é tratado de forma agnóstica pelo bloco.

  • Com REPLY em 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

COMM_REC_SEND

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;
(* ... *)