rede1// Inicializa a variável Descida, habilita o tratamento de interrupções e vincula os eventos a serem tratados aos tratadores.
se (imediatoHabil_Interrup) {
se (nãoimediatoInício) {
habilita_interrupções;
vinculaSubDescI0.0 à interrupçãoborda_subida_I0.0;
vinculaSubDescI0.0 à interrupçãoborda_descida_I0.0; // Reparem que dois eventos podem ser tratados pelo mesmo tratador de interrupções.
ligaInício;
se (imediatoEntrada_Punho) {
setimediatoDescida; // 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{
desligaimediatoInício;
}
rede2// 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çãoSubDescI0.0 ( )
se (Habil_Interrup) {
Tempo_Anterior :=Tempo_Borda;
}
quando (Habil_Interrup) temporizaTempo_Borda1h; // O tempo 1 h é arbitrário. Basta que seja um tempo maior que a largura máxima a ser medida.
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)
NETWORK1// Inicializa a variável Descida, habilita o tratamento de interrupções e vincula os eventos a serem tratados aos tratadores.
LDII1.0
LDNIInício ALD ENI ATCHSubDescI0.0, 0 ATCHSubDescI0.0, 1 // Reparem que dois eventos podem ser tratados pelo mesmo tratador de interrupções. SInício, 1
LDII0.0 ALD SIQ0.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.
LDII1.0 NOT RIInício, 1
NETWORK2// 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
INTSubDescI0.0
LDI1.0 MOVDT0, VM0
LDI1.0 TONT0, 3600000 // O tempo 1 h é arbitrário. Basta que seja um tempo maior que a largura máxima a ser medida.