No programa de controle abaixo, quatro bombas de sucção são ligadas de forma escalonada e em rodízio para esvaziamento de um sumidouro de esgotos.
clpBombas_Sumidouro// Controla 4 bombas de um sumidouro de esgotos, ligadas de forma escalonada, de acordo com o nível atingido pelo material no sumidouro, e em rodízio, para depreciação equilibrada das mesmas por uso em intensidade similar. Permite detecção de problemas de funcionamento ou falhas de partida nas bombas, com conseqüente ajuste automático no escalonamento de ligação das mesmas.
// Obs.: nas variáveis abaixo, os cardinais 1, 2, 3 e 4 referem-se às bombas fisicamente, mas os ordinais 1ª, 2ª, 3ª e 4ª referem-se às bombas na ordem em que serão ligadas, que muda de acordo com o ciclo em que o sistema estiver operando (para implementação do rodízio), indicado pelo valor presente na variável Ciclo:
rede 1 // Lógica de desligamento das bombas, se sumidouro está vazio ou se acionada chave de desligamento geral, e controle do ciclo de funcionamento em rodízio.
se (Nível_Esgoto<= 6400 ouimediatoDesliga_Bombas)
{
desligaimediatoBomba1;
desligaimediatoBomba2;
desligaimediatoBomba3;
desligaimediatoBomba4;
incrementaBCiclo; // Faz com que Ciclo varie de 1 a 4 alternadamente, para ligação em CicloB-:= (CicloB/ 4) B* 4; // rodízio de cada uma das bombas, evitando que os seus tempos de // funcionamento fiquem muito diferentes ao longo do tempo.
}
se (Ciclo= 0) { // Se ciclo não foi inicializado, força-o ao ciclo de nº 1 CicloB:= 1;
}
rede 2 // Lógica de ligação escalonada das bombas. Reparem que quando uma bomba é ligada, a mesma só é desligada quando do esvaziamento completo do sumidouro.
se ( nãoimediatoDesliga_Bombase
(Nível_Esgoto> 19200 ou (Nível_Esgoto> 6400 eFalha_B2ªeFalha_B3ªeFalha_B4ª)) )
{
se (nãoFalha_B1ª) {
se (Ciclo= 1) {
ligaimediatoBomba1;
}
se (Ciclo= 2) {
ligaimediatoBomba2;
}
se (Ciclo= 3) {
ligaimediatoBomba3;
}
se (Ciclo= 4) {
ligaimediatoBomba4;
}
}
}
se (nãoimediatoDesliga_Bombase
( (Nível_Esgoto> 32000 eBomba1ª_FinalPartida)
ou (Nível_Esgoto> 19200 eFalha_B1ª)
ou (Nível_Esgoto> 6400 eFalha_B1ªeFalha_B3ªeFalha_B4ª) ) )
{
se (nãoFalha_B2ª) {
se (Ciclo= 1) {
ligaimediatoBomba2;
}
se (Ciclo= 2) {
ligaimediatoBomba3;
}
se (Ciclo= 3) {
ligaimediatoBomba4;
}
se (Ciclo= 4) {
ligaimediatoBomba1;
}
}
}
se (nãoimediatoDesliga_Bombase
( (Nível_Esgoto> 44800 eBomba2ª_FinalPartida)
ou (Nível_Esgoto> 19200 eFalha_B1ªeFalha_B2ª)
ou (Nível_Esgoto> 32000 e (Falha_B1ªouFalha_B2ª))
ou (Nível_Esgoto> 6400 eFalha_B1ªeFalha_B2ªeFalha_B4ª) ) )
{
se (nãoFalha_B3ª) {
se (Ciclo= 1) {
ligaimediatoBomba3;
}
se (Ciclo= 2) {
ligaimediatoBomba4;
}
se (Ciclo= 3) {
ligaimediatoBomba1;
}
se (Ciclo= 4) {
ligaimediatoBomba2;
}
}
}
se (nãoimediatoDesliga_Bombase
( (Nível_Esgoto> 51200 eBomba3ª_FinalPartida)
ou (Nível_Esgoto> 19200 eFalha_B1ªeFalha_B2ªeFalha_B3ª)
ou (Nível_Esgoto> 32000
e ( (Falha_B1ªeFalha_B2ª)
ou (Falha_B1ªeFalha_B3ª)
ou (Falha_B2ªeFalha_B3ª) ) )
ou (Nível_Esgoto> 44800 e (Falha_B1ªouFalha_B2ªouFalha_B3ª))
ou (Nível_Esgoto> 6400 eFalha_B1ªeFalha_B2ªeFalha_B3ª) ) )
{
se (nãoFalha_B4ª) {
se (Ciclo= 1) {
ligaimediatoBomba4;
}
se (Ciclo= 2) {
ligaimediatoBomba1;
}
se (Ciclo= 3) {
ligaimediatoBomba2;
}
se (Ciclo= 4) {
ligaimediatoBomba3;
}
}
}
rede 3 // Detecta acionamento da bóia de segurança, quando de falha no sensor de nível.
se ( Bóia_NívelMáximo ) {
Nível_Esgoto := 64000;
}
se ( Bóia_NívelMínimo ) {
Nível_Esgoto := 6400;
}
rede 4 // Detecta falhas em quaisquer das quatro bombas.
se ( nãoSem_Falha1_B1ounãoSem_Falha2_B1ounãoSem_Falha3_B1ounãoSem_Falha4_B1 ) {
desligaimediatoBomba1;
ligaimediatoB1_Falha;
se (Ciclo= 1) {
ligaFalha_B1ª;
}
se (Ciclo= 2) {
ligaFalha_B2ª;
}
se (Ciclo= 3) {
ligaFalha_B3ª;
}
se (Ciclo= 4) {
ligaFalha_B4ª;
}
}
se (nãoSem_Falha1_B2ounãoSem_Falha2_B2ounãoSem_Falha3_B2ounãoSem_Falha4_B2 ) {
desligaimediatoBomba2;
ligaimediatoB2_Falha;
se (Ciclo= 1) {
ligaFalha_B4ª;
}
se (Ciclo= 2) {
ligaFalha_B1ª;
}
se (Ciclo= 3) {
ligaFalha_B2ª;
}
se (Ciclo= 4) {
ligaFalha_B3ª;
}
}
se (nãoSem_Falha1_B3ounãoSem_Falha2_B3ounãoSem_Falha3_B3ounãoSem_Falha4_B3 ) {
desligaimediatoBomba3;
ligaimediatoB3_Falha;
se (Ciclo= 1) {
ligaFalha_B3ª;
}
se (Ciclo= 2) {
ligaFalha_B4ª;
}
se (Ciclo= 3) {
ligaFalha_B1ª;
}
se (Ciclo= 4) {
ligaFalha_B2ª;
}
}
se ( nãoimediatoSem_Falha1_B4ounãoimediatoSem_Falha2_B4ounãoimediatoSem_Falha3_B4ounãoimediatoSem_Falha4_B4 ) {
desligaimediatoBomba4;
ligaimediatoB4_Falha;
se (Ciclo= 1) {
ligaFalha_B2ª;
}
se (Ciclo= 2) {
ligaFalha_B3ª;
}
se (Ciclo= 3) {
ligaFalha_B4ª;
}
se (Ciclo= 4) {
ligaFalha_B1ª;
}
}
rede 5 // Reseta as falhas depois das manutenções corretivas.
se (Reseta_Falhas) {
desligaFalha_B1ª;
desligaFalha_B2ª;
desligaFalha_B3ª;
desligaFalha_B4ª;
rede 6 // Marca tempo de funcionamento das bombas (550 horas é aproximadamente o tempo máximo que pode ser acumulado nos nossos temporizadores; quando alguma bomba o atinge, todos os tempos são zerados e inicia-se nova temporização).
quando (imediatoBomba1) temporiza_acumulaTempoFunc_B1 550 h;
quando (imediatoBomba2) temporiza_acumulaTempoFunc_B2 550 h;
quando (imediatoBomba3) temporiza_acumulaTempoFunc_B3 550 h;
quando (imediatoBomba4) temporiza_acumulaTempoFunc_B4 550 h;
se (nãoimediatoDesliga_Bombas) {
// Converte tempos de funcionamento das bombas, de milissegundos para ... // ... minutos, e os mostra para fins de controle operacional:
rede 7 // Reseta todos os tempos de funcionamento das bombas ao mesmo tempo, quando acionado comando de zera relógios ou excedido temporização máxima de qualquer bomba (máximo permitido pelo equipamento CLP utilizado; no nosso simulador, 550 h)
se (TempoFunc_B1ouTempoFunc_B2ouTempoFunc_B3ouTempoFunc_B4ouZera_Relógios) {
resetTempoFunc_B1;
resetTempoFunc_B2;
resetTempoFunc_B3;
resetTempoFunc_B4;
}
conta (TempoFunc_B1ouTempoFunc_B2ouTempoFunc_B3ouTempoFunc_B4) reset_quando (Zera_Relógios) emQtde_Resets_Temporeferência 32000;
rede 8 // Detecta fim de partida das bombas
se (imediatoFinalPartida_B1) {
se (Ciclo= 1) {
ligaBomba1ª_FinalPartida;
}
se (Ciclo= 2) {
ligaBomba2ª_FinalPartida;
}
se (Ciclo= 3) {
ligaBomba3ª_FinalPartida;
}
se (Ciclo= 4) {
ligaBomba4ª_FinalPartida;
}
}
se (imediatoFinalPartida_B2) {
se (Ciclo= 1) {
ligaBomba2ª_FinalPartida;
}
se (Ciclo= 2) {
ligaBomba1ª_FinalPartida;
}
se (Ciclo= 3) {
ligaBomba4ª_FinalPartida;
}
se (Ciclo= 4) {
ligaBomba3ª_FinalPartida;
}
}
se (imediatoFinalPartida_B3) {
se (Ciclo= 1) {
ligaBomba3ª_FinalPartida;
}
se (Ciclo= 2) {
ligaBomba2ª_FinalPartida;
}
se (Ciclo= 3) {
ligaBomba1ª_FinalPartida;
}
se (Ciclo= 4) {
ligaBomba4ª_FinalPartida;
}
}
se (imediatoFinalPartida_B4) {
se (Ciclo= 1) {
ligaBomba4ª_FinalPartida;
}
se (Ciclo= 2) {
ligaBomba3ª_FinalPartida;
}
se (Ciclo= 3) {
ligaBomba2ª_FinalPartida;
}
se (Ciclo= 4) {
ligaBomba1ª_FinalPartida;
}
}
fim
Como resultado da compilação do programa Bombas_Sumidouro acima, o SimuPLC 4.1.0 gerou, exatamente, o seguinte código, em Lista de Instruções - IL:
// CLP Bombas_Sumidouro // Controla 4 bombas de um sumidouro de esgotos, ligadas de forma escalonada, de acordo com o nível atingido pelo material no sumidouro, e em rodízio, para depreciação equilibrada das mesmas por uso em intensidade similar. Permite detecção de problemas de funcionamento ou falhas de partida nas bombas, com conseqüente ajuste automático no escalonamento de ligação das mesmas. // Obs.: nas variáveis abaixo, os cardinais 1, 2, 3 e 4 referem-se às bombas fisicamente, mas os ordinais 1ª, 2ª, 3ª e 4ª referem-se às bombas na ordem em que serão ligadas, que muda de acordo com o ciclo em que o sistema estiver operando (para implementação do rodízio), indicado pelo valor presente na variável Ciclo: // Ciclo = 1: B1 - 1ª, B2 - 2ª, B3 - 3ª, B4 - 4ª // Ciclo = 2: B2 - 1ª, B3 - 2ª, B4 - 3ª, B1 - 4ª // Ciclo = 3: B3 - 1ª, B4 - 2ª, B1 - 3ª, B2 - 4ª // Ciclo = 4: B4 - 1ª, B1 - 2ª, B2 - 3ª, B3 - 4ª // Cada vez que o sumidouro é esvaziado, a variável Ciclo altera-se: 1, 2, 3, 4, 1, 2, 3, ... // Após a compilação, verifique o funcionamento virtual acionando o menu: Plantas Virtuais -> Tanques de Líquidos Simulados -> Liga SimuPLC
NETWORK1// Lógica de desligamento das bombas, se sumidouro está vazio ou se acionada chave de desligamento geral, e controle do ciclo de funcionamento em rodízio.
LDD<=AIW0, 6400 OII0.0 RIQ0.1, 1 RIQ0.2, 1 RIQ0.3, 1 RIQ0.4, 1 RM0.1, 1 RM0.2, 1 RM0.3, 1 RM0.4, 1 INCBVB0 // Faz com que Ciclo varie de 1 a 4 alternadamente, para ligação em MOVBVB0, Ve1
/I4, Ve1
*I4, Ve1 -IVe1, VB0 // rodízio de cada uma das bombas, evitando que os seus tempos de // funcionamento fiquem muito diferentes ao longo do tempo.
LDD=VB0, 0 // Se ciclo não foi inicializado, força-o ao ciclo de nº 1 MOVB1, VB0
NETWORK2// Lógica de ligação escalonada das bombas. Reparem que quando uma bomba é ligada, a mesma só é desligada quando do esvaziamento completo do sumidouro.
LDNII0.0
LDD>AIW0, 19200
LDD>AIW0, 6400 AM1.2 AM1.3 AM1.4 OLD ALD
LDNM1.1 ALD LPS
LDD=VB0, 1 ALD SIQ0.1, 1 LRD
LDD=VB0, 2 ALD SIQ0.2, 1 LRD
LDD=VB0, 3 ALD SIQ0.3, 1 LPP
LDD=VB0, 4 ALD SIQ0.4, 1
LDNII0.0
LDD>AIW0, 32000 AM0.1
LDD>AIW0, 19200 AM1.1 OLD
LDD>AIW0, 6400 AM1.1 AM1.3 AM1.4 OLD ALD
LDNM1.2 ALD LPS
LDD=VB0, 1 ALD SIQ0.2, 1 LRD
LDD=VB0, 2 ALD SIQ0.3, 1 LRD
LDD=VB0, 3 ALD SIQ0.4, 1 LPP
LDD=VB0, 4 ALD SIQ0.1, 1
LDNII0.0
LDD>AIW0, 44800 AM0.2
LDD>AIW0, 19200 AM1.1 AM1.2 OLD
LDD>AIW0, 32000
LDM1.1 OM1.2 ALD OLD
LDD>AIW0, 6400 AM1.1 AM1.2 AM1.4 OLD ALD
LDNM1.3 ALD LPS
LDD=VB0, 1 ALD SIQ0.3, 1 LRD
LDD=VB0, 2 ALD SIQ0.4, 1 LRD
LDD=VB0, 3 ALD SIQ0.1, 1 LPP
LDD=VB0, 4 ALD SIQ0.2, 1
LDNII0.0
LDD>AIW0, 51200 AM0.3
LDD>AIW0, 19200 AM1.1 AM1.2 AM1.3 OLD
LDD>AIW0, 32000
LDM1.1 AM1.2
LDM1.1 AM1.3 OLD
LDM1.2 AM1.3 OLD ALD OLD
LDD>AIW0, 44800
LDM1.1 OM1.2 OM1.3 ALD OLD
LDD>AIW0, 6400 AM1.1 AM1.2 AM1.3 OLD ALD
LDNM1.4 ALD LPS
LDD=VB0, 1 ALD SIQ0.4, 1 LRD
LDD=VB0, 2 ALD SIQ0.1, 1 LRD
LDD=VB0, 3 ALD SIQ0.2, 1 LPP
LDD=VB0, 4 ALD SIQ0.3, 1
NETWORK3// Detecta acionamento da bóia de segurança, quando de falha no sensor de nível.
LDI0.3 MOVD64000, AIW0
LDI0.4 MOVD6400, AIW0
NETWORK4// Detecta falhas em quaisquer das quatro bombas.
NETWORK6// Marca tempo de funcionamento das bombas (550 horas é aproximadamente o tempo máximo que pode ser acumulado nos nossos temporizadores; quando alguma bomba o atinge, todos os tempos são zerados e inicia-se nova temporização).
LDIQ0.1 TONRT0, 1980000000
LDIQ0.2 TONRT1, 1980000000
LDIQ0.3 TONRT2, 1980000000
LDIQ0.4 TONRT3, 1980000000
LDNII0.0 // Converte tempos de funcionamento das bombas, de milissegundos para ... // ... minutos, e os mostra para fins de controle operacional: MOVDT0, Ve1
/D60000, Ve1 MOVDVe1, AQW1 MOVDT1, Ve1
/D60000, Ve1 MOVDVe1, AQW2 MOVDT2, Ve1
/D60000, Ve1 MOVDVe1, AQW3 MOVDT3, Ve1
/D60000, Ve1 MOVDVe1, AQW4
NETWORK7// Reseta todos os tempos de funcionamento das bombas ao mesmo tempo, quando acionado comando de zera relógios ou excedido temporização máxima de qualquer bomba (máximo permitido pelo equipamento CLP utilizado; no nosso simulador, 550 h)