UNIVERSIDADE FEDERAL DE SANTA CATARINA CURSO DE ENGENHARIA DE CONTROLE E AUTOMAÇÃO INDUSTRIAL Automação das Plataformas P-34 e P-48: Tratamento dos Pontos de Entrada e Saída Monografia submetida à Universidade Federal de Santa Catarina como requisito para a aprovação da disciplina: DAS 5511: Projeto de Fim de Curso Ricardo Souza Santos Florianópolis, Março de 2004. Automação das Plataformas P-43 e P-48: Tratamento dos Pontos de Entrada e Saída Ricardo Souza Santos Esta monografia foi julgada no contexto da disciplina DAS 5511: Projeto de Fim de Curso e aprovada na sua forma final pelo Curso de Engenharia de Controle e Automação Industrial Banca Examinadora: Fernando Gonçalves Costa Orientador Empresa Daniel Juan Pagano Orientador do Curso Prof. Augusto Humberto Bruciapaglia Responsável pela disciplina Prof. Julio Elias Normey Rico, Avaliador Rafael Carvalho Uberti, Debatedor Pedro Alves Brito de Azambuja, Debatedor 2 Agradecimentos Aos meus pais, por terem me apoiado incondicionalmente, e por terem me dado todas as condições de concluir os meus objetivos. Aos meus irmãos, pelo tempo que passamos juntos e por sempre terem me ajudado. Aos amigos que fiz em todos nestes 5 anos de convivência na UFSC. Aos professores do DAS, pela extrema competência e dedicação, em especial aos professores Augusto Humberto Bruciapaglia e Daniel Juan Pagano que me deram uma oportunidade de ingressar no mundo da pesquisa e, até o momento, no mundo do petróleo. Ao orientador Fernando Gonçalves Costa, com quem tive calorosas e valorosas discussões. À Unicontrol pela excelente oportunidade que me deu. i Resumo A P-43 e P-48 são as mais novas plataformas de exploração de petróleo desenvolvidas pela estatal Petrobras. Elas são a aposta da auto-suficiência na produção de petróleo no Brasil depois de anos em busca desta meta. A construção de estruturas de grandes proporções como estas exige um longo trabalho de logística e engenharia. Neste contexto, a Unicontrol foi a responsável por toda a parte de desenvolvimento e implantação do sistema de automação destas plataformas. O sistema de controle é baseado em automação por CLP. No caso das plataformas, isto significa controle central com entradas e saídas distribuídas através de redes de comunicação. O sistema é composto de vários subsistemas redundantes que cuidam, cada uma deles, de uma função de controle. Assim por exemplo, existe o sistema de controle do processo, o sistema de desligamento de emergência e assim por diante. Este sistema de controle é diretamente dependente da interação com os sinais de campo. Neste trabalho, foi desenvolvido o Sistema de Tratamento dos Pontos de Entrada e Saída, uma interface de software que visa garantir o cumprimento de especificações de projeto. Estas especificações são definidas pela Petrobras e visam facilitar o desenvolvimento da lógica e garantir uniformidade e confiabilidade na comunicação entre os sinais de campo e os controladores centrais (CLPs). O desenvolvimento do software se deu em linguagem STL para o CLP Siemens da família S7-400. Blocos de programa foram desenvolvidos e testados em laboratório e cumprem com os requisitos especificados. O Sistema de Tratamento dos Pontos de Entrada e Saída substituiu outro, desenvolvido anteriormente, com vantagens em relação ao tempo de execução, clareza da lógica e principalmente em relação ao espaço de memória utilizado. ii Abstract P-43 and P-48 are the newest oil platforms developed by the stated-owned Petrobras. With this two projects, Brazil will accomplish its goal of self-sufficiency in oil production. To build structures like these, a whole engineering and logistic work is needed. In this context, Unicontrol has been responsible for the development and implementation of the automation system. The control system is based in central PLCs controlling distributed I/O over a networked system. The system is composed by a set of redundant subsystems which are responsible, each one, for a control function. Thus, for example, there is the Process Control System, the Emergency Shutdown System, etc. This control system is directly dependant on the communication with field signaling. In this work, it has been developed an I/O Signals Management System, a software interface which aims at a project specification accomplishment. These specifications are defined by Petrobras to facilitate the logic development and to ensure sameness and reliability in the communication between field signaling and PLCs. The software has been developed in STL (Statement List) Language for Siemens S7-400 PLC. Software blocks have been developed and tested in laboratory and they accomplish the specifications required. This system has displaced another one, previously developed, with advantages related to the scan time and mainly related to the memory space required for the logic. In this way, control system gets faster ensuring a whole system better performance. iii Sumário Agradecimentos................................................................................................. i Resumo ............................................................................................................ ii Abstract ........................................................................................................... iii Sumário ........................................................................................................... iv Capítulo 1: Introdução ......................................................................................1 Capítulo 2: Unicontrol no Projeto......................................................................4 Capítulo 3: Características Construtivas das Plataformas................................7 3.1: Características do Óleo..........................................................................9 3.2: Visão Geral do Processo .......................................................................9 Capítulo 4: Arquitetura Geral das Redes de Controle ....................................11 4.1: Acesso aos Dados Remotos................................................................12 4.2: Rede Profibus DP ................................................................................13 4.3: Profibus FMS e Nível Superior de Controle .........................................14 Capítulo 5: S7-400 e S7-300 ..........................................................................18 5.1: Hardware — Controlador Central.........................................................18 5.2: Princípios de Programação do S7-400 ................................................24 Capítulo 6: Tratamento de Entradas e Saídas ...............................................47 6.1: Objetivo do Tratamento de Entradas e Saídas ....................................47 6.2: Mapeamento de Memória do CLP .......................................................49 6.3: Implementação ....................................................................................50 Capítulo 7: Resultados ...................................................................................86 7.1: Condições de Obtenção dos Resultados.............................................86 7.2: Visualização do Funcionamento ..........................................................87 iv 7.3: Resultados Obtidos..............................................................................87 Capítulo 8: Conclusões ..................................................................................90 Bibliografia:.....................................................................................................92 Anexo A — Instruções STL utilizadas ............................................................93 v Capítulo 1: Introdução Os Campos de Produção de Óleo de Caratinga e Barracuda estão localizados na parte central da Bacia de Campos, onde a lâmina d’água atinge 1040 metros. O Projeto das Plataformas P-43 / Barracuda e P-48 / Caratinga consiste da construção de duas plataformas FPSO (Floating Production, Storage and Offloading Units) para processar 150.000 bpd (barris por dia) de óleo cru e 3.000.000 Nm3/d (metros cúbicos por dia nas condições normais de temperatura e pressão) de gás natural cada uma. Estas plataformas são responsáveis pela extração de um total de 45 poços (26 para P-43 / Barracuda e 19 para P-48 / Caratinga). Nestas refinarias flutuantes, onde a primeira fase do refino é executada, o petróleo dos reservatórios é transportado para a superfície, separado da água, gás e areia que o acompanham. Fig. 1.1 — Localização dos Campos de Barracuda e Caratinga Estas plataformas exigem um complexo e extenso sistema de controle e supervisão de maneira a promover o funcionamento automatizado do sistema. Uma rede eficiente, com possibilidade de integração a outros sistemas, é uma das ferramentas necessárias ao atendimento deste requisito. 1 A rede de controle utilizada nestas plataformas é na verdade um conjunto de redes que atuam em conjunto para garantir segurança e confiabilidade ao sistema. Sua arquitetura e tecnologia foram projetadas para evitar ao máximo que falhas afetem a controlabilidade do sistema. Um exemplo disso são os anéis de comunicação que interligam os painéis remotos aos CLPs: além da redundância, seguem caminhos alternativos na plataforma. São ainda construídos em fibra ótica garantindo segurança nas áreas classificadas, imunidade a ruídos eletromagnéticos e menor perda de pacotes de informação. Outra rede existente, utilizada especificamente para fazer a manutenção preditiva da instrumentação baseada em sinais de 4 a 20 mA, é o protocolo Hart. Há ainda a rede do AFDS (Sistema Endereçável de Detecção de Fogo), responsável pela interligação dos sensores de fogo e gás. O sistema supervisório está concentrado na ECOS (Estação Central de Operação e Supervisão), localizado na sala de controle. O sistema de controle é central e é basicamente formado por 5 CPUs de CLP redundantes, totalizando 10 CPUs. A ECOS é ligada aos CLPs através de uma rede Ethernet. As plataformas P-43 e P-48 fazem parte da categoria das grandes plataformas. Seu sistema de controle possui mais de 15.000 pontos de E/S. Estes sinais são parte fundamental do sistema de controle da plataforma. O tratamento de sinais de E/S visa prover o sistema de controle de informação vinda do campo de uma maneira padronizada, realizando funções de temporização, bypass de entrada e travamento de estado (selo de alarme). A saída do sistema é igualmente tratada, dando ao operador do sistema a flexibilidade de sobrescrever os bits da lógica do intertravamento, através do supervisório. Uma dificuldade em implementar tal sistema está no fato de a linguagem disponível para programação ser de baixo nível. Para fazer a varredura (scan) de todos os bits teve-se de utilizar um ponteiro especial que dá informação de endereço e comprimento de área. Além disso, o fato de se utilizar temporização (na verdade, um atraso no sinal) cria uma dificuldade adicional que será explicada no capítulo específico. Nos capítulo 2, será feita a descrição do papel da Unicontrol no projeto, principalmente do escopo de suprimento. 2 No capítulo seguinte, algumas características construtivas das plataformas serão descritas, assim como uma visão geral do processo. No quarto capítulo, a arquitetura das redes de controle será mostrada. As particularidades de cada uma e sua importância no alcance do projeto. No quinto capítulo, as características do hardware serão mostradas, assim como as de software. Alguns conceitos básicos do CLP utilizado serão mostrados para que no sexto capítulo seja caracterizada a implementação propriamente dita. No sétimo capítulo serão apresentados os resultados obitidos e será discutida a solução adotada. No oitavo e último capítulo, serão expostas as conclusões acerca do trabalho realizado. 3 Capítulo 2: Unicontrol no Projeto O projeto de construção das plataformas Barracuda e Caratinga P-43 / P-48 teve início com a abertura da licitação. A Petrobras não constrói as plataformas mas contrata empresas competentes para fazê-lo. A vencedora da licitação para a construção foi a empresa KBR, ligada à americana Halliburton. A KBR recebeu da Petrobras um contrato de cerca de U$ 1,3 bilhão para ser usado na perfuração dos poços e construção das duas plataformas. Devido à magnitude do projeto, e à diversidade de tarefas envolvidas na construção, nem todos os serviços são realizados pela ganhadora da licitação (Tabela 2-1). Outras empresas são usualmente contratadas para tarefas mais específicas como por exemplo a automatização das plataformas. Neste contexto, a Unicontrol foi então escolhida pela KBR para ser a responsável pela automação da plataforma. Tabela 2-1 — Ordem de Contratação das Empresas Produção de Petróleo Construção da P-43 e P-48 Automação O papel da Unicontrol envolveu o suprimento de todo o equipamento e serviços para a ECOS (Estação Central de Operação e Supervisão), incluindo: • 11 painéis de E/S remotos com grau de proteção IP54. 4 • 12 painéis de E/S remotos com grau de proteção IP65. • 45 km de fibra ótica (halogen free para evitar propagação de incêndio). • CLPs para todos os subsistemas de controle e painéis de E/S, num total de 10 CPUs e 1750 cartões de E/S. • 8 estações de trabalho e 2 servidores. • 19 microcomputadores e notebooks para manutenção, administração e aplicações de terceiros. • Sistema de detecção de Fogo & Gás (AFDS). A Unicontrol cobriu as áreas de engenharia, manufatura, compra, desenvolvimento de software e comissionamento. Toda a parte de engenharia foi concentrada no Brasil já que a Halliburton / KBR e Petrobras têm seus centros de operação para este projeto no Rio de Janeiro. A compra dos equipamentos foi feita através do escritório da Unicontrol em São Paulo. Os painéis com grau de proteção IP54 (proteção contra poeira e projeções d’água) foram usados para áreas não-classificadas enquanto os painéis IP65 (proteção total contra poeira e contra jatos d’água), tiveram de ser projetados e manufaturados pela Unicontrol, com o processo de certificação feito no Brasil. Estes foram posteriormente enviados à Singapura, local da construção naval da P-43, conforme a necessidade. Toda a programação do CLP, desde a análise das matrizes de causa-efeito até o desenvolvimento, aprovação e implementação dos blocos de função estão sob a responsabilidade da Unicontrol. A Arquitetura de Controle por Unidade de Processo (MCPU) divide a segurança e as funções do processo de qualquer unidade em cinco grupos: Controle do Processo (Control), Fogo & Gás (F&G VAC), Utilidades da Embarcação (Vessel), Gerenciamento de Energia (Electrical) e Desligamento de Emergência (ESD). Cada grupo funcional é implementado na configuração do seu próprio hardware redundante. 5 O uso da Arquitetura MCPU resulta em cada unidade do processo sendo controlada por até cinco controladores diferentes, cada um responsável por um dos grupos funcionais descritos acima. Neste sentido, a perda de parte da funcionalidade em algum grupo funcional não significará que a plataforma como um todo será afetada. Devido à configuração por funções, a cada dispositivo inteligente é permitido comunicar-se com os elementos instalados em cada área de processo da plataforma. Para garantir maior confiabilidade ao sistema, todos os serviços diretamente envolvidos com a ECOS (Estação Central de Operação e Supervisão) estão também sob a responsabilidade da Unicontrol. Isto inclui: • Todo o projeto, desenvolvimento e implementação de todos os aspectos de engenharia da ECOS. • Todos os serviços de campo, da instalação ao comissionamento, startup, operação assistida e treinamento. • Interligação a outros pacotes já instalados, garantindo sua total integração à ECOS. 6 Capítulo 3: Características Construtivas das Plataformas Quanto às plataformas, esta é a primeira vez que duas plataformas estão sendo construídas em dois lugares diferentes (Singapura e Brasil) para iniciar a produção quase que simultaneamente. A P-48 está sendo construída no estaleiro Bras Fels em Angra dos Reis – RJ. A parte de construção naval da P-43 foi quase que totalmente realizada em Singapura, no Estaleiro Jurong. Isto devido à inexistência, no Brasil, de um outro dique seco que comportasse o seu porte (337 m de comprimento). Atualmente, a P-43 encontra-se no Estaleiro Mauá-Jurong em Niterói – RJ em fase de comissionamento e instalação dos módulos. As plataformas P-43 e P-48 são resultado da conversão de antigos navios petroleiros em plataformas e são mais um passo da Petrobras em busca da autosuficiência no mercado de petróleo. Juntas ambas podem produzir 300 mil barris de petróleo por dia. Os petroleiros utilizados nestas plataforamas não poderiam mais ser utilizados no transporte de petróleo pelo fato de possuírem casco simples (normas ambientais internacionais não permitem mais a utilização deste tipo de navio nesta atividade). Foram então transformadas em FPSOs (Floating Production, Storage and Offloading), unidades flutuantes que produzem, separando o óleo da água e areia, armazenam até um certo limite e depois descarregam o óleo produzido em outro navio de transporte. São versáteis devido a sua capacidade de locomoção, feita através de rebocadores, e por não precisarem de dutos ligando-as à terra para o escoamento a produção. A FPSO P-43, por exemplo, tem uma capacidade de armazenamento máxima maior do que 1,5 milhão de barris, o que equivale a aproximadamente a 75% da média diária de produção da Petrobras em 2003, que foi de 2.001.100 bpd [1]. A produção esperada da plataforma é de 150 mil bpd, ou seja, pode ficar aproximadamente 10 dias em produção continuada sem descarregamento. No entanto, quando estiver em funcionamento, prevê-se que o descarregamento da produção se dará a cada 7 dias durando dois dias. A capacidade de bombeamento máxima, da P-43 para o navio de transporte, é superior a 60 mil barris por hora. 7 Fig. 3.1 — Stena Continent: Navio convertido na P-43 Fig. 3.2 — P-43 chegando de Singapura (sem os módulos superiores) 8 3.1: Características do Óleo O óleo a ser produzido em Barracuda tem um API de 26º, o que caracteriza um óleo pesado, típico da Bacia de Campos. Seus valores de viscosidade são de 30,0 cP (30º C); 21,0 cP (50º C) e 15,7 cP (60º C). O início do deposição de parafina ocorre a 15º C. 3.2: Visão Geral do Processo Numerosos poços alimentam as FPSOs de Barracuda e Caratinga (26 poços do campo de Barracuda para a P-43 e 19 do campo de Caratinga para a P-48). Estes poços são ligados ao navio através de dutos flexíveis (risers). Existem também as linhas que fazem a transmissão dos sinais de controle chamadas de umbilicais. O controle de abertura do poço é feito através de acionamento hidráulico pela árvore de natal1 molhada, ou seja, localizada no fundo do mar. O óleo extraído chega à plataforma e passa pelo manifold2. Neste local existe um conjunto de tubulações grandes proporções, preparadas para receber o petróleo vindo dos poços. Existem na plataforma três manifolds: dois de produção e um de testes do óleo produzido. Os testes são necessários para verificar se óleo encontra-se dentro dos padrões esperados para aquela região e para analisar o efeito dos métodos de elevação artificial na composição do óleo. Isto inclui a relação água / óleo e a quantidade de areia. O óleo vindo dos manifolds de produção é então encaminhado aos separadores para a retirada de água e gás (Fig. 3.3). A separação neste caso dá-se por decantação: a água, assim como algumas impurezas presentes no óleo, mais densas, tendem a descer enquanto o óleo e o gás, menos densos, tendem a subir. A água retirada não pode ser simplesmente descartada. Ela passa por um processo de filtragem no hidrociclone e é depois descartada. 1 Árvores de natal são conjuntos de conectores e válvulas usadas para controlar o fluxo dos fluidos produzidos ou injetados, instalados em cima da cabeça do poço. 2 Manifold é um equipamento de passagem e de manobra da produção, onde o óleo é agrupado em um mesmo coletor. 9 Deste separador inicial, o óleo segue para o desidratador de óleo e depois para o tratador eletrostático. O tratador eletrostático retira as impurezas restantes ainda presentes que não saíram por decantação. Deste, o óleo segue até os separadores atmosféricos para a retirada do restante do gás. Já sem água e sem gás, o óleo pode ser armazenado nos tanques de estocagem do navio. Uma parte do gás pode ser utilizada na elevação artificial por gas lift. Existem vasos para armazená-lo já que o gás é o combustível utilizado para a geração de energia na plataforma. O excesso de gás é queimado no flare. Ainda existem processos auxiliares para a desidratação de gás. Fig. 3.3 — Fluxo de Processo 10 Capítulo 4: Arquitetura Geral das Redes de Controle O bom funcionamento da automação da plataforma é diretamente dependente das redes de comunicação entre os sensores, controladores e atuadores. Um bom projeto de engenharia é essencial neste caso que envolve mais de 15000 pontos de entrada e saída. É evidente que esta quantidade de sinais não pode ser ligada diretamente a módulos de E/S na sala de controle — a quantidade de cabos torna praticamente impossível esta abordagem. A arquitetura preocupouse então em distribuir o controle usando painéis remotos com estes cartões de E/S deixando a comunicação com o controlador central sob responsabilidade de uma rede Profibus DP. Desta maneira, reduz-se a fiação e permite-se que os instrumentos fiquem fisicamente mais próximos de seus cartões de integração. Garante-se desta maneira maior confiabilidade ao sistema e maior resistência a falhas. O controle da plataforma é feito centralmente, a partir de CLPs localizados em uma sala de painéis ao lado da sala de controle. Mais especificamente, é realizado por 5 CLPs Siemens S7-400 redundantes alimentados por uma fonte de alimentação da mesma série. Cada um destes CLPs é responsável por uma função de controle, os chamados subsistemas de controle. Estão presentes na plataforma os seguintes subsistemas de controle: • Emergency Shutdown Subsystem (Sistema de Desligamento de Emergência) – composto por duas CPUs de CLP redundantes. • Vessel Control Subsystem (Sistema de Controle de Utilidades da Embarcação) – composto por duas CPUs de CLP redundantes • Electrical Control Subsystem (Sistema de Controle Elétrico) – composto por duas CPUs de CLP redundantes. • Fire & Gas Subsystem (Sistema de Contenção de Fogo & Gás) – composto por duas CPUs de CLP redundantes. 11 • Process Control Subsystem (Sistema de Controle de Processos) – composto por duas CPUs de CLP redundantes. Além destes, existem outros dois CLPs, também redundantes, totalizando quatro CPUs, que fazem o controle do Sistema de Gerenciamento de Energia e do Gerador de Emergência. Estes dois sistemas não estiveram sob responsabilidade da Unicontrol e não serão abordados neste trabalho. 4.1: Acesso aos Dados Remotos A comunicação entre os instrumentos de campo e os CLPs é feita através de subredes que estão associadas a cada um dos subsistemas que formam o sistema de controle (Emergency Shutdown — ESD; Vessel Control — VCS; Electrical Control — ECS; Fire & Gas — FGV; Process Control — PCS). Cada subsistema da plataforma possui seus próprios pontos de entrada e saída. A arquitetura básica é formada por painéis de entrada e saída remotos, localizados no campo, próximos aos instrumentos, que centralizam a coleta e distribuição dos dados. Todos os instrumentos automatizados são ligados a estes painéis. Nestes painéis estão alocados cartões de E/S digitais e analógicos, responsáveis pela transformação dos sinais, da série Siemens S7-300 e uma fonte alimentadora. Desta maneira os sinais podem ser endereçados pela CPU S7-400 (controlador central) e utilizados nas rotinas de controle. Os sinais de um mesmo subsistema são agrupados em um mesmo módulo de interface chamado IM. Deste módulo existe uma ligação a um conversor OLM elétrico / ótico. Existem usualmente duas abordagens em relação à redundância no campo. Uma delas prevê a duplicação do I/O, isto é, a utilização de dois instrumentos de campo para a leitura do mesmo sinal. Outra se utiliza da redundância do meio de transmissão. Para escolher uma ou outra deve-se levar em conta os custos de engenharia. Foi devido ao grande número de instrumentos de campo que a segunda opção foi escolhida. Os cabos redundantes percorrem caminhos diferentes na 12 plataforma para garantir maior segurança. Isto porque, caso houver rompimento de um deles, não necessariamente o outro se romperá. Esta rede redundante utiliza o protocolo Profibus DP e interliga painéis e controladores centrais. 4.2: Rede Profibus DP No caso do acesso aos dados dos painéis, é utilizada a rede Profibus DP, considerada uma das redes de campo de mais rápidas e confiáveis disponíveis atualmente. É um formato de troca de mensagens especificamente projetado para acesso serial às entradas e saídas. O sufixo DP (decentralized periphery) refere-se à periferia descentralizada, que é usado para descrever a arquitetura de E/S distribuído com controle centralizado. No caso das plataformas, como já dito anteriormente, é imperativa a utilização de um barramento de campo como este. Com mais de 15000 pontos de E/S, seria impossível ligar todos os dispositivos diretamente aos controladores centrais, usando um par de fios para cada dispositivo como no modo mais usual. Os problemas de cabeamento seriam evidentes, tanto na quantidade como na qualidade das conexões, trazendo muitos problemas ao controle devido a falhas. O protocolo permite que os dispositivos de E/S sejam conectados aos seus respectivos controladores centrais por apenas um par de fios. O Profibus DP utiliza um mestre no barramento para controle de acesso ao cabo serial RS-485. Um escravo Profibus DP é qualquer dispositivo periférico que processa informação e envia sua saída ao mestre. O escravo é uma estação passiva na rede já que não tem direito a aceso ao barramento e pode apenas enviar sinais de reconhecimento de mensagens recebidas ou enviar mensagens de resposta ao mestre sob requisição. Todos os escravos Profibus têm a mesma prioridade e toda a comunicação da rede se origina do mestre. A CPU S7-400, utilizada no controle central, suporta a utilização do protocolo Profibus DP e possui uma entrada específica para este protocolo. No caso da rede utilizada na plataforma, esta CPU faz o papel de mestre de comunicação. Os mestres são as estações ativas na rede. Eles determinam a velocidade de transmissão e os escravos detectam automaticamente esta taxa. Os mestres lidam com o envio e recebimento de dados 13 de seus escravos e agem como os controladores na troca de informação de E/S com seus escravos, fazendo uma atualização cíclica dos dados. Os mestres podem acessar escravos de maneira individual, de maneira grupal (multicast) ou podem endereçar escravos de maneira geral para todos os escravos conectados (broadcast). Os escravos retornam respostas para todos as mensagens endereçadas individualmente a eles. Eles não respondem a um multicast ou um broadcast de um dispositivo mestre. Devido ao fato de o Profibus DP usar um algoritmo que permite o acesso ao barramento de maneira cíclica (periódica) ele é um protocolo determinístico. Isto significa que o sistema Profibus garante um tempo máximo de ciclo no qual todos os dispositivos serão atualizados. De fato, a rede Profibus DP foi projetada para ter este comportamento determinístico. Isto garante mais confiabilidade ao sistema pelo fato de nenhum sinal ficar sem ser lido em um tempo determinado, ou seja, não ocorre a postergação indefinida no acesso. Isto é especialmente importante na plataforma pois quase todos os sinais trazem, direta ou indiretamente, informações sobre segurança do sistema. Na Fig. 4.1 pode-se ter uma visão geral do sistema, incluindo as redes Profibus DP e Profibus FMS, que será abordada no próximo item. 4.3: Profibus FMS e Nível Superior de Controle Cada CLP se comunica com seu redundante via enlace ótico instalado na própria CPU. A redundância de hardware é mais uma das características do sistema que visa garantir a segurança do controle. Todo o rack que contém as CPUs é duplicado. Isto inclui as fontes de alimentação, as próprias CPUs (com entradas MPI e Profibus DP), o modulo de comunicação via Ethernet, o módulo de comunicação Profibus FMS e, em alguns subsistemas, os módulos de comunicação via Modbus. O enlace ótico (Fig. 4.2) é a maneira pela qual as CPUs de um mesmo subsistema se comunicam para manter a sincronia das informações e para “avisar” que a outra deve entrar em ação devido a alguma falha na CPU principal. A este sistema dá-se o nome de hot stand by. 14 Fig. 4.1 — Arquitetura do sistema de controle principal Todas as CPUs dos 14 CLPs (subsistemas de controle, Sistema de Gerenciamento de Energia e Gerador de Emergência) são interligadas em um anel de fibra ótica que funciona utilizando o protocolo Profibus FMS. Para a utilização desta tecnologia, está acoplado ao rack da CPU S7-400 um módulo Siemens CP443-5 que contém um cartão específico para esta finalidade. Deste módulo existe uma ligação a uma OLM, um dispositivo conversor elétrico / ótico. Este dispositivo possui uma saída elétrica e duas óticas, formando um “T” que permite a topologia em anel. Desta forma, todas as CPUs do sistema ficam “penduradas” no anel (Fig. 4.2). A topologia em anel possui uma característica que a torna vantajosa em relação a outras. Em caso de rompimento do cabo em algum ponto, ainda assim a comunicação via Profibus FMS entre as CPUs poderá acontecer, pois existirá um caminho ligando todas elas. 15 Fig. 4.2 — Redundância dos racks, enlace ótico e rede Profibus FMS A transmissão de dados por uma via Profibus FMS (Fieldbus Message Specification) é adequada para a transmissão de dados estruturados [2], neste caso entre as CPUs dos CLPs. A grande vantagem do protocolo Profibus FMS é que estruturas de dados podem ser transferidas em um formato neutro (padrão) e então convertidos no formato exigido pelo dispositivo final. O direito de acesso à rede é definido pelo token que é passado de um dispositivo mestre para outro. Os dispositivos escravos só reagem quando requisitados por um mestre. Em termos de funcionalidade de um dispositivo FMS, uma distinção é feita entre: • Cliente FMS: requisita um serviço, assumindo que este é um dispositivo mestre. • Servidor FMS: fornece o serviço requisitado. Tanto um mestre no Profibus como um escravo podem atuar como servidores. 16 Um sistema mestre FMS é formado por dispositivos que tenham, todos eles, capacidade de se comunicar no formato FMS na mesma subrede Profibus. A rede utilizada na plataforma, no nível dos CLPs, é deste tipo. 17 Capítulo 5: S7-400 e S7-300 Como exposto anteriormente, o sistema de controle da plataforma é central e realizado pelo CLP Siemens série S7-400, com a CPU 417H. São dez CPUs, cinco delas ativas e cinco em modo stand by. Os módulos de expansão de E/S são da série S7-300. Ambas as séries fazem parte da família Simatic Step 7. 5.1: Hardware — Controlador Central Os CLPs encontram-se nos racks na sala de painéis, ao lado da sala de controle da plataforma. A configuração utilizada pode ser visualizada na Fig. 5.1. Fig. 5.1 — Configuração do Rack 5.1.1: Fonte de Alimentação PS 407 É responsável pela alimentação de todos os dispositivos presentes no rack. É capaz de fornecer uma tensão de saída de 5 V DC e 24 V DC dependendo da aplicação. O fornecimento se dá via barramento backplane, localizado na parte de trás do rack. A tensão de entrada pode ser tanto 120 quanto 230 V AC. A PS 407 suporta uma corrente máxima de fornecimento de 10 A e ocupa o espaço correspondente a dois slots no rack. 18 A fonte PS 407 possui, em seu painel frontal: • Leds para confirmar tensão de saída em conformidade, tensão correta na bateria de backup e led para indicar falha interna; • Chave para reconhecimento de falha; • Compartimento para bateria de backup; • Chave para ativação do monitoramento da bateria; • Seletor de tensão de entrada; • Conexão com plug de 3 pinos. Fig. 5.2 — PS 407 Tabela 5-1 — Especificações Técnicas PS 407 10A R Especificações Técnicas PS 407 10A R Entrada Tensão de Entrada 110 / 230 VDC Tensão Classificada 120 / 230 VAC 88 até 300 VDC Tensão Permitida 85 até 264 VAC Freqüência do Sistema Freqüência Classificada 50 / 60 Hz Freqüência Permitida 47 até 63 Hz Saída Tensão de Saída (Valores Classificados) 5 / 24 VDC Corrente de Saída (Valores Classificados) 5 VDC: 10 A / 24 VDC: 1,0 A 19 5.1.2: CPU 417-4H É a Unidade Central de Processamento usada na plataforma, utilizada para sistemas que requerem alto desempenho e segurança. Esta é a CPU mais poderosa da família S7-400. Possui entrada para dois módulos de sincronia para conectar as CPUs redundantes através de um cabo de fibra ótica. Na plataforma, eles são utilizados. Possui ainda uma interface mestre Profibus DP [3] e uma MPI (Multi-Point Interface) integradas diretamente à CPU. Fig. 5.3 — Visão esquemática da CPU 417-4H Pode-se ainda utilizar cartões para expandir a memória de carga. Existem cartões de diversos tamanhos e dependendo da aplicação deve-se optar por mais ou menos memória. Na plataforma, foi utilizado um cartão de expansão de memória RAM de 2 MB. Fig. 5.4 — CPU 417-4H Tabela 5-2 — Especificações Técnicas CPU 417-4H Especificações Técnicas CPU 417-4H Integrada Expansível Memória Memória do Usuário 2 MB para programa 2 MB para dados Até 10 MB para programa 20 Até 10 MB para dados Memória de Carga Integrada 256 kB RAM Expansível FEPROM Cartão de Memória até 64 MB Expansível RAM Cartão de Memória até 64 MB Tempo de Execução das Instruções Operação com Bits (mín.) 0,1 µs Operação com Palavras (mín.) 0,1 µs Operação com Ponto fixo (mín.) 0,1 µs Operação com Ponto-flutuante (mín.) 0,6 µs Temporizadores / Contadores Contadores S7 512 Retentividade Selecionável C 0 até C 511 Alcance dos Contadores 0 até 999 Contadores IEC Sim Tipo SFB Temporizadores S7 512 Alcance 10 ms a 9990 s Temporizadores IEC Sim Tipo SFB Áreas de Dados Memória de bits 16 kB Retentividade Selecionável MB 0 até MB 16383 Entradas e Saídas Área total de endereçamento 16 kB Tabela Imagem da Periferia 16 kB Canais Digitais 131072 Canais Analógicos 8192 5.1.3: CP 443-1 O módulo CP 443-1 é o responsável pela comunicação do S7400 com a rede Industrial Ethernet. A taxa de transmissão é de 10 ou 100 Mbits. A conexão com a rede Ethernet se dá através de um conector de 15 pinos [3]. Fig. 5.5 — CP 443-1 21 Tabela 5-3 — Especificações Técnicas do Módulo Ethernet CP 443-1 Especificações Técnicas CP 443-1 Interfaces Conexão Industrial Ethernet Soquete de 15 pinos Consumo de Corrente @ +5 V DC Aproximadamente 1,4 A @ 24 V DC Típico 220 mA, máx. 340 mA Perda de Potência 8,6 W Condições Ambientais de Operação Temperatura de Operação 0 a 60° C Temperatura de Transporte / -40 a 70° C Armazenagem Umidade Relativa @ 25° C Máx. 95% @ 25° C 5.1.4: CP 443-5 BASIC O CP 443-5 BASIC é o responsável pela integração do S7-400, como mestre, à rede Profibus FMS. Suas funcionalidades incluem a operação com sistemas S7 redundantes, como os presentes na aplicação da plataforma [3]. Fig. 5.6 — CP 443-5 BASIC Tabela 5-4 — Especificações Técnicas do Módulo Profibus CP 443-5 BASIC Especificações Técnicas CP 443-5 BASIC Taxa de transmissão de dados Tecnologia de transmissão Conexão Tensão de alimentação Consumo de corrente @ 5 V Perda de Potência 9,6 kbits/s a 12 Mbits/s Interface Cabo RS-485 Soquete de 9 pinos 5 V DC ± 5% 1,2 A 6,5 W 22 Condições Ambientais de Operação Temperatura de Operação 0 a 60° C Temperatura de Transporte / -40 a 70° C Armazenamento Umidade Relativa Máx. 95% @ 25° C 5.1.5: CP 441-2 O módulo CP 441-2 é utilizado nos subsistemas Vessel e Fogo & Gás que possuem comunicação Modbus. No caso do subsistema Vessel, este tipo de comunicação seria é usado para controle do nível dos tanques de produção, enquanto no sistema Fogo & Gás ele é usado pelo AFDS (Sistema Endereçável de Detecção de Fogo). O módulo foi projetado para comunicação ponto a ponto serial de alta velocidade. Ele aceita interfaces variáveis (2 com 2) para uma comunicação mais eficiente. Fig. 5.7 — CP 441-2 Tabela 5-5 — Especificações Técnicas do Módulo Modbus CP 441-2 Especificações Técnicas CP 441-2 Número de entradas Método de transmissão Taxa de Trasmissão Máxima Distância de Transmissão Máxima Interface 2, variável 20 mA (TTY) (máx. 19,2 kbits/s) RS232 (V24) (máx. 115,2 kbits/s) RS422 / RS485 (X27) (máx. 115,2 kbits/s) 115,2 kbits/s distribuídos nas 2 interfaces RS 232C (V24): 10m 20 mA (TTY): 1000m RS 422 / 485 (X27): 1200m Parametrização Via Step 7 23 Existe, neste módulo, um driver disponível para comunicação em Modbus no formato RTU. 5.1.6: Rack do Controlador Central A integração dos dispositivos descritos nos itens acima pode ser visualizada na Fig. 5.8. Fig. 5.8 — Vista geral do Rack 5.2: Princípios de Programação do S7-400 A maior parte da programação se dá através do software SIMATIC Manager que é a principal aplicação para execução do projeto pois, através dele, pode-se configurar, editar e fazer testes nos programas. O primeiro passo para se iniciar um projeto é configurar o hardware da aplicação. A primeira comunicação do terminal de programação (geralmente um PC) com o CLP deve ser através da MPI (Multi-Point Interface) pois este é o único meio que se conecta ao CLP sem configuração. A MPI tem como objetivo conectar o CLP ao terminal de programação ou à interface de operação, ou ainda a outros CLPs. Na CPU existe somente uma MPI porém é possível acessar através dela todos os outros módulos programáveis. 24 Geralmente, utiliza-se a MPI para se fazer o download de uma configuração de hardware para a CPU. Isto porque sua taxa de transmissão é de 187,5 kbps, muito abaixo da taxa de uma rede Ethernet por exemplo que é de 10 Mbps ou 100 Mbps. Então, utiliza-se a MPI somente para configurar uma rede Ethernet para acessar o CLP do terminal de programação. A programação no CLP Siemens S7-400 segue a norma IEC 1131. Esta norma é um documento escrito por um consórcio de fabricantes de CLPs, casas de sistemas e instituições direcionadas a desenvolver plataformas para níveis de padronizações na automação industrial. Contém características de funções e definições de termos gerais comuns para CLPs. Por exemplo, processamento cíclico, imagem de processo, divisões de tarefas entre dispositivos de programação, CLPs e Interfaces Homem Máquina. De maneira geral, o ciclo de processamento da CPU se dá como mostrado na Fig. 5.9. Ele consiste de três partes principais: • A CPU atualiza o estado dos sinais de entrada na tabela imagem das entradas; • A CPU executa o programa do usuário com as respectivas operações chamadas pelo OB 1; • A CPU escreve os valores da tabela imagem das saídas no módulo de saídas. As tabelas imagem de entrada e saída são áreas da CPU onde os estados das entradas e saídas são a cada ciclo armazenadas. Existem áreas distintas para as entradas e para as saídas. Normalmente o programa de usuário, quando acessa uma entrada ou saída, está acessando na realidade esta área. A tabela imagem das entradas do processo é o local onde o estado das entradas são arquivadas na CPU. Antes do início de cada ciclo de programa, a CPU lê a periferia (módulos de entrada) e transfere os estados dos sinais digitais para esta área. Da mesma maneira, a tabela imagem das saídas contém o valor das 25 saídas resultantes do processamento do programa. Somente no final do ciclo de programa, estes valores de saída são transferidos para os módulos de saída. Esta abordagem garante que um mesmo sinal de entrada ou saída tenha sempre o mesmo valor durante um scan do CLP. Fig. 5.9 — Ciclo de Processamento da CPU 5.2.1: Áreas de Memória Existem três áreas de memória na CPU S7-400: a memória de carga, a memória de trabalho e a memória de sistema (Fig. 5.10). A memória de carga é parte do módulo programável. Ela contém objetos criados pelo dispositivo de programação e pode ser tanto um cartão de memória como uma memória integrada na CPU. É ainda dividida em memória de carga dinâmica e memória de carga retentiva. A memória de trabalho é do tipo RAM e é aquela que o processador da CPU acessa quando executa o programa de usuário. Contém o programa de usuário executável. 26 Fig. 5.10 — Áreas de Memória da CPU S7-400 A memória de sistema também é RAM e é integrada na CPU. Ela armazena dados de temporizadores, contadores, da memória de bits e dados necessários internamente pelo sistema operacional. Possui ainda a pilha de blocos (ordem de chamada dos blocos), a pilha de interrupção e o buffer de diagnóstico (que dá informações dos últimos eventos ocorridos com a CPU). A memória de sistema é dividida internamente em algumas áreas que podem ser acessadas pelo programa de usuário como mostrado na Tabela 5-6. Tabela 5-6 — Áreas de Endereço da Memória de Sistema Memória de Sistema Área de Endereço Notação no S7 Descrição Tabela Imagem da Periferia de Entrada Iy No começo do ciclo de varredura (scan) a CPU lê as entradas dos módulos de entrada e salva estes valores nesta área. Tabela Imagem da Periferia de Saída Qy Durante o ciclo de varredura (scan) o programa calcula os valores de saída e os aloca nesta área. No final do ciclo, a CPU envia estes valores calculados aos módulos de saída. Memória de Bit My Esta área fornece espaço para resultados intermediários calculados no programa. Temporizadores T Fornece espaço para temporizadores. 27 Contadores C Fornece espaço para contadores. Bloco de Dados DBy Blocos de Dados contêm informação para o programa. Eles podem ser definidos para uso geral ou podem ser determinados para um específico Bloco de Função ou Bloco de Função do Sistema. São abertos no programa de usuário com a instrução “OPN DB” Bloco de Dados “Instance” DIy São Blocos de Dados abertos no programa com a instrução “OPN DI”. Ly Esta área contém dados temporários de um bloco enquanto este está sendo executado. A “L stack” também fornece memória para transferência de parâmetros e para salvar resultados temporários. Dados Locais Obs. 1: y fornece a dimensão de acesso à área. Pode ser B para bytes, W para words e D para double words. Obs. 2: quando o acesso é ao bit não é preciso usar o indicador de dimensão de acesso y, exceto quando o acesso for em um DB ou em um DI. Neste caso devese utilizar X para acessá-lo. 5.2.2: Acesso Direto às E/S Pode-se acessar diretamente os sinais de entrada e saída. Isto demanda mais tempo já que é necessário acesso à rede que conecta os periféricos ao CLP (no caso das plataformas, a rede Profibus DP). Para estas áreas, não é possível o acesso a bits, porque este acesso foi projetado exclusivamente para endereçamento a variáveis analógicas. Tabela 5-7 — Acesso direto à área de E/S Área Periferia de Entrada PIy Área Periferia de Saída PQy As Áreas Periferia de Entrada e Saída permitem acesso direto às entradas e saídas centrais e distribuídas. 28 5.2.3: Registradores Existem quatro tipos de registradores na CPU S7-400: os acumuladores, os registradores de endereços, os registradores de blocos de dados e a palavra de status. A seguir, serão descritos o funcionamento e a utilidade de cada um deles. 5.2.3.1: Acumuladores Existem quatro acumuladores presentes na CPU S7-400. Eles são utilizados para instruções envolvendo bytes, words e double words em operações aritiméticas, comparações e outras. O tamanho dos acumuladores é de 32 bits. Eles são referenciados por ACCU X, onde X é o número do acumulador. Ainda podem ser referenciados por ACCU X-L ou ACCU X-H, sendo que L se refere à word menos significativa e H à word mais significativa. Da mesma maneira, pode haver uma referência ao byte. Neste caso, utilizam-se duas letras, como por exemplo ACCU 1-L-L, que se refere ao byte menos significativo da word menos significativa do acumulador 1. Fig. 5.11 — Acumuladores no S7-400 Tabela 5-8 — Exemplo de comandos envolvendo acumuladores L <endereço> Carrega o byte, word ou double word no ACCU 1 (acumulador 1) endereçado depois de o antigo conteúdo do ACCU 1 ter sido salvo no ACCU 2 e depois de ACCU 1 ter sido resetado. T <endereço> Copia o conteúdo do ACCU 1 no endereço de destino. O número de bytes copiado do ACCU 1 depende do tamanho especificado no endereço de destino. TAK Troca o conteúdo do ACCU 1 com o conteúdo do ACCU 2. 29 5.2.3.2: Registrador de Endereços Dois registradores de endereço de 32 bits cada um são usados como ponteiros para o registro de endereçamento indireto. Eles são referenciados por AR1 e AR2. O registrador de endereço contém informação da área de memória (I, Q, M, DB, etc.), do byte e do bit endereçado. O registro endereça univocamente os bits de todas as áreas, exceto dos Blocos de Dados (DBs). Para estes, deve-se informar a priori o número do DB a ser utilizado. Fig. 5.12 — Formato do Registrador de Endereços 5.2.3.3: Registrador de Bloco de Dados Os registradores de bloco de dados contêm os números dos blocos de dados que estão abertos (ativos). Eles possuem 16 bits (tamanho necessário para armazenar um número inteiro). Assim é possível que dois DBs estejam simultaneamente abertos; um DB no registrador de DB e o outro como DB Instance no registrador DI. Fig. 5.13 — Registradores de Bloco de Dados Para abrir um Bloco de Dados, deve-se guardar o número deste no registrador de bloco de dados. Para isso existe a instrução OPN cujo funcionamento está descrita no Anexo A. 30 5.2.3.4: Palavra de Status A Palavra de Status contém vários bits que refletem o resultado ou o estado lógico de instruções individuais durante a execução do programa. Possui 16 bits mas apenas os 9 primeiros são utilizados. Fig. 5.14 — Formato da Palavra de Status O bit 1 da palavra de status é o bit RLO (Result of Logic Operation). É usado como memória temporária em operações de lógica binária. Uma instrução gerada verifica o estado de um contato e o combina logicamente com o resultado do cheque (bit de status) de acordo com as regras da lógica. O resultado é armazenado no bit de RLO. Existem comandos que atuam diretamente no RLO. Com “SET” pode-se forçar RLO para “1”, com CLR para “0”, e com NOT inverte-se o estado de RLO. O bit 2 da palavra de status é o bit STA (bit de status). Este contém o valor de um bit endereçado. O bit de status sempre mostra, por leitura ou escrita o estado do bit endereçado. Estes são os principais bits da palavra de status e os que são efetivamente utilizados. 5.2.4: Linguagens de Programação Estão disponíveis no SIMATIC Manager 4 tipos de linguagens de progração: LAD (ladder), FBD (function block diagram), STL (statement list) e o SCL que é uma programação baseada em Pascal. 5.2.4.1: LAD — Ladder Também chamada de linguagem de diagrama de contatos, esta linguagem remete à conexão entre álgebra de Boole e circuitos elétricos. Na linguagem ladder, cada contado, ao assumir dois estados (fechado ou aberto), representa uma variável booleana, ou seja, uma variável que assume dois estados: verdadeiro ou falso [4]. 31 Fig. 5.15 — Exemplo de diagrama ladder Pela facilidade de construção e pela semelhança com os quadros de comando elétrico, o diagrama ladder (que quer dizer escada ou cascata) foi uma das primeiras técnicas de programação de CLPs. Na Fig. 5.15 tem-se um exemplo de diagrama ladder. Neste caso, a equação booleana representada em ladder é: Y = A.C + B. O diagrama possui duas linhas verticais, representando barras de alimentação. As relações causa-efeito são representadas por linhas horizontais formadas por um elemento controlado (bobina de relé) e um conjunto de condições para o controle do elemento (rede de contatores). O diagrama é, no entanto, uma representação lógica e não considera a tensão das barras de alimentação. O funcionamento no CLP se dá por uma varredura, chamada scan, de cada linha horizontal do programa. As bobinas de relés apresentam então um estado lógico dependente do estado lógico dos contatores que as controlam. As instruções básicas da linguagem, disponíveis em todos os CLPs são contatores normalmente abertos (NA ou NO), contatores normalmente fechados (NF ou NC), bobinas, bobinas inversas, bobinas de rearme (set), bobinas de desarme (reset), contatores sensíveis à borda de subida e contatores sensíveis à borda de descida. Ainda existem instruções de temporizador, instruções de contadores, instruções de movimentação, instruções de comparação e instruções de operações algébricas que variam de acordo com o fabricante do CLP e outras definidos pela IEC (International Eletrotechnical Commission). No SIMATIC Manager pode-se agrupar um determinado número de linhas horizontais para formar uma network. As networks facilitam o entendimento do código porque separam o código em pequenos blocos que podem ser comentados e nomeados. 32 5.2.4.2: FBD — Function Block Diagram Esta linguagem difere um pouco da linguagem ladder mas possui o mesmo objetivo. A diferença está no fato de que em FBD a programação é escrita da mesma maneira que no diagrama de portas lógicas. Esta linguagem possui as mesmas funcionalidades da linguagem ladder, apenas a representação é diferente. Como exemplo, temos na Fig. 5.16, a representação em FDB da equação Y = A.C + B, a mesma mostrada na Fig. 5.15 em ladder. Fig. 5.16 — Exemplo de Programação em FBD 5.2.4.3: STL — Statement List Programming Language STL é uma linguagem textual das mais poderosas do CLP S7-400. Com ela pode-se fazer uma programação mais eficiente porque são eliminadas linhas desnecessárias de código. Além disso, é permitido o uso de ponteiros, fazendo com que a programação fique mais ágil. Na Fig. 5.17 é mostrado o exemplo de como seria a representação da equação booleana Y = A.C + B em STL. Fig. 5.17 — Exemplo de Programação em STL Em STL, cada instrução corresponde a um passo da CPU. Um certo número de instruções, definido pelo usuário, pode ser agrupado para formar uma network. As instruções são muito mais próximas à linguagem de máquina. Por exemplo, para mover um byte em ladder, basta utilizar o bloco específico para isto. Em STL, é 33 necessário carregar o byte no acumulador e depois copiar o conteúdo do acumulador para o local desejado. Tabela 5-9 — Comandos STL Exemplos de Comandos em STL JC <jump label> Se RLO = 1, JC interrompe a varredura seqüencial do programa e pula para o destino identificado por “jump label”. ==D Compara o conteúdo do ACCU 1 com o conteúdo do ACCU 2 . O conteúdo é interpretado como números inteiros de 32 bits. O resultado é indicado pelo RLO; caso RLO = 1 a comparação é verdadeira, caso contrário, a comparação é falsa. LAR1 Copia o conteúdo de ACCU 1 no registrador de endereços AR1. +I Faz a operação de soma entre o ACCU 1-L e o ACCU 2-L e armazena o resultado em ACCU 1-L. 5.2.5: Ponteiros e seus formatos Pode-se fazer uma programação em STEP 7 com a utilização de ponteiros. Nesta seção será descrito o funcionamento e a chamada destes. 5.2.5.1: POINTER O primeiro tipo de ponteiro é o POINTER. O POINTER é um ponteiro de 6 bytes que pode armazenar endereços de todas as áreas de memória de sistema. Fig. 5.18 — Formato do POINTER Os dois primeiros bytes se referem ao número do Bloco de Dados (DB) endereçado. Caso o ponteiro não esteja endereçando um DB, deve-se preencher 34 estes bytes com 0. O byte 2 se refere à área de memória endereçada. São 7 áreas endereçáveis e cada uma delas possui um código hexadecimal como mostrado na Tabela 5-10. Os bytes 3, 4 e 5 endereçam os diretamente o byte e o respectivo bit. Tabela 5-10 — Códigos das Áreas de Memória Código Hexadecimal Área de Memória 81 82 83 84 85 86 87 I Q M DB DI L V Descrição Tabela Imagem das Entradas Tabela Imagem das Saídas Área de Memória de Bits Bloco de Dados Bloco de Dados Instance Dados Locais (pilha) Dados Locais Prévios A seguir são dados exemplos de como entrar com um dado do tipo POINTER no programa: • P#DB23.DBX5.5 — ponteiro para o bit 5, byte 5 do DB 23; • P#M20.0 — ponteiro para o bit 0, byte 20 da Memória de bits; • M20.0 — ponteiro se o parâmetro já foi declarado como sendo POINTER 5.2.5.2: Ponteiro ANY O parâmetro ANY é um ponteiro um pouco mais completo que o parâmetro POINTER. São necessários 10 bytes para armazená-lo. O parâmetro ANY, ao contrário do POINTER pode endereçar toda uma área de memória, além de poder apontar para temporizadores, contadores e blocos de programa. Ele pode ser usado em um bloco quando o tipo de dado do parâmetro é desconhecido ou quando qualquer tipo de dado pode ser usado. Na tabela de declaração de variáveis do bloco, deve-se declarar o parâmetro como sendo um ANY. Pode-se então determinar um tipo de dado de qualquer tipo ao parâmetro. O STEP 7 gerencia de maneira diferente os dados contidos no ponteiro ANY, de acordo com o seu conteúdo. Se o ponteiro estiver passando um tipo de dado 35 elementar ou complexo o formato é deferente daquele quando o ponteiro passa um tipo de parâmetro (contadores, temporizadores e blocos de programa). Para tipos de dados elementares ou complexos, o ponteiro ANY (Fig. 5.19) armazena: o tipo do dado, o fator de repetição, o número do DB, a área de memória na qual a informação está armazenada e o endereço inicial dos dados. Fig. 5.19 — Formato do Ponteiro ANY O fator de repetição identifica a quantidade do tipo de dado indicado a ser transferido pelo ponteiro ANY. Ele funciona como uma espécie comprimento de área. Se, por exemplo, se quiser transferir 10 bytes, o valor 10 deve ser inserido no fator de repetição e o código de bytes deve ser inserido no campo tipo de dado. O campo número do DB deve ser mantido em 0 se a área endereçada não for um Bloco de Dados. O campo seguinte identifica a área de memória (os códigos são os mesmos que os utilizados para o POINTER). O endereço restante é armazenado no formato byte.bit. Caso o campo tipo de dado identifique a passagem de um contador, temporizador ou bloco de programa, a avaliação dos campos é feita de maneira diferente (Fig. 5.20). 36 Fig. 5.20 — Formato do ponteiro ANY passando tipos de parâmetros 5.2.6: Blocos de Programa A programação em STEP 7 permite que o programa de usuário seja estruturado, fazendo com que este seja repartido em seções de programa. Isso traz uma série de vantagens como facilidade de compreensão do código, padronização de seções, organização, facilidade de manutenção no código, debug apenas nas seções desejadas e facilidade de comissionamento. Os exemplos mostram que a divisão em tarefas individuais em um grande processo é vantajosa. As seções de programa de um programa de usuário estruturado correspondem a estas tarefas individuais (na maioria dos casos) e são conhecidas como blocos de um programa. 5.2.7: Tipos de Blocos Os blocos de programa são divididos basicamente em dois tipos: blocos de sistema e blocos de usuário. Os blocos de sistema são funções pré-definidas ou blocos de função integradas ao sistema operacional da CPU. Estes blocos não ocupam nenhum espaço adicional na memória do usuário. Os blocos de sistema são chamados pelos programas de usuário. Os blocos de usuário são áreas disponíveis para escrever o código e os dados para o programa. Baseado nas necessidades da aplicação, pode-se estruturar o programa com várias opções de blocos de usuário. Alguns blocos podem ser executados ciclicamente enquanto outros podem ser executados 37 somente quando necessitado. Blocos de usuário são também chamados de blocos de programa. 5.2.7.1: Blocos de Usuário Dentre os blocos de usuário, o mais importante deles é o OB 1. Este faz o processamento cíclico do programa, ou seja, é executado no início de cada scan e tem por função chamar os outros blocos e porventura executar instruções. • Blocos de organização (OB): Faz a interface entre a CPU e o programa do usuário. O OB 1 é o bloco de processamento cíclico que é executado a cada scan. Pode-se escrever todo o programa todo nele, mas uma programação mais elegante usa o OB 1 para chamar outros blocos quando necessário. Além do OB 1, o sistema operacional pode chamar outros OBs que reagem a certos eventos, tais como: interrupção de data programada, interrupção de diagnóstico, interrupção de erros, interrupção de tempo de ciclo, interrupção de hardware, start-up do hardware. Caso dois OBs estejam programados para ser executados ao mesmo tempo, a prioridade do OB será levada em consideração. Para evitar que isso aconteça, pode-se usar um deslocamento temporal em um deles (offset) para que as interrupções ocorram em instantes distintos. Obs.: os OBs temporais utilizam o clock do CLP para ser ativados. O OB 1, apesar de ser um OB cíclico, não possui um tempo de execução fixo pois a cada ciclo podem ocorrem eventos que alteram o tempo de ciclo (por exemplo: chamada de outro OB, alteração nas entradas que provoquem a chamada de outro bloco, etc.). • Blocos de função (FB): Um bloco de função é uma função ou uma seqüência de comandos armazenados em um bloco lógico, onde os prâmetros podem ser arquivados em uma memória. O FB utiliza uma memória adicional na forma de um “Bloco de Dados Instance”. Parâmetros passados para o FB e alguns dos dados locais são arquivados neste bloco de dados associado (Instance DB). Outros 38 dados temporários são arquivados na pilha local (L stack). Dados arquivados em Instance DB são retidos quando o bloco de função é fechado. Dados arquivados na pilha local não são retidos. • Função (FC): A função é um bloco de operação lógica similar ao bloco de função para o qual não é designado área de memória. Um FC não necessita de um bloco de dados instance. As variáveis locais são arquivadas na pilha local (L stack) até que a função esteja concluída, sendo perdidos quando o FC termina a execução. • Bloco de Dados (DB): Um bloco de dados é uma área de dados permanente na qual dados ou informações que outras funções coletaram são armazenados. Blocos de dados são áreas de leitura / escrita que podem ser carregadas na CPU como parte do programa. Tabela 5-11 — Tipos de Blocos de Usuário Tipos de Blocos Blocos de Organização (OB) Bloco de Função (FB) Função (FC) Blocos de Dados (DB) Blocos de Usuário Características • Interface do usuário entre sistema e o programa; • Níveis de prioridades (1 a 26); • Informações especiais de inicialização na pilha de dados locais. • Um valor de retorno será transferido (parâmetros devem ser designados para a chamada); • Parametrizável / Retentivo; • Não Parametrizável / Retentivo; • Não Parametrizável / Não Retentivo. • Um valor de retorno será transferido (parâmetros devem ser designados para a chamada); • Parametrizável / Não Retentivo. • Estruturado, arquiva dados locais (DB instance); • Estruturado, arquiva dados globais (shared DB). 5.2.7.2: Blocos de Sistema Estes são os blocos que não ocupam espaço adicional na memória. Quando são FCs ou FBs, têm o código protegido contra leitura. 39 • Função de Sistema (SFC): Função de Sistema é uma função préprogramada e testada que é integrada na CPU. Algumas das tarefas suportadas por estas funções são setar parâmetros dos módulos, comunicação de dados, funções de cópia, etc. Uma SFC pode ser chamada pelo programa principal mas mesmo assim não ocupará memória de trabalho. • Blocos de Função de Sistema (SFB): Um Bloco de Função de Sistema funciona de maneira similar a um FB porém não ocupa espaço na memória de trabalho. Da mesma maneira, deve ser associado a um DB que deve ser transferido à CPU como parte do programa. • Blocos de Dados do Sistema (SDB): Um Bloco de Dados de Sistema é uma área de memória que a ferramenta cria para arquivar dados necessários para o controle de operações. Informações, tais como dados de configuração, conexões de comunicação e parâmetros são salvos em SDBs. Tabela 5-12 — Tipos de Blocos de Sistema Tipo de Bloco Função de Sistema (SFC) Bloco de Função Sistema (SFB) Blocos de Dados Sistema (SDB) • • de • • de • Blocos de Sistema Características Arquivados no sistema operacional das CPUs; Usuário pode chamar esta função (sem memória). Arquivados no sistema operacional das CPUs; Usuário pode chamar esta função (com memória). Blocos de dados para configuração de dados e parâmetros. 5.2.8: Endereçamento com S7-400 Existem várias maneiras de se fazer o endereçamento no SIMATIC Manager. Dependendo da aplicação, pode ser mais ou menos interessante usar uma ou outra maneira. A seguir, serão exemplificadas as maneiras de se fazer isto. 40 5.2.8.1: Endereçamento Direto Com Endereçamento Direto, o local da memória a ser acessado é codificado na própria instrução, ou seja, na própria intrução está o endereço que a instrução deve processar. Ainda há um subdivisão no Endereçamento Direto. Os endereços podem ser endereçados absolutamente ou simbolicamente. No endereçamento absoluto é utilizada a identificação da área de memória (I, M, Q, DB, DI, etc.) seguida da dimensão do acesso (B, W ou D) e do número do byte. Não é necessário usar dimensão de acesso quando se endereça o bit, exceto no caso de DB ou DI. Neste caso deve-se usar X para endereçá-los. Tabela 5-13 — Exemplos de Endereçamento Absoluto I 10.3 Acesso ao quarto bit (bit 3), do byte 10 da tabela imagem da periferia de entrada. MW 6 Acesso à word que se inicia no byte 6 (e inclui o byte 7) da memória de bit. QD 12 Acesso à double word que se inicia no byte 12 (e inclui os bytes 13, 14 e 15) da tabela imagem da periferia de saída. DBX 13.0 Acesso ao bit 0 do byte 13 do DB que estiver aberto (aquele cujo número estiver armazenado no registrador de DB). DIB 10 Acesso ao byte 10 do DB Instance (aquele cujo número estiver armazenado no registrador de DI). No endereçamento simbólico, o acesso é feito através de nomes e não de endereços absolutos. Para isto é necessário determinar um nome (símbolo) ao endereço desejado. Isto pode ser feito de duas maneiras. Numa delas o símbolo é determinado dentro de um bloco na tabela de declaração de variáveis do bloco. Neste caso o símbolo é local e válido somente dentro do bloco. Quando utilizado, o símbolo estará precedido de #. A outra maneira é determinar um símbolo global na tabela de símbolos que será válido em todo o projeto. Quando utilizado no programa, o símbolo estará entre aspas duplas. Podem ser endereçados simbolicamente bits, bytes, words e double words. 41 5.2.8.2: Endereçamento Indireto Com o endereçamento indireto, pode-se acessar áreas de memória que, ao contrário do endereçamento absoluto, são definidas ou modificadas durante a execução do programa. O endereçamento indireto permite que partes do programa sejam executadas repetidamente (loop), cada uma delas com um endereço diferente. Existe ainda uma subdivisão do endereçamento indireto: endereçamento indireto de memória e endereçamento indireto de registro. No endereçamento indireto de memória, o endereço a ser acessado é armazenado em uma área da própria memória do usuário. A esta área pode-se dar, se necessário, um nome simbólico. No endereçamento indireto de registro, o endereço é armazenado em um dos registradores de endereço (AR1 ou AR2) em vez de ser armazenado em uma área de memória. 5.2.8.2.1: Endereçamento Indireto de Memória • Usando Endereço de 32 bits: com este tipo de endereçamento, o endereço da variável se encontra em uma área de memória (M, L ou DB) a qual pode ter ou não um nome simbólico definido. A instrução, para se usar endereçamento indireto de memória, contém a própria instrução (A, L, etc.), um identificador de área (I, Q, M, DB, etc.), uma dimensão de acesso (B, W ou D) e uma variável. Esta variável possui 32 bits, ou seja, é uma double word, deve estar entre colchetes e contém o endereço da variável a ser acessada. Ex.: L MW [MD 30] //Carrega no ACCU 1 a MW apontada por A I [#pointer_1] //Faz a lógica E da entrada apontada por A DBX [#dbn] //Faz a lógica E do bit apontado por #dbn MD30 #pointer_1 localizado no DB que estiver aberto (DB cujo número estiver no registrador de DB) 42 Fig. 5.21 — Formato do ponteiro de 32 bits Para se armazenar um ponteiro em uma locação de memória deve-se primeiro carregá-lo no ACCU1 e depois copiá-lo para o local desejado. Ex.: L P#5.2 //Carrega no ACCU1 um ponteiro para o byte 5, DBD 12 //Copia o conteúdo do ACCU1 para a double bit 2 T word 12 do DB que estiver aberto A • I [DBD 12] //Faz a lógica E do bit de entrada 5.2 Usando Endereço de 16 bits: este endereçamento, ao contrário do endereçamento de 32 bits, é usado para localizar DBs, temporizadores e contadores além de FBs e FCs. O endereço é armazenado em uma word na memória (M, L ou DB). O programa interpreta o ponteiro como um inteiro sem sinal entre 0 e 65535. Ex.: UC FC [MW 12] //Chama incondicionalmente a FC cujo número está em MW12 OPN DB [#ent_dbn] //Abre o DB apontado por ent_dbn Fig. 5.22 — Formato do ponteiro de 16 bits 5.2.8.2.2: Endereçamento Indireto de Registro Com o Endereçamento Indireto de Registro, o endereço da variável a ser acessada está armazenado em um registrador de endereço. Também neste tipo de endereçamento existe uma outra subdivisão: Endereçamento Indireto de Registro de Área Interna e Endereçamento Indireto de Registro de Área Cruzada. Este tipo de 43 endereçamento serve para acessar dados (bits, bytes, word e double words) que estejam armazenados na memória. • Área Interna: uma instrução utilizando o registrador de endereços (área interna) consiste da própria instrução (A, L, T, etc.), de um indentificador de área (I, M, Q, DB, etc.), de uma dimensão de acesso (B, W ou DB) e de uma declaração do registrador utilizado junto com um offset entre colchetes. Ex.: L MW [AR1,P#0.0] // Carrega no ACCU1 a word da memória de bits cujo endereço está no registrador de endereços 1 (AR1). A I [AR2,P#5.3] // Faz a lógica E da entrada apontada por AR2 mais 5 bytes e 3 bits. No registrador, deve estar armazenado um ponteiro com o endereço desejado. Para armazenar um ponteiro no registrador de endereço, existe uma instrução especial. Ex.: LAR1 P#2.0 // Carrega no AR1 um ponteiro para o byte 2, bit 2. L ID [AR1,P#2.0] // Carrega no ACCU1 a double word de entrada cujo endereço está em AR1 mais 2 bytes, ou seja, ID 4. Obs.: para instruções com byte, word ou double word, o offset deve ter “0” no bit caso contrário um erro é ativado na CPU. • Área Cruzada: este é o ponteiro mais completo pois contém além do endereço do byte e do bit, a informação da área de memória. Neste caso, ao armazenar o ponteiro no registrador de endereços, deve-se informar a área de memória a ser acessada. Uma instrução utilizando o registrador de endereços (área cruzada) consiste da própria instrução (A, L, T, etc.), de uma dimensão de acesso (B, W ou DB) e de uma declaração do registrador utilizado junto com um offset entre colchetes. Neste caso não é necessário fazer a identificação de área. Ela já foi feita quando o ponteiro foi armazenado. 44 Ex.: L D [AR1,P#2.0] // Carrega a double word apontada pelo AR1 deslocada de 2 bytes. O ponteiro armazenado em AR1 deve ter a informação de área de memória, de bytes e de bits. Para armazenar o ponteiro com informação de área de memória, de bytes e bits (endereço completo), deve-se utilizar novamente a instrução LAR1 ou LAR2. Ex.: LAR1 P#I 3.0 // Carrega no AR1 um ponteiro para o byte 3 da tabela imagem da periferia. L B [AR1,P#1.0] // Carrega no ACCU1 o byte 4 da entrada (tabela imagem de periferia de entrada). Tabela 5-14 — Formas de Endereçamento no S7-400 Endereçamento Direto Absoluto Simbólico Endereçamento Indireto Memória Indireta Ponteiro de 16 bits Ponteiro de 32 bits (área int.) Registrador Indireto Ponteiro de 32 bits (área int.) Ponteiro de 32 bits (área cruz.) Exemplos: Q 6.5 “Pump_on” OPN DB[MW16] A M[MD30] A I[AR1,P#6.0] A [AR1,P#0.0] MD 12 #var_inc OPN DB[#epdbn] L IW[“analog”] L MB[AR2,P#0.0] T W[AR1,P#0.0] 5.2.9: Declaração de Variáveis Juntamente com os comandos, as variáveis são os mais importantes elementos do sistema de programação. Pode-se guardar nelas valores que podem ser salvos na memória no CLP para serem utilizados posteriormente no programa. As variáveis possuem propriedades que as distinguem de uma área de memória qualquer que são: nome simbólico, tipo de dado, alcance (faixa de validade). Antes de utilizar uma variável, deve-se primeiro criá-la, por meio de um processo de declaração de variável. Existem três maneiras de se declarar uma variável em S7: por meio da tabela de símbolos global (somente para tipos de dados 45 elementares3), utilizando a tabela de declaração de variáveis de um bloco de programa e também pela tabela de declaração de variáveis de um Bloco de Dados global (para todos os tipos de dados, incluindo os dados complexos4 e dados definidos pelo usuário5). Uma propriedade das variáveis declaradas na tabela de declaração de variáveis dos blocos de programa é o tipo de declaração. Dentre os tipos de declaração temos: • in: são as variáveis de entrada do bloco, ou seja, necessárias para a execução; • in/out: são variáveis que necessárias na chamada do bloco e que podem ser utilizadas diretamente na saída; • out: são variáveis retorno da função, ou seja, o resultado de seu processamento; • temp: são as variáveis temporárias; • stat: são as variáveis que ficam armazenadas de uma varredura para outra. 3 Entende-se por Dados Elementares os tipos de dados Bit (BOOL, BYTE, WORD, DWORD, CHAR), os tipos de dados Matemáticos (INT, DINT, REAL) e os tipos de dados Tempo (S5TIME, TIME, DATE, TIME_OF_DAY). Possuem até 32 bits. 4 Entende-se por Dados Complexos os tipos de dados Tempo (DATE_AND_TIME), Matriz (ARRAY), Estrutura (STRUCT) e Cadeia de Caracteres (STRING). Estes tipos de dados são maiores que 32 bits 5 Entende-se por Dados Definidos pelo Usuário (UDT) os dados maiores do que 32 bits que podem ser definidos pelo usuário. 46 Capítulo 6: Tratamento de Entradas e Saídas Para o tratamento dos pontos de entrada e saída foram desenvolvidos 9 blocos de programa. Ele é utilizado em todas as plataformas em operação. Esta é a primeira vez que o CLP Siemens é utilizado no controle de plataformas da Petrobras portanto não havia experiência prévia de implementação deste sistema de tratamento. Algumas dificuldades foram encontradas no decorrer do trabalho principalmente porque as especificações foram feitas baseadas em CLPs de outras marcas. 6.1: Objetivo do Tratamento de Entradas e Saídas Existem alguns motivos pelos quais o tratamento dos pontos de entrada e saída se tornou uma norma da Petrobras. Eles serão expostos nas seções 6.1.1: Tratamento de Entradas e 6.1.2: Tratamento de Saídas. 6.1.1: Tratamento de Entradas O tratamento de entradas garante facilidade de programação através da uniformização dos sinais de entrada. O que essa uniformização quer dizer é que o sinal “1” ocorre na lógica (no intertravamento) apenas quando este sinal está em sua condição anormal, ou seja, fora da condição considerada padrão. Isto ocorre porque existem sinais de campo que estão, em sua condição normal, enviando “1” e outros que, em sua condição normal estão enviando “0”. A uniformização, chamada de polarização de entrada, visa garantir que a programação do intertravamento seja transparente a estas particularidades. A segunda operação executada pelo tratamento de entradas é a temporização do sinal. Esta temporização é um atraso provocado pelo tratamento de entradas no sinal vindo do campo. Este atraso evita que transitórios ativem alguma lógica no intertravamento, ou seja, confirma através de um atraso de tempo, a real existência de uma condição anormal. A terceira operação executada é o bypass de entrada. Esta serve para o operador, através do supervisório (ECOS), sobrescrever o sinal vindo do campo, ou seja, ignorá-lo. O sinal resultante destas três primeiras operações é utilizado no intertravamento. 47 Ainda existe uma quarta operação, responsável pela comunicação com o supervisório. Nesta função, o sinal resultante das três primeiras operações é travado logicamente e enviado ao supervisório até que ocorra o reconhecimento. Este reconhecimento é feito através do supervisório e serve para garantir que o operador tomou conhecimento da alteração do estado do sinal no campo. Existe ainda uma quinta operação que serve para limpar (resetar) a tabela de reconhecimento de alarme. Esta função teve de ser implementada porque não existe, no supervisório utilizado, o comando pulsado. De maneira concisa, o que o sistema de tratamento de entradas deve fazer é: • A lógica de polarização da entrada; • A lógica do filtro; • A lógica de bypass; • A lógica de travamento de alarme e de seu reconhecimento. Fig. 6.1 — Esquema Geral do Tratamento de Entradas 6.1.2: Tratamento de Saídas O tratamento de saídas faz, como o próprio nome diz, o tratamento dos sinais provenientes da lógica de intertravamento com destino ao campo. Neste tratamento, 48 a primeira função faz a lógica de sobrescrever “1” no sinal de saída do intertravamento, se assim desejado pelo operador. A segunda função faz o contrário, ou seja, a lógica de sobrescrever “0” no sinal proveniente da primeira função. A terceira função faz a lógica das saídas esperadas. Esta função faz uma comparação da saída da segunda função com um sinal pré-definido e envia o resultado ao campo. De maneira geral, o que o sistema de tratamento de saídas deve fazer é: • A lógica de sobrescrever a saída da lógica; • A lógica de polarização da saída. Fig. 6.2 — Esquema Geral do Tratamento de Saídas Todas as funções, seus objetivos, e sua implementação, serão detalhadamente expostos a seguir. 6.2: Mapeamento de Memória do CLP Todos os sinais dos diagramas da Fig. 6.1 e da Fig. 6.2 são armazenados em tabelas que o CLP ou o supervisório podem ler ou escrever. Dependendo do sinal, existem direitos dados ao CLP ou ao supervisório de ler e escrever. A Tabela 6-1 mostra os direitos de acesso aos dados do tratamento de E/S. Por exemplo, o sinal de entrada física (da tabela ENT) é interno ao CLP. Somente o controlador tem acesso a este sinal que será posteriormente tratado e enviado ao supervisório para leitura. A escrita é igualmente proibida pelo supervisório pois isto poderia trazer conseqüências imprevisíveis para o controle, além de não refletir a real situação de campo. Para modificar a situação real do 49 campo existe um outro sinal, o de requisição de bypass, ao qual o supervisório tem direitos de escrita e leitura. Tabela 6-1 — Memória do CLP Mnemônico Tabela Ação permitida ENT Entrada física Interna ao CLP EPB Entrada polarizada e bypassada Interna ao CLP SAI Saída física Interna ao CLP SLG Saída da lógica VXL lê SLO Saída sobrescrita da lógica VXL lê EPT Entradas polarizadas temporizadas VXL lê EBS Entradas polarizadas, bypassadas e seladas VXL lê REC Reconhecimento de alarme VXL lê / escreve BYP Requisição de bypass VXL lê / escreve OV1 Requisição de sobrescrever “1” VXL lê / escreve OV0 Requisição de sobrescrever “0” VXL lê / escreve ESP Estado esperado da entrada Definido no CLP 6.3: Implementação Como já dito anteriormente, o sinal físico não será utilizado diretamente na lógica, mas sim um sinal previamente tratado. Durante a varredura do CLP, algumas tabelas são alteradas e outras são usadas como auxiliares do sistema de tratamento. 6.3.1: Função de Geração das Entradas Polarizadas (EP) Para a geração das entradas polarizadas, foi criado um bloco de programa do tipo função. Este bloco faz uma operação com a tabela da Entrada Física (ENT) e 50 com a tabela Estado Esperado da Entrada (ESP) para a geração de uma terceira tabela, a tabela das Entradas Polarizadas (EP). A operação lógica necessária é a OU EXCLUSIVO (Tabela 6-2). ent ⊕ esp = ep Tabela 6-2 — Operação OU EXCLUSIVO entre ent e esp gerando ep ent 0 0 1 1 esp 0 1 0 1 ep 0 1 1 0 Fig. 6.3 — OU EXCLUSIVO Na Tabela 6-2 é mostrada a tabela verdade da operação OU EXCLUSIVO entre sinais provenientes de ENT e ESP gerando um sinal que será alocado na tabela EP. Esta operação é utilizada porque toda vez que o sinal de campo se encontra fora de sua condição normal, o sinal “1” deve ser ativado. Isto de fato ocorre quando se utiliza a operação OU EXCLUSIVO. Pode-se notar que toda vez que o sinal de campo (tab. ENT) é diferente do sinal esperado (tab. ESP), o sinal de entrada polarizada (tab. EP) é ativado. A tabela ENT é proveniente da Tabela Imagem da Periferia de Entrada (I) enquanto a tabela ESP é definida internamente no CLP podendo ser pertencente a um bloco de dados (DB) ou à memória de bits (M). Da mesma forma, a tabela gerada EP pode ser alocada tanto em um bloco de dados (DB) como na memória de bits (M). 6.3.2: Funcionamento do FC 43 — Gerador de Entradas Polarizadas O bloco FC 43 tem por função fazer a operação OU EXCLUSIVO entre os pontos da tabela ENT e os pontos da tabela ESP. O resultado da operação deve ser 51 seqüencialmente armazenado na tabela EP. Esta operação pode ser melhor visualizada na Fig. 6.4. Nesta figura, em cada tabela estão representados o endereço completo (à esquerda) e o conteúdo do endereço (à direita). O endereço completo está representado como se estivesse armazenado do registrador de endereços (Fig. 5.12). Fig. 6.4 — Atualização da tabela EP A chamada do bloco pode ser feita através da função CALL. Quando se faz a chamada do bloco, todos os parâmetros de entrada devem ser passados para este ser executado e para a tabela EP ser atualizada. Enquanto os parâmetros não são passados as requisições de parâmetro ficam em vermelho e o bloco que está chamando o outro não pode ser salvo. Fig. 6.5 — Chamada de Bloco no S7 Fig. 6.6 — Chamada de Bloco com passagem de parâmetros 52 Os parâmetros do bloco FC 43 são três ponteiros do tipo ANY que vão identificar todas as áreas de memória a ser endereçadas. Neste caso as tabelas ENT, ESP e EP. Sabe-se de antemão que a tabela ENT é pertencente à área de memória Tabela Imagem da Periferia de Entrada (I) e que as tabelas ESP e EP pertencem à Memória de bit (M) ou a um Bloco de Dados (DB). No ponteiro ANY deve ser identificada a área de memória a qual os dados pertencem, bem como o endereço inicial, o tipo de dado endereçado (no caso do tratamento de E/S todos serão double word) e o fator de repetição, que representa o comprimento da área de memória. Caso a área endereçada seja um Bloco de Dados (DB) deve ainda ser identificado o número deste. Por exemplo, na Fig. 6.6, está representada uma chamada de bloco em que a tabela ENT se inicia no edereço 200.0 (byte 200, bit 0) da Tabela Imagem da Periferia de Entrada (I), possui 5 double words, ou seja 120 bits e ocupa 20 bytes da região I. Da mesma forma, a tabela ESP está alocada na Memória de Bits, inicia-se no endereço 200.0 e possui 5 double words. Já a tabela EP está em um Bloco de Dados de número 41, e se inicia no endereço 0.0 deste DB. Também possui 5 double words, ocupando um total de 20 bytes (até o endereço 19.7). A FC 43 possui ainda variáveis declaradas na tabela de declarações do bloco. Todas elas são do tipo “temp”, ou seja, temporárias. Fig. 6.7 — Tabela de declarações de variáveis do FC 43 53 A primeira network da FC 43 tem por objetivo armazenar nas variáveis locais, definidas na tabela de declarações, os dados provenientes do ponteiro ANY. Os dados armazenados são o fator de repetição, o número de DB (se existente) e o endereço inicial da área apontada. Como o ponteiro ANY possui mais de 32 bits ele não pode ser transferido para nenhum dos acumuladores. Para extrair os dados nele contidos é necessário usar Endereçamento Indireto de Registro de Área Cruzada. Network 1 — FC 43 L P##ENT //Carrega endereço do ponteiro ENT LAR1 //Transfere para o AR1 L W [AR1,P#2.0] //Carrega a word (deslocada de bytes)cujo endereço está em AR1; esta armazena o fator de repetição T #ent_rep_factor //Transfere para a variável local L D [AR1,P#6.0] //Carrega informação do endereço T #ent_end //Transfere para ent_end L P##ESP LAR1 L W [AR1,P#2.0] de repetição T #esp_rep_factor L W [AR1,P#4.0] existente, senão carrega zero) T #esp_dbn L D [AR1,P#6.0] T #esp_end L P##EP LAR2 L W [AR2,P#2.0] de repetição T #ep_rep_factor L W [AR2,P#4.0] existente, senão carrega zero) T #ep_dbn L D [AR2,P#6.0] T #ep_end 2 //Carrega endereço do ponteiro //Transfere para o AR1 //Carrega a word que contém o fator //Transfere para a variável local //Carrega o número de DB (se //Transfere para variável local //Carrega informação do endereço //Transfere para esp_end //Carrega endereço do ponteiro //Transfere para o AR2 //Carrega a word que contém o fator //Transfere para a variável local //Carrega o número de DB (se //Transfere para variável local //Carrega informação endereço //Transfere para ep_end A segunda network da função, é um verificador de tamanho de tabelas. É necessário que a operação de polarização de entradas seja feita entre tabelas de mesmo tamanho. Isto ocorre para evitar sobreposição de dados. Esta network faz então uma série de operações de comparação entre os fatores de repetição das áreas endereçadas. O menor fator de repetição é armazenado em uma variável local para que seja utilizado posteriormente na execução da operação entre tabelas. 54 Network 2 — FC 43 EP de EP REP1: de EP REP2: REP3: L L <I JC L #ent_rep_factor #esp_rep_factor REP1 #ep_rep_factor // // // // // Carrega tamanho da tab. ENT Carrega tamanho da tab. ESP Verifica se ENT é menor que ESP Se sim, pula para REP1 Se não, carrega tamanho da tab. <I JC T REP2 #rep_factor // E verifica se é menor que ESP // Se sim, pula para REP2 // Se não, atribui a rep_factor tam. JU INI // Pula para a próxima network L L <I JC T #ent_rep_factor #ep_rep_factor REP3 #rep_factor // // // // // Carrega tamanho da tab. ENT Carrega tamanho da tab. EP Verifica se ENT é menor que EP Se sim, pula para REP3 Se não, atribui a rep_factor tam. JU L T JU L T JU INI #esp_rep_factor #rep_factor INI #ent_rep_factor #rep_factor INI // // // // // // // Pula para a próxima network Carrega tamanho da tab. ESP E atribui a rep_factor Pula para a próxima network Carrega tamanho da tab. ENT E atribui a rep_factor Pula para a próxima network A operação realizada pela network 2 pode ser melhor entendida através da Fig. 6.8. Fig. 6.8 — Fluxograma do verificador de tamanho de tabela A terceira network faz a operação de OU EXCLUSIVO propriamente dita. A operação é feita em um loop que faz a operação de double word em double word. O primeiro passo é a transferência do fator de repetição calculado para o contador do loop. Depois disso, carrega-se no ACCU 1 e ACCU 2 as double words que são partes das tabelas que serão usadas na operação (ENT, ESP). Faz-se a operação 55 de OU EXCLUSIVO entre as duas double words e transfere-se o resultado para a tabela EP. Em alguns casos é necessário guardar no registrador de DB o número do Bloco de Dados a ser utilizado. Caso não haja DB a ser aberto, o registrador será carregado com o valor “0” (devido à instrução OPN), não influenciando a operação. Network 3 — FC 43 INI: L #rep_factor fator de repetição adequado //Inicia a network carregando o IFG: T #contador //Transfere para o contador do loop L ID [#ent_end] //Carrega a double word de entrada apontada por ent_end (ENT) LAR1 #esp_end //Carrega o AR1 com esp_end OPN DB [#esp_dbn] //Abre o DB cujo nro. está em esp_dbn L D [AR1,P#0.0] //Carrega a double word cujo endereço está em AR1 (ESP) XOD //Faz a operação de OU EXCLUSIVO entre ENT e ESP LAR2 #ep_end //Carrega o AR2 com ep_end OPN DB [#ep_dbn] //Abre o DB cujo nro. está em ep_dbn T D [AR2,P#0.0] //Transfere o resultado da operação para a double word cujo endereço está em AR2 L L +D T L L +D T L L +D T #ent_end P#4.0 L LOOP BEU #contador IFG //Incremento dos ponteiros #ent_end #esp_end P#4.0 #esp_end #ep_end P#4.0 #ep_end //Decrementa o contador do loop //Fim de Bloco O passo final é o incremento dos ponteiros para a próxima volta do loop. Fazse carregando um ponteiro de valor 4 bytes (equivalente a uma double word) e adicionando este ao endereço utilizado na volta atual. Na próxima volta, os valores operados serão aqueles cujos endereços foram atualizados na volta atual. Existe ainda a instrução de fim de bloco para indicar a finalização das tarefas de atualização das tabelas. 56 6.3.3: Função de Geração das Entradas Polarizadas Temporizadas (EPT) Para a geração das entradas polarizadas temporizadas, foi criado um bloco de programa do tipo função. Este bloco opera a tabela das Entradas Polarizadas (EP) gerada pela função descrita no item acima para a geração de uma outra tabela, a tabela das Entradas Polarizadas Temporizadas (EPT). Neste caso, nenhuma operação lógica é necessária, bastando apenas à função retardar o aparecimento do sinal lógico “1” proveniente da tabela EP, na tabela EPT. Quando o sinal em EP estiver em “0”, o seu respectivo em EPT também o deve estar. Fig. 6.9 — Diagrama da Função Objetivo desta função é fazer uma filtragem temporal nos sinais vindos do campo. Ela faz uma espécie de confirmação de estado anormal do sinal, ou seja, apenas após o tempo de atraso pré-definido o sinal é dado como anormal. Isto serve para ativar a lógica do intertravamento apenas em casos onde o sinal, em seu estado alterado, persistir. Um caso que pode ilustrar a funcionalidade desta função é o de uma chave de nível por exemplo. Vamos supor que, em um determinado momento, devido a uma oscilação do navio, a chave envia sinal e a tabela de entrada (ENT) é modificada no bit correspondente. No entanto, logo depois, o nível volta a seu estado anterior e não ativa mais a chave de nível. Se não houvesse a lógica de filtragem temporal, toda uma lógica no intertravamento poderia ter sido disparada sem necessidade. Quanto à localização das tabelas na memória do CLP, a tabela operada EP e a tabela gerada EPT podem estar armazenadas em duas diferentes áreas de memória: a Memória de Bits (M) ou em um Bloco de Dados (DB). 57 6.3.4: Funcionamento do FC 44 — Gerador de Entradas Polarizadas Temporizadas O bloco FC 44 foi desenvolvido para executar o descrito no item 6.3.3: retardar o aparecimento do sinal vindo de EP em EPT. A operação é executada de maneira seqüencial a cada 32 bits (double word). Os parâmetros do bloco FC 44 são três ponteiros do tipo ANY, um ponteiro do tipo POINTER, e um número hexadecimal do tamanho de um byte. Dos ponteiros ANY, dois deles identificam as áreas de memória onde estão alocadas as tabelas EP e EPT. O outro, identifica uma área de memória onde será alocada uma tabela auxiliar. Esta tabela auxiliar armazena, no formato hexadecimal, os tempos nos quais as transições positivas dos bits de EP ocorrem. O ponteiro tipo POINTER aponta para um Bloco de Dados que guarda o estado dos bits de EP na varredura anterior. Isto é necessário para utilizar o contato transicional. O parâmetro tipo byte contém um número hexadecimal que denota, em segundos, o tempo de espera (retardo do sinal em EPT) para todo o conjunto operado. A FC 44 possui na tabela de declarações do bloco (Fig. 6.10) variáveis do tipo “temp” (temporárias) e variáveis “in” (de entrada). A primeira network da FC 44 tem por objetivo armazenar nas variáveis locais, definidas na tabela de declarações, os dados provenientes dos ponteiros ANY e POINTER. Os dados armazenados são o fator de repetição, o número de DB (se existente) e o endereço inicial da área apontada. Além disso, o FB 1 é chamado, juntamente com seu Bloco de Dados Instance DB 1. Este FB por sua vez possui uma chamada a uma Função de Sistema que será utilizada em outra network. A Função de Sistema utilizada é a SFC 1 “READ_CLK” [5]. Com esta Função, pode-se ler o valor atual de data ou tempo do clock da CPU. O bloco possui dois parâmetros, ambos de saída. Um deles é um indicador de erros e o outro fornece os valores de tempo. Os valores de tempo estão armazenados em duas double words que contém valores do ano, mês, dia, hora, minutos, segundos e milissegundos além do dia da semana. A segunda network faz uma comparação entre os tamanhos das tabelas (como na FC 43). Neste caso a comparação é somente entre duas tabelas, o que 58 facilita o entendimento do código. Os tamanhos das tabelas são reconhecidos pelas variáveis locais e o menor deles é copiado na variável #rep_factor. Fig. 6.10 — Tabela de declarações de variáveis da FC 44 Uma das maneiras de se implementar a FC 44 é fazendo a varredura em todos os bits da tabela EP. No entanto, observando a operação, notou-se a existência de uma propriedade na relação EP x EPT: sempre que o bit da tabela EP está em “0”, seu correspondente na tabela EPT também deve estar. Usando esta propriedade, a varredura nos bits foi substituída por uma varredura nas double words. O primeiro passo na network 3 é a verificação de uma double word da tabela EP. Caso esta double word não seja igual a zero, isto significa que pelo menos um de seus bits está em “1”. Então se, e somente se, a double word na tabela EP for 59 diferente de zero a varredura nos bits é executada (somente da double word diferente de zero). Network 1 — FC 44 L LAR1 L T L T P##SUB W [AR1,P#0.0] #sub_dbn D [AR1,P#2.0] #sub_end L P##ATT LAR1 L W [AR1,P#2.0] de repetição T #att_rep_factor L W [AR1,P#4.0] existente, senão carrega zero) T #att_dbn L D [AR1,P#6.0] T #att_end L P##EP LAR1 L W [AR1,P#2.0] de repetição T #ep_rep_factor L W [AR1,P#4.0] existente, senão carrega zero) T #ep_dbn L D [AR1,P#6.0] T #ep_end L P##EPT LAR2 L W [AR2,P#2.0] de repetição T #ept_rep_factor L W [AR2,P#4.0] existente, senão carrega zero) T #ept_dbn L D [AR2,P#6.0] T #ept_end L T 0 #dbbyte CALL FB //Carrega endereço do ponteiro //Transfere para o AR1 //Carrega o número do DB //Tranfere para a variável local //Carrega informação do endereço //Tranfere para a variável local //Carrega endereço do ponteiro //Transfere para o AR1 //Carrega a word que contém o fator //Transfere para a variável local //Carrega o número de DB (se //Transfere para a variável local //Carrega informação do endereço //Tranfere para att_end //Carrega endereço do ponteiro //Transfere para o AR1 //Carrega a word que contém o fator //Transfere para a variável local //Carrega o número de DB (se //Transfere para a variável local //Carrega informação do endereço //Tranfere para ep_end //Carrega endereço do ponteiro //Transfere para o AR2 //Carrega a word que contém o fator //Transfere para a variável local //Carrega o número de DB (se //Transfere para a variável local //Carrega informação do endereço //Tranfere para ept_end //Carrega o inteiro 0 //Transfere para dbbyte 1 , DB1 //Chama FB 1, com DB instance 1 Nesta varredura dos bits da tabela EP, uma série de verificações deve ser feita. A primeira delas é a verificação de transição positiva do bit. Entende-se por transição positiva a mudança de “0” para “1” em um certo ciclo de varredura. Caso isto tenha ocorrido, o tempo de transição deve ser armazenado. Isto vai permitir que se verifique, a cada ciclo, se este sinal deve ser ativado também na tabela EPT. O local onde este tempo de transição é armazendo é apontado pelo ponteiro ANY. 60 Cada bit da tabela EP possui um espaço reservado nesta área de memória para que seja armazenado o tempo de transição. Network 2 — FC 44 L #ep_rep_factor L #ept_rep_factor <I JC REP1 T #rep_factor tamanho da tab. EP JU SEE REP1: L T JU #ep_rep_factor #rep_factor SEE //Carrega tamanho da tab. EP //Carrega tamanho da tab. EPT //Verifica se EP é menor que EPT //Se sim, pula para REP1 //Se não, atribui a rep_factor //Pula para SEE (network seguinte) //Carrega tamanho da tab. EP //E atribui a rep_factor //Pula para SEE (network seguinte) Uma segunda verificação é feita para averiguar se o bit da tabela EP já está em “1”. Caso ele esteja deve-se ver, através de uma terceira verificação, se não é o momento de setar, no respectivo lugar da tabela EPT, o bit correspondente. Caso contrário, o bit de EPT é resetado. Com o final da varredura dos bits a próxima double word é verificada e todo o ciclo recomeça. O funcionamento da função pode ser melhor entendido pela Fig. 6.11. Fig. 6.11 — Fluxograma do funcionamento da FC 44 O ponteiro SUB tipo POINTER, que é utilizado como parâmetro da função, tem o papel de endereçar uma área de memória que armazena o estado da tabela EP na varredura anterior. Isto serve para a verificação de transição positiva do bit (instrução FP). Quando o estado atual do bit é “1” e o estado anterior é “0” o bit RLO 61 da palavra de status é setado para “1”. Isto ocorre e ativa a lógica de armazenamento do tempo de transição no Bloco de Dados de armazenamento do tempo de transição. Na verdade, o tempo de transição armazenado é o segundo em que ocorreu a mudança de “0” para “1”. Todos os dados do instante de transição poderiam ser armazenados porém isto demandaria gasto de memória excessivo e desnecessário. Não é necessário, do ponto de vista prático e como será visto pelo cálculo adiante, saber a hora em que a transição ocorreu. Desta maneira, decidiu-se utilizar apenas a informação do segundo de transição, informado pelo clock do CLP, como na Fig. 6.12. Fig. 6.12 — Segundos do Clock em função do tempo Esta informação serve apenas para se fazer o cálculo necessário ao atraso de tempo. Basicamente, o bit em “1” deve ser setado em EPT quando a diferença entre o instante atual e o instante de tempo de transição for maior ou igual ao tempo de atraso definido como parâmetro de entrada do bloco. Seja c(t) a função da Fig. 6.12. Define-se então uma função d(t) que é dependente da diferença entre o tempo atual (ta) e tempo de transição (tt): d (t ) = c(t a ) − c(t t ) ___________ se ___ c(t a ) − c(t t ) ≥ 0 c(t a ) − c(t t ) + 60 _______ se ___ c(t a ) − c(t t ) < 0 O bit correspondente da tabela EPT só deve ser setado se: d (t ) ≥ t at Onde tat representa o tempo de atraso definido como parâmetro de entrada da FC 44. 62 Network 3 — FC 44 SEE: VSZ: EP é zero L T OPN LAR1 L L ==D JC faz varredura nos IF1: em ep_end //Carrega fator de repetição //Transfere para o contador do loop //Verifica se a double word da tab. D [AR1,P#0.0] 0 IDOU bits //Se sim, pula para IDOU / Se não, 32 #contador DB [#ep_dbn] #ep_end [AR2,P#0.0] //Carrega com 32 (bits numa double) //Carrega o contador do loop //Carrega o ponto cujo endereço está DB [#sub_dbn] #sub_end //sub_end aponta para o estado de ep [AR1,P#0.0] //Verifica #ciclo MEMT está em “1” //Se sim, pula para MEMT / Se não, OPN A = JC DB [#ep_dbn] [AR2,P#0.0] #ciclo SETA //Verifica se ep está em “1” OPN LAR1 R JU DB [#ept_dbn] #ept_end [AR1,P#0.0] IBIT L T OPN LAR2 A OPN LAR1 no scan anterior FP positiva = JC verifica se ep já de bits #rep_factor #contador_2 DB [#ep_dbn] #ep_end se houve transição //Se sim, pula para SETA //Se não //Reseta bit ept correspondente //Pula para seqüência de incremento MEMT: L DB1.DBB 7 //Carrega segundos do clock do CLP OPN DB [#att_dbn] T DBB [#att_end] //Transfere para byte correspondente do DB de armazenamento do tempo de transição JU IBIT //Pula para seqüência de incremento de bits SETA: L DB1.DBB 7 //Carrega segundos do clock do CLP OPN DB [#att_dbn] L DBB [#att_end] //Carrega segundo em que ocorreu a transição positiva (previamente armazenado no DB de armazenamento do instante de transição) -I //Subtrai os valores (para ver se ept já deve ser setado) L B#16#0 //Verifica se o resultado deu negativo <I TAK //Troca ACCU1 com ACCU2 para colocar o zero no ACCU2 e a diferença em ACCU1 JC ANOR JU NORM ANOR: L B#16#60 //Adiciona 60 à diferença (caso em que T_ATRASO + instante de transição negativa > 59) +I NORM: L #T_ATRASO //Atenção: escrever em HEXADECIMAL o tempo de espera (em segundos: 01h, 02h, ... , 58h ou 59h) (CONTINUA NA PRÓXIMA PÁGINA) 63 >=I igual ao T_ATRASO JC JU UM: OPN LAR1 S IBIT: contador_2 IDOU: INCD: //Verifica UM IBIT DB [#ept_dbn] #ept_end [AR1,P#0.0] se a diferença é maior ou //Se sim, pula para UM //Se não, pula para IBIT //Seta bit ept correspondente L L +D T #ep_end P#0.1 //Incremento dos ponteiros (para bits) L L +D T #ept_end P#0.1 L L +D T #sub_end P#0.1 L L +D T #att_end P#1.0 L LOOP JU #contador IF1 INCD //Pula OPN LAR1 L T DB [#ept_dbn] #ept_end 0 D [AR1,P#0.0] //Reseta a double apontada por ept_end OPN LAR1 L T DB [#sub_dbn] #sub_end 0 D [AR1,P#0.0] //Reseta a double apontada por sub_end L L +D T #ep_end P#4.0 L L +D T #ept_end P#4.0 L L +D T #sub_end P#4.0 L L +D T #att_end P#32.0 L LOOP #contador_2 VSZ #ep_end #ept_end #sub_end #att_end //Decrementa o Contador do Loop para INCD, para //Incremento dos Ponteiros #ep_end #ept_end #sub_end #att_end BEU 64 decrementar o 6.3.5: Função de Geração das Entradas Polarizadas Bypassadas (EPB) Para a geração das entradas polarizadas bypassadas, foi criado um bloco de programa do tipo função. Este bloco faz uma operação com a tabela da Entrada Polarizada Temporizada (EPT) e com a tabela Requisição de Bypass (BYP) para a geração da tabela das Entradas Polarizadas Bypassadas (EPB). A operação lógica executada é : ept ⋅ byp = epb Tabela 6-3 — Tabela Verdade da Operação ept 0 0 1 1 byp 0 1 0 1 epb 0 0 1 0 Fig. 6.13 — Operação de Geração de EPB Na Tabela 6-3 é mostrada a tabela verdade da operação que é executada para a geração da tabela EPB. Esta operação tem por objetivo dar ao operador do sistema a liberdade de ignorar um sinal em “1” vindo do campo. Para tal basta atribuir ao bit correspondente da tabela de requisição de bypass o valor “1”. Este artifício é utilizado para, por exemplo, ignorar sinais vindos de sensores defeituosos. Pela tabela verdade da operação percebe-se que o bit da tab. EPB somente é setado quando ept está em “1” e byp está em “0”. Quanto à localização na memória do CLP, as tabelas EPT, BYP e EPB podem se localizar tanto na Memória de Bits (M) como em um Bloco de Dados (DB). 65 6.3.6: Funcionamento do FC 45 — Gerador de Entradas Polarizadas Bypassadas O bloco FC 45 é um bloco do tipo função resposável por fazer a operação descrita no item anterior. Os parâmetros do bloco FC 45 são três ponteiros do tipo ANY responsáveis por endereçar as áreas de memória das tabelas envolvidas na operação. Tem-se a informação, através do ponteiro ANY, das três áreas de memória envolvidas e de seu tamanho. A FC 45 possui ainda variáveis usadas dentro do bloco listadas na tabela de declarações. Todas elas são do tipo “temp”, ou seja, temporárias. Fig. 6.14 — Tabela de declarações de variáveis do FC 45 A primeira network da FC 45 faz o armazenamento das variáveis locais, definidas na tabela de declarações, dos dados provenientes dos ponteiros ANY. Os dados armazenados são o fator de repetição, o número de DB (se existente) e o endereço inicial da área apontada. 66 Network 1 — FC 45 L LAR1 L T L T L T L T L LAR1 L T L T L T L LAR2 L T L T L T P##EPT W [AR1,P#2.0] #ept_rep_factor W [AR1,P#4.0] #ept_dbn D [AR1,P#6.0] #ept_end B [AR1,P#6.0] #ept_area P##BYP W [AR1,P#2.0] #byp_rep_factor W [AR1,P#4.0] #byp_dbn D [AR1,P#6.0] #byp_end P##EPB W [AR2,P#2.0] #epb_rep_factor W [AR2,P#4.0] #epb_dbn D [AR2,P#6.0] #epb_end //Carrega endereço do ponteiro EPT //Transfere para o AR1 //Carrega o fator de repetição //Transfere para uma variável local //Carrega nro. do DB (se existente) //Transfere para uma variável local //Carrega informação de endereço //Transfere para uma variável local //Carrega informação de área de mem. //Transfere para uma variável local //Carrega endereço do ponteiro BYP //Transfere para o AR1 //Carrega o fator de repetição //Transfere para uma variável local //Carrega nro. Do DB (se existente) //Transfere para uma variável local //Carrega informação de endereço //Transfere para uma variável local //Carrega endereço do ponteiro EPB //Tranfere para o AR2 //Carrega o fator de repetição //Transfere para uma variável local //Carrega nro. do DB (se existente) //Transfere para uma variável local //Carrega informação de endereço //Transfere para uma variável local A segunda network da função é, da mesma maneira que nas outras funções, um verificador de tamanho de tabelas. A estrutura básica da network é a mesma. O menor fator de repetição é armazenado em uma variável local para que seja Network 2 — FC 45 L L <I JC L <I JC T JU REP1: REP2: REP3: L L <I JC T JU L T JU L T JU #ept_rep_factor #byp_rep_factor REP1 #epb_rep_factor REP2 #rep_factor INI #ept_rep_factor #epb_rep_factor REP3 #rep_factor INI #byp_rep_factor #rep_factor INI #ept_rep_factor #rep_factor INI 67 utilizado posteriormente na execução da operação lógica. A terceira network é a responsável pela execução da lógica. A rotina básica é um loop que faz a operação descrita em 32 bits por volta. O primeiro passo é a transferência do fator de repetição para o contador do loop indicando o número de voltas que serão dadas. Logo após, uma instrução OPN faz a abertura do Bloco de Dados se esta for realmente a área de dados endereçada. Caso contrário, o registrador de Bloco de Dados é carregado com “0” e não influencia no resto das instruções. Percebe-se que, da mesma maneira que nas outras funções, há um uso intensivo de endereçamento indireto através do endereçamento indireto de registro Network 3 — FC 45 INI: L #rep_factor //Carrega o menor fator de repetição IF1: T #contador //Carrega o contador do loop OPN LAR1 L INVD OPN LAR1 L AD OPN LAR1 T DB [#byp_dbn] #byp_end D [AR1,P#0.0] //Abre DB (se existente) //Transfere o endereço do BYP p/ AR1 //Carrega dword apontada por byp_end //Inverte BYP //Abre DB (se existente) //Transfere o endereço de EPT p/ AR1 //Carrega dword apontada por ept_end //Executa a lógica AND //Abre DB (se existente) //Transfere o endereço do EPB p/ AR1 //Transfere resultado da lógica DB [#ept_dbn] #ept_end D [AR1,P#0.0] DB [#epb_dbn] #epb_end D [AR1,P#0.0] L L +D T #ept_end P#4.0 L L +D T #byp_end P#4.0 //Seqüência de incr. dos ponteiros #ept_end #byp_end L L +D T #epb_end P#4.0 #epb_end L LOOP #contador IF1 // Decrementa o contador do loop BEU de área cruzada e indireto de memória. Os passos finais são os incrementos nos ponteiros a cada volta do loop e a instrução BEU indicando fim de bloco incondicional. 68 6.3.7: Função de Geração das Entradas Polarizadas Bypassadas Seladas (EBS) Para a geração das entradas polarizadas bypassadas seladas, foi criado um bloco de programa do tipo função. Este bloco opera a tabela das entradas polarizadas bypassadas (EPB) e a Tabela de Reconhecimento de Alarme (REC) gerando a Tabela das Entradas Polarizadas Bypassadas Seladas (EBS). A operação lógica executada é um travamento lógico do estado “1” de epb (bit da tabela EPB) até que haja o reconhecimento por parte de rec (bit da tabela REC). Fig. 6.15 — Operação de Geração de EBS O reconhecimento é uma operação executada pelo operador, na sala de controle, através de um comando no supervisório da planta. Quando ocorre de um sinal da tabela EPB ser ativado, um alarme é acionado no supervisório da planta e o respectivo bit da tabela EBS é setado. No entanto, o sinal que é de fato utilizado na lógica do intertravamento é o proveniente da tabela EPB (ver Fig. 6.1). Para o sinal de EBS ser resetado, deve-se aguardar o respectivo sinal da tabela EPB ser levado a “0” antes, e o sinal da tabela REC ser setado. O objetivo desta função é assegurar que haja o reconhecimento, por parte do operador, de uma mudança de estado no campo. Enquanto não há o reconhecimento um alarme é disparado na tela do supervisório. De posse desta informação o operador pode tomar as medidas necessárias para o correto funcionamento do processo. A localização das tabelas na memória do CLP é, como na maioria dos casos, variável. Todas as tabelas podem se localizar tanto na Memória de Bits (M) como em um Bloco de Dados (DB). 69 6.3.8: Funcionamento do FC 46 — Gerador de Entradas Polarizadas Bypassadas Seladas O bloco FC 46 é um bloco do tipo função que faz a operação de travamento do alarme na tela do supervisório. Os parâmetros deste bloco são três ponteiros tipo ANY que endereçam as tabelas alocadas em alguma área de memória do CLP. Como já descrito, o ponteiro ANY descreve toda a área de memória e não apenas o endereço inicial. Além destes, a FC 46 possui variáveis internas que auxiliam as operações necessárias na implementação (Fig. 6.16). Fig. 6.16 — Tabela de declarações de variáveis do FC 46 A primeira network da FC 46 armazena em variáveis locais os dados informados pelos ponteiros ANY. Como nas outras funções, os dados armazenados são o fator de repetição, o número do DB e o endereço inicial da área apontada. A segunda network faz a verificação do tamanho das tabelas e utiliza o menor valor de tamanho na execução da opeação. Esta network funciona como já descrito 70 Network 1 — FC 46 L LAR1 L T L T L T L LAR1 L T L T L T L LAR1 L T L T L T P##EPB W [AR1,P#4.0] #epb_dbn D [AR1,P#6.0] #epb_end W [AR1,P#2.0] #epb_rep_factor P##REC W [AR1,P#4.0] #rec_dbn D [AR1,P#6.0] #rec_end W [AR1,P#2.0] #rec_rep_factor P##EBS W [AR1,P#4.0] #ebs_dbn D [AR1,P#6.0] #ebs_end W [AR1,P#2.0] #ebs_rep_factor //Carrega endereço do ponteiro //Transfere para AR1 //Carrega nro. do DB //Transfere p/ var. local //Carrega informação de endereço //Transfere p/ var. local //Carrega fator de repetição //Transfere p/ var. local //Carrega endereço do ponteiro //Transfere para AR1 //Carrega nro. do DB //Transfere p/ var. local //Carrega informação de endereço //Transfere p/ var. local //Carrega fator de repetição //Transfere p/ var. local //Carrega endereço do ponteiro //Transfere para AR1 //Carrega nro. do DB //Transfere p/ var. local //Carrega informação de endereço //Transfere p/ var. local //Carrega fator de repetição //Transfere p/ var. local anteriormente nas outras funções. Na Fig. 6.8 tem-se a descrição detalhada de como funciona a network. Network 2 — FC 46 L L <I JC L <I JC T JU REP1: REP2: REP3: L L <I JC T JU L T JU L T JU #epb_rep_factor #rec_rep_factor REP1 #ebs_rep_factor REP2 #rep_factor INI #epb_rep_factor #ebs_rep_factor REP3 #rep_factor INI #rec_rep_factor #rep_factor INI #epb_rep_factor #rep_factor INI A terceira network da FC 46 faz o travamento lógico do alarme. Em primeiro lugar se carrega o fator de repetição obtido na network 2, que é igual ao tamanho da menor tabela envolvida na operação, sendo o tamanho o número de double words da tabela. Este valor é transerido ao contador do loop e será decrementado a cada volta. A primeira operação executada é a lógica OU entre os bits de EPB e REC 71 (Fig. 6.15). O valor obtido desta operação é imediatamente utilizado sem ser armazenado para fazer a lógica E com o valor da tabela EBS. O valor desta operação é também utilizado sem ser armazenado para obter o novo valor de EBS. Network 3 — FC 46 INI: L #rep_factor //Carrega fator de repetição ROT: T LAR1 OPN L INVD LAR2 OPN L OD #contador #rec_end DB [#rec_dbn] D [AR1,P#0.0] //Transfere para o contador do loop //Transfere rec_end p/ AR1 //Abre DB (se existente) //Carrega dword do REC //Faz complemento de 1 (inv. sinal) //Transfere epb_end p/ AR2 //Abre DB (se existente) //Carrega dword de EPB //Faz operação OU nas dwords #epb_end DB [#epb_dbn] D [AR2,P#0.0] LAR1 OPN L AD #ebs_end DB [#ebs_dbn] D [AR1,P#0.0] //Transfere ebs_end p/ AR1 //Abre DB (se existente) //Carrega dword de EBS //Faz operação E nas dwords OPN L OD OPN T DB [#epb_dbn] D [AR2,P#0.0] //Abre DB (se existente) //Carrega dword de EPB //Faz operação OU nas dwords //Abre DB (se existente) //Transfere resultado p/ EBS DB [#ebs_dbn] D [AR1,P#0.0] L L +D T #epb_end P#4.0 L L +D T #rec_end P#4.0 L L +D T #ebs_end P#4.0 L LOOP #contador ROT //Incrementa ponteiros #epb_end #rec_end #ebs_end BEU //Decrementa contador do loop //Fim de Bloco O passo final do loop é fazer o incremento dos ponteiros e o decremento do contador para a próxima volta. Quando o loop é finalizado, a instrução de fim de bloco é executada. 72 6.3.9: Função de Reset de Reconhecimento Para a implementação da função de reset de reconhecimento foi criado um bloco de programa do tipo bloco de função. Este bloco opera a tabela REC e uma tabela auxiliar REC’ de maneira a resetar a primeira. Fig. 6.17 — Operação de Reset de REC Esta função tem por objetivo fazer no próprio CLP o comando de reset do reconhecimento. Isto é feito em primeiro lugar porque o supervisório (que envia o sinal de reconhecimento) não possui um comando no formato “pulso”. O outro motivo pelo qual o reset do reconhecimento é feito no CLP, é garantir que o sinal de reconhecimento chegue a lógica de tratamento de entradas e saídas. Se o sinal fosse pulsado e o CLP estivesse em um ciclo de varredura longo (situação rara mas possível), poderia ocorrer de o sinal de reconhecimento ir para “0” antes de sua utilização na lógica de tratamento de entradas. Na Fig. 6.17 tem-se o diagrama de funcionamento do bloco de função. Os dois temporizadores tem por objetivo gerar uma onda quadrada de período T = 2s. Esta onda ora habilita, ora desabilita o bloco de movimentação. Quando os bits correspondentes das tabelas EBS e REC estão ativados, em algum momento o bit REC’ também o será. Quanto à localização na memória do CLP, as tabelas EPT, BYP e EPB podem se localizar tanto na Memória de Bits (M) como em um Bloco de Dados (DB). 6.3.10: Funcionamento do FB 47 — Reset de Reconhecimento de Alarme O bloco FB 47 é um bloco do tipo bloco de função que faz a operação de reset de reconhecimento de alarme. Este reconhecimento é feito através de um comando do supervisório. Os parâmetros de entrada deste bloco são três ponteiros tipo ANY que endereçam as tabelas do CLP envolvidas na operação. Além destes 73 parâmetros de entrada, o bloco FB 47 possui variáveis outras variáveis do tipo “temp” e do tipo “stat”. Aqui, deve-se dizer o porquê de se utilizar um FB e não um FC como nos outros blocos de programa. Como já descrito anteriormente, os FBs possuem a capacidade de armazenar, de uma varredura para a outra, os valores de algumas variáveis. Neste caso, como foi necessário o uso de temporizadores, isso foi imprescindível. Os temporizadores devem, necessariamente, armazenar algumas variáveis para por exemplo, saber se estão ativos ou não. Para a chamada do bloco, é necessário ainda designar um Bloco de Dados que será o seu Bloco de Dados Instance (todo bloco de função deve ser chamado com a designação de um Bloco de Dados Instance). Na Fig. 6.18, tem-se a visualização das variáveis do Bloco. Fig. 6.18 — Tabela de declarações de variáveis do FB 47 A primeira network do Bloco de Função armazena em variáveis locais os dados informados pelos ponteiros ANY. Os dados armazenados são o fator de repetição, o número do DB e o endereço inicial da área apontada. Eles serão usados nas networks seguintes. 74 Network 1 — FB 47 L LAR1 L T L T L T L LAR1 L T L T L T L LAR1 L T L T L T P##REC W [AR1,P#4.0] #rec_dbn D [AR1,P#6.0] #rec_end W [AR1,P#2.0] #rec_rep_factor P##EBS W [AR1,P#4.0] #ebs_dbn D [AR1,P#6.0] #ebs_end W [AR1,P#2.0] #ebs_rep_factor P##RECL W [AR1,P#4.0] #recl_dbn D [AR1,P#6.0] #recl_end W [AR1,P#2.0] #recl_rep_factor //Carrega o endereço do Ponteiro //Transfere para o AR1 //Carrega nro. do DB (se existente) //Transfere para variável local //Carrega endereço inicial //Transfere para variável local //Carrega fator de repetição //Transfere para variável local //Carrega o endereço do Ponteiro //Transfere para o AR1 //Carrega nro. do DB (se existente) //Transfere para variável local //Carrega endereço inicial //Transfere para variável local //Carrega fator de repetição //Transfere para variável local //Carrega o endereço do Ponteiro //Transfere para o AR1 //Carrega nro. do DB (se existente) //Transfere para variável local // //Transfere para variável local // //Transfere para variável local A segunda network serve para a verificação do tamanho das tabelas e utiliza o menor valor deles na execução da opeação. Esta network é análoga àquela descrita na Fig. 6.8. Network 2 — FB 47 L L <I JC L <I JC T JU REP1: REP2: REP3: L L <I JC T JU L T JU L T JU #recl_rep_factor #rec_rep_factor REP1 #ebs_rep_factor REP2 #rep_factor INI #recl_rep_factor #ebs_rep_factor REP3 #rep_factor INI #rec_rep_factor #rep_factor INI #recl_rep_factor #rep_factor INI //Carrega tam. de REC’ //Carrega tam. De REC //REC’ < REC? //Se sim, pula p/ REP1 //Se não, carrega tam. EBS //REC < EBS //Se sim, pula p/ REP2 //Se não, rep_factor = tam. EBS //Pula p/ network seguinte //Carrega tam. REC’ //Carrega tam. EBS //REC’ < EBS? //Se sim, pula para REP3 //Se não, rep_factor = tam. EBS //Pula p/ network seguinte //Carrega tam. REC //rep_factor = tam. REC //Pula p/ network seguite //Carrega tam. REC’ //rep_factor = tam. REC //Pula p/ network seguinte A terceira network do Bloco de Função faz a geração da onda quadrada através de dois temporizadores. Eles são do tipo atraso na subida ou seja, quando um sinal “1” aparece na sua entrada, o temporizador retarda um tempo definido pelo 75 usuário seu aparecimento na saída. Com dois temporizadores ligados em série (como mostrado na Fig. 6.19), pode-se fazer a onda quadrada, de qualquer período, apenas ajustando o tempo de retardo. Dependendo do estado da onda quadrada (alto ou baixo) o fluxo de programa é direcionado para a network 5 ou para a network 6 através de um jump condicional. Este teste é feito na network 4. Fig. 6.19 — Network 3 do FB 48 A network 4 faz o teste para verificar em que estado se encontra a onda quadrada. Network 4 — FB 47 A JCN #onda.Q TMRZ //Se a onda estiver em “1” //Vai para network 6, senão para a 5 A network 5 faz a operação lógica E entre os bits da tabela EBS e da tabela REC e transfere o resultado para a tabela REC’. Já se sabe de antemão que, se se está na network 5, o estado da onda quadrada é alto. Então, o que se faz realmente nesta network é a operação lógica E entre três sinais: os dois já descritos mais o sinal da onda quadrada. Isto vem ao encontro do especificado graficamente pela Fig. 6.17. 76 Network 5 — FB 47 RREC: L T LAR1 OPN L LAR2 OPN L AD LAR1 OPN T #rep_factor #contador #rec_end DB [#rec_dbn] D [AR1,P#0.0] #ebs_end DB [#ebs_dbn] D [AR2,P#0.0] #recl_end DB [#recl_dbn] D [AR1,P#0.0] L L +D T #rec_end P#4.0 L L +D T #ebs_end P#4.0 L L +D T #recl_end P#4.0 L LOOP #contador RREC //Carrega fator de repetição //Transfere p/ contador do loop //Transfere rec_end p/ AR1 //Abre DB (se existente) //Carrega double da tab. REC //Transfere ebs_end p/ AR2 //Abre DB (se existente) //Carrega double da tab. EBS //Faz operação lógica E //Transfere recl_end p/AR1 //Abre DB (se existente) //Transfere resultado da operação //Incrementa ponteiros #rec_end #ebs_end #recl_end BEU //Carrega contador //Decrementa contador //Fim de Bloco A network 6 faz a operação de movimentação também descrita na Fig. 6.17. Esta network somente é executada se o estado da onda quadrada for baixo. Durante o estado baixo da onda quadrada é que se faz de fato reset da tabela de reconhecimento de alarme (REC). Isso se dá pela transferência dos valores da tabela REC’ para a tabela REC. 77 Network 6 — FB 47 TMRZ: MV: L T #rep_factor #contador //Carrega o fator de repetição //Transfere para o contador do loop LAR2 #recl_end OPN DB [#recl_dbn] L D [AR2,P#0.0] LAR1 #rec_end OPN DB [#rec_dbn] T D [AR1,P#0.0] valor da double de REC’ L L +D T #rec_end P#4.0 L L +D T #recl_end P#4.0 //Transfere recl_end p/ AR2 //Abre DB (se existente) //Carrega double de REC’ //Transfere rec_end p/ AR1 //Abre DB (se existente) //Transfere para double de REC o //Incremento dos ponteiros #rec_end #recl_end L #contador //Carrega contador LOOP MV //Decrementa conteúdo de ACCU 1 e pula para MV se seu conteúdo for > 0 BEU //Fim de Bloco Incondicional Ao final, a tabela de reconhecimento (REC) é resetada depois de a lógica anterior (lógica de reconhecimento) ter sido executada pelo CLP. Tem-se assim o reconhecimento do sinal de campo em seu estado alterado de uma maneira segura. 6.3.11: Função de Geração de SL1 Para a implementação desta função, foi criado um bloco de programa do tipo função. Este bloco opera com a tabela Saída da Lógica (SLG) e a tabela Requisição de Override “1” (OV1) para a geração da tabela SL1. Esta tabela é o resultado da operação de override “1” no sinal de saída. A operação lógica necessária é a OU (Tabela 6-4). s lg+ ov1 = sl1 Tabela 6-4 — Operação OU entre SLG e OV1 gerando SL1 slg 0 0 1 1 ov1 0 1 0 1 sl1 0 1 1 1 78 Fig. 6.20 — Operação OU A operação OU permite o sinal vindo de SLG apareça em SL1 quando OV1 é “0”. Quando o bit de SLG é “0”, a operação permite sobrescrever a lógica através do sinal de OV1 bastando para isso, escrever “1” no bit correspondente. Esta operação pode ser útil em casos como testes, falhas de equipamentos ou lógica defeituosa. A tabela SLG é a saída da lógica ou seja, o resultado do intertravamento. Pode estar alocada tanto em Memória de Bits (M) como em Bloco de Dados (DB). As outras tabelas podem, da mesma maneira, estar alocadas na Memória de Bits ou em um Bloco de Dados (DB). 6.3.12: Funcionamento do FC 48 — Gerador de SL1 O bloco FC 48 é um bloco do tipo função que faz a operação lógica OU entre os sinais das tabelas SLG e OV1. O bloco opera de maneira semelhante ao FC 43, apenas alterando a operação (de OU EXCLUSIVO para OU) e as tabelas envolvidas. Da mesma maneira, os parâmetros do bloco são três ponteiros do tipo ANY que endereçam as diferentes áreas de memória envolvidas na operação. A função FC 48 possui variáveis que auxiliam a execução da operação e são declaradas na tabela de declarações (Fig. 6.21). A primeira network armazena em variáveis locais as informações fornecidas pelo ponteiro ANY das três áreas envolvidas na operação. A segunda network faz a lógica de escolha do menor fator de repetição. O funcionamento é semelhante ao das outras funções já explicadas. A terceira network faz a lógica de override “1”. Os sinais de SLG e OV1 são carregados e a operação OU é executada de double word em double word. Obs.: por questão de semelhança com a FC 43, apenas a network 3 é mostrada neste caso. 79 Fig. 6.21 — Tabela de declarações do bloco FC 48 Network 3 — FC 48 INI: L #rep_factor //Carrega fator de repetição IF1: T OPN LAR1 L OPN LAR1 L OD OPN LAR1 T #contador DB [#slg_dbn] #slg_end D [AR1,P#0.0] DB [#ov1_dbn] #ov1_end D [AR1,P#0.0] //Transfere p/ contador do loop //Abre DB (se existente) //Transfere slg_end p/ AR1 //Carrega double de SLG //Abre DB (se existente) //Transfere ov1_end p/ AR1 //Carrega double de OV1 //Executa operação OU //Abre DB (se existente) //Transfere sl1_end p/ AR1 //Transfere resultado p/ SL1 L L +D T DB [#sl1_dbn] #sl1_end D [AR1,P#0.0] #slg_end P#4.0 #slg_end L L +D T #ov1_end P#4.0 L L +D T #sl1_end P#4.0 #sl1_end L LOOP #contador IF1 BEU //Incremento dos ponteiros #ov1_end //Carrega contador //Decrementa contador e pula p/ IF1 //Fim de Bloco 80 6.3.13: Função de Geração de SLO Para a implementação da função de geração da Saída da Lógica (SLO), foi criado um bloco de programa do tipo função. Este bloco opera com a tabela SL1 e com a tabela Requisição de Override “0” (OV0) para a geração da tabela SLO. Esta tabela é o resultado da operação de override “0” no sinal de saída. A operação lógica necessária é mostrada na equação abaixo e na Tabela 6-5. sl1 ⋅ ov0 = slo Tabela 6-5 — Tabela Verdade da Operação sl1 0 0 1 1 ov0 0 1 0 1 slo 0 0 1 0 Fig. 6.22 — Geração de SLO Com as operações de override é possível que o operador tenha controle do sinal que sai da lógica do intertravamento. Neste caso, basta fazer uma requisição na tabela OV0 no bit correspondente para que o bit de SLO seja “0”. Pela Tabela 6-5, pode-se notar que basta o bit de OVO ser igual a “0” que o bit correspondente de SLO também o será. Quanto à localização na memória, as três tabelas podem se localizar tanto em Memória de Bits (M) como em Bloco de Dados (DB). 6.3.14: Funcionamento do FC 49 — Gerador de SLO O bloco FC 49 é um bloco do tipo função que faz a operação descrita no item anterior. Assim como o bloco FC 48, este bloco opera de maneira semelhante ao FC 43, apenas alterando a operação (de OU EXCLUSIVO para a descrita acima) e as tabelas envolvidas. Os parâmetros de entradas são os mesmos ponteiros ANY que endereçam as tabelas SL1, OV0 e SLO. 81 A função possui as variáveis locais “temp” que auxiliam a execução do bloco de programa (Fig. 6.23). A primeira network armazena em variáveis locais as informações fornecidas pelo ponteiro ANY das três áreas envolvidas na operação. A segunda network faz a lógica de escolha do menor fator de repetição. O funcionamento é semelhante ao das outras funções já explicadas. A terceira network faz a lógica de override “0”. Os sinais de SL1 e OV0 são carregados e a operação descrita é executada de double word em double word e armazenada em SLO. Obs.: por questão de semelhança com a FC 43, apenas a network 3 é mostrada para esta função. Fig. 6.23 — Tabela de declarações de variáveis do FC 49 82 Network 3 — FC 49 INI: L #rep_factor //Carrega fator de repetição IF1: T OPN LAR1 L INVD OPN LAR1 L AD OPN LAR1 T #contador DB [#ov0_dbn] #ov0_end D [AR1,P#0.0] //Transfere p/ contador do loop //Abre DB (se existente) //Transfere ov0_end para AR1 //Carrega double de ov0 //Inverte sinal de OV0 //Abre DB (se existente) //Transfere sl1_end p/ AR1 //Carrega double de SL1 //Faz lógica E //Abre DB (se existente) //Transfere slo_end p/ AR1 //Transfere resultado p/ SLO L L +D T DB [#sl1_dbn] #sl1_end D [AR1,P#0.0] DB [#slo_dbn] #slo_end D [AR1,P#0.0] #sl1_end P#4.0 //Incremento dos ponteiros #sl1_end L L +D T #ov0_end P#4.0 L L +D T #slo_end P#4.0 #slo_end L LOOP #contador IF1 #ov0_end BEU //Carrega contador //Decrementa contador e pula p/ IF1 //Fim de Bloco 6.3.15: Função de Geração de Saídas Físicas (SAI) Para a implementação da função de geração da Saída Física (SAI), foi criado um bloco de programa do tipo função. Este bloco opera com a tabela Saída da Lógica (SLO) e com a tabela Saídas Esperadas (SSP) para a geração das Saídas Físicas (SAI). Esta tabela é o resultado da operação OU EXCLUSIVO entre as duas primeiras. A operação lógica necessária é mostrada abaixo e na Tabela 6-6. slo ⊕ ssp = sai Tabela 6-6 — Operação OU EXCLUSIVO entre SLO e SSP gerando SAI slo 0 0 1 1 ssp 0 1 0 1 sai 0 1 1 0 83 Fig. 6.24 — Geração de SAI A operação de geração de SAI tem o mesmo princípio da geração das entradas polarizadas (EP). O estado “normal” dos comandos é armazenado na tabela SSP. Quando existe uma diferença entre um bit de SLO e de SSP a saída física é ativada. Quanto à localização na memória, as três tabelas podem se localizar tanto em Memória de Bits (M) como em Bloco de Dados (DB). 6.3.16: Funcionamento do FC 50 — Gerador de Saídas Físicas (SAI) O bloco FC 50 é um bloco do tipo função que faz a operação OU EXCLUSIVO entre os sinais de SLO e SSP. Este bloco opera de maneira praticamente igual ao FC 43, apenas alterando as tabelas envolvidas na operação. Os parâmetros de entradas são ponteiros ANY que endereçam as tabelas SLO, SSP e SAI. Como nos outros blocos, a função possui as variáveis locais “temp” que funcionam como temporárias (Fig. 6.25). Fig. 6.25 — Tabela de declarações de variáveis do FC 50 84 A primeira network armazena em variáveis locais as informações fornecidas pelo ponteiro ANY das três áreas envolvidas na operação. A segunda network faz a lógica de escolha do menor fator de repetição. O funcionamento é semelhante ao das outras funções já explicadas. A terceira network faz a lógica de OU EXCLUSIVO. A operação é realizada de double word em double word. Obs.: por questão de semelhança com a FC 43, apenas a network 3 é mostrada para esta função. Network 3 — FC 50 INI: L #rep_factor //Carrega fator de repetição IF1: T OPN LAR1 L OPN LAR1 L XOD OPN LAR1 T #contador DB [#slo_dbn] #slo_end D [AR1,P#0.0] DB [#ssp_dbn] #ssp_end D [AR1,P#0.0] //Transfere para contador do loop //Abre DB (se existente) //Transfere sl0_end para AR1 //Carrega double word de SLO //Abre DB (se existente) //Transfere ssp_end para AR1 //Carrega double word de SSP //Faz operação OU EXCLUSIVO //Abre DB (se existente) //Transfere sai_end para AR1 //Transfere resultado para SAI L L +D T DB [#sai_dbn] #sai_end D [AR1,P#0.0] #slo_end P#4.0 //Incremento dos ponteiros #slo_end L L +D T #ssp_end P#4.0 L L +D T #sai_end P#4.0 #sai_end L LOOP #contador IF1 #ssp_end //Carrega contador //Decrementa contador e pula p/ IF1 BEU 85 Capítulo 7: Resultados Neste capítulo serão mostrados os resultados obtidos com o sistema de tratamento de entrada implementado e sua posterior análise. Os resultados referem-se a testes feitos em laboratório com o CLP Siemens S7-400. Algumas considerações a respeito dos monitoração e modificação das variáveis foi feita por uma estação conectada ao CLP via Ethernet. 7.1: Condições de Obtenção dos Resultados A situação em que foram realizados os testes de verificação do sistema diferem da situação em que o sistema será implementado nos seguintes aspectos: • A modificação da tabela ENT se dará pela mudança no estado dos sinais de campo, vindos da rede Profibus DP e não pela modificação manual via tabela d e variáveis; • A modificação da tabela REC se fará via supervisório. No caso dos testes a modificação é feita via tabela de variáveis. Em ambas as situações, as condições de laboratório, apesar de diferentes das condições de campo, não alteram grandemente os resultados que seriam obtidos em campo. No caso da modificação da tabela ENT, a diferença se dá pelo tempo de atualização da rede Profibus DP. No segundo caso, a situação de laboratório é praticamente igual a de campo. A diferença é que a estação que modifica a tabela REC é outra, no entanto está conectada na mesma rede Ethernet. 86 7.2: Visualização do Funcionamento Os testes em laboratório foram realizados utilizando uma tabela de variáveis que monitora o valor dos bits (Memória do CLP) online. Fig. 7.1 — Exemplo de Tabela de Variáveis Esta mesma ferramenta permite modificar o valor das variáveis, verificar o tempo de ciclo, forçar valores, etc. Em comparação à monitoração de variáveis diretamente no bloco, a tabela de variáveis permite que se visualize diretamente, em uma mesma tela, todas as variáveis de interesse. É a melhor maneira para fazer testes com vários blocos, pois independe da quantidade de chamadas. 7.3: Resultados Obtidos Em relação ao sistema anteriormente implementado, o novo Sistema de Tratamento de Entradas e Saídas apresentou soluções que mudaram sua característica. A primeira grande mudança se deu no endereçamento dos sinais. O 87 sistema anterior, em vez fazia o endereçamento bit a bit para os blocos que utilizavam temporizadores. Esta abordagem fazia com que os blocos de programa ficassem com um tamanho extremamente grande porque, para cada sinal de entrada, era feita uma network com a respectiva lógica. Toda a lógica do Sistema de Tratamento dos Pontos de Entrada e Saída desenvolvida ocupa uma área na memória de trabalho de 3.004 bytes. No sistema antigo, apenas para a geração da tabela EPT, havia dois blocos com o tamanho de 24.986 bytes cada um. Este tamanho se deve ao exposto anteriormente. Para cada ponto do sistema havia uma network com todas as instruções necessárias para fazer a lógica de temporização. No novo Sistema apenas é necessário informar a área dos sinais. A lógica de temporização é feita em apenas uma network. No sistema antigo, não havia a possibilidade de haver variações de área de memória para uma determinada tabela. Para isso era necessária a criação de um novo bloco de programa. Por isso, o sistema só funcionava para tabelas alocadas na Memória de Bits (M). Com o novo Sistema, toda área de memória pode ser enderaçada para uma tabela, basta que o ponteiro ANY contenha esta informação. Quanto ao tempo do ciclo de varredura, o CLP Siemens possui uma ferramenta de análise que permite verificar os tempos mínimo, médio e máximo de ciclo. No entanto, os resultados obtidos em laboratório não podem ser extrapolados diretamente para a plataforma. Isto porque não se tem uma relação direta entre o número de pontos das tabelas e o tempo de execução. Para tabelas com 160 pontos (5 double words), o tempo de execução médio do tratamento de entradas é de 3 ms e o de tratamento de saídas é de 1 ms. Este tempo é aumentado quando por exemplo, são mudados vários pontos da tabela ENT no mesmo ciclo. Quando foram alterados os 160 pontos no mesmo ciclo de varredura, o CLP acusou um tempo de ciclo máximo de 64 ms. Isto porque provavelmente o bloco FC 44 de temporização atuou em seus ciclos mais longos demandando mais tempo de execução. A alteração de tantos pontos em tão pouco tempo é, no entanto, muito difícil de ocorrer na prática. Além disso, a especificação Petrobras sobre tempo de ciclo é em relação ao tempo médio e não em relação ao tempo máximo. Porém, como foi dito anteriormente, a relação entre o número de pontos das tabelas e tempo de ciclo não é direta. Para um número maior de pontos (8 double words), o tempo de execução médio do tratamento de entradas se manteve em 3 ms. O 88 tempo de ciclo médio exigido pela Petrobras para as CPUs é de no máximo 150 ms. Com o sistema funcionando provisoriamente, o tempo de ciclo médio das CPUs (média dos tempos médios das 5 CPUs) está em cerca de 100 ms. 89 Capítulo 8: Conclusões A lógica de controle ficou muito mais clara do que a implementada anteriormente. A principal vantagem advinda do Sistema de Tratamento dos Pontos de Entrada e Saída é a rapidez de execução e a clareza da lógica. Agora, basta descrever a área de memória onde os pontos estão alocados e reservar uma área de memória para algumas tabelas auxiliares. O uso dos ponteiros ANY é fundamental nesta tarefa. Qualquer lugar de memória pode alocar os pontos envolvidos na operação pois os blocos de programa foram desenvolvidos para lidar com esta variedade. No entanto, o entendimento da lógica por parte da Petrobras é essencial para que o Sistema seja aprovado para uso na plataforma. As providências para que isso ocorra estão sendo tomadas por aqueles que trabalham diretamente na plataforma P-43. É a primeira vez que estas especificações estão sendo implementadas em um CLP Siemens, por isso este processo pode ser um pouco mais demorado. No entanto, testes devem ser realizados na P-43 (que se encontra em fase de comissionamento em Niterói) para garantir a viabilidade do sistema. Um dos problemas que pode ocorrer é o excessivo tempo de execução da lógica. Nos testes feitos em laboratório isto não ocorreu porque o número de pontos simulados na entrada do sistema foi muito inferior ao que será na prática. A relação direta entre tamanho de tabelas e tempo de execução não foi encontrada. Se necessário, algumas alterações deverão ser executadas nos blocos mais críticos, principalmente no FC 44 e FB 47, visivelmente os “gargalos” do sistema pela presença de temporização. O Sistema de Tratamento de Entradas e Saídas é um passo em busca do mais importante em plataformas de petróleo: a segurança. Ele foi praticamente todo desenvolvido em STL, linguagem que otimiza utilização do espaço e faz programas mais velozes, especialmente porque esta era uma das partes críticas do projeto. O que se buscou em todos os momentos foi a robustez e a simplicidade do programa. Isto foi alcançado graças ao uso intensivo dos diversos tipos de ponteiros 90 disponíveis, da organização interna dos blocos (todos seguem um padrão) e da divisão do sistema em subtarefas (um bloco para cada operação lógica). Com esta simplicidade e organização espera-se que, com os testes que serão realizados em plataforma, o Sistema de Tratamento dos Pontos de Entrada e Saída possa cumprir fielmente com o papel para o qual foi desenvolvido. 91 Bibliografia: [1] site: petrobras.com.br [2] SIMATIC NET NCM S7 for PROFIBUS / FMS Manual, Vol. 2, pg. 16-19, 2001. [3] SIMATIC S7-400 Manual, 2003. [4] C. C. de Moraes e P. L. Castrucci, “Engenharia de Automação Industrial”, LTC, 2001. [5] SIMATIC System Software for S7-300/400 System and Standard Functions, 2002. 92 Anexo A — Instruções STL utilizadas Neste anexo estão listadas as instruções utilizadas nos blocos do Sistema de Tratamento dos Pontos de Entrada e Saída, com seus respectivos formatos e descrições. • Instruções Lógicas de Bit: 1. A (AND) Formato: A <Bit> Descrição: A instrução A verifica se o estado do bit endereçado é “1” e faz a lógica AND com o bit RLO. 2. R (RESET) Formato: R <Bit> Descrição: A instrução R escreve “0” no bit endereçado se o RLO = 1. 3. S (SET) Formato: S <Bit> Descrição: A instrução S escreve “1” no bit endereçado se o RLO = 1. 4. = (ATRIBUIÇÃO) Formato: = <Bit> Descrição: A instrução = escreve o conteúdo de RLO no bit endereçado. 5. FP (SENSOR DE TRANSIÇÃO POSITIVA) Formato: FP <Bit> Descrição: A instrução FP detecta uma borda positiva quando o RLO transiciona de “0” para “1” e indica isso escrevendo “1” em RLO. 93 Durante cada ciclo de varredura, o estado de RLO é comparado com o obtido no ciclo anterior para verificar se houve mudança de estado. O estado anterior de RLO é armazenado no endereço indicado por <Bit> para se fazer a comparação. • Instruções de Salto: todas as intruções de salto utilizam como parâmetro um jump label. Este jump label pode ter no máximo quatro caracteres e o primeiro deles deve ser uma letra. São seguidos obrigatoriamente por “:” e devem preceder a instrução de programa. 1. JU (Jump Unconditional) Formato: JU <jump label> Descrição: A instrução JU interrompe o funcionamento seqüencial do programa e salta para um destino identificado por <jump label>. O <jump label> deve ser único e pode se localizar tanto antes como depois da instrução, porém deve estar no mesmo bloco de programa. 2. JC (Jump Conditional) Formato: JC <jump label> Descrição: A instrução JC interrompe o funcionamento seqüencial do programa e salta para <jump label> se RLO = 1. 3. JCN (Jump if RLO = 0) Descrição: A instrução JCN interromper o funcionamento seqüencial do programa e salta para <jump label> se RLO = 0. • Instruções com Double Words, Word e Bytes: 1. ==D (Compara Double Integer) Formato: ==D 94 Descrição: Esta instrução compara o conteúdo do ACCU 1 com o conteúdo do ACCU 2. Se ambos são iguais, RLO é escrito com “1”. 2. +D (Adição com Double Integer) Formato: +D Descrição: Esta instrução soma o conteúdo de ACCU 1 e ACCU 2 e armazena o resultado em ACCU 1. O conteúdo dos acumuladores é interpretado como inteiros de 32 bits. 3. <I (Compara Integer) Formato: <I Descrição: Esta instrução verifica se o conteúdo, interpretado como um número inteiro, de ACCU 2-L é menor do que o de ACCU 1-L. 4. >=I (Compara Integer) Formato: >=I Descrição: Esta instrução verifica se o conteúdo, interpretado como um número inteiro, de ACCU 2-L é maior ou igual do que o de ACCU 1-L. 5. –I (Subtração Integer) Formato: –I Descrição: Esta instrução subtrai o conteúdo de ACCU 1-L do conteúdo de ACCU 2-L e armazena o resultado em ACCU 1-L. 6. L (Load) Formato: L <address> Descrição: Esta instrução carrega o byte, word ou double word endereçado no ACCU 1 depois de o antigo conteúdo deste ser copiado para ACCU 2 e de o ACCU ser resetado para “0”. 7. T (Transfer) Formato: T <address> 95 Descrição: Esta instrução copia o conteúdo do ACCU1 para o destino endereçado por <address>. O número de bytes copiado para o destino depende do tamanho expressado no endereço de destino. 8. LAR1 ou LAR2 (Load AR1 or AR2) Formato: LAR1 <D> Descrição: Esta instrução carrega o registrador AR1 com o conteúdo da double word <D> ou do ponteiro. 9. TAK (Toggle Accu 1 with Accu 2) Formato: TAK Descrição: Esta instrução troca o conteúdo dos acumuladores ACCU 1 e ACCU 2. 10. INVD (Complemento de um de double interger) Formato: INVD Descrição: Esta instrução forma o complemento de “1” do conteúdo de ACCU 1. Isto inverte o valor, bit a bit, do conteúdo de ACCU 1. 11. AD (And double word) Formato: AD Descrição: Faz a operação booleana E entre o conteúdo de ACCU 1 e ACCU 2 e armazena o resultado em ACCU 1. 12. OD (Or double word) Formato: OD Descrição: Faz a operação booleana OU entre o conteúdo de ACCU 1 e ACCU 2 e armazena o resultado em ACCU 1. 13. XOD (Exclusive OR double word) Formato: XOR Descrição: Faz a operação booleana OU EXCLUSIVO entre o conteúdo de ACCU 1 e ACCU 2 e armazena o resultado em ACCU 1. 14. OPN (Open a data block) 96 Formato: OPN <data block> Descrição: Esta instrução armazena <data block> no registrador de DB. Este DB pode ser Compartilhado ou Instance. 15. LOOP (Faz o Loop) Formato: LOOP <jump label> Descrição: Esta instrução decrementa ACCU 1-L e salta para <jump label> se ACCU 1-L for diferente de zero. 16. BEU (Block End Unconditional) Formato: BEU Descrição: Encerra o processamento do bloco atual e salta para o bloco que chamou o atual. A varredura recomeça na instrução imediatamente subseqüente à que chamou o bloco. 17. CALL (Block Call) Formato: CALL <logic block indentifier> Descrição: Usado para chamar FCs, FBs, SFCs ou SFBs. 97