1. Objetivo O Objetivo deste documento mostrar detalhadamente, como construir uma biblioteca, dentro do software Elipse E, para reali!ar a coleta de dados de medidores de ener"ia para o SCDE #Sistema de Coleta de Dados de Ener"ia$ da CCEE #C%mara de Comerciali!a&'o de Ener"ia Eltrica$( 2.Pr-reqisitos Deve ser usada a vers'o )(* do E, atualmente em uso na CCEE( + refer,ncia deste documento de +"osto de )--.( Devem-se ter dispon/veis os se"uintes ar0uivos para a elabora&'o de uma nova biblioteca1 2ib+cesso(2IB 2ib2o"(2IB 2ib3istorico(2IB O driver de comunica&'o utili!ado deve ser baseado no IO4I5 da Elipse, vers'o 6(6, 0ue instalado juntamente com a vers'o )(* do E Build 67-( O Sistema Operacional utili!ado no ambiente da CCEE 8indows )-- Server, S96( !.Cria"#o do Objeto Deve ser criado um ar0uivo 2IB independente a partir do E Studio, e nele inserido um :object #Objeto de Dados$ 0ue ser; respons;vel por fa!er a coleta( Devem ser declaradas 0uatro propriedades para o objeto, conforme e<posto abai<o1 $i%ra 1 & Propriedades obri%at'rias do (Object =o :Object necess;ria a e<ist,ncia de 0uatro objetos descritos abai<o1 $i%ra 2 & Estrtra do (Object > obri"at?rio 0ue todos os objetos acima sejam inseridos no pr?prio :Object e n'o em subdiret?rio( Driver de Comnica"#o O Driver de comunica&'o o m?dulo do E 0ue possibilita a comunica&'o com um determinado e0uipamento usando os drivers com e<tens'o (dll, normalmente fornecidos pela Elipse Software( )edidorCon*i% O objeto @edidorConfi" respons;vel por tratar as informa&Aes de cone<'o com medidor e de status da coleta( Com os dados da propriedade Comm9arams, o driver confi"urado e ativado( +s informa&Aes da propriedade Data9arams s'o separadas uma a uma nas propriedades do pr?prio objeto @edidorConfi"( +o receber a informa&'o 0ue o medidor foi conectado a propriedade 9odeIniciar recebe o valor B5rueC indicando 0ue a rotina de coleta por ser iniciada( 6 Implementando Bibliotecas para o SCDE - CCEE O status da coleta pode ser verificado atravs da propriedade StatusColeta( +o iniciar o processo de coleta essa propriedade recebe o valor -- e assim 0ue a comunica&'o com o medidor for estabelecida, ela recebe o valor -*( Caso ocorra erro de comunica&'o com o medidor ou o tempo de coleta ultrapasse o limite estabelecido StatusColeta recebe o valor -)( Duando a coleta for finali!ada com sucesso, a propriedade recebe o valor 6)( Se for recebido um pedido de status da coleta de um medidor 0ue n'o est; sendo coletado no momento ser; retornado o status -7( +s propriedades do objeto s'o1 +ome ,ipo Descri"#o +cesso@eio Inte"er Indica o retorno de acesso ao meio de comunica&'o Codi"oErro Inte"er C?di"o do Erro Comm9arams Eariant +rraF de par%metros de comunica&'o Conectado Inte"er Indica o status de acesso ao meio de comunica&'o Data3oraGinal Date Data e hora final dos dados a serem coletados Data3oraInicial Date Data e hora inicial dos dados a serem coletados Data9arams Eariant +rraF de par%metros de dados DoisDuadrantes Boolean 5rue1 @edidor )D( Galse1 @edidor HD Envia-* Boolean Envia o Status de Coletando EnviaDadosColeta Boolean Gim de Coleta( Envia os dados da coleta GimColeta Boolean Indica o fim de coleta Ginali!ouComErro Boolean Indica se a coleta terminou com erro ou n'o 3oraInicioColeta Date 3ora 0ue iniciou a coleta I9 Strin" I9 do medidor @eioGisico Strin" @eio f/sico de comunica&'o #Ethernet, @odem, I+S, Serial$ =umero@+E Strin" C?di"o @+E do medidor =umeroSerie Strin" =umero de serie do medidor 9odeIniciar Boolean Indica se pode iniciar a coleta 9orta 8ord 9orta de cone<'o do medidor IesCol 2on" =Jmero da re0uisi&'o da coleta StatusColeta Inte"er -- #iniciou$, -) #finali!ou com erro$, -* #coletando$, -7 #sem coleta$ ou 6) #finali!ou O4$ Status9arams Eariant Ietorno da tentativa de estabelecimento de comunica&'o Status:@2 Eariant +r0uivo :@2 com os c?di"os de erro da comunica&'o 5elefone Strin" 5elefone do medidor 5ipoColeta Strin" Descri&'o do 5ipo de Coleta 5pComp9erdas Inte"er 5ipo de compensa&'o de perdas habilitado para o medidor ,abela 1 & Propriedades do )edidorCon*i% -o% O objeto 2o" respons;vel por padroni!ar os lo"s da coleta( 9ossui passos pr-definidos sendo al"uns obri"at?rios em todas as bibliotecas e outros opcionais( 5ambm poss/vel inserir te<tos n'o definidos na biblioteca( +s propriedades do objeto s'o1 +ome ,ipo Descri"#o +r0uivo Eariant Objeto +r0uivo #uso interno$ ComErro Boolean Informa se a coleta finali!ou com erro DataGinal Date Data e hora final da coleta DataInicial Date Data e hora inicial da coleta Diretorio Strin" Diretorio onde o lo" ser; criado Krava Boolean Escreve uma linha no lo" ) Implementando Bibliotecas para o SCDE - CCEE +ome ,ipo Descri"#o =ome2o" Strin" =ome do ar0uivo 5:5 9asso Inte"er 9asso da coleta 5e<to Strin" 5e<to a ser escrito ,abela 2 & Propriedades do objeto -o% obj.istorico O objeto obj3istorico utili!ado para criar o ar0uivo <ml( 5odos os dados coletados devem ser passados a este objeto( +s propriedades do objeto s'o detalhadas no item H(*( /.Con*i%ra"#o 4.1. Driver de Comunicao +ome O nome desse objeto obri"atoriamente BDriver6C( Protocolo 9ara determinar o protocolo de comunica&'o a ser usado, basta clicar na propriedade DriverLocation e locali!ar o ar0uivo dll( )eio $0sico +s confi"ura&Aes do driver s'o feitas em e<ecu&'o atravs do objeto @edidorConfi" da biblioteca 2ib+cesso( +o ser criado, o objeto medidor recebe as informa&Aes referentes L coleta e o meio f/sico nas propriedades Comm9arams e Data9arams( Essas informa&Aes devem ser passadas ao objeto @edidorConfi"( =o evento +fterStart#$ do driver, insira o se"uinte script1 Parent.Item("MedidorConfig1").CommParams = Parent.CommParams Parent.Item("MedidorConfig1").DataParams = Parent.DataParams 1rqivo de -o% do driver =a janela de confi"ura&Aes do driver , acesse a aba Setup e desabilite a cria&'o do ar0uivo de lo"( O ar0uivo de lo" ser; criado em uma pasta espec/fica para esse protocolo e o nome do lo" ter; a data do dia da coleta( =o evento +fterStart#$, insira o se"uinte script1 'NomeLog Dim Comm_arr(2) MyDate=Now NomeData=ig!t("""#Day(MyDate)$2)#ig!t(""" # Mont!(MyDate)$2) # C%tr(&ear(MyDate)) Comm_arr(1)='rray("I(.Log.)i*eName"$"+,-+.Logs-NomeProto/o*o-Dri0er"#Parent.Name#"_ "#NomeData#".*og") Comm_arr(2) = 'rray("I(.Log.+na1*e"$tr2e) 3rite 41$ "$ "$ .$ Comm_arr 4.2. Tags de Comunicao Os ta"s de comunica&'o s'o criados conforme a necessidade do protocolo, sendo obri"at?rios dois ta"s1 StatsComnicacao StatusComunicacao um bloco de comunica&'o de H elementos com a confi"ura&'o1 #-6,-,-,6$ ( Este bloco retorna eventos do driver "erados por v;rias fontes do IO4it #veja +p,ndice I M Eventos do IO4it para a lista de todos os eventos "erados pelo IO4it$ e apenas leitura( + propriedade timestamp do bloco informa o instante 0ue o evento ocorreu(
Implementando Bibliotecas para o SCDE - CCEE
+s informa&Aes obtidas por esse bloco, devem ser passadas para a propriedade Status9aram do objetos @edidorConfi"( =o evento OnIead do bloco, crie o se"uinte script1 dim %tat2s_Comm(5) %tat2s_Comm(1) = Item("6y7e").8a*2e %tat2s_Comm(2) = Item("%o2r/e").8a*2e %tat2s_Comm(.) = Item("Code").8a*2e %tat2s_Comm(5) = Item("Message").8a*2e (9:.Item("MedidorConfig1").%tat2sParam = %tat2s_Comm Onde OBN o nome do :Object criado( 1cesso)eio +cesso@eio um ta" de comunica&'o com a confi"ura&'o #-6,-,-,H$ 0ue informa o status atual do driver1 OGG2I=E ou O=2I=E( 4.3. MedidorConfig Crie uma associa&'o na propriedade +cesso@eio com a propriedade Ealue do ta" +cesso@eio para informar para o objeto @edidorConfi" o status do n/vel f/sico da comunica&'o1 $i%ra ! & -in2 com a propriedade 1cesso)eio 9ara sinali!ar o fim da coleta, crie uma associa&'o na propriedade GimColeta do @edidorConfi" com a propriedade GimColeta do :Object( $i%ra / - -in2 com a propriedade $imColeta + associa&'o com a propriedade GimColeta obri"atoriamente bidirecional pois o objeto @edidorConfi" pode for&ar o fim da coleta por e<cesso de tempo ou 0ueda na comunica&'o( Informe na propriedade =umeroSerie o ta" de comunica&'o 0ue retorna o numero serial do medidor( Essa informa&'o ser; e<ibida na interface "r;fica( $i%ra 3 & -in2 com a propriedade +meroSerie +s demais informa&Aes s'o recebidas atravs dos scripts feitos no objeto driver( 4.4. Log O objeto 2o" precisa das informa&Aes do objeto @edidorConfi"1 Ginali!ouComErro, Data3oraInicial e Data3oraGinal( Crie as associa&Aes necess;rias como mostra a fi"ura abai<o1 $i%ra 4 & -in2s obri%at'rios do obj-o% Confi"ure a propriedade Diret?rio com o nome do diret?rio criado na pasta E1OE2o"s para arma!enar os lo"s referentes L coleta desse objeto( Durante a l?"ica da coleta, devem ser acrescentadas linhas de scripts informando o passo da coleta conforme a 5abela ( Passo )ensa%em Obri"at?rios 6 Iecebe par%metros de confi"ura&'o ) Gim da coleta O4 Gim da coleta com Erro Erro de comunica&'o H Intervalo de Coleta1 P DataInicial P a P DataGinal H Implementando Bibliotecas para o SCDE - CCEE Passo )ensa%em 9ar%metros 6- Iniciou Coleta de 9ar%metros 66 5erminou Coleta de 9ar%metros 6) Kravou 9ar%metros 6 =Jmero @+E 6H =Jmero Serial 6* Iela&'o do 5ransformador 67 9er/odo de inte"ra&'o 6. +certo de rel?"io 6Q Iela&'o 59 6R Iela&'o 5C Ener"ia )- Iniciou Coleta de Ener"ia )6 5erminou Coleta de Ener"ia Eventos - Iniciou Coleta de Eventos 6 5erminou Coleta de Eventos Dualidade H- Iniciou Coleta de Dualidade H6 5erminou Coleta de Dualidade En"enharia *- Iniciou Coleta de En"enharia *6 5erminou Coleta de En"enharia Interrup&'o 7- Iniciou Coleta de Interrup&Aes 76 5erminou Coleta de Interrup&Aes ,abela ! & Passos de coleta Passos obri%at'rios Passo 15 Evento +fterStart#$ do Driver6 'L(;, e/e1e 7ar<metros de /onfig2ra=>o Parent.Item("Log1").Passo = 1 Passo 25 =o evento OnGimColetaChan"ed#$ da propriedade GimColeta do :Object if )imCo*eta t!en 'Log, )im da Co*eta Item("Log1").Passo = 2 end if Passo !5 Evento OnCommError do Driver 'Log, +rro de /om2ni/a=>o Parent.Item("Log1").Passo = . Passo /5 Dual0uer evento ap?s a propriedade 9odeIniciar do @edidorConfi" estiver em 5rue 'Log, Inter0a*o de /o*eta Parent.Parent.Item("Log1").Passo=5 9ara escrever um te<to 0ue n'o est; definido em um passo, basta inserir na propriedade 5e<to e em se"uida for&ar a propriedade Krava para 5rue( E<emplo1 Log.6e?to = @(L'A Log.;ra0a = 6r2e 4.5. Objis!"rico O objeto obj3istorico deve receber os valores 0ue ser'o inseridos no ar0uivo <ml( Os valores podem ser passados atravs de scripts ou associa&Aes( +s bibliotecas desenvolvidas para medidores de dois 0uadrantes devem dei<ar a propriedade DoisDuadrantes em 5rue( * Implementando Bibliotecas para o SCDE - CCEE 9ara "ravar um re"istro, deve-se for&ar para 5rue a propriedade Krava correspondente1 Krava+larmes KravaEner"ia KravaEner"iaComp KravaEn"enharia Krava9arametros KravaDualidade Cada propriedade Krava, insere um re"istro numa se&'o espec/fica do <ml, sendo 0ue os valores "ravados s'o a0ueles 0ue est'o nas propriedades do obj3istorico( 1larmes Propriedade ,ipo Descri"#o @=SInte"racaoS+larmes Date5ime 5imeStamp #obri"at?rio$ =umeroS9rioridade Double 9rioridade do alarme CDSCausa 5e<to C?di"o numrico do alarme DSSCausa 5e<to Descri&'o do alarme CDSEfeito 5e<to C?di"o numrico do detalhamento do alarme DSSEfeito 5e<to Descri&'o do detalhamento do alarme ,abela / & Dados de Eventos + propriedade =umeroS9rioridade s? ser; "ravada se for diferente de -( +s demais propriedades ser'o inseridas no :@2 se forem diferentes de va!io( Ener%ia Propriedade ,ipo Descri"#o @=SInte"racaoSEner"ia Date5ime 5imeStamp #obri"at?rio$ +tivaIn Double Ener"ia +tiva recebida #T8h$ +tivaOut Double Ener"ia +tiva fornecida #T8h$ IeativaIn Double Ener"ia reativa recebida #TE+rh$ IeativaOut Double Ener"ia reativa fornecida #TE+rh$ ,abela 3 & Dados de Ener%ia 9ara os medidores de dois 0uadrantes, ser'o "ravados apenas os campos +tivaIn e IeativaIn( 9ara os medidores de 0uatro 0uadrantes ser'o inseridos todos os campos( Ener%ia Compensada Propriedade ,ipo Descri"#o @=SInte"racaoSEner"iaComp Date5ime 5imeStamp #obri"at?rio$ +tivaInComp Double Ener"ia +tiva recebida com compensa&'o de perdas #T8h$ +tivaOutComp Double Ener"ia +tiva fornecida com compensa&'o de perdas #T8h$ IeativaInComp Double Ener"ia reativa recebida com compensa&'o de perdas #TE+rh$ IeativaOutComp Double Ener"ia reativa fornecida com compensa&'o de perdas #TE+rh$ ,abela 4 - Dados de Ener%ia Compensada 9ara os medidores de dois 0uadrantes, ser'o "ravados apenas os campos +tivaInComp e IeativaInComp( 9ara os medidores de 0uatro 0uadrantes ser'o inseridos todos os campos( En%en6aria Propriedade ,ipo Descri"#o @=SInte"racaoSEn"enharia Date5ime 5imeStamp #obri"at?rio$ 7 Implementando Bibliotecas para o SCDE - CCEE Propriedade ,ipo Descri"#o 5ensaoGase+ Double 5ens'o prim;ria fase + #Eolts$ 5ensaoGaseB Double 5ens'o prim;ria fase B #Eolts$ 5ensaoGaseC Double 5ens'o prim;ria fase C #Eolts$ CorrenteGase+ Double Corrente prim;ria fase + #+mpere$ CorrenteGaseB Double Corrente prim;ria fase B #+mpere$ CorrenteGaseC Double Corrente prim;ria fase C #+mpere$ ,abela 7 & Dados de En%en6aria 5odos os campos s'o inseridos no ar0uivo :@2 de coleta( Par8metros Propriedade ,ipo Descri"#o =umeroSerie 5e<to =Jmero de srie do medidor ID@+E 5e<to C?di"o do medidor no SCDE #6H d/"itos$ ID@+ES9edidoColeta 5e<to C?di"o do medidor no SCDE recebido no pedido de coleta Ielacao599ri Double 5ens'o 9rim;ria do 59 parametri!ada no medidor #Eolts$ Ielacao59Sec Double 5ens'o Secund;ria do 59 parametri!ada no medidor #Eolts$ Ielacao5C9ri Double Corrente 9rim;ria do 5C parametri!ada no medidor #+mpere$ Ielacao5CSec Double Corrente Secund;ria do 5C parametri!ada no medidor #+mpere$ CteInte"racaoEner"ia Double Intervalo de re"istro da ener"ia #se"undos$ CteInte"racaoEner"iaComp Double Intervalo de re"istro da ener"ia compensada #se"undos$ CteInte"racaoEn"enharia Double Intervalo de re"istro da 5ens'o e Corrente #se"undos$ Ielacao59 Double Iela&'o do 59 parametri!ada no medidor Ielacao5C Double Iela&'o do 5C parametri!ada no medidor ,abela 9 & Dados de Par8metros Os campos =umeroSerie, ID@+E, ID@+ES9edidoColeta e as CteInte"racao #Ener"ia, Ener"iaComp e En"enharia$ sempre ser'o "ravados( Os demais campos ser'o inseridos apenas se forem diferentes de -( :alidade Propriedade ,ipo Descri"#o @=SInte"racaoSDualidade Date5ime 5imeStamp #obri"at?rio$ DuracaoDisturbio Double Durao em milisegundos (ms) do evento Swell6 Double Tenso mxima ocorrida na fase A (fase-neutro) em valores primrios (volts com 2 casas decimais), no caso de um S!"" Sa"6 Double Tenso m#nima ocorrida na fase A (fase-neutro) em valores primrios (volts com 2 casas decimais), no caso de um SA$ Swell) Double Tenso mxima ocorrida na fase % (fase-neutro) em valores primrios (volts com 2 casas decimais), no caso de um S!"" Sa") Double Tenso m#nima ocorrida na fase % (fase-neutro) em valores primrios (volts com 2 casas decimais), no caso de um SA$ Swell Double Tenso mxima ocorrida na fase & (fase-neutro) em valores primrios (volts com 2 casas decimais), no caso de um S!"" Sa" Double Tenso m#nima ocorrida na fase & (fase-neutro) em valores primrios (volts com 2 casas decimais), no caso de um SA$ Disturbio=ominal Double 'alor da tenso de refer(ncia (fase-neutro) em valores primrios (volts com 2 casas decimais) parametri)ada no medidor . Implementando Bibliotecas para o SCDE - CCEE Propriedade ,ipo Descri"#o 2imiteSa" Double 'alor da tenso m#nima (fase-neutro) em valores primrios (volts com 2 casas decimais) parametri)ada no medidor 2imiteSwell Double 'alor da tenso mxima (fase-neutro) em valores primrios (volts com 2 casas decimais) parametri)ada no medidor ,abela ; & Dados de :alidade 5odos os campos s'o inseridos no ar0uivo :@2 de coleta( 3.Coleta dos Dados O E a"uarda um pedido de coleta atravs do m?dulo Driver:@2( +o receber um pedido criado em e<ecu&'o o objeto do tipo do protocolo pedido e passado a ele todas as informa&Aes necess;rias para conectar ao medidor e e<ecutar a coleta( + cria&'o do objeto ocorre dentro do m?dulo Driver:@2 e para cada novo objeto inserido no sistema, o m?dulo dever; ter o script modificado para receber o novo medidor( +s informa&Aes referentes ao meio f/sico, s'o passadas atravs do vetor CommSarr1 Dim Comm_arr(B) Comm_arr(1) = 'rray("I(.6y7e"$iMeio)isi/o) Comm_arr(2) = 'rray("I(.+t!ernet.MainIP"$IPMdr) Comm_arr(.) = 'rray("I(.+t!ernet.MainPort"$PortMdr) Comm_arr(C) = 'rray(Medidor'ddress%tring$address) Comm_arr(5) = 'rray("I(.%eria*.9a2date"$DE"") Comm_arr(E) = 'rray("I(.'%.Fs2arioPPP"$Fs2arioPPP) Comm_arr(G) = 'rray("I(.'%.%en!aPPP"$%en!aPPP) Comm_arr(B) = 'rray("I(.'%.PortaC(M"$PortaC(M) E as informa&Aes referentes L coleta s'o passados atravs do vetor dataSarr1 Dim data_arr(B) data_arr(1) = esCo* data_arr(2) = N2meroMae data_arr(.) = 6i7oCo*eta data_arr(5) = 'ddress data_arr(C) = DoisH2adrantes data_arr(E) = Com7Perdas data_arr(G) = DataIni data_arr(B) = Data)im Depois de criado, o objeto medidor recebe nas propriedades Comm9arams e Data9arams os vetores CommSarr e dataSarr, respectivamente( o1IMedidor.CommParams = Comm_arr o1IMedidor.DataParams = data_arr Esses dados ser'o passados ao driver de comunica&'o atravs do script mencionado no item H(6( Os status da cone<'o ser'o capturados pelo objeto @edidorConfi"( + coleta dos dados s? pode ser iniciada depois 0ue a propriedade 9odeIniciar do objeto @edidorConfi" estiver em 5rue( O primeiro passo coletar os dados de par%metros( +p?s a coleta dos par%metros, coletam-se os eventos e em se"uida deve-se verificar o tipo da coleta informado na propriedade 5ipoColeta do @edidorConfi"1 ,ipoColeta Si%ni*icado Ener%ia En%en6aria :alidade )E @edi&'o : : -- )E<:EE @edi&'o e Dualidade : : : :EE Dualidade -- -- : 1=D +uditoria : -- -- ,abela 1> & ,ipo de Coleta + Jltima etapa verificar o hor;rio do medidor e "ravar a informa&'o no lo" da coleta( Q Implementando Bibliotecas para o SCDE - CCEE 5.1. #ar$me!ros Coletar, se poss/vel1 6( =umero @+E #ID@+E$ )( =Jmero Serial #=umeroSerie$ ( 5ens'o prim;ria do 59 #Ielacao599ri$ H( 5ens'o secund;ria do 59 #Ielacao59Sec$ *( Corrente prim;ria do 5C #Ielacao5C9ri$ 7( Corrente secund;ria do 5C #Ielacao5CSec$ .( Iela&'o do 59 #Ielacao59$ Q( Iela&'o do 5C #Ielacao5C$ R( Ealor da constante de inte"ra&'o de Ener"ia #CteInte"racaoEner"ia$ 6-( Ealor da constante de inte"ra&'o de Ener"ia Compensada#CteInte"racaoEner"iaComp$ 66( Ealor da constante de inte"ra&'o de En"enharia #CteInte"racaoEn"enharia$ Os campos 6 e ) s'o obri"at?rios( +p?s verificar 0ue possui todos os dados de par%metros poss/veis, e<ecutar o script1 o1IJist.;ra0aParametros = tr2e onde obj3ist o objeto obj3istorico inserido na biblioteca( 5.2. %nergia +o "ravar os dados de ener"ia, deve-se verificar a propriedade 5pComp9erdas do objeto @edidorConfi"( Essa propriedade informa os tipos de ener"ia 0ue devem ser "ravadas1 ,pCompPerdas Descri"#o Ener%ia Compensada 2>>1 Ener"ia n'o compensada : -- 2>>2 Ener"ia compensada -- : 2>>! Ener"ia Bruta U Ener"ia 2/0uida : : ,abela 11 & Compensa"#o de Perdas E<emplo1 'Jistori/o +nergia if 67Com7Perdas=2""1 ( 67Com7Perdas=2"". t!en o1IJist.;ra0a+nergia = 6r2e end if 'Jistori/o +nergia Com7ensada if 67Com7Perdas=2""2 ( 67Com7Perdas=2"". t!en o1IJist.;ra0a+nergiaCom7 = 6r2e end if onde obj3ist o objeto obj3istorico inserido na biblioteca( 5.3. %ngen&aria Karantir 0ue os dados de tens'o e corrente sejam "ravados na unidade certa( 9ode-se, por e<emplo, criar e<pressAes nos campos de associa&'o( $i%ra 7 & -in2 com as propriedades de tens#o de *ase E<emplo1 'Dados de +ngen!aria o1IJist.;ra0a+ngen!aria = 6r2e onde obj3ist o objeto obj3istorico inserido na biblioteca( R Implementando Bibliotecas para o SCDE - CCEE 5.4. %ven!os Coletar todos os eventos e<istentes na mem?ria de massa( Os dados de alarmes n'o s'o obri"at?rios( E<emplo1 'Dados de a*armes o1IJist.;ra0a'*armes = 6r2e onde obj3ist o objeto obj3istorico inserido na biblioteca 5.5. 'ua(idade Coletar os dados de 0ualidade referentes ao intervalo pedido( Os campos de Dualidade n'o s'o obri"at?rios( E<emplo1 'Dados de K2a*idade o1IJist.;ra0aH2a*idade = 6r2e onde obj3ist o objeto obj3istorico inserido na biblioteca 5.). or*rio do Medidor Se"uir os se"uintes passos1 2er o hor;rio no medidorV Eerificar se est; defasado em mais de 7- se"undos em rela&'o ao servidor e inserir no lo" a informa&'o da hora e se est; ou n'o defasadoV Ginali!ar coleta( 4.E?emplo ).1. Configurao do +Objec! =a pasta C1OE@+E criar uma nova aplica&'o do tipo Bibliotecas de componentes do E chamada 2ibE<emplo e inserir um :Object chamado OBN( =o OBN, criar 0uatro propriedades conforme mostrado na Gi"ura Q( $i%ra 9 & Propriedades do OB@ =o Studio, abrir os projetos 2ib+cesso(lib, 2ib3istorico(lib e 2ib2o"(lib( Inserir 0uatro objetos no :Object1 Driver de comunica&'o, 2o", @edidorConfi" e obj3istorico( $i%ra ; & Estrtra do OB@ 6- Implementando Bibliotecas para o SCDE - CCEE ).2. Driver de Comunicao 9ara determinar o protocolo de comunica&'o a ser usado, deve ser selecionada na propriedade DriverLocation o ar0uivo dll( Se a propriedade DriverName for preenchida automaticamente, o driver foi carre"ado com sucesso( =a janela de confi"ura&Aes do driver , acessar a aba Setup e confi"urar o nJmero de retentativas de cone<'o e habilitar a op&'o BStart driver OGG2I=EC( Essa ultima op&'o necess;ria para poder alterar os par%metros de cone<'o em e<ecu&'o( $i%ra 1> & 1ba Setp das con*i%ra"Aes do driver 9ara 0ue as confi"ura&Aes do driver sejam feitas em e<ecu&'o atravs do objeto @edidorConfi", deve ser passado as informa&Aes recebidas nas propriedades Comm9arams e Data9arams para este objetos atravs de script( =o evento +fterStart#$, inserir o se"uinte script1 'NomeLog Dim Comm_arr(2) MyDate=Now NomeData=ig!t("""#Day(MyDate)$2)#ig!t(""" # Mont!(MyDate)$2) # C%tr(&ear(MyDate)) Comm_arr(1)='rray("I(.Log.)i*eName"$"+,-+.Logs-NomeProto/o*o-Dri0er"#Parent.Name#"_ "#NomeData#".*og") Comm_arr(2) = 'rray("I(.Log.+na1*e"$tr2e) 3rite 41$ "$ "$ .$ Comm_arr Parent.Item("MedidorConfig1").CommParams = Parent.CommParams Parent.Item("MedidorConfig1").DataParams = Parent.DataParams 'L(;, e/e1e 7ar<metros de /onfig2ra=>o Parent.Item("Log1").Passo = 1 ).3. Tags de Comunicao E<istem dois ta"s 0ue s'o obri"at?rios1 o StatusComunicacao, 0ue um bloco de comunica&'o de H elementos com a confi"ura&'o1 #-6,-,-,6$ e o +cesso@eio, 0ue um ta" de comunica&'o com a confi"ura&'o #-6,-,-,H$( +s leituras dos ta"s ficam habilitadas e as escritas desabilitadas( Ienomear os elementos do bloco StatusComunicacao para facilitar os scripts( 66 Implementando Bibliotecas para o SCDE - CCEE $i%ra 11 & ,a%s de comnica"#o obri%at'rios 9ara passar as informa&Aes obtidas pelo bloco StatusComunicacao para a propriedade Status9aram do @edidorConfi", criar no evento OnIead do pr?prio bloco o script abai<o1 dim %tat2s_Comm(5) %tat2s_Comm(1) = Item("6y7e").8a*2e %tat2s_Comm(2) = Item("%o2r/e").8a*2e %tat2s_Comm(.) = Item("Code").8a*2e %tat2s_Comm(5) = Item("Message").8a*2e Parent.Parent.Item("MedidorConfig1").%tat2sParam = %tat2s_Comm Os ta"s de comunica&'o s'o criados conforme a necessidade do protocolo( +s confi"ura&Aes de cada ta" s'o e<plicadas no manual do driver( Supondo 0ue o driver tenha a se"uinte estrutura1 $i%ra 12 - Estrtra do driver de comnica"#o Cada pasta contm al"uns ta"s espec/ficos1 $i%ra 1! - ,a%s da pasta Par8metros $i%ra 1/ - ,a%s da pasta Ener%ia 6) Implementando Bibliotecas para o SCDE - CCEE $i%ra 13 - ,a%s da Pasta En%en6aria $i%ra 14 - ,a%s da pasta Eventos $i%ra 17 - ,a%s da pasta :alidade $i%ra 19 & ,a%s da pasta Bel'%io ).4. MedidorConfig O objeto @edidorConfi" precisa de duas informa&Aes1 o status do n/vel f/sico da comunica&'o e se a coleta finali!ou( Como esses dados est'o no ta" +cesso@eio e na propriedade GimColeta do OBN, criar associa&Aes para passar estas informa&Aes( 9ara 0ue a interface "r;fica e<iba o nJmero de srie coletado do medidor, necess;rio passar essa informa&'o para o @edidorConfi"( 6 Implementando Bibliotecas para o SCDE - CCEE $i%ra 1; - 1ssocia"Aes do objeto )edidorCon*i% ).5. Log Crie um diret?rio na pasta E1OE2o"s com o nome do protocolo para arma!enar os lo"s referentes L coleta desse objeto( O obj2o" necessita das associa&Aes mostradas na Gi"ura )- e 0ue seja confi"urada a propriedade Diret?rio com o nome da pasta criada( $i%ra 2> & 1ssocia"Aes do obj-o% +p?s confi"urar o obj2o", adicionar os scripts para re"istrar no ar0uivo de lo" os passos obri"at?rios1 Passo 15 =o evento +fterStart#$ do Driver6, adicionar mais duas linhas 'L(;, e/e1e 7ar<metros de /onfig2ra=>o Parent.Item("Log1").Passo = 1 Passo 25 =o evento OnGimColetaChan"ed#$ da propriedade GimColeta do OBN, criar o script1 if )imCo*eta t!en 'Log, )im da Co*eta Item("Log1").Passo = 2 end if Passo !5 =o evento OnCommError do Driver1 'Log, +rro de /om2ni/a=>o Parent.Item("Log1").Passo = . Passo /5 Dual0uer evento ap?s a propriedade 9odeIniciar do @edidorConfi" estiver em 5rue #e<emplo na se&'o 7(. $ 'Log, Inter0a*o de /o*eta Parent.Parent.Item("Log1").Passo=5 ).). Objis!"rico =o objeto obj3istorico associar os ta"s 0ue passar'o os valores 0ue ser'o inseridos no ar0uivo <ml com as suas respectivas propriedades( E<emplo1 $i%ra 21 & E?emplo de associa"Aes do obj.istorico ='o se es0uecer de confi"urar corretamente os campos ID@+E( + propriedade ID@+ES9edidoColeta deve receber a informa&'o do c?di"o do medidor informado no pedido da coleta e a propriedade ID@+E deve informar o c?di"o lido do medidor( $i%ra 22 & E?emplo de associa"Aes 6H Implementando Bibliotecas para o SCDE - CCEE ).,. Co(e!a dos dados 9ara facilitar a l?"ica, criar no OBN um Servidor de Dados chamado IotinasColeta e dentro dele um ta" interno chamado @ascaraColeta 0ue possui valor inicial i"ual a -( 5oda a l?"ica de coleta ser; escrita neste ta" e as informa&Aes de cada passo ser'o inseridas no ar0uivo de lo" atravs do objeto 2o"6( $i%ra 2! - Estrtra do OB@ + coleta s? pode ser iniciada depois 0ue a propriedade 9odeIniciar do objeto @edidorConfi" estiver em 5rue( Crie um ta" Interno na pasta IotinasColeta chamado IniciaColeta #valor inicial i"ual a Galse$ e no objeto @edidorConfi", crie uma associa&'o reversa na propriedade 9odeIniciar com o ta" IniciaColeta( $i%ra 2/ =o ta" IniciaColeta, crie um evento de usu;rio 0ue ocorre 0uando o valor do ta" for 5rue( neste evento, force o valor do ta" @ascaraColeta para 61 %21 Ini/iaCo*eta_PodeIni/iar() 'Log, Inter0a*o Co*eta Parent.Parent.Item("Log1").Passo = 5 'Mas/ara Co*eta Parent.Item("Mas/araCo*eta").8a*2e = 1 +nd %21 + coleta dos dados come&a com a leitura dos par%metros( Duando o ta" @ascaraColeta for i"ual a 6, habilitar a leitura dos ta"s de par%metros( Crie no ta" um novo evento chamado OnChan"e 0ue ocorre toda ve! 0ue o seu valor for alterado1 6* Implementando Bibliotecas para o SCDE - CCEE $i%ra 23 - Evento OnC6an%e do ta% )ascaraColeta =o evento OnChan"e, inserir1 set Dri0er = Parent.Parent.Item("Dri0er1") set MedidorConfig = Parent.Parent.Item("MedidorConfig1") set o1ILog = Parent.Parent.Item("Log1") se*e/t /ase 8a*2e Case 1 'Leit2ra de 7ar<metros for ea/! 6ag in Dri0er.Item("Parametros") 6ag.'**owead = 6r2e Ne?t 'Log, Ini/io /o*eta de 7ar<metros o1ILog.Passo = 1" Crie um se"undo ta" interno chamado 2eu9arametros para verificar se todos os ta"s da pasta par%metros j; foram lidos( =o evento OnIead de cada ta" da pasta 9ar%metros, for&ar um bit do ta" 2eu9arametros( =umero@+ESOnIead#$ set Le2Parametros= Parent.Parent.Parent.Item("otinasCo*eta").Item("Le2Parametros") Le2Parametros.8a*2e = Le2Parametros.8a*2e ( 1 'Log, NLmero M'+ Parent.Parent.Parent.Item("Log1").Passo = 1. =umeroSerialSOnIead#$ set Le2Parametros= Parent.Parent.Parent.Item("otinasCo*eta").Item("Le2Parametros") Le2Parametros.8a*2e = Le2Parametros.8a*2e ( 2 'Log, NLmero %eria* Parent.Parent.Parent.Item("Log1").Passo = 15 Ielacao59SOnIead#$ set Le2Parametros= Parent.Parent.Parent.Item("otinasCo*eta").Item("Le2Parametros") Le2Parametros.8a*2e = Le2Parametros.8a*2e ( 5 'Log, e*a=>o 6P Parent.Parent.Parent.Item("Log1").Passo = 1B Ielacao5CSOnIead#$ set Le2Parametros= Parent.Parent.Parent.Item("otinasCo*eta").Item("Le2Parametros") Le2Parametros.8a*2e = Le2Parametros.8a*2e ( B 'Log, e*a=>o 6C Parent.Parent.Parent.Item("Log1").Passo = 1D CteEner"iaSOnIead#$ set Le2Parametros= Parent.Parent.Parent.Item("otinasCo*eta").Item("Le2Parametros") Le2Parametros.8a*2e = Le2Parametros.8a*2e ( 1E 67 Implementando Bibliotecas para o SCDE - CCEE CteEner"iaCompSOnIead#$ set Le2Parametros= Parent.Parent.Parent.Item("otinasCo*eta").Item("Le2Parametros") Le2Parametros.8a*2e = Le2Parametros.8a*2e ( .2 CteEn"enhariaSOnIead#$ set Le2Parametros= Parent.Parent.Parent.Item("otinasCo*eta").Item("Le2Parametros") Le2Parametros.8a*2e = Le2Parametros.8a*2e ( E5 Duando o ta" 2eu9arametros for i"ual a 6)., si"nifica 0ue todos os par%metros foram lidos e podem ser inseridos no <ml( =o ta" 2eu9arametros, criar um evento de usu;rio chamado 5erminou9arametros 0ue ocorre 0uando o Ealue do ta" i"ual a 6).( $i%ra 24 - Evento ,erminoParametros criado pelo sCrio =o evento 5erminou9arametros "ravar os par%metros e for&ar o ta" @ascaraColeta para )1 ';ra0a Par<metros Parent.Parent.Item("o1IJistori/o1").;ra0aParametros = 6r2e 'Log, ;ra0o2 7ar<metros Parent.Parent.Item("Log1").Passo = 12 'PrM?ima /o*eta Parent.Item("Mas/araCo*eta").8a*2e = 2 +p?s a coleta dos par%metros, coleta-se os eventos( Inserir al"umas linhas no evento OnChan"e do ta" @ascaraColeta para habilitar a leitura dos dados de eventos Case 2 'Log, 6ermino2 /o*eta de 7ar<metros o1ILog.Passo = 11 'Leit2ra de e0entos Dri0er.Item("+0entos").Item("Dados+0entos").'**owead = 6r2e 'Log, Ini/io2 /o*eta de +0entos o1ILog.Passo = ." + cada leitura de valores, deve-se "ravar os dados coletados no banco de dados( =o evento OnIead do bloco DadosEventos, criamos o script1 ';ra0a '*armes Parent.Parent.Parent.Item("o1IJistori/o1").;ra0a'*armes = 6r2e Duando o ta" StatusEventos for i"ual a 6, si"nifica 0ue terminou a coleta de Eventos( =o evento OnIead deste ta" for&ar o ta" @ascaraColeta para 1 Parent.Parent.Parent.Item("otinasCo*eta").Item("Mas/araCo*eta").8a*2e = . Depois da coleta de eventos, deve-se verificar o tipo da coleta informado na propriedade 5ipoColeta do @edidorConfi" para saber as informa&Aes 0ue precisam ser coletadas1 6. Implementando Bibliotecas para o SCDE - CCEE Se o tipo da coleta for DEE, inicia a coleta pelos dados de 0ualidade, se n'o, coleta ener"ia conforme 5abela 6-( =o evento OnChan"e do ta" @ascaraColeta, inserir novas linhas de script1 Case . 'Log, 6ermino2 /o*eta de +0entos o1ILog.Passo = .1 '+s/o*!e a 7rM?ima /o*eta if MedidorConfig.6i7oCo*eta = "H++" t!en 'Leit2ra H2a*idade 8a*2e = B e*se 'Leit2ra de +nergia 8a*2e = 5 end if 9ara coletar os dados de ener"ia, necess;rio informar o intervalo de coleta1 Case 5 'Leit2ra de +nergia 'Passa o inter0a*o de /o*eta set 'ti0a+nergia = Dri0er.Item("+nergia").Item("'ti0a+nergia") 'ti0a+nergia.Item("DataIni/ia*").8a*2e = MedidorConfig.DataJoraIni/ia* 'ti0a+nergia.Item("Data)ina*").8a*2e = MedidorConfig.DataJora)ina* 'ti0a+nergia.3rite() 'Ja1i*ita a *eit2ra dos dados Dri0er.Item("+nergia").Item("Dados+nergia").'**owead = 6r2e 'Log, Ini/io2 /o*eta de +nergia o1ILog.Passo = 2" + cada leitura do bloco DadosEner"ia, deve ser verificado atravs da propriedade 5pComp9erdas 0uais os tipos de ener"ia 0ue devem ser "ravadas( =o evento OnIead do bloco, inserir as se"uintes linhas1 set MedidorConfig = Parent.Parent.Parent.Item("MedidorConfig1") set o1IJist = Parent.Parent.Parent.Item("o1IJistori/o1") Com7Perdas = MedidorConfig.67Com7Perdas '2""1 4 +nergia n>o /om7ensada '2""2 4 +nergia /om7ensada '2"". 4 +nergia 9r2ta N +nergia LiK2ida '+nergia if Com7Perdas=2""1 ( Com7Perdas=2"". t!en o1IJist.;ra0a+nergia = 6r2e end if '+nergia Com7ensada if Com7Perdas=2""2 ( Com7Perdas=2"". t!en o1IJist.;ra0a+nergiaCom7 = 6r2e end if Duando o ta" StatusEner"ia for i"ual a 6, si"nifica 0ue terminou a coleta de ener"ia( =o evento OnIead deste ta" for&ar o ta" @ascaraColeta para *1 Parent.Parent.Parent.Item("otinasCo*eta").Item("Mas/araCo*eta").8a*2e = C Eerificar a pr?<ima coleta1 Case C 'Log, 6ermino2 /o*eta de +nergia o1ILog.Passo = 21 '+s/o*!e a 7rM?ima /o*eta if MedidorConfig.6i7oCo*eta = "'FD" t!en ')im Co*eta 8a*2e = 1" e*se 'Leit2ra de +ngen!aria 8a*2e = E 6Q Implementando Bibliotecas para o SCDE - CCEE end if 9ara coletar os dados de en"enharia, tambm necess;rio informar o intervalo de coleta1 Case E 'Leit2ra de +ngen!aria 'Passa o inter0a*o de /o*eta set 'ti0a+ngen!aria = Dri0er.Item("+ngen!aria").Item("'ti0a+ngen!aria") 'ti0a+ngen!aria.Item("DataIni/ia*").8a*2e = MedidorConfig.DataJoraIni/ia* 'ti0a+ngen!aria.Item("Data)ina*").8a*2e = MedidorConfig.DataJora)ina* 'ti0a+ngen!aria.3rite() 'Ja1i*ita a *eit2ra dos dados Dri0er.Item("+ngen!aria").Item("Dados+ngen!aria").'**owead = 6r2e 'Log, Ini/io2 /o*eta de +ngen!aria o1ILog.Passo = C" + cada leitura do bloco DadosEn"enharia, salvar as informa&Aes coletadas( =o evento OnIead do bloco inserir1 ';ra0a +ngen!aria Parent.Parent.Parent.Item("o1IJistori/o1").;ra0a+ngen!aria = 6r2e Duando o ta" StatusEn"enharia for i"ual a 6, si"nifica 0ue terminou a coleta de en"enharia( =o evento OnIead deste ta" for&ar o ta" @ascaraColeta para .1 Parent.Parent.Parent.Item("otinasCo*eta").Item("Mas/araCo*eta").8a*2e = G Eerificar a pr?<ima coleta1 Case G 'Log, 6ermino2 /o*eta de +ngen!aria o1ILog.Passo = C1 '+s/o*!e a 7rM?ima /o*eta if MedidorConfig.6i7oCo*eta = "M+" t!en ')im Co*eta 8a*2e = 1" e*se 'Leit2ra de H2a*idade 8a*2e = B end if +lm dos dados, devem ser coletados al"uns par%metros de 0ualidade1 Case B 'Leit2ra de H2a*idade set H2a*idade = Parent.Parent.Item("Dri0er1").Item("H2a*idade") 'Paramentros de H2a*idade H2a*idade.Item("ParametrosH2a*idade").'**owead = 6r2e 'Dados de H2a*idade H2a*idade.Item("DadosH2a*idade").'**owead = 6r2e 'Log, Ini/io2 /o*eta de H2a*idade o1ILog.Passo = 51 + cada leitura do bloco de 0ualidade, os dados coletados s'o inseridos no banco de dados( =o evento OnIead do bloco criar o script1 Parent.Parent.Parent.Item("o1IJistori/o1").;ra0aH2a*idade = 6r2e Duando o ta" StatusDualidade for i"ual a 6, si"nifica 0ue terminou a coleta de 0ualidade( =o evento OnIead deste ta" for&ar o ta" @ascaraColeta para R1 Parent.Parent.Parent.Item("otinasCo*eta").Item("Mas/araCo*eta").8a*2e = D +o terminar a coleta de 0ualidade, todos os dados necess;rios j; ter'o sidos coletados( + pr?<ima etapa verificar se necess;rio ajustar o hor;rio do medidor( Case D 'Leit2ra do !orOrio no medidor Dri0er.Item("e*ogio").Item("JorarioMedidor").'**owead = 6r2e 6R Implementando Bibliotecas para o SCDE - CCEE ).-. or*rio do Medidor +o ler o hor;rio do medidor, verificamos se est; defasado em mais de 7- se"undos em rela&'o ao servido, inserimos a informa&'o do rel?"io e se est; defasado ou n'o no lo" e finali!amos coleta( =o evento OnIead do ta" 3orario@edidor, adicionar as se"uintes linhas1 set o1ILog = Parent.Parent.Item("Log1") dif%egDataJora = DateDiff("%"$ CDate(8a*2e)$ CDate(now)) if '1s(dif%egDataJora) P E" t!en o1ILog.6e?to = "e*ogio do medidor 7re/isa ser aI2stado" o1ILog.;ra0a = 6r2e e*se o1ILog.6e?to = "e*ogio do medidor /orreto" o1ILog.;ra0a = 6r2e end if ')im Co*eta Parent.Parent.Parent.Item("otinasCo*eta").Item("Mas/araCo*eta").8a*2e = 1" )... /im da co(e!a Duando o ta" @ascaraColeta receber o valor 6-, si"nifica 0ue todos os passos da coleta foram cumpridos e pode ser finali!ada( Deve-se autori!ar o objeto hist?rico a "ravar o ar0uivo <ml com os dados de coleta( Duando o <ml estiver pronto, ser; enviado para o servidor e a propriedade GimColeta receber; o valor 5rue( Case 1" ')im Co*eta ';era QLM de /o*eta Parent.Parent.Item("o1IJistori/o1").;ra0a'rKQML = 6r2e )-