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