Samia Kamal Genena
Transcrição
Samia Kamal Genena
UNIVERSIDADE FEDERAL DE SANTA CATARINA CURSO DE ENGENHARIA DE CONTROLE E AUTOMAÇÃO INDUSTRIAL Simplementação, Configuração e Customização do Sistema PI na Unidade Multipropósito de FCC Monografia submetida à Universidade Federal de Santa Catarina como requisito para a aprovação da disciplina: DAS 5511 Projeto de Fim de Curso Samia Kamal Genena Florianópolis, Março de 2004 Implementação, Configuração e Customização do Sistema PI na Unidade Multipropósito de FCC Monografia submetida à Universidade Federal de Santa Catarina como requisito para a aprovação da disciplina: DAS 5511: Projeto de Fim de Curso Samia Kamal Genena Florianópolis, março de 2004 Implementação, Configuração e Customização do Sistema PI na Unidade Multipropósito de FCC Samia Kamal Genena 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: Alberto Jamhour, Eng. Orientador Empresa Julio Elias Normey Rico, PhD. Orientador do Curso Prof. Augusto Humberto Bruciapaglia Responsável pela disciplina Prof. Ubirajara Franco Moreno, Avaliador Ronald Gomes, Debatedor Rodrigo Castelan Carlson, Debatedor À memória de minha filha Santra, com todo carinho. i Agradecimentos Ao engenheiro e orientador Alberto Jamhour, pela habilidade com que orientou meu trabalho nunca deixando de me incentivar, propiciando um ambiente de trabalho favorável, facilitador de minha jornada. Ao professor e orientador Julio Elias Normey Rico, que prontamente aceitou o desafio de me orientar, apesar das dificuldades ligadas ao tema, pela sua grande dedicação e conhecimento em projetos de pesquisa, e pela minha formação profissional. À Universidade Federal de Santa Catarina - UFSC - e aos professores do curso de Engenharia de Controle e Automação Industrial, responsáveis pela minha formação. Ao apoio financeiro da Agência Nacional do Petróleo - ANP - e da Financiadora de Estudos e Projetos - FINEP - por meio do Programa de Recursos Humanos da ANP para o Setor Petróleo e Gás - PRH nº34 - ANP/MCT. À PETROBRAS/UN-SIX pela oportunidade de estágio e aprendizado oferecidos. Ao suporte da OSIsoft, especialmente Wanda Eaton e Justin Starnes, pela competência e dedicação, estando sempre presentes quando surgiram dúvidas relacionadas ao sistema PI. Ao operador Gilson Mauro Herbst, conhecedor do Sistema PI, que colaborou no início do projeto explicando o funcionamento do sistema. À engenheira química e amiga, Luciana Monteguti, que com paciência me explicou o funcionamento do processo de Craqueamento Catalítico Fluidizado. Obrigada pelo companheirismo, amizade e suporte emocional que proporcionou. Aos estagiários da PETROBRAS/UN-SIX, que compartilharam o período de estágio comigo, em especial ao estagiário e amigo João Rodrigues Giovani de Souza e à estagiária e amiga Daniela Muccillo, pelo companheirismo, compreensão e amizade. ii A minha mãe Tânia Regina Ferreira, exemplo de coragem, determinação, retidão e perseverança, pessoa a qual admiro muito, pela dedicação e amor durante toda a minha vida, pelo constante incentivo para prosseguir na busca do meu ideal, e a minha irmã gêmea Aziza Kamal Genena, pessoa que também admiro e amo, obrigada pelo incentivo dedicado a mim. Ao meu namorado, Ricardo Gabriel Steinbach, uma pessoa convicta e sensível, que sempre compartilhou entusiasticamente de várias idéias, uma pessoa de visão e motivadora, obrigada pelo companheirismo, carinho e amor dedicados a mim. Às amigas, Clarice Urban Chagas e Michelle Bonatti, que sempre foram fontes de amizade e força, estando presentes em diversas situações da minha vida. Aos amigos da graduação: Victor Rocha, Leonardo Soliz Encinas e Hermínio Matias Neto, os quais admiro imensamente pela inteligência e pela maneira com que vivem e enxergam a vida. Agradeço em especial ao amigo Leandro de Souza, Engenheiro de Controle e Automação Industrial, que para mim, mais que um amigo é um irmão, sempre compartilhando comigo os bons e maus momentos, alegrias e tristezas, ajudandome com palavras sábias de um verdadeiro amigo que ele é, sempre me incentivando e dando força para seguir em frente sem me deixar abater. Por fim e não menos importante, agradeço saudosa de minha pedra preciosa e filha Santra, que faleceu no decurso deste projeto, deixando saudade. Obrigada pelo amor incondicional que durante dez anos foi fonte inesgotável de alegria e essência da magia que é a razão da minha persistência, energia e luta, rendo-lhe meu amor eterno e homenagem. iii A conclusão de um curso de graduação é um passo no desenvolvimento pessoal num tempo em que a única constante é a mudança. iv Resumo O sistema PI (Plant Information) pode ser traduzido como um conjunto de ferramentas que permite o acompanhamento de processos industriais, o armazenamento do histórico dos dados desses processos e o acompanhamento online das suas variáveis. A grande vantagem desse sistema é a possibilidade de realizar consultas aos dados sem haver necessidade de vínculo físico do cliente com o Sistema de Controle Distribuído (SDCD). O objetivo do Projeto de Fim de Curso foi a implementação, configuração e customização do sistema PI na Unidade Multipropósito de Craqueamento Catalítico Fluido da SIX. As atividades desenvolvidas na Petrobras/SIX que serão abordadas nesta monografia estiveram relacionadas ao conhecimento do sistema, atualização e inserção de novos tags no banco de dados do servidor, instalação e configuração de uma nova interface de coleta de dados entre o SDCD e o servidor, criação de telas de processo para acompanhamento do processo nas máquinas clientes, e principalmente o desenvolvimento de aplicativos em Visual Basic, os quais são responsáveis por monitorar e inserir dados manualmente no servidor. v Abstract The Plant Information System (PI System) can be defined as a group of tools that allows the attendance of industrial processes, the storage of the processes data report and the on-line attendance of their variables. The great advantage of PI System is the possibility to watch the process data without the need of a physical bond between the client machines and the DCS. The objective of this dissertation is to describe the developed work of implementation, configuration and customizing of the PI System in the Fluid Catalytic Cracking Unit of SIX. The developed activities that will be approached in this monograph were related to the knowledge of the system, updating and inserting of new tags in the server's database, installation and configuration of a new interface of data collection between DCS and server, creation of process screens for attendance of the process in the client machines, and mainly the development of applications in Visual Basic, which are responsible for monitoring and manually inserting data in the server. vi Sumário Agradecimentos................................................................................................ ii Resumo ............................................................................................................ v Abstract ........................................................................................................... vi Sumário .......................................................................................................... vii Índice de Figuras .............................................................................................. x Índice de Anexos ............................................................................................ xii Capítulo 1: Introdução ......................................................................................1 Capítulo 2: Petrobras – Petróleo Brasileiro S/A................................................3 2.1: Áreas de Atuação...................................................................................4 2.1.1: Abastecimento.................................................................................4 2.1.2: Exploração e Produção ...................................................................4 2.1.3: Gás e Energia..................................................................................5 2.1.4: Internacional ....................................................................................5 2.2: Unidade de Industrialização do Xisto – SIX ...........................................6 2.2.1: Processo PETROSIX ......................................................................6 2.2.2: Gerência de Pesquisa – GEPES .....................................................9 2.3: Craqueamento Catalítico Fluido...........................................................13 2.3.1: Descrição Sumária do Processo ...................................................14 2.3.2: Produtos de Craqueamento...........................................................16 2.3.3: Catalisadores para FCC ................................................................19 2.3.4: Carga para Craqueamento ............................................................19 2.3.5: Variáveis Operacionais..................................................................20 2.4: Unidade Multipropósito de FCC – U144...............................................21 vii 2.4.1: Descrição Geral.............................................................................21 2.4.2: Fluxo de Catalisador......................................................................22 2.4.3: Fluxo de Carga ..............................................................................23 2.4.4: Fluxo de Ar ....................................................................................23 2.4.5: Fluxo de Vapor ..............................................................................24 2.4.6: Fluido de Selagem.........................................................................24 2.4.7: Amostrador de Topo e Sistemas de Condensação .......................24 Capítulo 3: O Sistema PI ................................................................................26 3.1: O Armazenamento dos Dados .............................................................28 3.1.1: Buferização dos Dados .................................................................29 3.1.2: Teste de Exceção..........................................................................30 3.1.3: Compressão dos Dados ................................................................30 3.2: Tags .....................................................................................................33 3.3: Acesso aos Dados ...............................................................................35 3.3.1: PI-API ............................................................................................35 3.3.2: Utilitários Clientes..........................................................................37 3.3.3: Interface semAPI ...........................................................................39 3.4: Sistema de Controle Distribuído – SDCD ............................................43 Capítulo 4: Etapas do Trabalho Desenvolvido................................................44 4.1: Instalação e Configuração da Interface................................................44 4.2: Criação de Planilhas para Automação de Tarefas Repetitivas ............50 4.2.1: Cálculo de Atributos dos Tags a partir do BD do SDCD................50 4.2.2: Cálculo de Estados Digitais ...........................................................53 4.2.3: Cálculo de Valores Atuais das Variáveis .......................................54 4.3: Criação de Telas de Processo .............................................................55 4.4: Desenvolvimento de Aplicativos em Visual Basic ................................60 viii 4.4.1: PI Tag Monitor ...............................................................................60 4.4.2: Entrada Manual de Dados .............................................................64 4.4.3: PI Data Insert.................................................................................65 Capítulo 5: Discussão dos Resultados, Conclusões e Perspectivas ..............68 Bibliografia:.....................................................................................................71 Anexos:...........................................................................................................72 ix Índice de Figuras Figura 1 – Produtos e Subprodutos do Xisto ....................................................7 Figura 2 – Processo Petrosix............................................................................8 Figura 3 – Unidade de extração do óleo de xisto (retorta)................................9 Figura 4 – Diagrama de Blocos do Craqueamento Catalítico.........................16 Figura 5 – Unidade Multipropósito de FCC.....................................................22 Figura 6 – Fluxo dos Dados............................................................................26 Figura 7 – Arquitetura do Sistema PI na SIX ..................................................27 Figura 8 – Processamento de Informações Novas.........................................28 Figura 9 – PI Snapshot Subsystem ................................................................28 Figura 10 – Fluxo da Exceção à Compressão ................................................29 Figura 11 – Exemplo do Processo de Filtragem dos Dados...........................29 Figura 12 – Sistema de Buferização...............................................................29 Figura 13 – Como funciona o Exception Report .............................................30 Figura 14 – Parâmetros de Compressão........................................................31 Figura 15 – Primeiro Passo da Compressão de Dados..................................31 Figura 16 – Zona Morta da Compressão ........................................................32 Figura 17 – Determinação do valor a ser armazenado...................................32 Figura 18 – Compressão dos Dados ..............................................................33 Figura 19 – Resultado Final da Compressão dos Dados ...............................33 Figura 20 – Máquina Cliente com PI-API........................................................36 Figura 21 – PI Tag Configurator – add-in para Microsoft Excel ......................38 Figura 22 – PI Point Builder............................................................................38 Figura 23 – Interface – Intermediador na Coleta de Dados ............................39 x Figura 24 – Esquema do Interfaceamento ABB/Bailey-PI semAPI.................39 Figura 25 – Módulo/Cartão de Comunicação INICI03 ....................................40 Figura 26 – Estrutura do Interfaceamento ABB/Bailey-PI semAPI .................41 Figura 27 – Tela do LICENTRY ......................................................................45 Figura 28 – Tela do ICICONF.........................................................................46 Figura 29 – Buffer Primário de Memória sendo utilizado ................................49 Figura 30 – Buffer Secundário de Memória sendo utilizado ...........................49 Figura 31 – Guia EngUnits .............................................................................50 Figura 32 – Guia Bailey PointType .................................................................51 Figura 33 – Guia BD SDCD............................................................................52 Figura 34 – Guia Cálculo para Exportar .........................................................52 Figura 35 – Estados Digitais Lógicos..............................................................53 Figura 36 - Estados digitais de cada tag digital .............................................54 Figura 37 – Retorno de Valor Atual das Variáveis ..........................................55 Figura 38 – Lista de telas do PI-ProcessBook................................................56 Figura 39 – Comparação entre telas de processo..........................................57 Figura 40 –Tela de Processo Geral criada no PI-ProcessBook......................58 Figura 41 – Tela criada no PI-ProcessBook ...................................................59 Figura 42 – Gráfico do PI-ProcessBook .........................................................59 Figura 43 – PI Tag Monitor – Splash Screen..................................................61 Figura 44 – PI Tag Monitor – Tela de Monitoração dos Dados ......................61 Figura 45 – PI Tag Monitor – Tela de Busca ..................................................62 Figura 46 – PI Tag Monitor – Resultado da Busca Efetuada..........................63 Figura 47 – PI Tag Monitor – Monitoramento de Variáveis.............................64 Figura 48 – PI Data Insert – Tela de Inserção dos Dados ..............................66 Figura 49 – PI Data Insert – Processo de Inserção dos Dados ......................67 xi Índice de Anexos Anexo A – Fluxograma Unidade Multipropósito de FCC ................................72 Anexo B – Código Fonte do arquivo piapi32.bas............................................73 Anexo C – Código Fonte do arquivo piutil.bas................................................79 Anexo D – PI Tag Monitor – Código Fonte do Splash Form..........................82 Anexo E – PI Tag Monitor – Código Fonte do Display Form .........................83 Anexo F – PI Tag Monitor – Código Fonte do Search Form...........................85 Anexo G – PI Data Insert – Código Fonte do DataInsert Form.......................87 Anexo H – Supported Input Point Types (ABB/Bailey Data to PI) ..................89 Anexo I – Lista Completa de parâmetros do blysem.bat ................................90 xii Capítulo 1: Introdução O assunto a ser abordado no decorrer desta monografia foi desenvolvido durante a execução do Projeto de Fim de Curso, realizado durante período de estágio na empresa Petrobras/UN-SIX, onde se trabalhou junto à Gerência de Pesquisa com o sistema PI (Plant Information), sendo exigida a implementação, configuração e customização do mesmo de acordo com os objetivos a serem alcançados pela companhia. Por implementação entende-se dar efeito prático a algo concebido através de uma ação objetiva. Configurar por sua vez significa dar forma. Customização, por fim, tem o sentido de adaptar os produtos e processos ao gosto do cliente, originando da palavra do inglês customer, que significa cliente. Assim, durante a realização do trabalho foi possível efetivar de fato o funcionamento do sistema PI, dando forma ao mesmo para que funcionasse corretamente, e criando interfaces de comunicação entre os usuários e o servidor de dados que se adaptassem a utilização requerida pelo cliente. Sendo o sistema PI um conjunto de servidor/cliente desenvolvido para automatizar totalmente a coleta, armazenamento e apresentação das informações de um processo, esse Projeto de Fim de Curso está completamente inserido no contexto do curso de Engenharia de Controle e Automação Industrial. Constavam entre os objetivos do trabalho a ser realizado: a operacionalização do sistema para as unidades de pesquisa da SIX, iniciando pela U144 (Unidade Multipropósito de Craqueamento Catalítico Fluido); a integração dos dados oriundos do PI com os programas para balanço de massa e energia da unidade; e a elaboração roteiros para manutenção e implementação adicionais, quando necessárias. O sistema PI foi encontrado fora de funcionamento, especialmente no que diz respeito à comunicação entre o SDCD e a interface de coleta dos dados. Assim, o foco inicial do trabalho resumiu-se em fazer com que a interface funcionasse corretamente. 1 A metodologia adotada foi baseada no aprendizado e no conhecimento adquirido progressivamente sobre o funcionamento do sistema através de manuais, internet e contatos com o fabricante e o representante no Brasil, seguindo o princípio de que é preciso conhecer bem o sistema para poder configurá-lo e fazê-lo funcionar corretamente. No decorrer da monografia poder-se-á acompanhar as etapas de desenvolvimento do trabalho realizado. Primeiramente, no capítulo 2, é feita uma apresentação da empresa onde o estágio foi realizado, composta de um breve relato sobre sua história e áreas de atuação. Nesse mesmo capítulo é feita uma descrição do processo de craqueamento catalítico fluido, a título de informação para os leitores e de sua implementação na Unidade de Industrialização do Xisto – SIX. No capítulo 3 descreve-se os conhecimentos adquiridos sobre o sistema PI e seu funcionamento, bem como o funcionamento da interface semAPI que executa a coleta de dados do SDCD. No quarto capítulo são descritas as atividades desenvolvidas pela autora, acompanhadas de esclarecimentos sobre projetos quando esses se fizerem necessários. Finalmente, no quinto e último capítulo, é apresentada uma discussão dos resultados, junto com conclusões e perspectivas sobre o projeto, onde se faz uma análise crítica das realizações e dificuldades encontradas durante o período. 2 Capítulo 2: Petrobras – Petróleo Brasileiro S/A Em outubro de 1953, através da Lei nº. 2.004, a Petrobras era criada para executar as atividades do setor de petróleo no Brasil em nome da União. Ao longo de quatro décadas, tornou-se líder em distribuição de derivados no país, colocando-se entre as vinte maiores empresas petrolíferas na avaliação internacional. Em 1997, o Brasil ingressou no seleto grupo de 16 países que produz mais de um milhão de barris de óleo por dia. E nesse mesmo ano foi criada a Lei nº. 9.478, que abre as atividades da indústria petrolífera à iniciativa privada. Com a lei, foram criados a Agência Nacional do Petróleo (ANP), encarregada de regular, contratar e fiscalizar as atividades do setor; e o Conselho Nacional de Política Energética, um órgão formulador da política pública de energia. Em sintonia com a mudança do cenário, a Petrobras seguiu preparada para a livre competição, ampliando novas perspectivas de negócios e tendo maior autonomia empresarial. Noventa e três plataformas de produção, mais de dez refinarias, quase dezesseis mil quilômetros em dutos e mais de sete mil postos de combustíveis, esses são números da Petrobras que representam sua forte presença no Brasil. A Petrobras desenvolve diversas atividades no exterior e mantém uma consistente atividade internacional, tal como: compra e venda de petróleo, tecnologias, equipamentos, materiais e serviços; acompanhamento do desenvolvimento da economia americana e européia; operação financeira com bancos e bolsa de valores; recrutamento de pessoal especializado; afretamento de navios; apoio em eventos internacionais, entre outros. Além de estar presente em diversos países como Angola, Argentina, Bolívia, Colômbia, Estados Unidos e Nigéria, a Petrobras conta ainda com o apoio de seus escritórios no exterior como em Nova Iorque e no Japão. Além disso, há o CENPES, o Centro de Pesquisas da Petrobras, que possui uma das mais avançadas tecnologias do mundo e é reconhecido internacionalmente pela sua competência. 3 2.1: Áreas de Atuação A Petrobras atua em várias áreas do setor de energia. Desde a exploração de gás e petróleo até a distribuição, passando pelo refino e abastecimento, as atividades da companhia estão divididas em: Exploração e Produção, Gás e Energia, Abastecimento, e Internacional. Como empresa de energia, a Petrobras atua em várias áreas desse setor, desde a exploração de gás e petróleo, refino, abastecimento até a distribuição. 2.1.1: Abastecimento A Petrobras abastece quase toda a demanda do mercado brasileiro por derivados de petróleo – cerca de 1,7 milhões de barris/dia - mercado esse composto por 140 milhões de consumidores. Além do objetivo de aumentar sua capacidade de produção, de modo a atender a crescente demanda por derivados, a Petrobras precisa enfrentar outro desafio: adaptar suas refinarias de modo a aumentar a taxa de conversão de diferentes tipos de óleo, dentro da já existente estrutura de processamento, eliminando, assim, a dependência da importação. De acordo com a Petroleum Intelligence Weekly, a Petrobras é a nona maior companhia no setor downstream - refino, transporte e comercialização. O termo downstream, na Petrobras, está ligado à boa parte da estrutura operacional da companhia: suas onze refinarias, duas fábricas de fertilizantes, bases, dutos, terminais e navios. 2.1.2: Exploração e Produção O órgão de Exploração e Produção (E&P) da Petrobras é responsável pela pesquisa, localização, identificação, desenvolvimento, produção e incorporação de reservas de óleo e gás natural dentro do território nacional. Impulsionado pelo fato de grande parte das reservas brasileiras se encontrarem em bacias marítimas a grandes profundidades, o E&P, em parceria com outras áreas da Companhia, tem alçado a Petrobras à excelência mundial em desenvolvimento e aplicação de tecnologia de exploração e produção em águas 4 profundas. Esse esforço foi reconhecido internacionalmente através do recebimento, pela segunda vez, no ano 2001, do prêmio mais importante da indústria mundial de petróleo, o Distinguished Achievement Award, oferecido na Offshore Technology Conference (OTC). 2.1.3: Gás e Energia A área de negócios de Gás & Energia é responsável pela comercialização do gás natural nacional e importado e pela implantação de projetos, em parceria com o setor privado, que irão garantir a oferta deste combustível em todo o país. Elevar a participação do gás natural na matriz energética do país dos atuais 3% para 10% até 2005 é um dos principais objetivos da companhia. Para isso, a Petrobras dedica esforço permanente junto às distribuidoras de gás e seus clientes, buscando alternativas técnicas e econômicas que ampliem o uso do gás nos segmentos industriais, automotivos, na geração e co-geração de energia. A área de Gás & Energia da Petrobras é responsável por grande parte da estrutura de transporte e comercialização, atuando sempre de maneira segura e ambientalmente correta. Entre todos os combustíveis atualmente disponíveis em larga escala, o gás natural é aquele que se destaca como o mais versátil, econômico e limpo. 2.1.4: Internacional A Petrobras desenvolve também diversas atividades no exterior e mantém uma consistente atividade internacional, como: exploração; compra e venda de petróleo, tecnologias, equipamentos, materiais e serviços; acompanhamento do desenvolvimento da economia americana e européia; operação financeira com bancos e bolsa de valores; recrutamento de pessoal especializado; afretamento de navios; apoio em eventos internacionais, entre outros. Ainda assim, a Companhia está associada às maiores empresas de petróleo do mundo, fazendo-se presente em Angola, Argentina, Bolívia, Colômbia, Casaquistão, Estados Unidos, Guiné Equatorial, Nigéria e Trinidad & Tobago. 5 2.2: Unidade de Industrialização do Xisto – SIX A Unidade de Industrialização do Xisto foi constituída em 1º de junho de 1954, com a missão de estudar as potencialidades do xisto betuminoso e a viabilidade econômica de sua transformação industrial. A sede está localizada no município de São Mateus do Sul, no Paraná, a 140 quilômetros de Curitiba, onde também se encontram a mina e a área industrial. Em função da capacidade tecnológica desenvolvida na exploração do xisto, a Petrobras resolveu transformar a planta industrial do xisto também num centro avançado de pesquisa na área de refino. Assim, dentro da SIX podem ser encontrados dois núcleos distintos, a Gerência de Produção e a Gerência de Pesquisa. Hoje, vários projetos estão sendo desenvolvidos em conjunto com universidades e centros de pesquisas. Além disso, a SIX confere atenção especial à preservação dos ecossistemas, promove e apóia os órgãos públicos de defesa do meio ambiente e entidades ambientalistas. 2.2.1: Processo PETROSIX O Brasil tem um dos maiores volumes mundiais de xisto: reservas de 1,9 bilhão de barris de óleo, 25 milhões de toneladas de gás liquefeito, 68 bilhões de metros cúbicos de gás combustível e 48 milhões de toneladas de enxofre só na formação Irati, que engloba os estados de São Paulo, Paraná, Santa Catarina, Rio Grande do Sul, Mato Grosso do Sul e Goiás. A Petrobras concentrou suas operações na jazida de São Mateus do Sul, cidade do Paraná, onde o minério é encontrado em duas camadas: a camada superior de xisto com 6,4 metros de espessura e teor de óleo de 6,4%, e a camada inferior com 3,2 metros de espessura e teor de óleo de 9,1%. Em 1972, entrou em operação a Usina Protótipo do Irati (UPI), que comprovou a viabilidade técnica do processo PETROSIX, testou equipamentos e levantou dados básicos para projetos de usinas industriais. O processo de consolidação da tecnologia PETROSIX se completou em dezembro de 1991, quando entrou em operação o Módulo Industrial (MI), em plena 6 escala. Atualmente, a SIX processa diariamente 7.800 toneladas de xisto betuminoso, que geram 3.870 barris de óleo de xisto, 120 toneladas de gás combustível, 45 toneladas de gás liquefeito de xisto e 75 toneladas de enxofre. Figura 1 – Produtos e Subprodutos do Xisto A principal característica da tecnologia desenvolvida pela Petrobras é a simplicidade operacional. Depois de minerado a céu aberto, o xisto vai para um britador, que reduz as pedras a tamanhos que variam de 6 a 70 milímetros. Então, estas pedras são levadas a uma retorta, onde são pirolisadas (cozidas) a uma temperatura de aproximadamente 500 graus Celsius liberando-se a matéria orgânica nelas contida sob a forma de óleo e gás. O calor para a pirólise é fornecido por uma corrente gasosa de elevada temperatura, que entra na zona de retortagem e se mistura com uma segunda corrente, injetada pela base da retorta, para recuperar o calor do xisto já retortado. 7 Figura 2 – Processo Petrosix Nas zonas de aquecimento e secagem, a massa gasosa ascendente cede calor ao xisto e se resfria, resultando na condensação dos vapores de óleo sob a forma de gotículas, transportadas para fora da retorta pelos gases. Estes, com as gotículas de óleo, passam por dois outros equipamentos (ciclone e precipitador eletrostático), onde são coletados o óleo pesado e as partículas sólidas arrastadas na etapa anterior. O gás limpo de neblina de óleo (ou seja, das gotículas de óleo pesado condensadas durante a retortagem) passa por um compressor e se divide em três correntes: uma retorna para o fundo da retorta, outra também volta à retorta após ser aquecida em um forno, e a terceira, denominada gás produto, vai para um condensador onde o óleo leve é recuperado. Depois de retirado o óleo leve, o gás é encaminhado à unidade de tratamento de gás para a produção de gás combustível de xisto e para a recuperação do GLX (gás liquefeito de xisto) e do enxofre. 8 Figura 3 – Unidade de extração do óleo de xisto (retorta) O óleo produzido é vendido diretamente para as indústrias e também é enviado para a REPAR, Refinaria do Paraná. A nafta é toda processada pela refinaria, produzindo gasolina. O GLX e o enxofre são vendidos diretamente para terceiros. Terminado o processo de retirada do óleo e gás da rocha, o xisto, agora dito “retortado”, é devolvido à área minerada que será reabilitada. 2.2.2: Gerência de Pesquisa – GEPES Desde sua criação em 1954, a SIX vem atuando como um centro de desenvolvimento de tecnologia, inicialmente para o aproveitamento do xisto e a partir de 1991 em outros projetos, principalmente na área de refino, trabalhando em conjunto com o Centro de Pesquisas da Petrobras – CENPES. Com a implantação do Programa de Desenvolvimento de Tecnologias Estratégicas de Refino (Proter), que busca compatibilizar a maior oferta de petróleos nacionais com o aumento da demanda de combustíveis e da sociedade pela melhoria do ar e dos produtos, a SIX passou a trabalhar nas áreas de craqueamento 9 catalítico, desasfaltação, hidrogenação e no desenvolvimento de novas rotas para o aproveitamento do coque e do resíduo asfáltico. Assim, a SIX sedia um dos maiores esforços de desenvolvimento tecnológico do país e vem realizando estudos para desenvolvimento de processos e equipamentos, possuindo diversas plantas piloto, entre as quais destacamos: 2.2.2.1: Unidade Multipropósito de FCC Estuda o craqueamento catalítico de petróleos nacionais; Testa e desenvolve equipamentos como ciclones, riser, regenerador, resfriador de catalisador e stripper; Determina a influência de variáveis de processo no rendimento e na qualidade dos produtos; Levanta dados de projetos de novas unidades de FCC de resíduos; Desenvolve equipamentos e processos, e testa catalisadores. 2.2.2.2: Unidade de Nebulizadores de FCC Desenvolve dispersores de carga com boa distribuição de vazão, formando um jato em leque, com tamanho e distribuição de gotículas controlados, alta durabilidade, facilidade de contração, baixo consumo de fluido de atomização e baixo diferencial de pressão. 2.2.2.3: Unidade de Hidroconversão de Resíduos Desenvolve tecnologia de hidroconversão, que maximiza a produção de diesel com qualidade, a partir do resíduo de vácuo de Petróleo Marlim. 2.2.2.4: Unidade a Frio de Ciclones Avalia novas concepções e novas geometrias de ciclones; Avalia novas condições operacionais e desenvolve ciclones de alta eficiência, baixa perda de carga e elevado fator operacional. 10 2.2.2.5: Unidade de Recirculação de Catalisador Pesquisa para propiciar aumento da taxa média de utilização do parque de refino; Pesquisa materiais e desenvolve equipamentos para unidades de alto desempenho e refino de petróleo nacional, com ênfase na conversão de resíduos. 2.2.2.6: Unidade de Destilação Produz cortes de gasolinas especiais de competição, especialmente para a Fórmula 1; Produz cortes de petróleo para estudo da qualidade e rendimentos dos produtos; Avalia internos de torres. 2.2.2.7: Unidade de Desasfaltação Estuda a influência das variáveis operacionais na qualidade e rendimento dos produtos; Avalia o desempenho de solventes com diferentes composições; Realiza testes de co-processamento e outros produtos na carga de desasfaltação; Faz a avaliação de internos de torres; Produz cortes pesados para estudos de produção de asfaltos especiais. 2.2.2.8: Unidade de Pneus Armazena e promove a dosagem correta de pneus picados à carga de minério. O processo Petrosix permite a reciclagem de 140 mil toneladas/ano, ou o equivalente a 27 milhões de pneus - 1 tonelada de pneus rende: 532 kg de óleo, 24 kg de gás, 314 kg de carbono e 110 kg de aço. 11 2.2.2.9: Unidade de Tratamento e Misturas Reverte termicamente o concentrado nitrogenado de gasóleo, viabilizando a acidificação de cargas para UFCCs; Utilizada para preparo de misturas diversas, combustíveis para queima e testes de fornos. 2.2.2.10: Laboratório O laboratório está preparado para realizar análises elementares completas, com equipamentos de última geração, tais como: Espectrômetro de absorção atômica com geração de hidretos, da Varian, modelo Aa220; Espectrômetro por quimiluminescência e fluorescência para determinação de nitrogênio e enxofre, da Antec, modelo NS9000; Analisador por infravermelho e condutividade térmica para determinação de carbono, hidrogênio e nitrogênio, da Leco, modelo CHN2000; Destilador D-86; Cromatógrafos para destilação simulada (D-2887 e HT750) da HP; Cromatógrafo para análise de PIANIO - HP 6890; Bancada de destilação (PEV, POT STEEL e D1150). Além de executar ensaios de acompanhamento de processos e vendas da SIX, o laboratório fornece suporte a todas as plantas do Parque Tecnológico, sendo capacitando a realizar mais de 120 trabalhos e ensaios. 2.2.2.11: Laboratório de Medição de Partículas a Laser Laser de argônio INNOVA 70C-5, de 5 watts, para medir o tamanho de partículas (PDPA - phase doppler particle analyser) e sua velocidade no interior de ciclones (LDV - laser doppler velocimeter). 12 2.2.2.12: Laboratório de Combustão Obtém informações a respeito da queima de diversos tipos de combustíveis e suas emissões, inclusive particulados; Testa queimadores, materiais e equipamentos; Otimiza condições operacionais, em função do combustível e queimador. 2.2.2.13: Unidade de Tratamento Ácido de Gasóleo/ Emulsões Desenvolve o processo de remoção de nitrogênio básico de cargas de FCC, visando aumentar a conversão e qualidade dos produtos; Estuda emulsões diversas e tratamentos de rejeitos industriais. 2.3: Craqueamento Catalítico Fluido O processo de Craqueamento Catalítico Fluido – FCC (Fluid Catalytic Cracking) – nasceu em 1942 e apesar de quase 60 anos de amadurecimento continua sendo uma tecnologia em evolução, sendo atualmente o principal processo de conversão das frações pesadas de petróleo para produtos leves das refinarias modernas. Até 1913, toda a gasolina produzida era obtida por destilação direta do petróleo, portanto, tanto a qualidade como a quantidade dependiam unicamente do tipo de cru refinado. Como havia grande variedade de petróleos, havia também uma grande variação no rendimento e na qualidade das gasolinas. Em média, entretanto, o rendimento situava-se em torno de 20% em volume. A partir da segunda década do século, começaram a surgir processos comerciais de craqueamento, objetivando suprir as necessidades da indústria automobilística. Iniciando com o craqueamento térmico, o processo mais tarde passou a utilizar a versão catalítica, em leitos fixo, móvel ou fluidizado, desenvolvendo-se de forma notável esta última concepção, até atingir o estágio em que hoje nos encontramos, onde o craqueamento catalítico fluido é praticamente um processo imprescindível às modernas refinarias. 13 O craqueamento catalítico é um processo de refino que visa aumentar a produção de gasolina e de gás liquefeito de petróleo – GLP, através da conversão de cortes pesados provenientes da destilação do petróleo (gasóleo e resíduos), em frações mais leves. É um processo largamente utilizado em todo o mundo, uma vez que a demanda de gasolina em vários países é superior a dos óleos combustíveis. O craqueamento catalítico corrige a produção de gasolina e GLP, suplementando a diferença entre a quantidade obtida diretamente do petróleo e a requerida pela refinaria de modo a atender ao mercado. O FCC é hoje um processo largamente difundido em todo o mundo, devido principalmente a dois fatores. O primeiro deles consiste no fato de contribuir eficazmente com a refinaria no sentido de ajustar sua produção às reais necessidades do mercado consumidor local, devido à sua grande flexibilidade operacional. O segundo fator que tornou consagrado o processo está ligado ao aspecto econômico, transformando frações residuais, de baixo valor comercial, em derivados nobres de alto valor. 2.3.1: Descrição Sumária do Processo O processo consiste na quebra de moléculas pesadas presentes nos gasóleos e resíduos, por ação de um catalisador à base de sílica-alumina, em altas temperaturas. A ruptura das ligações possibilita o aparecimento de moléculas leves, principalmente compostos de 3 a 12 átomos de carbono (GLP e Gasolina), devido à seletividade do catalisador usado. As reações provocam também a formação, em menor escala, de gases leves, gasóleos leve e pesado, e coque, este último depositando-se na superfície do catalisador. A deposição de coque provoca a desativação do catalisador, devido à considerável redução da área disponível aos reagentes (hidrocarbonetos). Com o objetivo de restaurar-se a atividade, o catalisador inativado pelo coque é continuamente retirado do vaso de reação e enviado a um vaso de regeneração onde, por intermédio de uma injeção de ar e por ação de alta temperatura, o coque é queimado, restabelecendo a atividade catalítica. O conjunto reator-regenerador é denominado conversor. 14 Os gases de craqueamento efluentes do reator são encaminhados à seção de fracionamento, onde, por intermédio de uma torre de destilação, obtém-se uma separação primária dos cortes produzidos. Pelo fundo da torre produz-se um óleo pesado, bastante denso, denominado Resíduo de Craqueamento. Esta corrente também é conhecida como Óleo Decantado ou Óleo Clarificado. A fracionadora produz, como corte lateral, um óleo leve de faixa de ebulição semelhante ao diesel conhecido como Óleo Leve de Reciclo (Light Cycle Oil – LCO) ou Diesel de Craqueamento. Pelo topo da torre sai uma corrente gasosa composta da nafta (gasolina) de craqueamento e de hidrocarbonetos mais leves que, uma vez resfriada e condensada parcialmente, gera no tambor de acúmulo duas correntes. A corrente gasosa é composta de hidrocarbonetos leves (C1, C2, C3 e C4), enquanto a fração líquida é constituída de nafta instabilizada (grande quantidade de gases leves dissolvidos). Ambas as correntes são enviadas à seção de recuperação de gases. A finalidade da seção de recuperação de gases é, através de operações de compressão, absorção, retificação e destilação em várias etapas, processar as correntes de gases e de nafta instabilizada, e dela separar três frações distintas, o Gás Combustível do Gás Liquefeito – GLP, e o tratamento Merox , tratamento que remove mercaptanas, que do GLP e da nafta. As mercaptanas são compostos orgânicos que contém enxofre, do tipo RSH, onde R é um radical orgânico. Esses compostos causam efeitos negativos na qualidade da gasolina, como mau cheiro e formação de goma na estocagem da gasolina. O tratamento Merox é também chamado de adoçamento Merox (Mercaptan Oxidation), e utiliza soda cáustica – hidróxido de sódio – para remover as mercaptanas através da formação de dissulfeto. Após essas operações as frações são destinadas à estocagem. A corrente de gás ácido rico em H2S, proveniente do tratamento DEA, tratamento que utiliza dietilamina (DEA) para remover compostos indesejáveis (contendo enxofre) de corrente de gases, principalmente gás combustível, através da absorção, é normalmente enviado à Unidade de Recuperação de Enxofre (URE), onde, através de uma queima controlada da corrente gasosa, tem-se então a produção de enxofre elementar. 15 Os gases de combustão provenientes da queima do coque durante a regeneração do catalisador saem dessa etapa em elevadas temperaturas, superiores a 700ºC. De modo a aproveitar todo o potencial energético dessa corrente, ela é encaminhada a caldeiras recuperadoras de calor, onde produzem vapor de água de alta pressão, resfriando os gases de combustão antes dos mesmos serem lançados à atmosfera. A Figura 4 mostra em termo de diagrama de blocos todas as interligações das várias seções do processo de Craqueamento Catalítico Fluido. Figura 4 – Diagrama de Blocos do Craqueamento Catalítico 2.3.2: Produtos de Craqueamento 2.3.2.1: Gás Combustível É composto basicamente de hidrogênio, metano, etano e eteno. Além desses, podemos encontrar também, em menores proporções, outros gases, como o propano, propeno, n-butano, iso-butano, n-buteno, iso-buteno, CO, CO2, N2. Os três últimos compostos citados são provenientes do arraste de gás de combustão pelo catalisador regenerado. 16 Há também uma proporção variável de H2S, gerado pelas reações de craqueamento dos compostos sulfurados presentes na carga. Este gás, porém, é removido da mistura gasosa pelo tratamento DEA, de tal modo que o gás combustível sai praticamente isento de H2S. Este, conhecido como gás ácido, é enviado à unidade de recuperação de enxofre (URE), onde esse elemento é produzido. 2.3.2.2: Gás Liquefeito de Petróleo (GLP) O GLP de Craqueamento basicamente é composto de propano, propeno, butanos e butenos. Em menores proporções ocorre também a presença de etanos e pentanos. De forma similar ao gás combustível, também há ocorrência de H2S, que é eliminado pelo tratamento DEA. Outros compostos de enxofre podem estar também presentes, tendo seus teores reduzidos através do tratamento Merox. A Unidade de FCC é a principal responsável pela geração do gás liquefeito nas refinarias. Especificamente no Brasil isto é de extrema importância, devido ao grande consumo desse derivado que temos no país. 2.3.2.3: Nafta de Craqueamento A nafta produzida no FCC, devido à sua composição, é um excelente componente para a produção de gasolina. Ela é rica em olefinas, isoparafinas e aromáticos, sendo pobre em naftênicos e n-parafinas. Esta proporção de hidrocarbonetos conduz a uma gasolina de bom índice de octanagem, bastante superior aos valores de naftas de destilação e de processos térmicos de conversão. O teor de enxofre de nafta de craqueamento é alto, necessitando submetê-la ao tratamento Merox, que reduz o teor daquele elemento, além de diminuir-se e enquadrar-se devidamente a corrosividade. O elevado valor de enxofre é devido ao alto teor desse elemento presente na carga. Quando craqueamos cargas com resíduos, o problema tende a se agravar devido à maior quantidade de enxofre de natureza aromática, que o tratamento Merox não consegue remover. O rendimento da gasolina no craqueamento varia de 50 a 65% do volume. 17 2.3.2.4: Óleo Leve de Craqueamento (LCO) O Óleo Leve de Craqueamento (Light Cycle Oil – LCO) é uma fração cuja faixa de destilação é aproximadamente a do óleo diesel. Ele é constituído de uma elevada concentração de aromáticos bi e tri nucleados com ramificações, além de grandes quantidades de olefinas e diolefinas de longas cadeias. Em função dessa composição, seu número de cetano é baixo, não sendo aproveitado como óleo diesel. 2.3.2.5: Óleo Decantado O Óleo Decantado, também conhecido como Óleo Clarificado (ClO), Óleo Combustível de FCC e Resíduo de Craqueamento, é como o último nome indica, o produto líquido mais pesado das reações de craqueamento. Este produto é riquíssimo em hidrocarbonetos aromáticos polinucleados, com algumas ramificações e olefinas pesadas também ramificadas. Seu maior uso em refinarias é, à semelhança do LCO, servir como diluente do resíduo de vácuo para a produção de óleos combustíveis. O Óleo Clarificado, embora bastante denso, é muito menos viscoso que os resíduos de vácuo. Devido à elevada aromaticidade, ele tem também uma alta relação carbono/hidrogênio. Por isso, conforme sua característica, ele pode ser enquadrado como Resíduo Aromático (RARO), produto este que pode ser vendido às indústrias petroquímicas especializadas em produção de negro de fumo (carbono coloidal finamente dividido). O negro de fumo é utilizado como carga para produção de pneus, plásticos, pigmentos pretos, etc. 2.3.2.6: Gás Ácido (H2S) A corrente de gás ácido é proveniente do tratamento de gás combustível e do GLP pela Unidade de Tratamento DEA, sendo rica em H2S, ela é enviada para ser processado numa URE. O rendimento de gás ácido é bastante variável em função do tipo de carga processada e das condições de severidade das reações de craqueamento. 18 Devido ao seu alto poder calorífico, sua facilidade de queima, seu caráter antipoluente (em virtude do baixo teor de enxofre) e sobretudo porque – caso não seja utilizado – será queimado na tocha, o gás combustível é largamente consumido em fornos e caldeiras das diversas unidades da refinaria. 2.3.3: Catalisadores para FCC O catalisador de craqueamento em leito fluidizado desempenha três funções principais no processo: Promotor das reações de craqueamento – esta é a principal função do catalisador no processo. Ele promove a ocorrência de reações de quebra em condições bem mais suaves do que aquelas requeridas ao craqueamento térmico. Além disso, a quantidade e a qualidade dos produtos são bastante superiores ao processo realizado na ausência de catalisador. Agente de transporte de coque – o carbono depositado na superfície do catalisador é transportado do reator ao regenerador, onde é queimado, produzindo energia, sendo esta a principal fonte de calor do processo. Este efeito é muito importante, pois caso não houvesse o catalisador, o coque formado tenderia a se depositar no interior dos vasos de reação, acabando por provocar entupimentos, reduzindo, em conseqüência, o tempo de operação contínua da unidade. Isto se observa constantemente no craqueamento térmico. Agente de transferência de calor – o calor gerado pela queima do coque no regenerador é parcialmente utilizado no aquecimento do catalisador, elevando sua temperatura em 100 a 350°C. A circulação do catalisador retira esta energia do regenerador e a utiliza para aquecer e vaporizar a carga, de modo a possibilitar e manter as reações de craqueamento. 2.3.4: Carga para Craqueamento A carga enviada a uma unidade de craqueamento constitui-se em uma das mais relevantes variáveis deste processo. Suas características influenciam diretamente na conversão, e em conseqüência, na qualidade e quantidade dos produtos obtidos pela quebra das moléculas. 19 A qualidade da carga é determinada pelos vários tipos e quantidades de hidrocarbonetos que a constitui, assim como as impurezas que nela estão presentes. A composição da carga, por sua vez, é influenciada pelas características do petróleo original e do seu refino. A carga é constituída de hidrocarbonetos parafínicos, olefínicos, naftênicos e aromáticos nas suas diversas formas e arranjos, além de outros compostos de caráter orgânico ou não, classificados como impurezas. Dentro deste último grupo, encontram-se os compostos orgânicos de nitrogênio, oxigênio e enxofre, juntamente com pequenas quantidades de metais pesados (níquel, cobre, ferro e vanádio) e alcalinos (sódio, potássio e cálcio). 2.3.5: Variáveis Operacionais O FCC é um processo no qual devem existir três equilíbrios simultâneos em sua operação: Equilíbrio de calor: o excesso de geração de energia causa elevadas temperaturas, causando danos ao equipamento e ao catalisador. A baixa geração de energia causa temperaturas insuficientes do catalisador, fazendo com que as reações não ocorram corretamente. Equilíbrio de pressões: é fundamental para que o catalisador circule corretamente e não ocorra inversão do fluxo. Equilíbrio químico: também chamado de equilíbrio de coque ou balanço de carbono, consiste na queima do coque gerado na reação. A insuficiência da queima de coque causa um acúmulo deste no catalisador, o que afeta as conversões. Por outro lado, a insuficiência na geração de coque afeta o balanço térmico. Assim, o Craqueamento Catalítico é um processo bastante complexo devido à quantidade de variáveis que estão envolvidas. Podem-se classificar as variáveis operacionais em dois grandes grupos: variáveis independentes (ou de ação direta), nas quais se atua através de um controlador e variáveis dependentes (ou de ação indireta), que são alteradas em conseqüência da mudança de alguma variável independente. Pode-se citar como variáveis independentes: vazão de carga fresca, qualidade da carga fresca, atividade do inventário de catalisador, temperatura do 20 reator, etc. Como variáveis dependentes podem-se citar: conversão, rendimento dos produtos, razão catalisador/óleo, circulação de catalisador, tempo de contato, temperatura da fase densa do regenerador, vazão de ar para combustão, etc. 2.4: Unidade Multipropósito de FCC – U144 Plantas multipropósito são unidades de testes que visam reproduzir condições operacionais reais. Estas unidades, de porte intermediário entre uma unidade piloto e protótipo, buscam representar os fenômenos de um processo, sendo adequadas para estudos de otimização de processos e equipamentos. Entre os objetivos de uma unidade multipropósito podemos citar: Aquisição de dados experimentais para desenvolvimento de modelagem matemática e simulação do processo. Desenvolvimento de equipamentos e sistemas. Estudo de processos em novas condições operacionais, por exemplo, alteração das vazões processadas e de catalisadores. 2.4.1: Descrição Geral A unidade de FCC visa o aproveitamento de certas frações de petróleo, transformando-as em frações nobres, como GLP e Gasolina. A unidade multipropósito estuda, por sua vez, o comportamento do processo, considerando variáveis como: temperatura, pressão, catalisador, tempo de contato, etc. As principais características da planta são: Carga entre 60 e 300 kg/h; Temperatura de reação entre 460 e 580 ºC; Temperatura de carga entre 100 e 350 ºC; Pressão do reator entre 1,0 e 2,5 kgf/cm2 man; Temperatura de regeneração entre 600 e 730 ºC. 21 Figura 5 – Unidade Multipropósito de FCC A planta é monitorada por um SDCD – Sistema de Controle Distribuído, que conta com inúmeros indicadores de pressão, temperatura, diferenciais de pressão com grandes facilidades de acompanhamento. O riser apresenta quatro pontos de injeção da carga, permitindo variar o tempo de contato entre 0,5 e 3 segundos com qualquer tipo de carga. 2.4.2: Fluxo de Catalisador O catalisador percorre um circuito fechado dentro do conversor. O escoamento se torna possível por toda a massa estar em estado fluidizado, o que se consegue com ar, hidrocarbonetos vaporizados e vapor de água. O catalisador regenerado e aquecido escoa do regenerador para a base do riser. Ao entrar em contato com a carga, fornece calor vaporizando-a, sendo então arrastado pelos vapores de hidrocarbonetos e vapor de água, através do riser onde ocorrem as reações de transformação da carga, agregando-se o coque ao catalisador. Na saída do riser o fluxo passa por ciclones onde há a separação catalisador/produtos. O catalisador escoa pelas pernas dos ciclones e deposita-se 22 no stripper onde passa por um processo que utiliza vapor de água para a retirada dos hidrocarbonetos que podem estar presentes no catalisador. Do stripper o catalisador escoa por uma tubulação para o regenerador, onde em contato com o ar queima o coque agregado durante as reações, completando-se o ciclo. 2.4.3: Fluxo de Carga A carga é pré-aquecida a certa temperatura. A seguir é enviada para os bicos dispersores, entrando no riser e vaporizando em contato com o catalisador. Após a passagem pelo riser e pelos ciclones, o gás separado do catalisador passa para a primeira etapa de condensação. A seguir passa por um segundo permutador de calor, onde o óleo condensado é armazenado nos tanques e a corrente gasosa mais os hidrocarbonetos leves passam por um condensador a freon. O fluxo segue então para os tanques de selagem e em seguida para o flare onde os gases são queimados. A carga pode ser injetada no riser em quatro pontos distintos, com o objetivo de alterar o tempo de contato com o catalisador, como já citado. Os produtos armazenados durante o teste são amostrados e transferidos para o tanque de produtos. 2.4.4: Fluxo de Ar Passando por um aquecedor, o fluxo é aquecido e direcionado para a base do regenerador onde, através de uma placa distribuidora, entra no equipamento promovendo a fluidização e queima do coque no catalisador, regenerando-o. Os gases formados no regenerador passam por ciclones para a separação de partículas arrastadas do leito, que são devolvidas ao regenerador. O fluxo isento de sólidos é lançado na atmosfera. 23 2.4.5: Fluxo de Vapor Vapor de Lift: É o vapor utilizado para acelerar o catalisador na base do riser. O vapor é condensado por um sistema de condensação sendo posteriormente separado do óleo. Vapor de dispersão: É o vapor utilizado para atomizar a carga. Entra no “riser” pelos bicos dispersores, seguindo também com os produtos para o sistema de condensação sendo posteriormente separado. Vapor de “estripagem”: É utilizado para remover os hidrocarbonetos presentes no catalisador, sendo que estes e o vapor saem pelo topo do stripper somando-se ao fluxo de produtos, seguindo então para o sistema de condensação. 2.4.6: Fluido de Selagem Ar e gás inerte servem como fluidos de selagem para o processo em linhas e válvulas. O gás inerte é pressurizado e armazenado em um vaso pulmão, onde um compressor garante sua pressão na saída. 2.4.7: Amostrador de Topo e Sistemas de Condensação Após o craqueamento, sai do riser uma mistura contendo vapores de hidrocarbonetos, vapor de água, gases e catalisador gasto (com coque). Esta mistura segue para dois ciclones em série, nos quais o catalisador gasto é separado. A corrente que segue ao topo da unidade é então composta apenas de vapores e gases, sendo que uma parte desta segue para o sistema de condensação e outra parte é desviada para o Amostrador de Topo ou RMS (Reactor Mixer Sampler – Amostrador da Mistura de Produtos do Reator). No amostrador de topo, a corrente passa por um permutador a ar, condensando parte do óleo, que é coletado em um tanque. O restante da corrente passa por um permutador a água, condensando uma fração menos pesada de óleo, coletado também no tanque. Finalmente, a mistura não condensada segue para uma torre de recheio, na qual a neblina restante, que passou com esta corrente, é retida. O último permutador utiliza freon, sendo condensada a parte mais leve do óleo. O 24 gás resultante é coletado e levado para a análise cromatográfica. O óleo (composto de todas as frações condensadas) também é encaminhado ao laboratório para a destilação simulada. Para medir a quantidade de gás que passa pelo amostrador de topo, existe um medidor MGU (Medidor de Gás Úmido). A outra parte da corrente que sai do ciclone e que não foi desviada ao RMS, passa por um sistema de condensação semelhante ao do Amostrador de Topo, porém com os dois primeiros permutadores a água. A vazão de gás é indicada pelo SDCD, tem sua amostra coletada para análise cromatográfica e é depois queimada no flare. O óleo condensado é coletado em um tanque, e depois de separado de grande parte da água, é levado ao laboratório para análise de destilação simulada. Um fluxograma da Unidade Multipropósito de Craqueamento Catalítico Fluido encontra-se no Anexo A. 25 Capítulo 3: O Sistema PI O sistema PI (Plant Information) é um conjunto de módulos de software servidor/cliente desenvolvidos para automatizar totalmente a coleta, armazenamento e apresentação das informações da planta de um processo, gerenciando essas operações. Assim, o sistema PI é freqüentemente utilizado como uma integração e plataforma de desenvolvimento de largas aplicações, tornando-se a ligação principal entre a área industrial e o escritório. Ele foi desenvolvido para executar a monitoração e análise de plantas de processo, servindo como servidor de dados para aplicações cliente. Operadores, engenheiros e gerentes podem usar as aplicações clientes para visualizar os dados armazenados no servidor PI. O PI um sistema que engloba todas as interfaces e ferramentas necessárias para apresentar em tempo real os inúmeros dados que provêm de dispositivos normalmente encontrados numa planta. Atualmente o sistema PI conta com mais de 350 interfaces para mais de 500 sistemas de controle. Muitos nomes são utilizados para fazer referência a essa coleção de módulos de software. Neste documento, em geral, sistema PI ou simplesmente PI, refere-se ao sistema como um todo. O servidor ou nó primário é chamado de servidor PI. O servidor colhe a informação dos nós de coleta de dados, que são designados para pegar informação diretamente do processo de produção, e compartilha os dados com a organização, localmente e/ou remotamente. Figura 6 – Fluxo dos Dados 26 O fluxo de dados se dá do processo de produção para o sistema de PI. A Figura 6 ilustra como os dados fluem do sistema de controle para dentro do arquivo de dados do servidor PI. A arquitetura do sistema é o que faz o sistema PI tão robusto e valioso. Tudo começa com a camada de informações da planta ou do processo de produção, onde o servidor PI coleta os dados de um número qualquer de fontes. Este servidor, assim como as bases de dados que estão associadas a ele, é otimizado para realizar a coleta de informações. Figura 7 – Arquitetura do Sistema PI na SIX 27 3.1: O Armazenamento dos Dados O sistema de armazenamento dos dados do sistema PI é o PI Data Archive, arquivo de dados, onde as informações obtidas do processo de produção são armazenadas. Para cada variável de processo a ser rastreada, um ponto é definido no sistema PI. Cada ponto tem aproximadamente 50 atributos. Estes atributos definem como os dados são coletados e armazenados. Figura 8 – Processamento de Informações Novas Observa-se na Figura 8 como no sistema PI o valor mais recente para cada ponto é conhecido por snapshot, que é uma estrutura de dados na memória principal que retém só o valor atual de cada ponto, e representa o primeiro destino dos dados à medida que são coletados. Figura 9 – PI Snapshot Subsystem 28 O segundo destino dos dados são os arquivos de dados do servidor que são armazenados em disco. Antes dos dados serem armazenados em arquivo eles podem ser filtrados eletronicamente e estatisticamente. O primeiro desses processos ocorre no nó ou ponto de coleta dos dados e é chamado de Teste de Exceção, enquanto o outro é executado pelo próprio servidor PI sendo chamado de Compressão de Dados. Um esquema sucinto desses processos pode ser visualizado nas Figuras 10 e 11. Figura 10 – Fluxo da Exceção à Compressão Figura 11 – Exemplo do Processo de Filtragem dos Dados 3.1.1: Buferização dos Dados O sistema de buferização dos dados do sistema PI é composto de dois buffers de memória (primário e secundário) e um buffer de disco. Figura 12 – Sistema de Buferização 29 A buferização está sempre ativada quando a interface que coleta dados do SDCD está conectada ao servidor PI, só o buffer primário de memória é ativado, assim todos os dados são armazenados no buffer primário. Quando a conexão com o servidor PI é perdida o buffer secundário é ativado. A buferização no disco rígido apenas é ativada depois que o buffer secundário de memória estiver cheio. A buferização no disco rígido é utilizada até que o tamanho máximo de arquivo, previamente determinado, seja atingido. 3.1.2: Teste de Exceção Uma variável viola o teste de exceção se seu valor difere do valor anterior por ExcDev (Exception Deviation Specification) ou se o tempo desde a última exceção for maior ou igual ao ExcMax (Maximum Exception Time). Além disso, nenhum valor é informado até que o ExcMin (Minimum Exception Time) tenha sido excedido desde a última exceção. Quando uma variável viola o teste de exceção, então o valor que violou o teste e o valor anterior são informados. Figura 13 – Como funciona o Exception Report 3.1.3: Compressão dos Dados O objetivo da compressão dos dados é manter a tendência original dos mesmos usando o menor número de pontos, salvando dessa forma espaço em disco, e mantendo ao mesmo tempo uma precisão extremamente alta sem a necessidade de armazenar toda a amostra de dados ou de ter que recorrer ao 30 cálculo da média ou a técnicas de amostragem periódica para determinar a tendência dos mesmos. Figura 14 – Parâmetros de Compressão A compressão de dados é similar ao teste de exceção onde somente uma mudança significativa em relação ao valor anteriormente arquivado é armazenada. Figura 15 – Primeiro Passo da Compressão de Dados A Figura 15 mostra como o sistema usa o parâmetro CompDev (Compression Deviation) para "desenhar" um paralelogramo do último ponto arquivado até o valor atual. A largura do paralelogramo é duas vezes o valor CompDev (um valor de desvio para cima e um para baixo). Nesse caso a primeira "zona morta" é desenhada em volta do primeiro ponto e estendida até o próximo ponto e aos pontos consecutivos. Tal zona também é chamada de cobertura de compressão. 31 Quando qualquer valor fica fora da cobertura de compressão, (fora dos paralelogramos), o PI armazena um valor no PI Data Archive, como pode ser observado nas ilustrações a seguir. Figura 16 – Zona Morta da Compressão O sistema PI não armazena o valor que cometeu a violação, ao invés disso, ele armazena o valor anterior. Figura 17 – Determinação do valor a ser armazenado Na figura o valor obtido em 12:01:45 viola o teste e o valor de 12:01:30 é arquivado. O processo de compressão de dados reinicia novamente a partir do valor que acabou de ser armazenado, como pode ser verificado na Figura 18. 32 Figura 18 – Compressão dos Dados Finalmente o processo de compressão termina para o exemplo citado. Os valores circulados são os que serão armazenados em arquivo. Figura 19 – Resultado Final da Compressão dos Dados Note que PI não armazena exatamente o que aconteceu, mas sim um bom senso do que ocorreu com os dados. A precisão da tendência dos pontos armazenados depende do valor escolhido como desvio de compressão, o CompDev. 3.2: Tags Cada tag possui uma localização única no sistema PI, e deve ser utilizado para armazenar fluxos individuais de dados, por exemplo: o fluxo em uma tubulação, um modo de controlador em operação, um comentário em forma de texto, os resultados de um totalizador, qualquer coisa que possa ser medida pode ser capturada utilizando um tag do PI como uma definição. 33 Cada tag do PI tem uma série de atributos para descrever as partes diferentes do sistema. Estes atributos podem ser resumidos pela pergunta que cada definição tenta responder, como: • descrever o tag para uma aplicação cliente e para o usuário, determinando como a informação deve ser exibida; • descrever o tag para a interface, determinando como e onde a interface deve coletar a informação para a qual está destinada; • descrever o tag para o servidor PI, determinando como o servidor deve armazenar a informação. Os tags possuem certos atributos que controlam como os dados são exibidos e manipulados dentro do sistema. Alguns dos atributos mais importantes são: • Tag name: nome único destinado a cada variável monitorada; • Descriptor: descrição do tag com no máximo 26 caracteres; • Point Source: permite agrupamento dos tags segundo a interface de dados utilizada (SDCD, CLP, ou outras fontes). O valor padrão é K para pontos da Pesquisa; • Zero, Span e Typical value: valor mínimo, escala e valor típico; • Step: mostra a informação como ZOH (Zero Order Holder – Interpolação de Ordem Zero) ou como uma interpolação linear; • Location#: define o endereço da informação no SDCD: o Location1: contém o número da interface, normalmente, o número da interface deve coincidir com o número lógico utilizado pelo software da ABB/Bailey; o Location2: deve ser igual a (INFI90 Loop Number * 256) + PCU Number; o Location3: INFI90 Module Number; o Location4: INFI90 Block Number; o Location5: especifica o tipo de ABB/Bailey Point Type que será lido, com por exemplo: analog, digital, station, RCM, etc. 34 • PtOwner, PtGroup, PtAccess: controla os usuários que podem modificar ou ver os atributos dos tags; • DataOwner, DataGroup, DataAccess: controla quem pode ler ou escrever dados; • Compression Specification: controla como a informação é arquivada; • Exception Specification: controla como os dados e o ruído são filtrados para obter-se um fluxo de dados limpo e significante. 3.3: Acesso aos Dados O sistema PI permite a coleta de dados através de uma grande variedade de nós de rede. Essa estrutura distribuída oferece muitas vantagens sobre uma estrutura monolítica, incluindo escalabilidade, robustez e flexibilidade. Ele dispõe de ferramentas que possibilitam a criação de novos aplicativos para realizar o acesso aos dados, como: • PI-API (Application Program Interface - C-style function library) • PI-SDK (Software Development Kit - COM-based object oriented module) • PI ODBC / PI OLEDB • PI Interfaces (Read/Write Interfaces - exemplo: interface semAPI) 3.3.1: PI-API O PI-API provê uma interface comum de programação para o sistema PI. É uma biblioteca de funções que permite acessar o sistema PI para leitura e gravação. A própria OSIsoft (fabricante do PI System) utiliza essa biblioteca para criar as interfaces para várias plataformas. Usuários licenciados podem criar suas próprias aplicações fazendo uso dela. O PI-API é uma biblioteca de funções que pode ser chamada a partir de linguagens de programação como C, C++, Visual Basic, Delphi, etc. Estas funções permitem ler e escrever valores no servidor PI, além de alterar ou obter configuração de pontos. 35 Figura 20 – Máquina Cliente com PI-API Todas as aplicações clientes da OSIsoft são escritas usando o PI-API, o PISDK ou uma combinação dos dois para comunicação com o servidor PI. Elas comunicam-se com o servidor PI através do protocolo de rede TCP/IP. Entre os softwares clientes disponibilizados pela OSIsoft estão: PI-ProcessBook, PI-DataLink, PI-BatchView, PI-SQC, etc. O arquivo "piapi32.bas" contém todas as funções, procedimentos e definições de tipos de variáveis da biblioteca PI-API. As funções do PI-API são divididas em grupos: • PIAR: Archive functions (read and write) • PIBA: PI Batch functions • PIEL: Event Log functions • PILG: Common dialog boxes & Message logging • PIPT: Point database functions • PISN: Snapshot functions (read and write) • PITM: Time functions • PIUT: Utility functions 36 3.3.2: Utilitários Clientes Podem-se utilizar as aplicações clientes do PI para acessar os dados armazenados no servidor: PI-ProcessBook, PI-DataLink, PI-ManualLogger, PIControlMonitor, PI-BatchView, PI-ActiveView, PI-SQC, PI-SMT, PI-AlarmView, etc. • PI-ProcessBook: aplicação que possibilita ao usuário construir e visualizar telas de processos, gráficos e valores das variáveis envolvidas. É um pacote gráfico fácil de utilizar, que permite criar gráficos dinâmicos, gráficos interativos mostrando dados em tempo real. Também permite que sejam criadas telas de processo para acompanhamento em tempo real. • PI-DataLink: add-in para Microsoft Excel que possibilita a visualização de valores do sistema PI de diversas formas, bem como copiá-los para uma planilha para realizar análises adicionais. As funções do PI-DataLink são acessadas dentro do Microsoft Excel por um menu que aparece depois que o add-in é instalado. Com PI-DataLink, um usuário pode trocar informação diretamente com o banco de dados do PI. Essa ferramenta combinada com a funcionalidade da planilha eletrônica faz com que o PIDataLink seja um utilitário poderoso e fácil de usar por reunir, analisar e relatar dados do PI. Existem ainda ferramentas de gerenciamento do Sistema PI (PI System Management Tools), como o PI Tag Configurator e o PI Point Builder. • PI Tag Configurator: add-in para Microsoft Excel para criação e manutenção de tags. • PI Point Builder: aplicação para criação de tags e manutenção de tabela de estados digitais. 37 Figura 21 – PI Tag Configurator – add-in para Microsoft Excel Figura 22 – PI Point Builder 38 3.3.3: Interface semAPI Interfaces são módulos de software para coleta de dados de sistemas externos, como pode ser visto na Figura 23 . Figura 23 – Interface – Intermediador na Coleta de Dados As origens típicas de dados são SDCDs, CLPs, e sistemas de laboratório. A interface utilizada na coleta de informação da Unidade de FCC onde o trabalho foi desenvolvido chama-se ABB/Bailey semAPI. A interface é o dispositivo necessário para realizar a comunicação entre o processo de produção e o servidor PI. Essa função pode ser facilmente identificada na figura a seguir. Figura 24 – Esquema do Interfaceamento ABB/Bailey-PI semAPI 39 A comunicação utilizando a interface semAPI exige o software semAPI RunTime da ABB/Bailey, o módulo de interface com o computador, e ainda o software Blysem da interface PI-Bailey semAPI da OSIsoft. O semAPI Run-Time da ABB/Bailey manipula em baixo nível os protocolos de comunicação e o trânsito de dados da rede INFI90 da ABB/Bailey, disponibilizandoos em alto nível para a interface. Isto é necessário uma vez que os protocolos de baixo nível são proprietários e sua documentação não é fornecida por se tratar de segredo industrial. A interface trabalha com o módulo de interfaceamento com o computador INICI03 que é conectado ao computador via conexão SCSI. O módulo INICI03 consiste de três módulos: INICT03 Computer Transfer, INNIS01 Network Interface, IMMPI01 Multifunction Processor Interface. Figura 25 – Módulo/Cartão de Comunicação INICI03 A interface PI-Bailey semAPI fornece uma transferência de dados bidirecional entre o sistema PI e a rede ABB/Bailey INFI90. Essa interface foi desenvolvida para tirar proveito da biblioteca semAPI da ABB/Bailey. A interface controla todo o protocolo de comunicações da ABB/Bailey, tornando assim possível que o sistema PI se comunique com os módulos INICI da ABB/Bailey por uma série de métodos como: conexão serial, Ethernet, e SCSI. 40 Figura 26 – Estrutura do Interfaceamento ABB/Bailey-PI semAPI Todos os dados lidos pela interface vêm de relatórios de exceção do sistema ABB/Bailey, que gera um relato de exceção sempre que o valor ou status de uma variável muda, ou quando um limite específico de tempo foi atingido desde o último relato. A topologia de rede usual utilizada pela interface é a ponto-a-ponto, sendo que o software semAPI e o processo da interface estão no mesmo computador. O computador é fisicamente conectado por um cabo SCSI ao cartão de comunicação da ABB/Bailey, e este cartão está conectado à rede INFI90 da ABB/Bailey. 3.3.3.1: Seqüência de Ações da Interface A seqüência de operações da interface após a inicialização é a seguinte. • A interface obtém todos os tags de um respectivo PointSource e processa somente aqueles tags cujo atributo onde é descrito o número da INICI coincide com aquele que foi passado para ela como parâmetro na sua inicialização. No caso da U144, o PointSource é “K” e o número da INICI é 2. A interface cria então uma lista indexada pelo número do pointID da lista de tags. 41 • A interface tenta iniciar a comunicação com o módulo de comunicação da ABB/Bailey. Quando a comunicação é estabelecida, a interface cria um device driver que manipula fisicamente e em baixo nível os protocolos de comunicação. • A interface então estabelece os tags na tabela do módulo de comunicação da ABB/Bailey. Após todos os dados serem estabelecidos e conectados, a interface entra na fase de coleta de dados. • A interface mantém a leitura dos exception reports até o número máximo de exceções especificada na inicialização da interface. • Se mais de dois minutos se passarem desde a última leitura na tabela de pontos, a interface verifica se houveram alterações nesta tabela e promove então a alteração em sua tabela interna, adicionando, deletando ou atualizando os atributos dos pontos. • Os dois últimos passos são repetidos continuamente enquanto a interface estiver rodando. • Se a interface encontrar dez erros consecutivos durante a coleta de dados, então ela volta para o início do procedimento, tentando iniciar a comunicação com o módulo de comunicação da ABB/Bailey. 3.3.3.2: Inicialização da Interface A interface permite que a sua inicialização seja customizada visando atender às necessidades de cada sistema. Os parâmetros mais importantes a serem especificados no script de instalação da interface são os seguintes: /host=X especifica o nome do host do PI Server /id=X ID da Interface /ps=X pointsource para a interface /ec=X contador da taxa de I/O /sn ao usar este parâmetro haverá tratamento de exceção do PI sobre os exception reports da ABB/Bailey /in=X número da interface, deve coincidir com o atributo location1 da configuração dos tags do PI /ici=X número da ICI da ABB/Bailey /to=X ICI timeout (O cartão de comunicação fica offline após não receber mensagem da interface por este período) /fm=X modo de redundância , 1 primária, 2 for secundária 42 /dl=X intervalo entre varredura das exceções da ABB/Bailey /me=X número máximo de exceções por interação /mp=X número máximo de pontos para esta interface /ef=X exception screening 0=default=não /ts=X sincronização de tempo 1 -> pi master, -1 -> ABB/Bailey master /f=X taxa de scan 3.4: Sistema de Controle Distribuído – SDCD O Sistema de Controle Distribuído – SDCD, muito embora não faça parte do sistema PI como um todo, é o responsável pela coleta de dados tanto analógicos quanto digitais na área de produção. Os dados enviados para o SDCD pelos dispositivos de campo são os mesmos repassados em tempo real para interface que enviará os dados para o PI Data Archive. Assim, faz-se necessário uma explicação sucinta do que é o Sistema de Controle Distribuído. O SDCD, lançado em meados da década de 70, tinha a função de automatizar uma planta por completo, substituindo os painéis dos controladores (variáveis analógicas) assim com os de relés (variáveis digitais). Os SDCDs, flexibilizaram o tamanho de seu hardware de forma a atender aplicações de pequeno/médio portes e também “abriram” o seu sistema viabilizando a comunicação com qualquer hardware/software do mercado. Eles foram concebidos de forma a permitir a escalabilidade do sistema e também a operação ininterrupta do processo, possibilitando a inclusão de cartões de I/O e a redundância dos mesmos sem a parada da CPU do sistema. Os Sistemas de Controle Distribuído têm sido usados em aplicações que exigem um controle de processo em larga escala, onde é possível rodar várias operações complexas para uma variada gama de processos diferentes. A utilização de SDCDs reduziu o uso de computadores centralizados, e, dentro deste conceito distribuiu a IHM (Interface Homem Máquina), o controle lógico e a base de dados em diferentes placas de circuito dentro do computador, reduzindo assim o risco de falhas do sistema como um todo. 43 Capítulo 4: Etapas do Trabalho Desenvolvido O trabalho desenvolvido no setor de Pesquisa da Unidade de Industrialização do Xisto, dividiu-se em etapas. De maneira geral, após a conclusão de cada etapa proposta, novos desafios foram sendo sugeridos. 4.1: Instalação e Configuração da Interface O principal problema no início do trabalho desenvolvido na SIX foi identificado na interface de coleta de dados do sistema PI, que não estava coletando corretamente os dados provenientes do SDCD. O problema poderia estar relacionado: • aos softwares instalados no computador da interface; • ao hardware da interface; • ao cabo SCSI conectado ao SDCD; • ou ainda, ao próprio cartão de comunicação INICI03 do SDCD. Devido à urgência de solução do problema da interface, deu-se início a um estudo específico sobre a instalação e a configuração da mesma. A instalação dos softwares e hardwares da ABB/Bailey foi realizada anteriormente pelo serviço de suporte da mesma em um computador destinado a ser a interface entre o SDCD e o servidor PI, o qual estava localizado ao lado do gabinete do SDCD. Primeiro foi realizada a instalação do cartão de comunicação INICI03 no gabinete do SDCD da U144. Depois se deu a instalação de placa SCSI 2940 na interface e seus respectivos drivers com a interligação da placa com o hardware do gabinete através de cabo SCSI padrão. Por último ocorreu a instalação do software semAPI Run-Time da ABB/Bailey. Junto com o pacote semAPI Run-Time da ABB/Bailey, o programa ICICONF tem como aplicabilidade definir um ICI lógico para cada módulo INICI instalado. 44 O software key é um alfa-numérico longo e o user string é normalmente igual a "LICENSE01". Esses dois parâmetros são fornecidos pela ABB/Bailey. Eles precisam ser inseridos em três lugares. A chave do software deve ser inserida no aplicativo LICENTRY. E o user string precisa ser inserido tanto no aplicativo LICENTRY como no ICICONF. Se os parâmetros corretos não forem utilizados, a interface não conseguirá conectar ao cartão de comunicação INICI. Figura 27 – Tela do LICENTRY No computador da interface está instalado o aplicativo ICICONF, que define o ICI lógico para cada módulo INICI. Ao tentar-se descobrir por que a interface não estava coletando os dados corretamente, um dos problemas detectados foi a má configuração do aplicativo ICICONF que foi então configurado como na Figura 28, onde: • Application Logical ICI = 2 (isso porque na produção já existe um ICI lógico denominado 1) • Physical ICI Device = S000: (endereçamento reconhecido pela interface para o cartão de comunicação ao qual ela está conectada por um cabo SCSI) 45 • Physical Connection Type = SCSI (o computador da interface possui uma placa SCSI conectada por um cabo SCSI ao cartão de comunicação INICI03 do SDCD) • Name/Address of Node = P28110179L (é o nome do computador da interface reconhecido pela rede corporativa TCP/IP. Aqui também poderia ser definido o IP da máquina ao invés do nome). • Network Communication Protocol = TCP/IP (tipo de rede de comunicação entre a interface e o servidor) • License String = LICENSE01 (nome do arquivo *.sla que contém os dados da licença da interface) • TCP/IP Port = 3001 (número da porta utilizada para comunicação). Figura 28 – Tela do ICICONF Após a realização da configuração correta do aplicativo ICICONF, deu-se continuidade ao trabalho que envolveu três etapas distintas: • Instalação do PI-API, um pré-requisito para a instalação da interface, e do sistema de buferização da interface semAPI, efetuado durante a instalação do PI-API. 46 • Instalação da interface PI-Bailey semAPI (blysem.exe) com os parâmetros específicos para a o sistema ABB/Bailey da pesquisa, com a configuração do startup da interface. • Adequação da tabela de proxys do servidor para permissão de acesso da interface ao servidor (etapa realizada pelo responsável pelo servidor PI da SIX). A instalação do PI-API foi simples, de forma que apenas bastou seguir os passos definidos pelo arquivo de setup, não envolvendo qualquer segredo. O procedimento de instalação da interface PI-Bailey semAPI foi o seguinte: • Criou-se o diretório C:\PI\interfaces\blysem#\, onde “#” deveria corresponder ao número da interface que foi especificado usando o parâmetro /id no arquivo blysem#.bat. Foram copiados os arquivos blysem.exe e blysem.bat para o disco rígido, de forma que os dois foram chamados de blysem#.exe e blysem#.bat, de acordo com o que foi mencionado acima. As linhas de comando do arquivo blysem#.bat foram configuradas para customizar a interface. O código do arquivo blysem2.bat da interface que coleta e transfere corretamente os dados pode ser visualizado a seguir: ------------------rem BLYSEM2.bat 22/10/2003 rem Os parametros a seguir sao da interface da pesquisa rem ICI=2 (numero do ICI) rem PointSource tipo K (da pesquisa) rem IN=2 (respectivo location1 - parametro das tags tipo K no PI Server) rem ID=1 (ICI primario, nao reduntante) rem com output habilitada rem f sao definicoes de scan classes rem ec = io rate counter (utilizado se necessario) rem to = ICI timeout rem me = numero maximo de excecoes por iteracao rem outros parametros setados como default. blysem2.exe /host=S2811AU02:5450 /id=1 /ec=1 /ps=K /in=2 /ici=2 /me=1000 /to=180 /f=00:00:15,00:00:00 /f=00:00:30,00:00:00 /f=00:00:45,00:00:00 /of=1 /q /stopstat ------------------- 47 A interface foi testada ao executar-se o arquivo *.bat, verificando-se se os dados estavam sendo transferidos corretamente para o arquivo de dados do PI no servidor. Essa verificação foi feita utilizando-se o aplicativo para MS-DOS apisnap.exe. Além disso realizou-se uma varredura por mensagens de erro no arquivo pipc.log. Quando foi verificado o correto funcionamento da interface, a mesma foi configurada para rodar como um serviço do Windows, inicializando de maneira automática junto com o computador. Para instalar a interface como um serviço do Windows era necessário saber se o serviço de buferização (Bufserv) seria utilizado ou não. O propósito do Bufserv é continuar a coleta de dados da interface caso o servidor esteja desligado por algum motivo. Sabe-se que o serviço de buferização foi instalado juntamente com o PI-API quando o mesmo foi instalado. A interface foi instalada como um serviço automático, executando-se a linha de comando abaixo no prompt de comando: > blysem2 -install -auto -depend "tcpip DD_<device name> bufserv" > blysem – start O parâmetro DD_<device name> faz referência ao nome do dispositivo setado durante a configuração do aplicativo ICICONF. Durante os testes para verificar se a interface estava funcionando corretamente foi utilizado o utilitário bufutil.exe, para verificar se o serviço de buferização, caso o servidor estivesse desligado por algum motivo, estava funcionando corretamente, como pode ser observado nas Figuras 29 e 30. 48 Figura 29 – Buffer Primário de Memória sendo utilizado Figura 30 – Buffer Secundário de Memória sendo utilizado Além dos testes realizados sobre o sistema de buferização da interface, foram realizados testes onde o objetivo era verificar se a interface estava repassando corretamente os dados para o servidor PI. Tais testes foram realizados utilizando-se os aplicativos PI-ProcessBook e apisnap.exe, que remetiam em tempo real os valores atuais das variáveis que foram comparados com os valores obtidos pelo software supervisório da ABB/Bailey, para verificar se os mesmos eram iguais. 49 4.2: Criação de Planilhas para Automação de Tarefas Repetitivas Quando foi obtido o funcionamento correto da interface de coleta de dados do sistema PI, a etapa seguinte foi a configuração dos tags no servidor e a utilização dos dados coletados segundo a necessidade da Gerência de Pesquisa. Para isso foram criadas diversas planilhas eletrônicas utilizando o aplicativo Microsoft Excel para automação das tarefas repetitivas. Entre as planilhas mais importantes criadas estão as citadas a seguir. 4.2.1: Cálculo de Atributos dos Tags a partir do BD do SDCD A planilha eletrônica responsável pelo cálculo dos atributos dos tags a serem enviados para o servidor PI, foi desenvolvida de maneira que utiliza dados provenientes do banco de dados do SDCD da ABB/Bailey, para promover a correta configuração dos atributos. Para isso faz-se necessário que as localizações dos pontos no SDCD sejam definidas com precisão, para que não haja erro ao buscar o valor das variáveis. Figura 31 – Guia EngUnits 50 Dentro da planilha as guias "EngUnits" e "BayleyPointType" não devem ser alteradas, pois apenas servem de referência para a guia "BD SDCD" executar os cálculos. Todas as guias da planilha foram interligadas, dessa forma uma guia pode depender das outras para efetuar os cálculos para os quais foi designada. Figura 32 – Guia Bailey PointType A guia "BD SDCD" deve ser editada com dados obtidos do banco de dados do SDCD a ser obtido com o operador responsável. Os dados a serem inseridos nessa guia são: TAGNAME, TAGDESC, TAGTYPE, PV/UNITS, PV/LOW, PV/HIGH, LOOP, PCU, MODULE, BLOCK. Além disso a guia “BD SDCD” é responsável por retirar das guias anteriormente citadas, os valores para as colunas “Bailey Point Type”, “Unidades”, e “Point Type”. Para isso foram utilizadas funções como “INDEX” e “MATCH”, para correlacionar as tabelas e os valores armazenados nelas. Assim, por exemplo, se uma variável possuía seu “TAGTYPE” igual a “ANALOG”, então seu “Bailey Point Type” seria igual a 5. Da mesma forma as “Unidades” de uma variável foram buscadas pelo valor do seu “Unit_ID”, e o “Point Type” da variável foi determinado pelo “TAGTYPE” dela. 51 Figura 33 – Guia BD SDCD Na guia "Cálculo para Exportar", os outros atributos (locations, zero, span, typicalvalue, engunits, excdev, compdev, compmin, compmax, compressing, pointtype) são calculados a partir dos dados previamente obtidos. Figura 34 – Guia Cálculo para Exportar 52 Assim, a guia "Cálculo para Exportar" está pronta para ser exportada para o servidor com os tags devidamente definidos e seus parâmetros devidamente calculados. Para exportar os dados calculados para o servidor, utiliza-se o utilitário PI-Tag Configurator, um add-in para Microsoft Excel, fornecido pela OSIsoft. 4.2.2: Cálculo de Estados Digitais Utilizando o mesmo princípio da planilha anteriormente citada, foi desenvolvida uma planilha responsável pelo cálculo do estado digital das variáveis coletadas pelo servidor PI. Figura 35 – Estados Digitais Lógicos Como pode observar-se na Figura 35, essa planilha utiliza-se de uma tabela de estados digitais lógicos que são retornados pelo SDCD. Além disso, como pode verificar-se na guia seguinte, a planilha também depende dos atributos LS0 à LS3 retirados do banco de dados do SDCD. 53 Figura 36 - Estados digitais de cada tag digital O mecanismo de cálculo dos estados digitais está baseado na busca pela correspondência na tabela de estados lógicos, do valor encontrado nas colunas LS0 a LS3, preenchendo assim as colunas ZERO, UM, DOIS e TRÊS. Assim, os valores digitais 0 e 1 monitorados pelo sistema PI, podem ter significados diferentes como: abre e fecha, início e fim, ligado e desligado, etc. 4.2.3: Cálculo de Valores Atuais das Variáveis O monitoramento dos valores atuais das variáveis através de planilha eletrônica é feito utilizando-se uma funcionalidade fornecida pelo add-in para Microsoft Excel, PI-Data Link. Esse add-in disponibiliza inúmeras funções para monitoramento e inserção de dados diretamente no servidor. 54 A função PICurrVal , como se verifica na Figura 37, retorna o valor atual das variáveis solicitadas, a partir do conhecimento do tag, ou seja, o nome das mesmas. Figura 37 – Retorno de Valor Atual das Variáveis O desenvolvimento das planilhas eletrônicas que otimizaram diversas tarefas, ocorreu de forma gradativa e concomitantemente à realização de outras atividades. 4.3: Criação de Telas de Processo A criação de telas de processo deu-se devido a necessidade de monitoramento do que estava acontecendo na área, sem que fosse necessário ir até a mesma para acompanhar o processo, ou ainda, sem que fosse necessário acessar o software supervisório da ABB/Bailey para obter informações em tempo real. Todas as telas de processo criadas foram disponibilizadas num servidor na intranet da SIX. Para que pudessem ser acessadas bastava mapear nos computadores o endereço de rede onde essas telas estão armazenadas. Para 55 visualizá-las o usuário precisava possuir o aplicativo PI-ProcessBook instalado em seu computador. Figura 38 – Lista de telas do PI-ProcessBook O processo de criação de telas do PI-ProcessBook para monitorar processos em tempo real, envolvia os seguintes passos: • Inserção de um novo Display (Menu File > New > ProcessBook Display (.pdi) File > OK), onde se pode definir o nome do Display a ser criado, entrando com o mesmo na caixa de texto ProcessBook Name. • No novo Display pode-se montar o processo utilizando as bibliotecas do PI-ProcessBook, fazendo-se desenhos, ou utilizando panos de fundo. No caso das telas criadas foram utilizados panos de fundo retirados do software supervisório da ABB/Bailey e editados, como se verifica na Figura 39. 56 Figura 39 – Comparação entre telas de processo • Para utilizar o pano de fundo, é preciso certificar-se de que a imagem a ser utilizada como pano de fundo tenha sido salva como "256 Color Bitmap", "16 Color Bitmap" ou "Monochrome Bitmap", isso porque se a imagem for salva como "24-bit Bitmap" a mesma perderá resolução ao ser inserida como pano de fundo no display do PI-ProcessBook. • Os campos onde são mostrados os valores atuais das variáveis de processo a serem monitoradas em tempo real, são adicionados a partir do Menu Draw > Value, quando uma janela abrir-se-á e poder-se-á definir o servidor, o nome da variável a ser monitorada, o formato do número, etc. • A inserção de links de uma tela de monitoramento para outra, é realizada a partir da inserção de um botão que aponte para o caminho correto. Para inserir um botão utilize o Menu Draw > Button. Uma janela aparecerá onde se pode definir o nome do botão, o tipo de comando a que ele estará relacionado, no caso de criar um link para outra tela escolhe-se a opção Linked Display. Em Action Item deve-se a definir qual tela aparecerá ao 57 clicar o botão, e por fim ainda pode-se escolher se esta ação abrirá uma nova tela ou permanecerá na mesma. Ao todo foram criadas 49 telas de processo e 12 telas de gráficos. Exemplos são mostrados abaixo. Figura 40 –Tela de Processo Geral criada no PI-ProcessBook 58 Figura 41 – Tela criada no PI-ProcessBook Figura 42 – Gráfico do PI-ProcessBook 59 4.4: Desenvolvimento de Aplicativos em Visual Basic O trabalho final que foi executado para a Gerência de Pesquisa da SIX, foi o desenvolvimento de aplicativos em Visual Basic objetivando otimizar e automatizar o monitoramento das variáveis do processo de Craqueamento Catalítico Fluido, e a inserção de dados de laboratório no servidor PI. A primeira etapa do desenvolvimento dos aplicativos, foi o estudo da linguagem de programação Visual Basic. A escolha dessa linguagem de programação deu-se pelo fato de que já existiam softwares de balanço de massa e energia que utilizavam essa linguagem em operação na U144. O objetivo inicial era desenvolver uma rotina em Visual Basic, a qual seria inserida nos aplicativos UMProcess/DataLab e UMProcess/BME, para que os mesmos enviassem automaticamente os valores de balanços por eles calculados para serem armazenados no servidor PI juntamente com as outras variáveis referentes ao processo de FCC coletadas pelo SDCD. Foram desenvolvidos dois softwares, PI Tag Monitor e PI Data Insert. O primeiro responsável pelo monitoramento amigável, em tempo real ou não, das variáveis armazenadas no servidor. E o segundo, responsável pela inserção de dados de laboratório no servidor. 4.4.1: PI Tag Monitor O aplicativo PI Tag Monitor foi elaborado para efetuar o monitoramento dos dados do servidor PI a partir da coleta em tempo real dos mesmo. A maior dificuldade encontrada durante a elaboração do aplicativo foi a escolha de uma função que melhor se adequasse ao monitoramento correto de todos os tipos de variáveis. A única função do módulo piapi32.bas que coletava corretamente as variáveis do tipo string era piar_getarcvaluex. É possível realizar uma procura pelas variáveis desejadas e mostrar seus valores corretos, independente dos seus pointtypes (float32, int32 ou string), de acordo com o timestamp definido pelo usuário. A seguir são apresentadas telas passo a passo do aplicativo em funcionamento. A Figura 43 mostra a tela inicial do programa, onde se entra com o 60 nome do servidor na caixa de texto, e clica-se no botão Conectar, para que a conexão com o servidor seja efetuada. No passo seguinte, Figura 44, deve-se clicar no botão Procurar presente na tela de monitoração dos dados. Figura 43 – PI Tag Monitor – Splash Screen Figura 44 – PI Tag Monitor – Tela de Monitoração dos Dados Uma nova tela que realiza a procura pelas variáveis desejadas é aberta. No caso do exemplo abaixo o Tag Mask escolhido foi “TI-144*”, determinando assim 61 que o programa deve rastrear por todas as variáveis presentes no servidor PI que iniciam com o prefixo inserido na caixa de texto. A procura só é realmente efetivada após clicar-se no botão Procurar. Figura 45 – PI Tag Monitor – Tela de Busca Ainda na tela de busca é possível especificar se a procura deve ser realizada somente para um tipo de PointSource, ou se a mesma deve procurar todos os tipos. No caso dos tags da Gerência de Pesquisa da SIX, o PointSource é igual a “K”. Já no caso das variáveis inseridas manualmente no servidor, o PointSource é igual a “L”. O resultado da procura realizada é evidenciado na própria tela de busca que é atualizada após o término da ação de procurar pelas variáveis que possuíam o TagMask igual a “TI-144*” e o PointSource igual a “K”. 62 Figura 46 – PI Tag Monitor – Resultado da Busca Efetuada Outras buscas podem ser efetuadas, para que o usuário consiga numa mesma tela monitorar todas as variáveis desejadas. O número máximo de variáveis que podem ser monitoradas ao mesmo tempo pelo programa PI Tag Monitor é dezesseis. A Figura 47 mostra a tela final de monitoramento do aplicativo elaborado. Nela estão sendo monitoradas variáveis atualizadas pelo SDCD (TI-144*) e variáveis inseridas manualmente (U144*), sendo a variável “U144-AAFluidoSerpentina“, uma variável do tipo string, evidenciando que a dificuldade apontada no início dessa seção foi superada, e que a leitura dos tags do tipo string é realizada corretamente. 63 Figura 47 – PI Tag Monitor – Monitoramento de Variáveis 4.4.2: Entrada Manual de Dados A inserção manual de informações no banco de dados do PI exige que os tags a elas relacionadas possuam atributos configurados adequadamente. O PointSource utilizado para variáveis que recebem entrada manual de dados deve ser igual a “L” de Laboratory Tags, indicando que os valores inseridos não vêm de uma interface, mas sim de uma entrada do usuário ou de uma aplicação específica. O parâmetro Compressing normalmente deve ser igual a zero, pois as entradas de dados manuais não devem sofrer o teste de compressão de dados que serve para remover valores que não tenham mudado significativamente. 64 Por outro lado, o parâmetro Step geralmente é setado em um, já que a maioria dos dados manuais devem ser mostrados com interpolação do tipo ZOH, Interpolador de Ordem Zero, pois é considerada má prática interpolar linearmente entre valores inseridos manualmente, para tentar calcular que valor a variável teria se a medida tivesse sido realizada num momento particular. Os parâmetros Location# podem ser ignorados, porque não existe uma interface envolvida na coleta dos dados. Da mesma forma os parâmetros ExcDev, ExcMin, ExcMax, e ExcDevPercent também podem ser ignorados, pois o teste de exceção normalmente é realizado pela interface, e no caso da inserção manual de dados não existe interface envolvida. Por último, o parâmetro DataAccess deve ser configurado para que seja igual a "o:rw g:rw w:rw", assim as aplicações criadas para inserir dados manualmente no servidor, terão acesso a ele e poderão escrever no banco de dados. 4.4.3: PI Data Insert A elaboração do aplicativo PI Data Insert, utilizando a linguagem de programação Visual Basic, visou o lançamento dos dados da operação diretamente no servidor PI, com o objetivo de unificar a base de dados, alocando todos os valores de processo, ou variáveis calculadas num mesmo servidor. Assim como no desenvolvimento do PI Tag Monitor, a maior dificuldade encontrada durante o desenvolvimento do PI Data Insert, foi a inserção incorreta dos dados do tipo texto no servidor. Após inúmeras tentativas descobriu-se a função que inseria corretamente strings no servidor, bem como os parâmetros que para ela deveriam ser passados. Tal função era a pisn_putsnapshotx. O aplicativo testa se o dado inserido está de acordo com o PointType armazenado no servidor, assim se o número que está sendo inserido deve ser um inteiro, e o usuário tentar inserir um número fracionário, o programa mostra uma mensagem de erro ao usuário solicitando que um número inteiro seja inserido. A seqüência de ações executadas pelo programa é a seguinte: o programa testa se a caixa de texto associada a cada variável está vazia ou não, caso esteja vazia, ele pula para próxima caixa de texto, caso contrário ele executa o teste que verifica se o valor inserido é do tipo do valor determinado no servidor para aquela 65 variável. Se o valor estiver incorreto o programa pede para que o usuário digite na caixa de texto um valor compatível com o tipo exigido pela variável. Caso o valor inserido na caixa de texto passe no teste anterior, o programa verifica se foi especificada a Data e Hora de inserção dos dados, se esse parâmetro não foi especificado, o programa solicita que o usuário especifique-o, para que ele possa dar continuidade ao processo de inserção do novo dado no servidor. Figura 48 – PI Data Insert – Tela de Inserção dos Dados Assim, se o valor passar por todos os testes citados anteriormente, ele é inserido no servidor, com a Data e Hora especificadas pelo usuário. Após a inserção ser efetuada, o programa ainda testa para verificar se o dado foi inserido corretamente, e acende uma “luz verde”, para indicar que a ação foi efetuada com sucesso, como ilustrado na Figura 49. 66 Figura 49 – PI Data Insert – Processo de Inserção dos Dados 67 Capítulo 5: Discussão dos Resultados, Conclusões e Perspectivas No período inicial do estágio na SIX, onde foi realizado o Projeto de Fim de Curso, que resultou nessa monografia, procedeu-se um estudo sobre o sistema PI que resultou num aprendizado progressivo sobre o que ele é e sua aplicabilidade no sistema Petrobras, devido suas potencialidades. De fato, concentrar todas as informações num banco de dados, torna fácil a organização e o acesso a esses dados armazenados, sendo esse o maior objetivo da implementação do sistema PI. O servidor PI da UN-SIX, é um servidor que armazena tanto os dados da produção, que processa o xisto, quanto os dados provindos das unidades de pesquisa. A interface responsável pela coleta dos dados das unidades da Gerência de Pesquisa não estava realizando a tarefa para a qual foi atribuída, comportando-se como uma máquina ociosa, de forma que dados importantes de testes realizados pelas unidades não estavam sendo armazenados no servidor PI. Com a instalação e configuração da interface os dados de operação e testes das unidades, em especial da Unidade Multipropósito de Craqueamento Catalítico Fluido, passaram a ser enviados e armazenados corretamente no servidor, possibilitando assim que esses dados pudessem ser acessados de qualquer máquina conectada à intranet da SIX, ou até mesmo da Petrobras. Um problema a ser resolvido futuramente é o problema de travamento da interface, que embora esteja coletando corretamente os dados, tem “congelado” em dias de temperatura muito altas, o que leva à necessidade de reinicialização da mesma. Vários componentes de hardware da máquina foram trocados, não solucionando o problema. Com a interface funcionando adequadamente deu-se início ao desenvolvimento de ferramentas que automatizassem o processo de criação e 68 edição de tags no servidor PI, e que fossem capazes de visualizar dados, além de inseri-los corretamente no banco de dados do PI. Assim, foram criadas planilhas eletrônicas utilizando-se o aplicativo Microsoft Excel, responsáveis por: configurar corretamente os atributos dos tags, monitorar variáveis em tempo real, e especificar o estado digital de cada variável digital presente no servidor. Citando que durante o trabalho realizado, foram criados e editados quase 1900 pontos no servidor PI. A não utilização das planilhas desenvolvidas, tornaria uma tarefa extremamente trabalhosa, inserir os dados no servidor, um por um, o que não compensaria. As quase cinqüenta telas de processo criadas para acompanhamento do funcionamento da Unidade de FCC utilizando-se o software PI-ProcessBook, permitem que o usuário monitore o andamento dos testes realizados em qualquer máquina conectada à intranet, em tempo real. O aspecto das telas do software supervisório da ABB/Bailey foi mantido, para que os operadores da unidade, tivessem facilidade ao acompanhar o andamento do processo por outro aplicativo, no caso o PI-ProcessBook. Os aplicativos PI Data Insert e PI Tag Monitor, foram elaborados para facilitar a inserção dos dados da operação no servidor PI, como também para monitorar as variáveis no período de tempo desejado. São aplicativos que customizam a maneira como os dados são vistos e inseridos no servidor. A principal dificuldade encontrada na elaboração desses dois aplicativos esteve relacionada aos dados do tipo texto, que ou eram inseridos incorretamente no servidor, ou eram lidos incorretamente pelo aplicativo de monitoramento das informações. A solução para esse problema com os dados do tipo texto foi encontrada a partir do contato com o suporte da OSIsoft, empresa desenvolvedora do sistema PI, que disponibiliza dos módulos piapi32.bas e piutil.bas, para facilitar o desenvolvimento de aplicações em Visual Basic. De modo geral, o desenvolvimento dessas atividades transcorreu gradualmente, à medida que o sistema foi sendo conhecido e desmistificado. O uso da palavra “desmistificado” é cabível, uma vez que o sistema era previamente conhecido apenas pelo operador responsável processamento do xisto na SIX. 69 pelo mesmo no setor de Com o aprendizado adquirido sobre o sistema, e com a transferência e disseminação das informações absorvidas, o sistema passou de desconhecido, e por que não abandonado, para uma ferramenta valiosa de coleta, armazenamento e gerenciamento dos dados provenientes de testes nas unidades de Pesquisa da SIX. Conclui-se que as funções de implementar, configurar e customizar o sistema Plant Information, na Unidade Multipropósito de Craqueamento Catalítico Fluido, inseridas no contexto do curso de Engenharia de Controle e Automação Industrial, obtiveram sucesso, sabendo que o trabalho desenvolvido no período de agosto de 2003 a fevereiro de 2004 teve seu valor reconhecido pelas partes interessadas. Como perspectivas futuras de tarefas a serem desenvolvidas listam-se: • Reinstalar e configurar o servidor PI e a interface em novas máquinas; • Criar interfaces amigáveis para inserção dos dados oriundos do laboratório e da engenharia no servidor PI; • Adquirir e instalar o utilitário PI Active View para permitir acesso remoto via browser às telas do PI-ProcessBook. 70 Bibliografia: [ 1 ] PI Application Programming Interface – Version 1.3.3. San Leandro, CA: OSI Software Inc., July 2000. [ 2 ] PI Data Link User's Guide – Version 1.9. San Leandro, CA: OSI Software Inc., November 2000. [ 3 ] PI-Process Book – Programmer's Reference Manual – Version 2.12. San Leandro, CA: OSI Software Inc., December 1999 [ 4 ] BROWN, Steve. Visual Basic 6 Complete: Sybex, 1999. 1011 p. [ 5 ] http://www.osisoft.com 71 72 ar gases de combustão catalisador silo de carga atm Anexo A – Fluxograma Unidade Multipropósito de FCC atm vapor "stripper" ciclones LRCV regenerador ar de combustão ciclones atm PDRCV TRCV carga vapor de "lift" gases de combustão atm HV óleo pesado "riser" condensadores PRCVb PRCVd "flare" óleo produto óleo leve FREON torre de absorção condensador condensador Unidade Multipropósito de FCC U-144 Anexos: Anexo B – Código Fonte do arquivo piapi32.bas ' $Archive: /PI/clients/piapi/piapi32.bas $ 'Copyright (c) 1993-98 OSI Software, Inc. All rights reserved. 'Unpublished - rights reserved under the copyright law of the United States. ' 'USE OF A COPYRIGHT NOTICE IS PRECAUTIONARY ONLY AND DOES NOT IMPLY PUBLICATION 'OR DISCLOSURE. ' 'THIS SOFTWARE CONTAINS CONFIDENTIAL INFORMATION AND TRADE SECRETS OF 'OSI SOFTWARE, INC. USE, DISCLOSURE, OR REPRODUCTION IS PROHIBITED WITHOUT 'THE PRIOR EXPRESS WRITTEN PERMISSION OF OSI SOFTWARE, INC. ' 'RESTRICTED RIGHTS LEGEND 'Use, duplication, or disclosure by the Government is subject to restrictions 'as set forth in subparagraph (c)(1)(ii) of the Rights in Technical Data and 'Computer Software clause at DFARS 252.227.7013 ' 'OSI Software, Inc. '777 Davis Street, Suite 250, San Leandro CA 94577 ' ' $Log: /PI/clients/piapi/piapi32.bas $ ' ' 17 2/26/03 9:31a Matzen ' Added function prototype for get_utctime ' ' 16 2/19/03 2:48p Matzen ' The prototype for piut_getloginuser was changed to return a long ' instead of a string. Although visual basic strings can be returned as ' parameters in function calls (as long as they are declared as Byval ' String), visual basic strings cannot directly be returned by a function ' writen in C or C++ unless the C or C++ function returns a BSTR. Once ' must treat function returns of char* as long in visual basic and then ' manipulate the long using win32 calls. See clientele call 52201GMBH. ' ' 15 4/16/02 11:34a Harry ' Changed case of PITime in method definitions. Screws up VB projects ' that include it and want to use PISDK PITime. Rem Rem 14 8/10/99 2:27p Cahenze Rem Added piut_getloginuser Rem Rem 13 7/27/99 5:29p Cahenze Rem drVals were #, not Any. Rem Rem 12 5/13/99 11:19a Cahenze Rem Added piut_strerror Rem Rem 11 4/28/99 8:08a Charlie Rem Added archive retrieval flags which were missing. Added missing $ type Rem in pilg_addnewserver. Removed Byval declaration in piut_errormsg for Rem msglen. Rem Rem 10 2/15/99 5:45p Charlie Rem pisn_evmexceptx: first argument changed to byref. Rem Rem 9 2/08/99 1:09p Charlie Rem Added pilg_checklog, pilg_formputlog, pisn_evmexceptx, Rem pisn_sendexcepstrucq, piut_fastserverversion. Rem Rem 8 12/03/98 5:07p Charlie Rem Removed unusable PIvaluetypes. Modified PITIMESTAMP.reserved to Rem PITIMESTAMP.tzinfo. Added piar_putarcvaluesx and mode definitions, Rem pitm_isdst, pitm_setdst and piut_getserverversion. Rem Rem 7 5/15/98 11:35a Harry Rem Removed line Rem Attribute VB_Name = "Module1" Rem Conflicted with other modules when loading into VB projects and not Rem required. Leaving it out causes the module to take the next available Rem name. Rem Rem 6 4/30/98 10:19a Charlie Rem Rem 4 10/29/97 7:45a Harry Rem Added defined constants for extended API, GETSAME, PI_NOMOREVALUES, and Rem BITFLAGS ' ' History 73 ' 11/22/96 hs Added and fixed extended api declarations and types Option Explicit '------------------------------- piar_summary definitions Global Const ARCTOTAL = 0 Global Const ARCMINIMUM = 1 Global Const ARCMAXIMUM = 2 Global Const ARCSTDEV = 3 Global Const ARCRANGE = 4 Global Const ARCAVERAGE = 5 Global Const ARCMEAN = 6 '------------------------------- piar_value definitions Global Const ARCVALUEBEFORE = 1 Global Const ARCVALUEAFTER = 2 Global Const ARCVALUEINTERP = 3 Global Const ARCVALUECODE = 4 '------------------------------- piel_evntactn definitions Global Const ELEQSEARCH = 1 Global Const ELGESEARCH = 2 Global Const ELLESEARCH = 3 Global Const ELGTSEARCH = 4 Global Const ELLTSEARCH = 5 Global Const ELEDIT = 6 Global Const ELDELETE = 7 '------------------------------- pilg_putoutput definitions Global Const MSGLOG = 1 Global Const STDOUTPUT = 2 '------------------------------- pipt_updates definitions Global Const NOTAGS = 0 Global Const POINTCREATE = 1 Global Const POINTEDIT = 2 Global Const POINTDELETE = 3 '------------------------------- piut_login definitions Global Const PILOGINOK = 1 Global Const PIREADACCESS = 2 Global Const PIWRITEACCESS = 4 Global Const PILOGINREAD = 8 Global Const PILOGINWRITE = 16 Global Const PILOGINPIUSER = 256 Global Const PILOGINVMS = 512 Global Const PILOGINUNIX = 1024 Global Const PINO = 0 Global Const PIREAD = 1 Global Const PIREADWRITE = 2 '-------------------------------- pilg definitions Global Const GETFIRST = 0 Global Const GETNEXT = 1 Global Const GETSAME = 2 Global Const PI_NOMOREVALUES = 100 Global Const PI_M_AFLAG = 1 Global Const PI_M_QFLAG = 2 Global Const PI_M_SFLAG = 4 Global Const MAX_POINT_NUM_LEN = 16 Global Const MAX_NODENAME_LEN = 30 Global Const MAX_TAGNAME_LEN = 256 Global Const MAX_USERNAME_LEN = 30 Global Const PILOGIN_SERVER_TYPE_PI = 1000 '-------------------------------- extended API definitions Global Const ARCflag_time = 4 Global Const ARCFLAG_EVEN = 8 Global Const ARCflag_filter = 16 Global Const ARCflag_mark = 32 Global Const ARCFLAG_COMP = 64 Global Global Global Global Global Global Global Global Global Global Global Global Const Const Const Const Const Const Const Const Const Const Const Const PI_Type_null = 0 PI_Type_bool = 1 PI_Type_uint8 = 2 PI_Type_int8 = 3 PI_Type_char = 4 PI_Type_uint16 = 5 PI_Type_int16 = 6 PI_Type_uint32 = 7 PI_Type_int32 = 8 PI_Type_uint64 = 9 PI_Type_int64 = 10 PI_Type_float16 = 11 74 Global Global Global Global Global Global Global Const Const Const Const Const Const Const PI_Type_float32 = 12 PI_Type_float64 = 13 PI_Type_PI2 = 14 PI_Type_digital = 101 PI_Type_blob = 102 PI_Type_PIstring = 105 PI_Type_bad = 255 ' piar_putarcvaluesx defines Global Const ARCNOREPLACE = 3 Global Const ARCAPPEND = 4 Global Const ARCREPLACE = 5 Global Const ARCREPLACEX = 6 Global Const ARCDELETE = 7 Global Const ARCAPPENDX = 8 ' add unless event(s) exist at same time (PI 2.x) ' add event regardless of existing events ' add event, replace if event at same time ' replace existing event (fail if no event at time) ' remove existing event ' add event regardless of existing events, no compression '---------------------------- Structure declarations Type QERROR Point As Long piapierror As Long End Type Global Const MAXPI3PUTSNAP = 255 'For queue call return values. Type QERRORS syserror As Long numpterrs As Long qerr(MAXPI3PUTSNAP) As QERROR End Type Type PI_EXCEPT NewVal As Single newstat As Long newTime As Long oldVal As Single oldstat As Long oldTime As Long prevVal As Single prevstat As Long prevTime As Long ExcDevEng As Single ExcMin As Long ExcMax As Long End Type Type PI_VAL bSize As Long istat As Long FLAGS As Integer End Type Type TagList server As String * MAX_NODENAME_LEN NodeID As Long tagname As String * MAX_TAGNAME_LEN Point As Long reserved As Long End Type Type PITimeStamp Month As Long ' /* 1-12 */ Year As Long ' /* four digit */ Day As Long ' /* 1-31 */ Hour As Long ' /* 0-23 */ Minute As Long ' /* 0-59 */ tzinfo As Long Second As Double ' /* 0-59.99999999.... */ End Type 'PI batch function declarations -- New with PI-API v1.1.0 Declare Function piba_getunit Lib "piapi32.dll" (ByVal unit$, ByVal slen&, ByVal index&, number&) As Long Declare Function piba_getaliaswunit Lib "piapi32.dll" (ByVal unit$, ByVal balias$, ByVal slen&, ByVal index&, number&) As Long Declare Function piba_getunitswalias Lib "piapi32.dll" (ByVal balias$, ByVal unit$, ByVal slen&, ByVal index&, number&) As Long Declare Function piba_findaliaspoint Lib "piapi32.dll" (ByVal unit$, ByVal balias$, ptno&, ByVal tagname$, ByVal slen&) As Long Declare Function piba_search Lib "piapi32.dll" (ByVal batchid$, ByVal blen&, ByVal unit$, ByVal ulen&, ByVal product$, ByVal plen&, stime&, etime&, ByVal sf&, ByVal timeout&) As Long 'PI Login Services function declarations -- new with PI-API v1.1.0 75 Declare Function pilg_addnewserver Lib "pilog32.dll" (ByVal servername$, ByVal servertype&, ByVal username$, ByVal portnum&) As Long Declare Function pilg_connectdlg Lib "pilog32.dll" (ByVal hwndparent&) As Long Declare Function pilg_disconnect Lib "pilog32.dll" () As Long Declare Function pilg_disconnectnode Lib "pilog32.dll" (ByVal servername$) As Long Declare Function pilg_getconnectedserver Lib "pilog32.dll" (ByVal servernamebuf$, bufsize&, NodeID&, port&, ByVal seq&) As Long Declare Function pilg_getdefserverinfo Lib "pilog32.dll" (ByVal servernamebuf$, bufsize&, NodeID&, port&) As Long Declare Function pilg_getnodeid Lib "pilog32.dll" (ByVal servernamebuf$, NodeID&) As Long Declare Function pilg_getselectedtag Lib "pilog32.dll" (taglst As TagList, ByVal seq&) As Long Declare Function pilg_getservername Lib "pilog32.dll" (ByVal NodeID&, ByVal servernamebuf$, bufsize&) As Long Declare Function pilg_login Lib "pilog32.dll" (ByVal hwndparent&, ByVal username$, ByVal servername$, ByVal password$, valid&) As Long Declare Function pilg_pointattdlg Lib "pilog32.dll" (ByVal hwndparent&, taglst As TagList) As Long Declare Function pilg_registerapp Lib "pilog32.dll" (ByVal dllname$) As Long ' The function below requires allocating a linked list which is not supported in VB ' 'Declare Function pilg_registerhelp Lib "pilog32.dll" (ByVal helpfile$, linklist&) As Long Declare Function pilg_setservernode Lib "pilog32.dll" (ByVal servername$) As Long Declare Function pilg_tagsearchdlg Lib "pilog32.dll" (ByVal hwndparent&) As Long Declare Function pilg_unregisterapp Lib "pilog32.dll" () As Long 'Function declarations Declare Function piar_calculation Lib "piapi32.dll" (count&, times&, rvals!, istats&, ByVal Expr$) As Long Declare Function piar_compvalues Lib "piapi32.dll" (ByVal pt&, count&, times&, rvals!, istats&, ByVal rev&) As Long Declare Function piar_compvaluesfil Lib "piapi32.dll" (ByVal pt&, count&, times&, rvals!, istats&, ByVal Expr$, ByVal rev&, ByVal fil&) As Long Declare Function piar_deletevalue Lib "piapi32.dll" (ByVal pt&, ByVal timedate&) As Long Declare Function piar_interpvalues Lib "piapi32.dll" (ByVal pt&, count&, times&, rvals!, istats&) As Long Declare Function piar_interpvaluesfil Lib "piapi32.dll" (ByVal pt&, count&, times&, rvals!, istats&, ByVal Expr$) As Long Declare Function piar_panvalues Lib "piapi32.dll" (ByVal pt&, count&, timedate&) As Long Declare Function piar_plotvalues Lib "piapi32.dll" (ByVal pt&, ByVal intervals&, count&, times&, rvals!, istats&) As Long Declare Function piar_putvalue Lib "piapi32.dll" (ByVal pt&, ByVal rval!, ByVal istat&, ByVal timedate&, ByVal wait&) As Long Declare Function piar_replacevalue Lib "piapi32.dll" (ByVal pt&, ByVal timedate&, ByVal rval!, ByVal istat&) As Long Declare Function piar_summary Lib "piapi32.dll" (ByVal pt&, time1&, time2&, rval!, pctgood!, ByVal code&) As Long Declare Function piar_timedvalues Lib "piapi32.dll" (ByVal pt&, count&, times&, rvals!, istats&, ByVal prev&) As Long Declare Function piar_timedvaluesfil Lib "piapi32.dll" (ByVal pt&, count&, times&, rvals!, istats&, ByVal Expr$) As Long Declare Function piar_timefilter Lib "piapi32.dll" (ByVal StartTime&, ByVal EndTime&, ByVal Expr$, tottime&, passtime&) As Long Declare Function piar_value Lib "piapi32.dll" (ByVal pt&, timedate&, ByVal Mode&, rval!, istat&) As Long Declare Function piel_addevnt Lib "piapi32.dll" (pitime&, number&, ByVal group&, ByVal etype&, ByVal Msg$, ByVal timeout&) As Long Declare Function piel_evntactn Lib "piapi32.dll" (pitime&, number&, group&, etype&, ByVal slen&, ByVal Msg$, ByVal action&, ByVal timeout&) As Long Declare Function pilg_checklogfile Lib "piapi32.dll" (ByVal action&, ByVal LogFile$) As Long Declare Function pilg_formputlog Lib "piapi32.dll" (ByVal Msg$, ByVal IdString$) As Long Declare Function pilg_puthomelog Lib "piapi32.dll" (ByVal Msg$) As Long Declare Function pilg_putlog Lib "piapi32.dll" (ByVal Msg$) As Long Declare Function pilg_putoutput Lib "piapi32.dll" (ByVal Msg$, ByVal FLAGS&) As Long Declare Function pipt_compspecs Lib "piapi32.dll" (ByVal pt&, compdev&, compmin&, compmax&) As Long Declare Function pipt_compspecseng Lib "piapi32.dll" (ByVal pt&, compdeveng!, compmin&, compmax&) As Long Declare Function pipt_dates Lib "piapi32.dll" (ByVal pt&, creationdate&, ByVal creator$, ByVal crlen&, changedate&, ByVal changer$, ByVal chlen&) As Long Declare Function pipt_descriptor Lib "piapi32.dll" (ByVal pt&, ByVal desc$, ByVal slen&) As Long Declare Function pipt_digcode Lib "piapi32.dll" (digcode&, ByVal digstring$) As Long Declare Function pipt_digcodefortag Lib "piapi32.dll" (ByVal pt&, digcode&, ByVal digstring$) As Long Declare Function pipt_digpointers Lib "piapi32.dll" (ByVal pt&, digcode&, dignumb&) As Long Declare Function pipt_digstate Lib "piapi32.dll" (ByVal digcode&, ByVal digstate$, ByVal slen&) As Long Declare Function pipt_displaydigits Lib "piapi32.dll" (ByVal pt&, displaydigits&) As Long Declare Function pipt_engunitstring Lib "piapi32.dll" (ByVal pt&, ByVal engunitstring$, ByVal slen&) As Long 76 Declare Function pipt_engunstring Lib "piapi32.dll" (ByVal engunitcode&, ByVal engunitstring$, ByVal slen&) As Long Declare Function pipt_excspecseng Lib "piapi32.dll" (ByVal pt&, ExcDevEng!, ExcMin&, ExcMax&) As Long Declare Function pipt_exdesc Lib "piapi32.dll" (ByVal pt&, ByVal exdesc$, ByVal slen&) As Long Declare Function pipt_findpoint Lib "piapi32.dll" (ByVal tagname$, pt&) As Long Declare Function pipt_inprocbits Lib "piapi32.dll" (ByVal pt&, larchiving&, lcompressing&, filtercode&) As Long Declare Function pipt_instrumenttag Lib "piapi32.dll" (ByVal pt&, ByVal instrumenttag$, ByVal slen&) As Long Declare Function pipt_location Lib "piapi32.dll" (ByVal pt&, location&) As Long Declare Function pipt_nextptwsource Lib "piapi32.dll" (ByVal source%, pt&) As Long Declare Function pipt_pointid Lib "piapi32.dll" (ByVal pt&, ipt&) As Long Declare Function pipt_pointsource Lib "piapi32.dll" (ByVal pt&, ByVal source$) As Long Declare Function pipt_pointtype Lib "piapi32.dll" (ByVal pt&, ByVal pttype$) As Long Declare Function pipt_ptexist Lib "piapi32.dll" (ByVal pt&) As Long Declare Function pipt_recordtype Lib "piapi32.dll" (ByVal pt&, steps&) As Long Declare Function pipt_rescode Lib "piapi32.dll" (ByVal pt&, rescode&) As Long Declare Function pipt_scale Lib "piapi32.dll" (ByVal pt&, zero!, span!) As Long Declare Function pipt_scan Lib "piapi32.dll" (ByVal pt&, lscan&) As Long Declare Function pipt_signupforupdates Lib "piapi32.dll" () As Long Declare Function pipt_sourcept Lib "piapi32.dll" (ByVal pt&, sourcept&) As Long Declare Function pipt_squareroot Lib "piapi32.dll" (ByVal pt&, squareroot&) As Long Declare Function pipt_tag Lib "piapi32.dll" (ByVal pt&, ByVal tag$, ByVal slen&) As Long Declare Function pipt_taglong Lib "piapi32.dll" (ByVal pt&, ByVal tag$, ByVal slen&) As Long Declare Function pipt_tagpreferred Lib "piapi32.dll" (ByVal pt&, ByVal tag$, ByVal slen&) As Long Declare Function pipt_totalspecs Lib "piapi32.dll" (ByVal pt&, totalcode&, convers!) As Long Declare Function pipt_typicalvalue Lib "piapi32.dll" (ByVal pt&, typicalvalue!) As Long Declare Function pipt_updates Lib "piapi32.dll" (pt&, ByVal tagname$, ByVal slen&, Mode&) As Long Declare Function pipt_userattribs Lib "piapi32.dll" (ByVal pt&, userint1&, userint2&, userreal1!, userreal2!) As Long Declare Function pipt_wildcardsearch Lib "piapi32.dll" (ByVal tagmask$, ByVal direction&, found&, ByVal tagname$, ByVal slen&, pt&, numfound&) As Long Declare Function pisn_evmdisestablish Lib "piapi32.dll" (count&, pts&) As Long Declare Function pisn_evmestablish Lib "piapi32.dll" (count&, pts&) As Long Declare Function pisn_evmexceptions Lib "piapi32.dll" (count&, pt&, rval!, istat&, timedate&) As Long Declare Function pisn_getsnapshot Lib "piapi32.dll" (ByVal pt&, rval!, istat&, timedate&) As Long Declare Function pisn_getsnapshots Lib "piapi32.dll" (pt&, rval!, istat&, timedate&, piapierror&, ByVal count&) As Long Declare Function pisn_putsnapshot Lib "piapi32.dll" (ByVal pt&, ByVal rval!, ByVal istat&, ByVal timedate&) As Long Declare Function pisn_putsnapshots Lib "piapi32.dll" (pt&, rval!, istat&, timedate&, piapierror&, ByVal count&) As Long Declare Function pisn_sendexcepstruc Lib "piapi32.dll" (ByVal pt&, ByVal pttype%, except As PI_EXCEPT, count&) As Long Declare Function pisn_sendexceptions Lib "piapi32.dll" (ByVal pt&, ByVal pttype%, oldVal!, oldstat%, oldTime&, prevVal!, prevstat%, prevTime&, ByVal NewVal!, ByVal newstat%, ByVal newTime&, ByVal ExcDevEng!, ByVal ExcMin%, ByVal ExcMax%, count&) As Long Declare Function pisn_sendexcepstrucq Lib "piapi32.dll" (ByVal pt&, ByVal pttype%, except As PI_EXCEPT, count&, ByVal Queueing%, numbptErrs&, qErrs As QERROR) As Long '----- these functions have return types incompatible with Visual Basic 'Declare Function pisn_sendexceptionq Lib "piapi32.dll" (ByVal pt&, ByVal pttype%, oldval!, oldstat%, oldtime&, prevval!, prevstat%, prevtime&, ByVal newval!, ByVal newstat%, ByVal newtime&, ByVal excdeveng!, ByVal excmin%, ByVal excmax%, count&) As QERRORS 'Declare Function pisn_putsnapshotq Lib "piapi32.dll" (ByVal pt&, ByVal rval!, ByVal istat&, ByVal timedate&) As QERRORS 'Declare Function pisn_flushputsnapq Lib "piapi32.dll" () As QERRORS Declare Function pitm_delay Lib "piapi32.dll" (ByVal mseconds&) As Long Declare Function pitm_fastservertime Lib "piapi32.dll" () As Long Declare Sub pitm_formtime Lib "piapi32.dll" (ByVal timedate&, ByVal timestring$, ByVal slen&) Declare Sub pitm_intsec Lib "piapi32.dll" (timedate&, timearray&) Declare Function pitm_parsetime Lib "piapi32.dll" (ByVal timestr$, ByVal reltime&, timedate&) As Long Declare Sub pitm_secint Lib "piapi32.dll" (ByVal timedate&, timearray&) Declare Function pitm_servertime Lib "piapi32.dll" (servertime&) As Long Declare Function pitm_syncwithservertime Lib "piapi32.dll" () As Long Declare Function pitm_systime Lib "piapi32.dll" () As Long Declare Function piut_connect Lib "piapi32.dll" (ByVal ProcName$) As Long Declare Function piut_disconnect Lib "piapi32.dll" () As Long Declare Function piut_disconnectnode Lib "piapi32.dll" (ByVal SrvName$) As Long Declare Function piut_fastserverversion Lib "piapi32.dll" (MinorVer&, ByVal buildid$, ByVal BuildLen&) As Long Declare Function piut_getapiversion Lib "piapi32.dll" (ByVal version$, ByVal slen&) As Long Declare Function piut_getloginuser Lib "piapi32.dll" () As Long Declare Sub piut_getprotocolvers Lib "piapi32.dll" (ByVal Vers$, ByVal slen&) Declare Function piut_getserverversion Lib "piapi32.dll" (NodeID&, ByVal servername$, ByVal servernamelen&, ByVal version$, ByVal versionlen&, ByVal buildid$, ByVal buildidlen&) As Long 77 Declare Sub piut_inceventcounter Lib "piapi32.dll" (ByVal counter&, ByVal count&) Declare Function piut_ishome Lib "piapi32.dll" () As Long Declare Function piut_login Lib "piapi32.dll" (ByVal username$, ByVal password$, valid&) As Long Declare Function piut_netinfo Lib "piapi32.dll" (ByVal namestr$, ByVal NameLen&, ByVal addressstr$, ByVal addresslen&, ByVal typestr$, ByVal typelen&) As Long Declare Function piut_netnodeinfo Lib "piapi32.dll" (ByVal namestr$, ByVal NameLen&, ByVal addressstr$, ByVal addresslen&, connected&) As Long Declare Function piut_netserverinfo Lib "piapi32.dll" (ByVal namestr$, ByVal NameLen&, ByVal addressstr$, ByVal addresslen&, connected&) As Long Declare Function piut_setdefaultservernode Lib "piapi32.dll" (ByVal servername$) As Long Declare Sub piut_setprocname Lib "piapi32.dll" (ByVal ProcName$) Declare Function piut_setservernode Lib "piapi32.dll" (ByVal servername$) As Long Declare Sub piut_zeroeventcounter Lib "piapi32.dll" (ByVal counter&) Declare Function piar_getarcvaluesx Lib "piapi32.dll" (ByVal PtNum&, ByVal arcMode&, count&, drVal As Any, iVal&, bVal As Any, bSize&, istat&, FLAGS%, time0 As PITimeStamp, time1 As PITimeStamp, ByVal FuncCode&) As Long Declare Function piar_getarcvaluesfilterx Lib "piapi32.dll" (ByVal PtNum&, ByVal Mode&, count&, drVal As Any, iVal&, bVal As Any, bSize&, istat&, FLAGS%, time0 As PITimeStamp, time1 As PITimeStamp, ByVal Expr$, ByVal FuncCode&) As Long Declare Function piar_getarcvaluex Lib "piapi32.dll" (ByVal PtNum&, ByVal arcMode&, drVal As Any, iVal&, bVal As Any, bSize&, istat&, FLAGS%, time0 As PITimeStamp) As Long Declare Function piar_putarcvaluesx Lib "piapi32.dll" (ByVal count&, ByVal Mode&, PtNum&, drVal As Any, iVal&, bVal As Any, bSize&, istat&, FLAGS%, time0 As PITimeStamp, Errors&) As Long Declare Function piar_putarcvaluex Lib "piapi32.dll" (ByVal PtNum&, ByVal Mode&, drVal As Any, iVal&, bVal As Any, bSize&, istat&, FLAGS%, time0 As PITimeStamp) As Long Declare Function pipt_pointtypex Lib "piapi32.dll" (ByVal PtNum&, typeX&) As Long 'Declare Function pisn_evmexceptionsx Lib "piapi32.dll" (ByVal Count&, PTnum&, event As PI_EVENT, ByVal FuncCode&) As Long Declare Function pisn_evmexceptx Lib "piapi32.dll" (count&, PtNum&, typeX&, Val As Variant, istat&, FLAGS%, Timeval As PITimeStamp, ByVal FuncCode&) As Long Declare Function pisn_flushputsnapqx Lib "piapi32.dll" (numbptErrs&, qErrs As QERROR) As Long Declare Function pisn_getsnapshotsx Lib "piapi32.dll" (PtNum&, cntptnum&, drVal As Any, iVal&, bVal As Any, bSize&, istat&, FLAGS%, time0 As PITimeStamp, lerror&, ByVal FuncCode&) As Long Declare Function pisn_getsnapshotx Lib "piapi32.dll" (ByVal PtNum&, drVal As Any, iVal&, bVal As Any, bSize&, istat&, FLAGS%, time0 As PITimeStamp) As Long Declare Function pisn_putsnapshotqx Lib "piapi32.dll" (ByVal PtNum&, drVal As Any, iVal&, bVal As Any, bSize As Long, istat As Long, FLAGS%, TimeStamp As PITimeStamp, ByVal Queueing&, numbptErrs&, qErrs As QERROR) As Long 'pisn_putsnapshotsx takes a pointer to an array of string pointers which can't be generated in VB Declare Function pisn_putsnapshotsx Lib "piapi32.dll" (ByVal count&, PtNum&, drVal As Any, iVal&, bVal As Any, bSize&, istat&, FLAGS%, time0 As Any, Errors&) As Long Declare Function pisn_putsnapshotx Lib "piapi32.dll" (ByVal PtNum&, drVal As Any, iVal&, bVal As Any, bSize&, istat&, FLAGS%, time0 As Any) As Long 'Declare Function pisn_sendexceptionqx Lib "piapi32.dll" (ByVal pt&, ByVal typeX&, oldValue As PI_EVENT, prevvalue As PI_EVENT, newvalue As PI_EVENT, ByVal ExcDevEng#, ByVal ExcMin#, ByVal ExcMax#, Count&, ByVal Queueing&, numbptErrs&, qErrs As QERROR) As Long 'Declare Function pisn_sendexceptionsx Lib "piapi32.dll" (ByVal num_pts&, ptnum&, typeX&, except As PI_EXCEPTSTRU, Errors&, Count&) As Long Declare Function pisn_sendexceptqx Lib "piapi32.dll" (ByVal pt&, ByVal typeX&, oldVal As Variant, oldistat&, oldFlags%, oldTime As PITimeStamp, prevVal As Variant, previstat&, prevFlags%, prevTime As PITimeStamp, Val As Variant, istat&, FLAGS%, newTime As PITimeStamp, ByVal ExcDevEng#, ByVal ExcMin#, ByVal ExcMax#, count&, ByVal Queueing&, numbptErrs&, qErrs As QERROR) As Long Declare Function pitm_getpitime Lib "piapi32.dll" (time0 As PITimeStamp, frac#) As Long Declare Function pitm_getutctime Lib "piapi32.dll" (time0 As PITimeStamp) As Double Declare Function pitm_isdst Lib "piapi32.dll" (time0 As PITimeStamp) As Long Declare Sub pitm_setcurtime Lib "piapi32.dll" (time0 As PITimeStamp, ByVal incl_subsec%) Declare Sub pitm_setdst Lib "piapi32.dll" (time0 As PITimeStamp, ByVal tm_isdst&) Declare Function pitm_setpitime Lib "piapi32.dll" (time0 As PITimeStamp, ByVal pitime&, ByVal frac#) As Long Declare Function pitm_settime Lib "piapi32.dll" (time0 As PITimeStamp, ByVal xyear&, ByVal xmonth&, ByVal xday&, ByVal xhour&, ByVal xminute&, ByVal xsecond#) As Long Declare Function piut_errormsg Lib "piapi32.dll" (ByVal stat&, ByVal Msg$, MsgLen&) As Long Declare Function piut_setpassword Lib "piapi32.dll" (ByVal username$, ByVal oldpw$, ByVal newpw$) As Long Declare Function piut_strerror Lib "piapi32.dll" (ByVal stat&, ByVal Msg$, MsgLen&, ByVal SrcStr$) As Long 78 Anexo C – Código Fonte do arquivo piutil.bas ' @(#)piutil.bas 1.1 09/20/95 ' 'Copyright (c) 1995 Oil Systems, Inc. All rights reserved. Unpublished - rights 'reserved under the copyright law of the United States. ' 'USE OF A COPYRIGHT NOTICE IS PRECAUTIONARY ONLY AND DOES NOT IMPLY PUBLICATION 'OR DISCLOSURE. ' 'THIS SOFTWARE CONTAINS CONFIDENTIAL INFORMATION AND TRADE SECRETS OF 'OIL SYSTEMS, INC. USE, DISCLOSURE, OR REPRODUCTION IS PROHIBITED WITHOUT 'THE PRIOR EXPRESS WRITTEN PERMISSION OF OIL SYSTEMS, INC. ' 'RESTRICTED RIGHTS LEGEND 'Use, duplication, or disclosure by the Government is subject to restrictions 'as set forth in subparagraph (c)(1)(ii) of the Rights in Technical Data and 'Computer Software clause at DFARS 252.227.7013 ' 'Oil Systems, Inc. '545 Estudillo Ave., San Leandro CA 94577 ' ' Option Explicit Type PIVAL rval As Single istat As Long timedate As Long End Type '----- declarations used to make a window "always on top" ----'courtesy of Microsoft Declare Function SetWindowPos Lib "user32" (ByVal h&, ByVal hb%, ByVal x%, ByVal y%, ByVal cx%, ByVal cy%, ByVal f%) As Integer Global Const SWP_NOMOVE = 2 Global Const SWP_NOSIZE = 1 Global Const FLAGS = SWP_NOMOVE Or SWP_NOSIZE Global Const HWND_TOPMOST = -1 Global Const HWND_NOTOPMOST = -2 '------------------------------------- handle errors in PI Function ChkPIstatus(piname As String, apistatus As Long) As Long If apistatus <> 0 Then MsgBox "Error in " & piname & ": status = " & apistatus End If ChkPIstatus = apistatus End Function '------------------------------------- connect to PI server if server has changed Sub Connect(servername As String) Dim status As Long status = ChkPIstatus("piut_setservernode", piut_setservernode(servername)) End Sub Function FormatTime(pitime As Long) As String Dim timestring As String * 19 pitm_formtime pitime, timestring, Len(timestring) FormatTime = timestring End Function '----- Get digital state code, given a string Function getDigCode(theString As String) As Long Dim theCode As Long If pipt_digcode(theCode, theString) = -12 Then getDigCode = 0 ' return 0 if string not found Else getDigCode = -theCode 'return a negative value, it's more useful End If End Function '------------------------------------- get state string from code Function getDigState(code As Long) As String Dim state As String * 12 If ChkPIstatus("pipt_digstate", pipt_digstate(code, state, 12)) <> 0 Then state = "" 'return empty string on error End If getDigState = state End Function 79 '------------------------------------- get a snapshot event Sub getEVMexception(ptno As Long, valu As PIVAL) Dim count As Long count = 1 If ChkPIstatus("pisn_evmexceptions", pisn_evmexceptions(count, ptno, valu.rval, valu.istat, valu.timedate)) <> 0 Or count = 0 Then ptno = 0 'return ptno = 0 if there is no exception at this time End If End Sub '----- get point number from point name Function getptno(itsName As String) As Long Dim ptno As Long Dim apistatus As Long Dim tagname As String * 80 'must be fixed-length string because API can modify it getptno = 0 'return zero on error tagname = itsName apistatus = pipt_findpoint(tagname, ptno) If apistatus = -5 Then MsgBox "Point """ & itsName & """ not found." ElseIf ChkPIstatus("pipt_findpoint", apistatus) = 0 Then getptno = ptno End If End Function '----- get point source character Function getptsource(ptno As Long) As String Dim ptsrc As String * 1 If ChkPIstatus("pipt_pointsource", pipt_pointsource(ptno, ptsrc)) <> 0 Then ptsrc = "" 'return empty string on error End If getptsource = ptsrc End Function '----- get point type character Function getPtType(ptno As Long) As String Dim pttype As String * 1 If ChkPIstatus("pipt_pointtype", pipt_pointtype(ptno, pttype)) <> 0 Then pttype = "" 'return empty string on error End If getPtType = pttype End Function '------------------------------------- get current value from point number Sub GetSnapshot(ptno As Long, valu As PIVAL) Dim status As Long status = ChkPIstatus("pisn_getsnapshot", pisn_getsnapshot(ptno, valu.rval, valu.timedate)) End Sub '------------------------------------- sign up for snapshot events on a point Sub ListenTo(ptno As Long) Dim count As Long, status As Long count = 1 status = ChkPIstatus("pisn_evmestablish", pisn_evmestablish(count, ptno)) End Sub '----- Make this an ordinary (not topmost) window Sub makenontopmost(theForm As Form) Dim success As Integer success = SetWindowPos(theForm.hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, FLAGS) 'success is nonzero when successful End Sub '----- Make this window "always on top" Sub maketopmost(theForm As Form) Dim success As Integer Dim winhandle As Long winhandle = theForm.hWnd success = SetWindowPos(winhandle, HWND_TOPMOST, 0, 0, 0, 0, FLAGS) 'success is nonzero when successful End Sub '----- process rval/istat, return result as string Function parsePIval(valu As PIVAL, pttype As String) As String If valu.istat < 0 Then parsePIval = getDigState(-valu.istat) ElseIf pttype = "I" Then 'integer tag parsePIval = Str$(valu.istat) Else 'real tag 80 valu.istat, parsePIval = Str$(valu.rval) End If End Function '------------------------------------- parse a PI time string Function parsetime(s As String, rel As Long) As Long Dim timestr As String * 19 'must be fixed-length string because API can modify it Dim result As Long timestr = s If ChkPIstatus("pitm_parsetime", pitm_parsetime(timestr, rel, result)) <> 0 Then result = 0 'return zero on error End If parsetime = result End Function '-------------------- convert PI time to Excel time ' 1-jan-1970 is 25569 on MS Windows, and there are 86400 seconds in a day. Function pitime2xl(pitime As Long) As Double pitime2xl = CDbl(pitime) / 86400 + 25569 End Function '------------------------------------- stop listening for snapshot events on a point Sub StopListening(ptno As Long) Dim count As Long, status As Long count = 1 status = ChkPIstatus("pisn_evmdisestablish", pisn_evmdisestablish(count, ptno)) End Sub '----- Change a string into a PI value. ' return 0 if OK, 1 if error Function StringToPIVAL(theString As String, pttype As String, valu As PIVAL) As Long Dim theval As Variant Dim theInt As Integer StringToPIVAL = 0 'be optimistic, set for OK return valu.istat = getDigCode(theString) If valu.istat <> 0 Then 'it is a digital state valu.rval = 0 ElseIf pttype = "D" Then MsgBox "Digital value needed" StringToPIVAL = 1 'error Else ' point is not digital, value is not digital theval = CVar(theString) 'see if it's a number If Not IsNumeric(theval) Then MsgBox "Numeric value needed" StringToPIVAL = 1 'error Else 'point is numeric, value is numeric valu.rval = theval 'setup for a real point, the usual case valu.istat = 0 If pttype = "I" Then 'we need an integer theInt = Int(valu.rval) If theInt <> valu.rval Or theInt > 32767 Or theInt < 0 Then MsgBox "Valid integer value needed" StringToPIVAL = 1 'error Else 'point is integer, value is integer valu.istat = valu.rval valu.rval = 0 End If 'value is integer End If 'point is integer End If 'value is numeric End If 'point is numeric End Function 81 Anexo D – PI Tag Monitor – Código Fonte do Splash Form Option Explicit Private Sub ConnectBtn_Click() Dim servername As String Dim theTime As Long servername = ServerText ServerFrame.Visible = False Refresh Connect servername theTime = pitm_syncwithservertime() DisplayForm.Show Hide End Sub Private Sub Form_Load() Dim dh As Long, dw As Long 'fix the width and height for small/large fonts dh = Height - ScaleHeight dw = Width - ScaleWidth Height = splashimage.Height + dh Width = splashimage.Width + dw 'center the splash screen splashscreen.Move (Screen.Width splashscreen.Width) splashscreen.Height) / 2 ServerFrame.Top = ScaleHeight * 0.85 - ServerFrame.Height ServerFrame.Left = ScaleWidth * 0.95 - ServerFrame.Width ServerText.SelStart = 0 ServerText.SelLength = Len(ServerText.Text) GlobalInit End Sub 82 / 2, (Screen.Height - Anexo E – PI Tag Monitor – Código Fonte do Display Form Option Explicit Private Sub Ajudar_Click() MsgBox "Clique em PROCURAR para vbExclamation, "PI Tag Monitor Help" End Sub selecionar os Tags que devem ser monitorados.", ' Quando o botão PROCURAR é apertado, o programa pára de ouvir todos os tags, ' Vai para o formulário SearchForm, e então volta a ouvir todos os tags de novo. Private Sub ConfigBtn_Click() Dim i As Integer reconfig = False exceptiontimer.Enabled = False For i = 0 To ntags - 1 If ptno(i) <> 0 Then StopListening ptno(i) End If Next i Searchform.Show 1 'mostra o formulário de procura If reconfig Then showsnaps End If End Sub ' De tempos em tempos (timer), checar se existe algum dado novo. Private Sub exceptiontimer_Timer() Dim pt As Long Dim valu As PIVAL Dim i As Integer Do getEVMexception pt, valu If pt = 0 Then Exit Sub 'não existem dados novos End If For i = 0 To ntags - 1 If ptno(i) = pt Then OldVal(i) = parsePIval(valu, pttype(i)) OldTime(i) = FormatTime(valu.timedate) If unconfirmed(i) Then If valu.timedate = changetime(i) Then 'verifica se timestamp é o mesmo unconfirmed(i) = False End If End If End If Next i Loop End Sub 'Após voltar do SearchForm, desabilita o timer e mostra os snapshots atuais. Private Sub Form_Load() exceptiontimer.Enabled = False showsnaps End Sub Private Sub Form_Unload(Cancel As Integer) End End Sub Private Sub QuitBtn_Click() End End Sub 'Coleta e mostra o valor do snapshot de cada tag, 'e também é setado para monitorar mudanças no valor das variáveis. Private Sub showsnaps() Dim i As Integer Dim timestring As String * 19 Dim valu As PIVAL Dim TimeStamp As PITimeStamp Dim Dim Dim Dim Dim Dim Dim bVal As String * 30 bSize As Long Mode As Integer drVal As Long iVal As Long istat As Long FLAGS As Integer 83 For i = 0 To ntags - 1 NameLab(i) = tagname(i) If ptno(i) > 0 Then If pttypex(i) <> 105 Then GetSnapshot ptno(i), valu OldVal(i) = parsePIval(valu, pttype(i)) OldTime(i) = FormatTime(valu.timedate) ListenTo ptno(i) exceptiontimer.Enabled = True Else bSize = 30 Mode = 1 apistat = piar_getarcvaluex(ptno(i), Mode, drVal, iVal, ByVal bVal, bSize, istat, FLAGS, TimeStamp) OldVal(i) = bVal OldTime(i) = FormatTime(pitm_systime()) End If End If Next i End Sub 84 Anexo F – PI Tag Monitor – Código Fonte do Search Form Option Explicit Private Sub AddAllBtn_Click() Do While SearchList.ListCount > 0 And OutList.ListCount < ntags moveitem SearchList, OutList, 0 Loop If MoveBtn.Caption = ">>" Then MoveBtn.Enabled = False End If EnableButtons 'habilita o botão addall ">> All" se possível End Sub Private Sub CanBtn_Click() Hide End Sub Private Sub ClearBtn_Click() OutList.Clear If MoveBtn.Caption = "<<" Then MoveBtn.Enabled = False End If EnableButtons 'habilita o botão addall ">> All" se possível End Sub Private Sub EnableButtons() 'habilita os botões ">> All" e "OK" se apropriado AddAllBtn.Enabled = SearchList.ListCount > 0 And OutList.ListCount < ntags OKBtn.Enabled = OutList.ListCount > 0 End Sub Private Sub InfoBtn_Click() MsgBox "Selecione no máximo 16 Tags que você deseje monitorar. Entre os PointSources selecione: K para variáveis da pesquisa, L para variáveis inseridas manualmente, e B para variáveis da engenharia.", vbExclamation, "PI Tag Monitor Help" End Sub Private Sub MoveBtn_Click() If MoveBtn.Caption = "<<" Then movelist OutList, SearchList, -1 ElseIf MoveBtn.Caption = ">>" Then movelist SearchList, OutList, ntags - OutList.ListCount End If End Sub Private Sub moveitem(src As ListBox, dst As ListBox, index As Integer) dst.AddItem src.List(index) dst.ItemData(dst.NewIndex) = src.ItemData(index) src.RemoveItem index End Sub 'Move os itens de uma lista para outra 'Entre com a capacidade = quantidade de linhas na lista destino, -1 se ilimitado Private Sub movelist(src As ListBox, dst As ListBox, ByVal capacity As Integer) Dim index As Integer index = 0 Do While index < src.ListCount If src.Selected(index) Then If capacity = 0 Then src.Selected(index) = 0 index = index + 1 Else moveitem src, dst, index If capacity > 0 Then capacity = capacity - 1 End If End If Else index = index + 1 End If Loop If src.ListCount = 0 Or capacity = 0 Then MoveBtn.Enabled = False End If src.ListIndex = -1 EnableButtons 'habilita o botão addall ">> All" se possível End Sub Private Sub OKBtn_Click() Dim i As Integer 85 For i = 0 To OutList.ListCount - 1 tagname(i) = OutList.List(i) ptno(i) = OutList.ItemData(i) pttype(i) = getPtType(ptno(i)) apistat = pipt_pointtypex(ptno(i), pttypex(i)) Next i For i = OutList.ListCount To ntags - 1 tagname(i) = "" ptno(i) = 0 Next i reconfig = True Hide End Sub Private Sub OutList_Click() If OutList.ListIndex > -1 Then MoveBtn.Caption = "<<" MoveBtn.Enabled = True Else MoveBtn.Enabled = False End If EnableButtons 'habilita o botão addall ">> All" se possível End Sub Private Sub OutList_DblClick() movelist OutList, SearchList, -1 End Sub Private Sub SearchBtn_Click() Dim count As Long Dim found As Long Dim numfound As Long Dim pt As Long Dim src As String Dim status As Long Dim tagmask As String Dim tagname As String * 80 SearchList.Clear tagmask = MaskText.Text count = 0 ProgBar.Width = 0 ProgBar.Visible = True 'pega o primeiro ponto equivalente status = pipt_wildcardsearch(tagmask, 0, found, tagname, Len(tagname), pt, numfound) If status = -1 Or numfound = 0 Then 'nenhum ponto encontrado MsgBox "Nenhum Tag foi encontrado.", vbExclamation, "PI Tag Monitor Message" Exit Sub ElseIf ChkPIstatus("pipt_wildcardsearch", status) <> 0 Then Exit Sub End If If found <> 0 Then 'encontrou pelo menos um ponto Do 'entra em loop até que não encontre mais nenhum ponto count = count + 1 'atualiza a barra de progressão ProgBar.Width = ProgBox.Width * count / numfound src = getptsource(pt) 'are we showing only one source? If ShowOneSource = 0 Or src = SourceText Then SearchList.AddItem tagname 'adiciona a lista SearchList.ItemData(SearchList.NewIndex) = pt 'adiciona o PointNumber também End If status = pipt_wildcardsearch(tagmask, 1, found, tagname, Len(tagname), pt, numfound) If found = 0 Then Exit Do Loop Until ChkPIstatus("pipt_wildcardsearch", status) <> 0 End If ProgBar.Visible = False EnableButtons 'habilita os botões como requerido End Sub Private Sub SearchList_Click() If SearchList.ListIndex > -1 And OutList.ListCount < ntags Then MoveBtn.Caption = ">>" MoveBtn.Enabled = True Else MoveBtn.Enabled = False End If EnableButtons 'habilita os botões como requerido End Sub Private Sub SearchList_DblClick() movelist SearchList, OutList, ntags - OutList.ListCount End Sub Private Sub ShowOneSource_Click() SourceText.Enabled = ShowOneSource.Value End Sub 86 Anexo G – PI Data Insert – Código Fonte do DataInsert Form Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim Dim tagname As String PointNumber As Long PointType As Long i As Integer j As Integer rval As Double bVal As String drVal As Long iVal As Long bSize As Long istat As Long Private Sub AJUDA_Click() MsgBox "Para inserir um novo valor no banco de dados do PI, basta digitar o valor desejado na caixa de texto e clicar em ENVIAR. O formato para data e hora é dd-mmm-yy hh:mm:ss" End Sub Private Sub Atual_Click() Data.Text = FormatTime(pitm_systime()) End Sub Private Sub Enviar_Click() 'rotina responsável por enviar o dado coletado nas caixas de texto 'para o servidor do PI For i = 0 To 19 If i <> 19 Then If Value(i).Text <> "" Then tagname = "U144-" + Var(i).Caption pt = pipt_findpoint(tagname, PointNumber) pt = pipt_pointtypex(PointNumber, PointType) If IsNumeric(Value(i).Text) Then If PointType = 12 Then 'valor real rval = Value(i).Text istat = 0 End If If PointType = 8 Then 'valor inteiro? If Int(Value(i).Text) = Value(i).Text And Int(Value(i).Text) <= 32767 And Int(Value(i).Text) >= 0 Then istat = Value(i).Text rval = 0 Else MsgBox "Um valor INTEIRO é necessário para " & tagname Value(i).Text = "" Value(i).SetFocus Exit Sub End If End If ElseIf PointType <> 105 Then 'inseriu texto, mas é necessário número MsgBox "Um valor NUMÉRICO é necessário para " & tagname Value(i).Text = "" Value(i).SetFocus Exit Sub End If If PointType = 105 Then bVal = Value(i).Text drVal = 0 iVal = 0 bSize = 0 istat = 0 sflag = 0 End If 'string Envia_Ja End If ElseIf Valor.Text <> "" Then tagname = "U144-" + Var(i).Caption pt = pipt_findpoint(tagname, PointNumber) pt = pipt_pointtypex(PointNumber, PointType) bVal = Valor.Text 87 drVal = 0 iVal = 0 bSize = 0 istat = 0 sflag = 0 Envia_Ja End If Next i Wait.Interval = 500 Wait.Enabled = True End Sub Private Sub SAIR_Click() End End Sub Private Sub Wait_Timer() For j = 0 To 19 Confirma(j).FillColor = &H8000000F If j = 19 Then Valor.Text = "" Else Value(j).Text = "" End If Wait.Enabled = False Next j End Sub Private Sub Envia_Ja() If PointType <> 105 Then pitime = parsetime(Data.Text, 0) If pitime <> "" Then If ChkPIstatus("piar_putvalue", piar_putvalue(PointNumber, rval, istat, 0)) = 0 Then unconfirmed = True Confirma(i).FillColor = RGB(0, 255, 0) 'luz verde End If Else MsgBox "Você precisa especificar data e hora a serem inseridos" Data.SetFocus End If End If pitime, If PointType = 105 Then pitime = parsetime(Data.Text, 0) If ChkPIstatus("pisn_putsnapshotx", pisn_putsnapshotx(PointNumber, drVal, iVal, ByVal bVal$, bSize, istat, sflag, pitime)) = 0 Then unconfirmed = True Confirma(i).FillColor = RGB(0, 255, 0) 'luz verde End If End If End Sub 88 Anexo H – Supported Input Point Types (ABB/Bailey Data to PI) Bailey Point Type Description Data Type Bailey Function Code OIS Type Name Extended Attribute 1 Process Variable A note 1 Station No 2 Set Point Read A note 1 Station No 3 Control Output Read A note 1 Station No 4 Ratio Index Read A 80, 23 Station No 5 Analog Read A 30 Analog Yes 6 Station Status D note 1 Station Yes 7 Digital Read D 45 Digital No 14 Module Status D 15 RCM Read D 62 RCM Yes 19 RMSC Read A 68 RMSC Yes 21 4-byte Analog Read A Yes 29 DAANG A Yes 30 ASCII string S No 51 MSDD D 129 Yes 52 DD D 123 Yes 53 RMC D Yes 54 DADIG D Yes 60 Text Selector I No 70 Harmony Analog Input A Yes 71 Harmony Analog Output A Yes 72 Harmony Digital Input D Yes 73 Harmony Digital Output D Yes No 89 Anexo I – Lista Completa de parâmetros do blysem.bat rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem rem BLYSEM.bat OSIsoftware Inc. command file to start the PI/ABB/Bailey semAPI Interface Parameters: Universal Interface parameters (in any order ) /host=X ! specifies host name of PIserver if it is not the default server defined in pilogin.ini. /id=X ! interface ID number, Required /ps=X ! point source for interface. Required /ec=X ! IO rate counter /sn ! Overrides exception reporting to use snapshotting Interface Specific parameters (in any order ) /in=X ! Interface number, should match location1 of PI tags, if not defined, generated from interface ID string. /ici=X ! ABB/Bailey logical ICI number, set to interface ID number if not define /icdb=X ! interface specific debug level, 0 [def] /to=X ! ICI timeout (ICI goes offline after not receiving messages from interface for the timeout period), 90 [def], 0 for no timeout. Maximun timeout is 240 second. Also, interface will restart itself if getting consecutive errors exceeding the timeout period. /fm=X ! failover mode, 0[def] for no failover, 1 for primary, 2 for secondary /fp=X ! failover Primary PCU address. Required for secondary /dl=X ! delay [sec] between ABB/Bailey get exceptions: default one second /me=X ! Max exceptions per iteration: default is 2500 [def] /mp=X ! Max number of points for this interface, 30000 [def] /ef=X ! Exception screening 0=none [def], else 1 /of=X ! Outputs to ABB/Bailey allowed if 1, else 0 [default] /ts=X ! Time sync [0] default no timesync; 1 -> pi master, -1 -> ABB/Bailey master /EVG=X ! Event logger group number for ASCII event /EVT=X ! event logger type number for ASCII event /fv=X /fs=X /rc /hncc ! ! ! ! Analog filter limit (mininum 1000) Analog filter digital status code(positive or negative) Range checking at interface level Must be set if connecting to HNCC and not ICI03 90 Parameter Explanation /FM=0 This option controls the fail-over mode of the interface. Specify /FM=1 for the primary interface and /FM=2 for the secondary interface. Also, for the secondary interface, you need to supply the PCU number of the ICI mode communicating to the primary interface. The details of the fail-over mechanism are described in FailOver Operation section. /TO=90 This option specifies the ICI module watch dog timer. If the interface stops communicating with the ICI module for a period longer than the specified watch dog timer, the ICI module will go off-line, setting all the output points (PI to ABB/Bailey) bad quality. For systems using PI values in the ABB/Bailey control loops, the watch dog timer will prevent old value from being used in the control loop. Also, you should not set the watch dog timer to 0 if the interface is set up as fail over primary interface. Otherwise, the secondary interface will not pick up data collection when the primary interface stops communicating with the ICI module. See the FailOver Operation section for details. /EF =0 This option controls the exception screening behavior of the ICI module. With exception screening option enabled, the INFI90 sends only deviation exceptions, no maximum time exceptions. Though this feature will significantly reduce the communications traffic, it can prevent the PI system from reconstructing the data between two exception reports accurately. For example: if a value changes slowly, then ABB/Bailey would not send the change until the total change exceeded the deviation limit. Therefore, one cannot distinguish a step change from a linear change. Hence, this option is set to 0 by default. The EF option is primarily used for system with mostly digital or discrete data. /TS=0 This option controls the time synchronization behavior between ABB/Bailey and PI systems. Note that the interface cannot change the PI system time if the interface is running on a VMS PINET node or when the interface is running on Windows NT. Also, if the interface is linked to a Data Acquisition version of semAPI, the interface cannot set the time on the ABB/Bailey System. When you specify VMS as the time master, additional configuration is required. The time master of the loop is determined by the time accuracy factor on each node. Hence, you need to set the time accuracy to 15 or greater on the CIU module through the CIU utilities by connecting a terminal to the CIU termination unit. See the CIU manual for details on how to use the CIU utilities. /EVG= and /EVT= Define the Event Logger group and type to be used when ascii data (type 30) is sent to the Event Logger. /FV= and /FS Analog filter parameters. /FV specific a limit. If the analog values from ABB/Bailey is greater than this value, they will be replaced by a digital state code (specified by /FS) by the interface. The FV parameter has to be greater than 1000 to be considered valid by the interface. If /FV is not specific, no analog filter checking will be performed by the interface (even if /FS is specified). If /FS is omitted, the interface will default to NODATA(code 248) as the digital state to substitute the analog value over the filter limit. The Analog filter check is supported starting in version 1.3.1 of the interface. /RC Range Checking enabled at interface level. All analog values above (Zero + Span) will be replaced with digital state OverRange. All analog values below Zero will be replaced with digital state UnderRange. 91