O código-fonte abaixo demonstra a capacidade de um CLP atuar como retransmissor de informações com processamento ativo interno.
clpRecebe_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.
rede1// Habilita o tratamento de interrupções e vincula os eventos a serem tratados aos respectivos tratadores.
se (imediatoHabil_Interrup) {
se (nãoInício) {
habilita_interrupções;
vinculaRecebe_Byte à interrupçãorecepção_Port0;
vinculaTransmite_Byte à interrupçãotransmissão_Port1;
ligaimediatoEnviou_Byte;
ligaInício;
}
}
senão{
desligaInício;
}
rede2// Tratamento da ocorrência do evento de recepção de byte no Port0
tratador_interrupçãoRecebe_Byte ( )
se (Enviou_Byte) {
recebe_byteemByte_Recebido_P0vindo_doPort0;
Byte_a_Ser_Enviado_P1B:=16 * (Byte_Recebido_P0B&2#00001111) + (Byte_Recebido_P0B&2#11110000) / 16; // Inverte posição dos nibbles formadores do byte recebido
transmite_byteByte_a_Ser_Enviado_P1noPort1;
desligaimediatoEnviou_Byte;
}
fim_tratador_interrupção
rede3// Tratamento da ocorrência do evento de término da transmissão de byte enviado no Port1
tratador_interrupçãoTransmite_Byte ( )
se (nãoEnviou_Byte) {
ligaimediatoEnviou_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.