Criando aplicação a partir da Default
Esta secção apresenta passo a passo um roteiro de elaboração de um projeto partindo da Aplicação Default. Para iniciar crie um projeto novo, escolhendo o template de projeto DefaultNewProject. Então entre no projeto e inicia a criação dos demais objetos como detalhado nestes próximos itens.
Criação dos Dicionários
Na criação de tags e tipos de usuário (templates), deve-se definir o dicionário que será usado para traduzir o valor de uma variável para seu estado. Este atributo chamado Parameter é usado nas listas de Alarme. Assim, se o tag de uma proteção vale "1", na lista de alarme será apresentado o texto "ATUADO".
Deve-se assim, criar os dicionários que serão usados para posteriormente criar os templates e tags.
Foram criados os dicionários:
SEL_CHAVE: Estados de chaves de 4 posições;
SEL_PROTECTION: Digitais com frase Normal / Atuado;
DNP_IIN_CMD: Resultado dos comandos DNP (Internal Indication); Se o usuário deseja manter a aplicação em duas línguas, deverá:
Incluir no dicionário Inglês, apresentado na figura abaixo, todos os termos em português que colocar em telas e objetos.
Em todos os objetos com texto usar a propriedade Localization;
Em dinâmicas com texto e em Scripts, no local de textos sempre usar
@Client.Locale("texto") e adicionar o texto ao dicionário Inglês;
Criação dos Templates
Introdução
Na organização de uma nova aplicação, o usuário deve planejar adequadamente os templates. Assim, a título de exemplo, vai-se criar uma aplicação de monitoração de uma subestação com:
Bay de linha;
Bay de transformador;
Bay de alimentador;
Como um bay pode ocorrer mais de uma vez, para cada bay será criado como um template.
Os pontos de cada bay são fornecidos, geralmente, em planilhas Excel e, a partir destas planilhas, deverão ser criados os templates, isto é, é mais fácil adequar à planilha Excel para o formato do ActionNET do que digitar ponto por ponto diretamente nos Tags e Templates.
Estudando os tags de um bay o usuário poderá observar sequências de pontos que se repetem em diferentes bays. Estas sequências, a título de facilitar o trabalho e padronizar tags, devem ser também criadas como templates. Assim, por exemplo, em diferentes bays se tem a mesma
sequência de variáveis analógicas e, para facilitar o trabalho, define-se esta sequência como um template, conforme a figura abaixo:
Template dos Bays
Para gerar o template de um bay, a partir de uma planilha Excel, basta organizar seus pontos de forma idêntica a da Aba de templates. Para criar uma planilha organizada de forma idêntica a Aba de Templates, basta copiar uma linha desta Aba e colá-la em uma planilha Excel, conforme a planilha abaixo gerada a partir do template ANA1.
A partir desta planilha, esvaziam-se as linhas, mantendo o cabeçalho, e depois se deve organizar nossa planilha de pontos dos bays, no formato desta planilha, conforme mostrado na figura abaixo, onde foram colocados os pontos do bay de linha existentes em um relé SEL_311.
Nesta planilha, as células em azul são os pontos originais da planilha de pontos do bay de linha e os pontos em branco correspondem a pontos criados pelo usuário, pelos seguintes motivos:
ANA: corresponde aos pontos analógicos do bay que estão apresentados na figura do item 8.2.1.
ALM_GROUP: é uma variável calculada que deve ser colocada em todos os bays onde se deseja ter um alarme de grupo identificando se este bay tem ou não pelo menos um alarme atuado. Observar que em
Em Category se tem a variável AN_GRUALM_ALM associada.
IIN_VAL e IIN_CMD: são variáveis associadas ao canal DNP3 que serão explicadas mais a frente, quando da criação dos pontos de Entrada e Saída da aplicação.
CB (Circuit Break): foi criado um template para o disjuntor onde estão declaradas a variável de entrada com o estado do disjuntor e as duas variáveis de saída para ligar / desligar o disjuntor;
SC_89-1: Foi criado um template para chaves seccionadoras onde estão declaradas a variável de entrada com o estado da chave e as duas variáveis de saída para ligar / desligar a chave;
As colunas do template usadas são:
Type: Tipo do ponto que no caso são:
Digital (0 ou 1): variáveis digitais de entrada e saída;
AnalogInt: Variáveis digitais discretas são definidas como AnalogInt: estado de disjuntor e seccionadoras (assumem valores entre 0 e 3).
AnalogDouble: Variáveis analógicas são definidas como AnalogDouble.
ANA1: template com todas as variáveis analógicas de um bay.
Parameter: contém o nome do dicionário que converte o valor da variável em um texto;
Retentive: o texto properties indica que no início do programa tanto o valor do Tag como suas propriedades serão iguais aos seus valores quando do encerramento do programa.
Category: o item "7.3.2" trata as categorias existentes na aplicação default e, no caso, criou-se um único tag referente ao alarme de grupo associado a este bay.
Description: texto descritivo do tag.
Assim como se criou o bay associado ao relé SEL_311L (proteção de linha) se deve criar os pontos associados aos relés que coletam pontos dos alimentadores e do transformador.
Criação de Níveis (Assets)
Os Assets (níveis) correspondem à organização dos agrupamentos de pontos da aplicação. Os tags tratados a partir da aplicação default devem ser diferentes de SysInternals que é o agrupamento dos tags usados nas rotinas internas da aplicação Default, para gerar as telas com os diversos relatórios disponibilizados automaticamente:
Histórico de Medidas;
Sumário de Tags;
Sumário de Alarmes;
Sumário de Eventos
Pesquisa a Eventos;
Log de Operação;
Tendência em Tempo Real e Histórica;
Usando NewLevel (botão direito do mouse sobre DefaultNewProject_DNP) definiu-se, conforme figura a seguir, três novos itens de segundo nível, conforme mostra a figura abaixo:
Alimentadores: terá os alimentadores.
Linhas: terá os bays de linha;
Trafos: terá os bays de trafo;
Todos os tags criados deverão estar em um destes níveis.
Criação dos tags de Bays
Para criar os bays da subestação, vai-se para a Aba de Objects e criam-se os bays associando- se seus tipos (Type) aos respectivos templates, conforme a figura abaixo.
Observar que estes tags devem ser do tipo Server (estão no servidor) e não podem estar incluídos no nível SysInternal.
Criação dos Devices
Nesta aplicação exemplo, considera-se que os relés estejam se comunicando com o SCADA através do protocolo DNP 3.0. Para cada protocolo existe um manual específico.
Criação de um Canal DNP3
Na Aba de canais (Channel) cria-se um novo canal chamado "DNP301" usando o protocolo DNP3 com comunicação TCP/IP, conforme figura abaixo:
Neste canal se usa os atributos default, conforme abaixo:
Criação do Nodo
O nodo corresponde ao IED (relé, CLP, UTR, etc.).
Na ABA Node deve-se criar um novo nodo conforme a figura abaixo:
Após, deve-se acertar os atributos do node, clicando na coluna Primary Station.
Criação dos Pontos do Canal / Nodo
A criação dos pontos é feita de forma similar a criação dos templates, isto é, a maneira mais fácil é criar um ponto qualquer na ABA de pontos, exporta-lo para uma planilha Excel e após, a partir da planilha de pontos da aplicação criar uma planilha Excel mantendo a organização da planilha exportada:
TagName | Node | Address | DataType | Modifiers | AccessType | Label | Scaling |
Tag.SEL_LINHA_01.DJ_52A | Node.SEL_311L_01 | Native | AccessType.Read | None |
No manual do protocolo DNP 3 estão as informações sobre como preencher cada coluna de um ponto. Os pontos BI são de entrada digital (Binary Input), os pontos AI são entradas analógicas, os pontos CRO são saídas digitais (Control Relay Output) e os pontos IIN são entradas do tipo Internal Indication do DNP3.
Observações:
Para criar um ponto duplo como no caso das seccionadoras, definiu-se a seccionadora como uma variável AnalogInt, e criou-se dois pontos digitais que correspondem ao Bit0 e Bit1 da seccionadora (linhas 10 e 11 da planilha acima);
As variáveis do tipo IIN (linhas 40 e 41) tem endereço fixo, conforme apresentado no manual do DNP3;
Para executar uma saída deve-se chamar a rotina (Class) AN_TAG com método de inverter o valor da variável de saída:
@Script.Class.AN_Tags.ToggleDigOutput(<tag de saída>);
Sempre que enviar um comando, é interessante colocar uma mensagem no Sumário de Eventos registrando este comando. Para tal execute a ação:
@Alarm.SystemEvents.AddCustomMessage("Mensagem" + txtNome) onde txtNome é o string com o nome da variável comandada.
Criação dos Alarmes
A criação de alarmes, a partir da Aplicação Default, exige que se crie na tabela de Itens de Alarmes uma entrada (Linha) para cada comportamento que deve ser sinalizado. A tabela abaixo mostra o número de entradas que serão criadas em função da situação:
DESCRIÇÃO | LINHAS | CONDITION | GROUPS | OBSERVAÇÕES |
Sinalizar qualquer mudança | 1 | Changed | EVENTOS_BIP | |
Sinalizar diferentemente 0/1 | 2 | Equal 0 | NOACK_BIP | |
Sinalizar diferentemente 0/1 | 2 | Equal 1 | NOACK_BIP | |
Analógica com 1 Limite | 1 | HI / LO | HI_NOACK_BIP ou | Quando normal – Hora |
Analógica com 2 Limite (HI) | 2 | HI | HI_NOACK_BIP | Quando normal – Hora |
Analógica com 2 Limite | 2 | LO | LO_NOACK_BIP | Quando normal – Hora |
Analógica com 4 Limites | 4 | HI | HI_NOACK_BIP | |
Analógica com 4 Limites | 4 | LO | LO_NOACK_BIP | |
Analógica com 4 Limites | 4 | HIHI | HIHI_NOACK_BIP | |
Analógica com 4 Limites | 4 | LOLO | LOLO_NOACK_BIP |
Observações:
Pode-se colocar alarmes de Tags analógicos com dois limites superiores e 2 inferiores.
Quando um dos alarmes está atuado, os Tags são mantidos no Sumário de Alarmes e no de Eventos. Quando os Tags são normalizados, eles saem do Sumário de Alarmes e, no Sumário de Eventos é colocado o horário de sua normalização.
No ActionNET, quando da definição do Sumário de Alarmes, é selecionado o parâmetro "Merge Hi e HIHI" que mantém na lista o alarme de mais importância quando dois alarmes deste tipo estão atuados, isto é, se HIHI está atuado, a linha de HI é inibida e o mesmo ocorre com LO e LOLO.
Há eventos que são armazenados no histórico sempre que ocorre uma mudança de valor. Estes eventos são usados em manobras de equipamentos tais como seccionadora, tap de transformador, etc.
Em tempo de execução, o Sumário de Alarmes apresenta os alarmes que estão atuados no momento.
Já o Sumário de Eventos tem os eventos apresentados em ordem cronológica Eventos analógicos tem seu horário de atuação e normalização sinalizados. Assim, quando um alarme analógico inicia, ele possui apenas o horário de atuação e quando ele encerra, possui os dois horários.
Criação do Histórico de Medidas
Conforme apresentado, na Aplicação Default existe uma tabela (Table1) que é gravada no mínimo a cada minuto e sempre que o tag for alterado. Abaixo é mostrada esta tabela preenchida com todas as variáveis analógicas do bay de linha 01.
Para cada Bay, deve ser repetido procedimento semelhante.
Criação das Telas da Aplicação
Conforme apresentado no capítulo referente a Aplicação Default, já existem nove telas onde oito já estão prontas, ver em "Telas Disponibilizadas".Tela Principal (AN_MainPage)
Na tela principal foram colocadas informações da Linha 01, conforme mostra a figura abaixo:
As quatro retas e o texto Proteções são retângulos e TextOutput, respectivamente, que após serem criados foram agrupados, sem nenhum vínculo à tags;
Os valores das três variáveis analógicas a direita são TextBox associados aos tags das variáveis: potência ativa, reativa e tensão.
As proteções são checkBox, sendo cada uma associada a um tag do bay de linha. Elas são tipo Output (Binding: Outputonly) o que quer dizer que o usuário nunca faz uma entrada no checkbox;
O desenho do bay de linha foi feito com objetos retângulos, círculos e polígonos (seta) que ao final foram agrupados tornando-se um único objeto:
O disjuntor e a seccionadora são Símbolos criados para a aplicação. A seccionadora apresenta a figura de fechado (retângulo vermelho), aberto (reta verde inclinada) e inválido (# assume letra ?).
O disjuntor fica vermelho quando fechado, verde quando aberto e com a bandeirola vermelha ao lado quando impedido. Um clique tanto sobre o disjuntor como a seccionadora abre a tela de comando:
A bandeirola do símbolo DISJ só é visível quando o tag do disjuntor está Disable, conforme mostra a dinâmica abaixo:
O Disjuntor é um botão com quatro dinâmicas: Um clique sobre ele faz duas ações:
Faz que a variável global AN_DISJ_SELECTED seja o disjuntor selecionado:
Tag.AN_DISJ_SELECTED.Link=#TagDJ:(Tag.SEL_LINHA_01.CB.DJ).GetName( )
Chama a janela de comando:
Display.AN_Command.Open()
O mouse sobre o objeto aumenta seu tamanho de 20% e sua opacidade é 0%.
Quando a variável é "0", a cor é verde e quando é "1" a cor é vermelha:
O "X" são duas linhas agrupadas e possuem uma dinâmica que é só aparecer quando a qualidade do tag é diferente de 192 (192 = qualidade OK).
Janela de Comando (AN_Command)
Nesta janela existem três TextOutputs com os textos:
Estado
Condição
Comando Alarme
Os botões de ligar e desligar possuem a dinâmica de Mouse clique (MouseLeftButtonDown) associadas aos Scripts MouseLeftButtonDown1 e MouseLeftButtonDown2, respectivamente, que enviam o comando de Ligar e Desligar para o campo:
Nesta página: