Exercícios de STEP 7 Manuel Alonso Exercício 1. Uso de um FC. Exercício 2. Uso de um FB. Exercício 3. Uso de um FB multi instanciada. Exercício 4. Uso de um Temporizador ou contador dentro de uma FB multi instanciada. MOV2P. Exercício 5. Uso de um UDT. Exercício 6. Programar no OB100. OB de reinicio (restart). Exercício 7. Programar um OB32. OB cíclico. Exercício 8. Programar um OB10. OB de Tempo. Exercício 9. Programar um OB 121. Falha por software. Exercício 10. Programar um OB86. Falha de hardware. Será feito no próximo módulo porque precisa do laboratório. Exercício 11. Resolver um problema mediante GRAFCET. Todos os exercícios foram resolvidos no simulador.
1. Exercício uso de uma FC. Programe um conversor de graus Celsius para Fahrenheit quando a entrada I0.0 é igual a 1 e vice-versa quando é 0. Sendo as formula: C = (F-32) / 1,8 e F = (C * 1,8) + 32 Note-se que em este é um exemplo típico de um sistema combinacional, onde o valor da saída depende somente do valor das entradas. Pelo tanto podemos usar esta função em varias partes do programa sem problema de sobrescrever o valor da memoria. Solução: 1. Criamos uma FC1 com as seguintes variáveis locais:
2. Criamos o programa a seguir:
3. No OB1 fazemos a chamada ao FC1.
4. Para poder manipular as variáveis criamos uma VAT onde inserimos o valor da temperatura a converter e veremos o valor convertido.
2. Exercício uso de uma FB. Neste caso temos uma FB1 que faz a gestão de um motor. Podemos usar esta função em varias partes do programa, sendo que para cada chamada será criada uma DB onde serão armazenadas as variáveis locais evitando assim sobrescreve-las cada vez que executamos o OB1. Solução: 1. Criamos uma FB, por exemplo FB1, com as seguintes variáveis locais.
2. Criamos a lógica necessária.
3. Chamamos a FB desde o OB1 ou uma FC, quando nos pregunte se queremos criar uma DB associada contestamos que sim e criamos a DB1.
4. Para uma segunda chamada será criada outra DB (por exemplo, DB2) onde serão armazenadas as variáveis referentes ao motor 2.
3. Exercício FB Multi instanciada. Neste caso queremos criar uma função de uso comum que podamos chamar em vários lugares do programa, igual à FB, mais queremos que as variáveis locais sejam guardadas somente em uma DB comum. Isso é chamado de FB multi instanciada. Solução: 1. Primeiramente criamos uma FB, por exemplo FB100, onde criamos a logica desejada da função comum.
2. Agora criamos a FB1 onde vamos a usar varias vezes a função comum FB100. Para poder usar esta função, criamos as variáveis tipo STATIC Motor_1 e Motor_2 do tipo FB100 (ou o nome que lhe assignamos, neste caso Gestão Motor).
3.
Fazemos a chamada a função para cada motor que desejamos comandar.
4.
Agora fazemos a chamada da FB1 desde a OB1.
4. Exercício criação de uma MOV2P. Neste caso queremos uma função multi instanciada que contenha um temporizador ou contador dentro dela, por exemplo, a FB100. Um exemplo disto seria a função MOV2P que faz a gestão do movimento de um atuador de duas posições. Solução: 1. Como no caso anterior criamos a função comum FB100.
Onde os parâmetros TempoAvanzo e TempoRecuo são valores de referencia para os movimentos de avanço e recuo de cada atuador (cilindro) que serão introduzidos mediante uma Variable Table como a mostrada a seguir.
2.
Então escrevemos a logica requerida.
3.
Repetiremos a mesma estrutura para o Recuo. Finalmente teremos:
4. Para poder declarar o temporizador ou contador IEC como multi instancia, inserimos ele e depois com o botão direito escolhemos a opção Change to Multiple Instance Call
Depois nos vai preguntar pelo nome de esta função, neste caso Tempo_de_Avanzo ou Tempo_de_Recuo para o segundo temporizador. 5. Seguidamente procedemos como no caso anterior, chamando no FB1 a função FB100 para cada atuador, neste caso cilindro e chamando esta Fb1 no OB1.
5. Exercício uso de uma UDT . Vamos a supor que temos que automatizar muitas máquinas das quais queremos ter informação de três dados de cada uma de elas. Queremos ter informação de sua temperatura, da chave de marcha/paro e da quantidade de peças que leva feitas ao dia. Vamos a organizamos os dados utilizando os UDT. Vamos a supor que temos as máquinas distribuídas em dois polígonos. Dentro de cada polígono temos três plantas e dentro de cada planta temos 4 máquinas. De cada una de essas máquinas temos que monitorar os dados que definimos anteriormente. Para isso vamos a criar unos UDT, o UDT1 vai a ser o tipo de dados que assignaremos a cada uma de as máquinas. Para gerar um UDT1 temos que inserir um objeto do tipo Variable Table no Simatic Manager. Nosso UDT_1 com nome simbólico “dados” ficaria:
Já temos definido um tipo de dados. Agora cada máquina será do tipo UDT1. Nosso UDT2 com nome simbólico “Maquina” ficará:
Dentro de cada máquina estamos incluindo implicitamente cada um dos três dados anteriormente definidos. Agora cada planta será do tipo UDT2. Nosso UDT3 com nome simbólico “Planta” ficará:
Dentro de cada planta, estamos incluindo implicitamente quatro máquinas e sabemos que dentro de cada máquina vão seus três dados. Sem escrever demasiadas linhas temos um monte de dados acumulados. Agora temos que fazer a DB. Primeiro vamos a tabela de símbolos e nomeamos a DB que vamos a utilizar, podemos chama-la de DADOS. Dentro de dados pomos:
Dentro de cada uma de estas linhas, estão implícitas três plantas dentro de cada uma das quais há quatro máquinas, dentro de cada uma das quais há três dados. Agora a vantagem que temos, aparte de haver poupado escrever muitos dados, é a maneira de aceder aos dados. Se dentro do DB selecionamos o menu View > data view veremos todos os dados que criamos com os nomes que tem.
Isto é parte do DB que criamos. De este modo, podemos aceder por seu nome ao dado que queremos. Por exemplo, podemos aceder a temperatura da máquina 2 da planta 3 do polígono 1 da seguinte maneira: DADOS.Poligono1.Planta3.MAQ2.Temperatura De este forma não tenho por que saber que endereço tem esta línea dentro da DB. Acedo a cada dado por seu nome. Vamos a ver agora como acederíamos a dois dos dados que temos na DB. Por exemplo, vamos supor que queremos por em marcha uma das máquinas com a entrada I0.0. (Máquina 3 da planta 2 do polígono 1). Isto corresponde a um bit. Então em STL seria: U I 0.0 = DADOS.Poligono1.Planta2.MAQ3.Marcha Se fazemos isto e logo vamos a observar o valor atual do módulo de dados, veremos que este bit estará a um.
6. Exercício OB de reinicio. Quando a CPU realiza um reinicio completo, acede ao OB 100 antes de ler o OB 1. O OB 100 é um bloco que se lê somente uma vez ao iniciar a CPU. Ata que não haja um novo passo de STOP a RUN, não se volverá a ler. Vamos a programar o OB 100 para que ponha uns valores iniciais a umas marcas, por exemplo, a M0.0. Logo faremos que no OB 1 apague esta variável para não ter mais este valor inicial. De esta forma o valor inicial do M0.0 valerá somente durante o primeiro Scan. Isto pode ser usado, por exemplo, num GRAFCET para inicializar a etapa inicial. No OB100
No OB 1
7. Exercício OB cíclico. As alarmes cíclicas, são uns OB que executam-se cada certo tempo que nos parametrizamos. São independentes do ciclo do programa. Podem executar-se duas vezes por ciclo de scan o uma vez cada 100 ciclos, dependendo do tempo que ajustemos a alarme e do tempo que demore o ciclo de scan. A CPU vai executando o programa que tem na sua memoria e vai pulando aos blocos que lhe corresponde. Quando termina de executar este OB, continuará por onde ia no ciclo normal do programa. O tempo de execução de estes OB é algo que se modifica desde o hardware da CPU. Entramos em Object Propierties e vamos a aba Cyclic Interrupts.
Nesse menu podemos programar os tempos de todas as alarmes cíclicas que tenhamos disponíveis em nossa CPU. Na OB32 temos um tempo de 1000ms ou 1 segundo. Vamos a usar isto para fazer um pisca pisca. Vemos também que tem prioridade 9. A prioridade utiliza-se no caso em que a CPU tenha que executar dois blocos ao mesmo tempo. Por exemplo, se quando se cumpre o tempo da alarme, a CPU estava lendo uma instrução de salto a uma FC, que bloco executara-se primeiro? O que tenha maior prioridade. O OB1 tem prioridade 1 e sempre será o último a executar-se. Una vez criado o bloco OB32 criamos o seguinte programa:
Una vez enviemos isto al PLC, veremos que teremos um pisca pisca de 1 segundo no endereço Q0.7.
8. Exercício OB de tempo. As alarmes horarias são similares as cíclicas, mais usam intervalos de tempo maiores. Para programar este tipo de alarmes, teremos que faze-lo através do hardware ou por software usando as SFC correspondentes. Em nosso caso vamos faze-lo através do hardware. Para isso vamos entrar na ferramenta hardware e abrir a aba de alarmes horarias Time-of-Day Interrupts. Dependendo da CPU que tenhamos, teremos mais ou menos OB disponíveis, em nosso caso só temos a OB10. Agora ativamos esta OB marcando a casinha correspondente e programamos o intervalo, a data e hora de começo.
O funcionamento é como o das alarmes cíclicas. Logo programamos o OB10 com a função desejada. Vamos a ver um exemplo de este tipo de alarmes. Vamos a fazer que se execute o OB 10 cada minuto desde a hora atual. Na OB10 vamos a programar o mesmo programa que para fizemos para OB32. O OB10 executara-se cada minuto desde a data e hora que lhe demos de começo. Para que se ative a alarme, o relógio da CPU deve passar pela data e hora de inicio. Se o relógio da CPU tem uma data e hora posterior a de ativação, nunca se ativará e pelo tanto não funcionará a alarme. Nota: pra ajustar a data e hora da CPU ir ao menu PLC, estando em online e escolher a opção Set Time of Day.
9. Exercício OB de falha por SOFTWARE. O sistema operativo da CPU chama ao OB121 quando aparece um evento ativado por um erro durante a execução do programa. Assim por exemplo, se dentro do programa se chama a um bloco que não fui carregado na CPU, o OB121 será invocado. Não precisa por nada no bloco, sua existência já garante o seu funcionamento. Note-se que o led de SF vai ficar acesso mais a CPU ficará em RUN. O OB121 funciona na mesma prioridade que o bloco que foi interrompido. Se não está programado o OB121, a CPU passará de RUN a STOP.
10. Exercício OB de falha por hardware. Não pode ser testado no simulador, será feito no laboratório. 11. Exercício de modelagem com GRAFCET. Muitos problemas não são fazeis de resolver de forma intuitiva, sendo que sua solução pode apresentar um comportamento inesperado devido a estrutura escolhida para sua resolução. Para evitar isso podemos usar a metodologia GRAFCET, que nos possibilita resolver qualquer problema de automação de uma forma segura e sistemática. Neste caso queremos criar uma função de uso comum que podamos chamar em vários lugares do programa, igual à FB, mais queremos que as variáveis locais sejam guardadas somente em uma DB comum. 1. Primeiramente criamos a FB comum, por exemplo, a FB100 onde criamos a logica desejada. Neste caso como queremos fazer um programa a partir de um pulsador ligue e desligue uma saída (telerruptor, flip-flop ou rele de impulso). Devemos por nome a FB para poder chama-la mais tarde. Para isso usamos botão direito e Object Propieties... e ponhamos o nome em Symbolic Name. Como a logica de esta função não é intuitiva, podemos recorrer à metodologia GRAFCET para cria-la. Neste caso teremos que criar um FB100, por exemplo, que criará sua DB100 associada. Como variáveis locais definiremos:
Note-se que a variável E0 correspondente a etapa inicial tem um valor inicial TRUE (1 lógico), que somente se considerará no primeiro scan do OB1. Fazendo o GRAFCET dela teremos o esquema da figura 1 onde (Liga) é o conjugado da variável Liga.
Figura 1. GRAFCET do exercício 1.
As estruturas principais se repetem sempre o que facilita sua implementação sem erros. Note-se que esta metodologia serve para qualquer caso.
2. Agora criamos uma FB, por exemplo, FB1, aonde vamos a usar a função comum FB100, varias vezes, neste caso teríamos varias chamadas a função flip-flop para diferentes motores, por exemplo. Nesta FB1 definimos as seguintes variáveis locais, onde note-se que o data type será FB100 ou o nome simbólico que colocamos a esta. Nesta FB fazemos à chamada no momento certo a função multi-instanciada
3. Finalmente, chamamos o FB1 desde o OB1.