COMM_REC_SEND

A função deste bloco é encaminhar um serviço de comunicação, permitindo obter e opcionalmente enviar dados da aplicação para um dispositivo remoto através de qualquer um dos canais de comunicação disponíveis no equipamento.

O bloco quando ativado, inicialmente aguarda no canal de comunicação especificado pela recepção de um pacote de dados enviado pelo equipamento remoto. Uma vez recebido o pacote de dados, a aplicação pode montar em um buffer de resposta e devolve-lo na mesma transação de comunicação. O envio desta resposta é opcional e é possível apenas tratar o pacote recebido sem devolver nada para o equipamento remoto.

Este bloco trata o conteúdo dos dados obtidos e enviados de forma agnóstica.

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.

Ver também

Consulte o bloco COMM_SEND_REC para enviar e opcionalmente receber um pacote de um equipament remoto.

Bloco

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

Dica

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

Parâmetros

Nome

Classe

Tipo

Dim.

V. Ini.

Descrição

START

Entrada

BOOL

FALSE

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

SEND_SIZE

Entrada

INT

0

Tamanho em bytes do pacote a ser retornado para o cliente do canal especificado. Aguarda para enviar enquanto zero. (se < 0 não)

COMM_SRC

Entrada

INT

0

Identificador do canal de comunicação a ser utilizado (tipo COMM_CHAN_ID)

I_PACK

Entrada/Saída

ANY

Pacote recebido do cliente no canal especificado

O_PACK

Entrada/Saída

ANY

Pacote enviado como resposta para o cliente no canal especificado

REC_SIZE

Saída

UINT

0

Se > 0, indica o nro. de bytes recebidos pelo bloco e disponível em I_PACK.

RESULT

Saída

INT

0

Código de retorno da última transação executada. É atualizado enquanto a saída PA for para TRUE.

SEND_SIZE

A entrada SEND_SIZE é avaliada pelo bloco no próximo ciclo após o valor da saída REC_SIZE se tornar maior que zero. Quando REC_SIZE for maior que zero indicando que existe um pacote de dados em I_PACK a ser tratado, o bloco avalia o estado da entrada SEND_SIZE e executa as seguintes ações dependendo do valor presente no parâmetro:

  • Se SEND_SIZE é igual a zero o bloco aguarda sem nenhuma ação. Neste caso se a aplicação demorar a montar o pacote de resposta poderá ocorrer um timeout na transação terminando a mesma com erro (reportado no parametro RESULT);

  • Se SEND_SIZE for maior que zero o bloco inicia o processo de transmissão do pacote presente no parâmetro O_PACK sendo que o nro de bytes transferidos é definido pelo valor de SEND_SIZE;

  • Se SEND_SIZE for menor que zero, a transação é encerrada, retornando REC_SIZE para 0 e RESULT para SUCCESS(0). Note que é importante, quando a aplicação não necessitar de enviar uma resposta para o equipamento remoto, que este processo seja executado para que o ciclo da transação corrente possa ser encerrado corretamente. Caso contrário, o bloco só estará apto a receber um novo pacote do equipamento remoto quando ocorrer o timeout da transação corrente. Caso ocorra o timeout e o canal for TCP/IP a conexão com o equipamento remoto será fechada.

I_PACK e O_PACK

Os parâmetros I_PACK e O_PACK podem ser vetores de qualquer tipo de dados ou estruturas. Cabe ressaltar que, o pacote de dados recebido é transferido para o parâmetro I_PACK da mesma forma que foi recebido. Se o canal associado possuir SOF ou EOF, estes dados não são transferidos para o parâmetro.

Importante

Caso a aplicação necessite enviar o pacote de dados com SOF e/ou EOF é de responsabilidade da aplicação inserir estes valores no parametro de retorno 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.

COMM_SRC

O canal de comunicação utilizado é especificado por um identificador (valor numérico) conforme indicado na tabela a seguir:

Nome

Ident.

Descrição

HILS.COM1_PORT_ID

0

Canal serial COM1

HILS.COM2_PORT_ID

1

Canal serial COM2

HILS.COM3_PORT_ID

2

Canal serial COM3

HILS.COM4_PORT_ID

3

Canal serial COM4

HILS.COM5_PORT_ID

4

Canal serial COM5

HILS.COM6_PORT_ID

5

Canal serial COM6

HILS.COM7_PORT_ID

6

Canal serial COM7

HILS.COM8_PORT_ID

7

Canal serial COM8

HILS.SOCK0_PORT_ID

8

Controlador Ethernet 1: Socket 0

HILS.SOCK1_PORT_ID

9

Controlador Ethernet 1: Socket 1

HILS.SOCK2_PORT_ID

10

Controlador Ethernet 1: Socket 2

HILS.SOCK3_PORT_ID

11

Controlador Ethernet 1: Socket 3

HILS.SOCK4_PORT_ID

12

Controlador Ethernet 1: Socket 4

HILS.SOCK5_PORT_ID

13

Controlador Ethernet 1: Socket 5

HILS.SOCK6_PORT_ID

14

Controlador Ethernet 1: Socket 6

HILS.SOCK7_PORT_ID

15

Controlador Ethernet 1: Socket 7

HILS.ETH2_SOCK0_PORT_ID

16

Controlador Ethernet 2: Socket 0

HILS.ETH2_SOCK1_PORT_ID

17

Controlador Ethernet 2: Socket 1

HILS.ETH2_SOCK2_PORT_ID

18

Controlador Ethernet 2: Socket 2

HILS.ETH2_SOCK3_PORT_ID

19

Controlador Ethernet 2: Socket 3

HILS.ETH2_SOCK4_PORT_ID

20

Controlador Ethernet 2: Socket 4

HILS.ETH2_SOCK5_PORT_ID

21

Controlador Ethernet 2: Socket 5

HILS.ETH2_SOCK6_PORT_ID

22

Controlador Ethernet 2: Socket 6

HILS.ETH2_SOCK7_PORT_ID

23

Controlador Ethernet 2: Socket 7

Este texto pode ser utilizado como parâmetro pois esta definido no tipo COMM_CHAN_ID disponível na biblioteca HI_STD.

Cada equipamento possui um sub-conjunto dos recursos de comunicação indicados na tabela acima. Para identificar quais recursos estão disponíveis em um dado equipamento, consulte o manual do mesmo.

Exemplo

Declaração de Variáveis

Nome

Tipo

Dimensão

Valor Inicial

Descrição

MY_START

BOOL

Flag de inicialização do processo

MY_TRANS

COMM_REC_SEND

Instancia do bloco de comunicação COMM_REC_SEND

MY_IBUF

SINT

[0..9]

Buffer que receberá o pacote remoto

MY_OBUF

SINT

[0..9]

Buffer utilizado para enviar a resposta

O_PACK_LEN

UINT

0

Tamanho do pacote a ser enviado

Clique aqui para baixar a tabela de variáveis

Código ST

(* ... *)
(* aguarda recepção do pacopte 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 pacopte 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;
(* ... *)