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
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.
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.
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.
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
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)
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)
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>