Programa Recebe Transmite Bytes

Top 



O código-fonte abaixo demonstra a capacidade de um CLP atuar como retransmissor de informações com processamento ativo interno.



clp
Recebe_Transmite_Bytes // Recebe bytes no Port 0, inverte a posição dos seus nibbles (as duas metades de 4 bits do byte) e os retransmite no Port 1.

// Funcionamento:


// 1) Mova o foco para o campo de edição que simula o buffer do Port 0 (pressione o mouse em cima dele);


// 2) Entre com um byte neste campo (basta pressionar uma tecla de caracter ou, mantendo a tecla <Alt> pressionada, digitar o valor decimal do byte (0 a 255) no teclado numérico e, em seguida, soltar a tecla <Alt> - observando que, neste caso, os valores digitados e os correspondentes caracteres imprimíveis dependerão da página de código configurada no sistema operacional);


// 3) Acione o botão ao lado do campo (buffer) que simula recepção ou transmissão (clique com o mouse em cima dele, ou tecle <Tab> e <Enter>);


// 4) Neste momento ocorre um evento de recepção; então o tratador recebe o byte, faz o processamento programado e devolve o byte já processado ao Port 1, aguardando o evento que indicará o final de sua transmissão pelo hardware do equipamento;


// 5) Simule a ocorrência deste evento de final de transmissão pressionando o botão ao lado do "buffer" do Port 1 (o byte será apagado neste instante, completando a simulação do evento);


// 6) Fim do ciclo, o qual, seguido repetidamente, simula um fluxo contínuo de recepção, processamento e retransmissão de bytes pelo equipamento.


// Obs.: o que pode ocorrer se um byte for recebido e, antes que seja processado e retransmitido, chegar mais outro byte? Sugestão: altere este programa para que esta situação seja convenientemente tratada.


var
   I0.0    Habil_Interrup,
AQW0
Byte_Recebido_P0,
AQW1
Byte_a_Ser_Enviado_P1,
Q0.0
    Enviou_Byte,
Q1.0
    Início;

rede
1 // Habilita o tratamento de interrupções e vincula os eventos a serem tratados aos respectivos tratadores.

se
(imediato Habil_Interrup) {
se
(não Início) {

habilita_interrupções
;
vincula
Recebe_Byte à interrupção recepção_Port0;
vincula
Transmite_Byte à interrupção transmissão_Port1;

liga
imediato Enviou_Byte;

liga
Início;
}
}
senão
{
desliga
Início;
}

rede
2 // Tratamento da ocorrência do evento de recepção de byte no Port0

tratador_interrupção
Recebe_Byte ( )

se
(Enviou_Byte) {
recebe_byte
em Byte_Recebido_P0 vindo_do Port0;

Byte_a_Ser_Enviado_P1
B:= 16 * (Byte_Recebido_P0 B& 2#00001111) + (Byte_Recebido_P0 B& 2#11110000) / 16; // Inverte posição dos nibbles formadores do byte recebido

transmite_byte
Byte_a_Ser_Enviado_P1 no Port1;

desliga
imediato Enviou_Byte;
}

fim_tratador_interrupção


rede
3 // Tratamento da ocorrência do evento de término da transmissão de byte enviado no Port1

tratador_interrupção
Transmite_Byte ( )

se
(não Enviou_Byte) {
liga
imediato Enviou_Byte;
}

fim_tratador_interrupção


fim




Como resultado da compilação do programa
Recebe_Transmite_Bytes acima, o SimuPLC 4.1.0 gerou, exatamente, o seguinte código, em Lista de Instruções - IL:



// CLP    Recebe_Transmite_Bytes

// Recebe bytes no Port 0, inverte a posição dos seus nibbles (as duas metades de 4 bits do byte) e os retransmite no Port 1.
// Funcionamento:
// 1) Mova o foco para o campo de edição que simula o buffer do Port 0 (pressione o mouse em cima dele);
// 2) Entre com um byte neste campo (basta pressionar uma tecla de caracter ou, mantendo a tecla <Alt> pressionada, digitar o valor decimal do byte (0 a 255) no teclado numérico e, em seguida, soltar a tecla <Alt> - observando que, neste caso, os valores digitados e os correspondentes caracteres imprimíveis dependerão da página de código configurada no sistema operacional);
// 3) Acione o botão ao lado do campo (buffer) que simula recepção ou transmissão (clique com o mouse em cima dele, ou tecle <Tab> e <Enter>);
// 4) Neste momento ocorre um evento de recepção; então o tratador recebe o byte, faz o processamento programado e devolve o byte já processado ao Port 1, aguardando o evento que indicará o final de sua transmissão pelo hardware do equipamento;
// 5) Simule a ocorrência deste evento de final de transmissão pressionando o botão ao lado do "buffer" do Port 1 (o byte será apagado neste instante, completando a simulação do evento);
// 6) Fim do ciclo, o qual, seguido repetidamente, simula um fluxo contínuo de recepção, processamento e retransmissão de bytes pelo equipamento.
// Obs.: o que pode ocorrer se um byte for recebido e, antes que seja processado e retransmitido, chegar mais outro byte? Sugestão: altere este programa para que esta situação seja convenientemente tratada.

//
=VAR   I0.0   Habil_Interrup
//
=VAR   AQW0   Byte_Recebido_P0
//
=VAR   AQW1   Byte_a_Ser_Enviado_P1
//
=VAR   Q0.0   Enviou_Byte
//
=VAR   Q1.0   Início

NETWORK    1 // Habilita o tratamento de interrupções e vincula os eventos a serem tratados aos respectivos tratadores.

LDI   I0.0

LDN   Q1.0
ALD
ENI
ATCH   Recebe_Byte,   8
ATCH   Transmite_Byte,   26
SI    Q0.0,   1
S   Q1.0,   1

LDI   I0.0
NOT
R   Q1.0,   1

NETWORK    2 // Tratamento da ocorrência do evento de recepção de byte no Port0

INT   Recebe_Byte

LD   Q0.0
RCV   AQW0   0
MOVB   AQW0,   Ve1
ANDB   2#00001111,   Ve1
MOVD   16,   Ve2
*
D   Ve1,   Ve2
MOVB   AQW0,   Ve3
ANDB   2#11110000,   Ve3
/
D   16,   Ve3
+D   Ve3,   Ve2
MOVB    Ve2,   AQW1
// Inverte posição dos nibbles formadores do byte recebido
XMT   AQW1   1
RI    Q0.0,   1

NETWORK    3 // Tratamento da ocorrência do evento de término da transmissão de byte enviado no Port1

INT   Transmite_Byte

LDN   Q0.0
SI    Q0.0,   1