Programa Medidor Largura Punhos

Top 



O código-fonte abaixo demonstra a capacidade de um CLP atuar como equipamento medidor de grandezas eletroeletrônicas.



clp
Medidor_Largura_Punhos // Mede a largura dos punhos presentes na entrada I0.0 (tanto a parte ligada como a desligada)

var
   I0.0    Entrada_Punho,
T0
    Tempo_Borda,
I1.0
    Habil_Interrup,
Q0.0
    Descida,
VM0
    Tempo_Anterior,
AQW0
Largura_Entrada_em_0,
AQW1
Largura_Entrada_em_1;

rede
1 // Inicializa a variável Descida, habilita o tratamento de interrupções e vincula os eventos a serem tratados aos tratadores.

se
(imediato Habil_Interrup) {

se
(não imediato Início) {
habilita_interrupções
;
vincula
SubDescI0.0 à interrupção borda_subida_I0.0;
vincula
SubDescI0.0 à interrupção borda_descida_I0.0; // Reparem que dois eventos podem ser tratados pelo mesmo tratador de interrupções.

liga
Início;

se
(imediato Entrada_Punho) {
set
imediato Descida; // Inicializa a variável Descida de acordo com valor de I0.0 no início do funcionamento, para que, independente de I0.0 estar ligado ou não neste momento, as medições da largura dos seus pulsos ligado e desligado não fiquem trocadas.
}
}

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

rede
2 // Tratamento dos eventos de subida e descida de I0.0, para início da contagem do tempo em que este ponto fica em nível alto ou baixo

tratador_interrupção
SubDescI0.0 ( )

se
(Habil_Interrup) {
Tempo_Anterior
:= Tempo_Borda;
}

quando
(Habil_Interrup) temporiza Tempo_Borda 1 h; // O tempo 1 h é arbitrário. Basta que seja um tempo maior que a largura máxima a ser medida.

se
(não imediato Descida){
Largura_Entrada_em_0
:= Tempo_Borda - Tempo_Anterior;
set
imediato Descida;
}
senão
{
Largura_Entrada_em_1
:= Tempo_Borda - Tempo_Anterior;
reset
imediato Descida;
}

fim_tratador_interrupção


fim




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



// CLP    Medidor_Largura_Punhos

// Mede a largura dos punhos presentes na entrada I0.0 (tanto a parte ligada como a desligada)

//
=VAR   I0.0   Entrada_Punho
//
=VAR   T0   Tempo_Borda
//
=VAR   I1.0   Habil_Interrup
//
=VAR   Q0.0   Descida
//
=VAR   VM0   Tempo_Anterior
//
=VAR   AQW0   Largura_Entrada_em_0
//
=VAR   AQW1   Largura_Entrada_em_1

NETWORK    1 // Inicializa a variável Descida, habilita o tratamento de interrupções e vincula os eventos a serem tratados aos tratadores.

LDI   I1.0

LDNI    Início
ALD
ENI
ATCH   SubDescI0.0,   0
ATCH   SubDescI0.0,   1
// Reparem que dois eventos podem ser tratados pelo mesmo tratador de interrupções.
S   Início,   1

LDI   I0.0
ALD
SI    Q0.0,   1
// Inicializa a variável Descida de acordo com valor de I0.0 no início do funcionamento, para que, independente de I0.0 estar ligado ou não neste momento, as medições da largura dos seus punhos ligado e desligado não fiquem trocadas.

LDI   I1.0
NOT
RI    Início,   1

NETWORK    2 // Tratamento dos eventos de subida e descida de I0.0, para início da contagem do tempo em que este ponto fica em nível alto ou baixo

INT   SubDescI0.0

LD   I1.0
MOVD   T0,   VM0

LD   I1.0
TON   T0,   3600000
// O tempo 1 h é arbitrário. Basta que seja um tempo maior que a largura máxima a ser medida.

LDNI    Q0.0
MOVD   T0,   Ve1
-D   VM0,   Ve1
MOVD   Ve1,   AQW0
SI    Q0.0,   1
NOT
MOVD   T0,   Ve1
-D   VM0,   Ve1
MOVD   Ve1,   AQW1
RI    Q0.0,   1