Scada Desenvolvedores
Scada Desenvolvedores
Scada Desenvolvedores
Page 1 / 16
CERTI SCADABR
Pgina inicial minicursos Desenvolvimento API ScadaBR Checklist ScadaBR 0.8 Distribuio GUI Infra de TI Middleware Protocolos Testes de Performance Utilizao dos CLPs Video Aulas Documento de Referncia do ScadaBR Glossrio Mango Outros Scada's Open Source Mango OpenScada Testes Mango Sitemap
Pesquisar o site
scadabr-desenvolvedores-2
Abrindo o ScadaBR para desenvolvimento (Eclipse - Java)
Desenvolvimento de protocolos
1. Introduo
1.1 Informaes gerais A arquitetura do ScadaBR no oferece uma maneira totalmente flexvel de se adicionar novos protocolos no sentido de que, alm de adicionar as classes do novo protocolo em si, outras classes gerais e tambm alguns arquivos de configurao devem ser modificados, de modo que uma nova compilao do sistema exigida. As alteraes nos arquivos compartilhados, no entanto, so simples e as classes que do apoio implementao do protocolo em si esto muito bem arranjadas de modo que as funcionalidades comuns a todos os protocolos esto centralizadas em superclasses e evitam a repetio de cdigo, fazendo com que seja necessrio apenas codificar aquilo que especfico ao protocolo em si. O desenvolvimento de um novo protocolo para o ScadaBR envolve duas partes bem distintas: a implementao do cdigo Java e a implementao da interface grfica. Estas duas partes sero abordadas separadamente. 1.2 Requisitos 1.3 Este documento
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 2 / 16
Como no existem tabelas "personalizadas" para cada protocolo, que sempre possui configuraes especficas, estas informaes so serializadas e persistidas em um campo do tipo BLOB nas tabelas. Os mtodos de serializao e desserializao devem ser escritos pelo desenvolvedor do protocolo, como ser visto adiante, e requerem muito cuidado em sua implementao. 2.2. Os objetos RT (Runtime Objects) Os objetos do tipo NovoDataSourceRT e NovoPointRT apenas implementam os mtodos que fazem parte da dinmica do funcionamento do protocolo. Os mtodos que iniciam e param o datasource devero ser implementados nesses objetos. As aes que cada datasource realizar para atualizar o valor de seus pontos (requisio dos dados e atualizao dos valores) tambm se encontram nestes objetos, bem como o mtodo que ser requisitado ao se realizar um comando de escrita. 2.3 As superclasses Os parmetros e comportamentos que so comuns a todos os datasources bem como os mtodos que devem obrigatoriamente ser implementados esto localizados nas superclasses principais: com.serotonin.mango.vo.dataSource.DataSourceVO, com.serotonin.mango.vo.dataSource.AbstractPointLocatorVO, com.serotonin.mango.rt.dataSource.PollingDataSource e com.serotonin.mango.rt.dataSource.PointLocatorRT. Na prtica, a classe NovoDataSourceVO dever estender DataSourceVO, NovoPointVO estender AbstractPointLocatorVO, NodoDataSourceRT estender PollingDataSource e NovoPointRT estender PointLocatorRT. 3 Outras alteraes necessrias alteraes em MangoContextListener e DataSourceVO
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 3 / 16
HTTP_I M AGE( 15, " dsEdi t . ht t pI m age" , t r ue) { @ Over r i de publ i c Dat aSour ceVO<?> cr eat eDat aSour ceVO( ) { r et ur n new Ht t pI m ageDat aSour c eVO( ) ; } }, M _BUS( 20, " dsEdi t . m bus" , f al s e) { @ Over r i de publ i c Dat aSour ceVO<?> cr eat eDat aSour ceVO( ) { r et ur n new M Bus Dat aSour ceVO( ) ; } } Os arquivos .jsp que de cada protocolo esto em WebContent/WEB-INF/jsp/dataSourceEdit/ e so, na verdade, apenas fragmentos que sero includos em um arquivo .jsp "pai": WebContent/WEBINF/jsp/dataSourceEdit.jsp. Assim como o cdigo Java utiliza herana e classes abstratas para definir o comportamento dos protocolos que sero implementados (e tambm centralizar o comportamento que comum a todos), o desenvolvimento de interfaces no ScadaBR tambm se utiliza desse mtodo, centralizando o comportamento comum das interfaces de todos os protocolos no arquivo dataSourceEdit.jsp e apenas exigindo que os fragmentos (como se fossem subclasses) implementem os mtodos JavaScript que executem aes que so especficas a cada datasource. O maior problema dessa abordagem a confuso causada pelo fato de que os mtodos que precisam ser implementados pelas "subclasses" no sero indicados por nenhum ambiente de desenvolvimento, pois mtodos abstratos (sem corpos) e herana no so mecanismos previstos em JSP e JavaScript. A "classe abstrata" dataSourceEdit.jsp Como dito acima, este arquivo a base de todas as pginas de configurao de protocolo, e contm o cdigo comum a todas as implementaes. importante conhecer as funes que "no tem corpo" e que devem ser implementadas por cada protocolo:
f unc t i on i ni t I m pl ( ) { / / f uncao que c ham ada ao ent r ar na t el a. } f unc t i on saveDat aSour ceI m pl ( ) { / / f uncao cham ada quando o us ur i o sal v a o dat asour ce, deve env i ar os dados ao s er vi dor par a i nser i / / l o/ al t er - l o. / / os dados par a envi ar ao ser v i dor dev em s er r ec uper ados dos c am pos pr eenc hi dos. } f unc t / ex i s t com o } i on edi t Poi nt CBI m pl ( l ocat or ) { / f uncao cham ada quando o us ur i o cl i c a par a al t er ar um dat apoi nt ent e. Dev e l i s t ar os dados do / / dat apoi nt ( que j v em par am et r o ' l oc at or ' ) nos c am pos na t el a.
f unc t i on savePoi nt I m pl ( l ocat or ) { / / f uncao cham ada quando o us uar i o sal v a o dat apoi nt . dev e envi ar os dados ao s er vi dor par a i nser i - l o/ al t er a- l o. / / os dados que dev em s er env i ados es t ao no obj et o l ocat or r ecebi do c om o par am et r o. } f unc t i on appendPoi nt Li st Col um nFunct i ons( poi nt Li st Col um nHeader s, poi nt Li st Col um nFunct i ons) { / / f uncao ut i l i zada c as o sej a nec es sr i o adi c i onar novas col unas na t abel a que l i s t a os dat apoi nt s de um / / dat asour ce. }
Noes sobre DWR e a classe DataSourceEditDwr O framework DWR, simplificadamente, prov uma camada de abstrao de modo que se possa chamar os mtodos em Java a partir do Javascript. Para o caso dos protocolos, todas funcionalidades no servidor chamadas pelo cliente utilizando o DWR esto na classe com.serotonin.mango.web.dwr.DataSouceEditDwr. Na prtica, os mtodos que devero ser chamados no servidor ao, por exemplo, salvar um datasource (function saveDataSourceImpl()), sero definidos nesta classe. f unc t i on saveDat aSour ceI m pl ( ) { Dat aSour ceEdi t Dwr . s av eVi r t ual Dat aSour ce( $get ( " dat aSour c eNam e" ) , $get ( " dat aSour ceXi d" ) , $get ( " updat ePer i ods" ) , $get ( " updat ePer i odType" ) , s av eDat aSour c eCB) ; }
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 4 / 16
Qualquer tipo de mtodo pode ser definido na classe DataSourceEditDwr e ser acessada de forma semelhante via Javascript. Observe que no exemplo acima h um ltimo parmetro que se chama saveDataSourceCB (e sempre h um parmetro a mais em todas as funes sendo acessadas via DWR). Este parmetro define uma funo callback (CB) que ser chamada quando a funo saveVirtualDataSource terminar sua execuo, recebendo como parmetro o retorno da funo executada no servidor. Esta idia importante no desenvolvimento da interface. Para fixar, veja o exemplo abaixo: f unc t i on scanCancel ( ) { Dat aSour ceEdi t Dwr . c ancel Tes t i ngUt i l i t y( sc anBut t ons) ; } f unc t i on scanBut t ons( scanni ng) { set Di s abl ed( " sc anBt n" , sc anni ng) ; set Di s abl ed( " sc anCanc el Bt n" , ! s canni ng) ; } No caso acima, a funo cancelTestingUtility est definida no servidor sem parmetros de entrada. Ao ser chamada via DWR no cdigo Javascript necessrio que se passe no mnimo um parmetro que indica a funo callback que ser chamada quando o mtodo retornar (scanButtons). A funo scanButtons chamada e recebe como parmetro (scanning) o retorno de cancelTestingUtility (), que um boolean. Arquivos de ajuda onde colocar, como configurar. (manifest.xml em dox). As janelas de ajuda dos datasources so configuradas atravs de uma varivel chamada dsHelpId. <c : s et v ar =" ds Hel pI d" v al ue=" m odbus Ser i al DS" / > Para este caso acima, a varivel tem como valor "modbusSerialDS" que deve referenciar um id definido no arquivo: WebContent/WEB-INF/dox/manifest.xml. O arquivo de ajuda dever estar nas pastas do idioma desejado e conter o mesmo nome do id comentado, como por exemplo: WebContent/WEB-INF/dox/en/modbusSerialDS.htm. Para o caso dos arquivos de ajuda dos datapoints, os ids e arquivos devem ser configurados da mesma forma citada acima, porm a referncia a ajuda se dar na tag customizada pointList que usada em todas as telas para configurao dos datapoints. <t ag: poi nt Li st poi nt Hel pI d=" v i r t ual PP" > No caso acima, pointHelpId referencia o id virtualPP, que deve estar definido em manifest.xml, e que ir referenciar o arquivo dox/idioma/virtualPP.htm.
Parte 3 - Exemplo
Passos para a implementao
Passo 1: Criar os objetos VO 2 classes devem ser criadas: - ProtocoloDataSourceVO (extends DataSourceVO): deve conter as propriedades (atributos) do protocolo, mtodo de validao, configurao dos eventos associados a este datasource e mtodos de serializao dos atributos. - ProtocoloPointLocatorVO (extends AbstractPointLocatorVO): deve conter as propriedades (atributos) dos datapoints do protocolo, mtodo de validao e mtodos de serializao dos atributos. Passo 2: Criar os objetos RT 2 classes devem ser criadas: - ProtocoloDataSource (extends PollingDataSource): deve conter os mtodos de inicializao e finalizao, realizao do polling e atualizao dos datapoints e mtodo de escrita (envio de comandos). - ProtocoloPointLocatorRT (extends PointLocatorRT): deve conter atributos do ponto em runtime, se necessrio. Passo 3: Adicionar o novo protocolo em DataSourceVO e MangoContextListener
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 5 / 16
O novo protocolo deve ser adicionado no enum Type em DataSourceVO e no mtodo constantsInitialize () em MangoContextListener. Passo 4: Criar o arquivo JSP do protocolo em jsp/dataSourceEdit/ Crie a JSP do novo protocolo (protocolo.jsp) e coloque-o na pasta especificada acima. Passo 5: Adicionar a referncia para a nova pgina em jsp/DataSourceEdit.jsp. A nova pgina criada deve constar no arquivo dataSourceEdit.jsp para que aparea na lista de protocolos. Passo 6: Implementar os mtodos necessrios em Java em DataSourceEditDwr No mnimo os mtodos para inserir/editar datasources e datapoints devero ser implementados nesta classe. Passo 7: Implementar os mtodos necessrios em JavaScript no arquivo jsp. Implementar as funes Javascript como saveDataSourceImpl(), editPointCBImpl(), etc. Passo 8: Criar e configurar os arquivos de ajuda. Criar os arquivos de ajuda em dox/idioma e adicionar as referncias em dox/manifest.xml.
Executando
Exemplo Para exemplificar, a criao de um novo protocolo seguindo os passos citados ser detalhada. O protocolo se chamar ProtocoloTemplate. Ter como configuraes (do datasource) apenas 2 propriedades: propriedadeTexto e propriedadeInteiro. Os datapoints deste protocolo tero apenas uma propriedade que ser chamada numeroPonto. Implementao
ser implementados. pr ot ect ed voi d addEvent Types( Li st <Event TypeVO> event Types) { . . . } pr ot ect ed voi d addPr oper t i esI m pl ( Li st <Local i z abl eM essage> l i st ) { . . . } pr ot ect ed voi d addPr oper t yChangesI m pl ( Li st <Local i zabl eM essage> l i st , Dat aSour ceVO<?> f r om ) {. . . } publ i c Dat aSour ceRT cr eat eDat aSour ceRT( ) { . . . } publ i c Poi nt Locat or VO cr eat ePoi nt Locat or ( ) { . . . } publ i c Local i zabl eM essage get Connect i onDescr i pt i on( ) { . . . } publ i c Expor t Codes get Event Codes( ) { . . . } publ i c com . ser ot oni n. m ango. vo. dat aSour ce. Dat aSour ceVO. Type get Type( ) {. . . } 1.3 O mtodo de validao, 2 mtodos de serializao (para persistir no banco de dados) e mais 2
mtodos para converso em JSON (para utilizao com o DWR) devem ser adicionados manualmente, como abaixo. publ i c voi d val i dat e( Dwr ResponseI 18n r esponse) { super . val i dat e( r esponse) ; } pr i vat e st at i c f i nal i nt ver si on = 1; pr i vat e voi d wr i t eObj ect ( Obj ect Out put St r eam out ) t hr ows I OExcept i on { out . wr i t eI nt ( ver si on) ; } pr i vat e voi d r eadObj ect ( Obj ect I nput St r eam i n) t hr ows I OExcept i on { i nt ver = i n. r eadI nt ( ) ; } publ i c voi d j sonDeser i al i ze( JsonReader r eader , JsonObj ect j son) t hr ows JsonExcept i on { super . j sonDeser i al i ze( r eader , j son) ; } publ i c voi d j sonSer i al i ze( M ap<St r i ng, Obj ect > m ap) { super . j sonSer i al i ze( m ap) ; }
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 6 / 16
1.4
mtodos getters e setters. 1.5 Adicione tambm mais 2 atributos: int updatePeriodType e int updatePeriods, que iro indicar o
perodo de polling e sua unidade (segundos, minutos, etc...) 1.6 Supondo que a propriedadeTexto no possa ser nula e que a propriedadeInteiro sempre tenha publ i c voi d val i dat e( Dwr ResponseI 18n r esponse) { super . val i dat e( r esponse) ; i f ( pr opr i edadeI nt ei r o <= 0) r esponse. addCont ext ual M essage( " pr opr i edadeI nt ei r o" , " val i dat e. gr eat er ThanZer o" ) ; i f ( St r i ngUt i l s. i sEm pt y( pr opr i edadeText o) ) r esponse. addCont ext ual M essage( " pr opr i edadeText o" , " val i dat e. i nval i dVal ue" ) ;
que ser maior que zero, preencha o mtodo de validao conforme abaixo.
Ateno: O primeiro argumento de addContextualMessage indica o ID do campo em que dever ser apresentada a mensagem (validate.invalidValue, por exemplo) na interface grfica. Isto , ao ocorrer um erro de validao da propriedadeInteiro, por exemplo, o sistema ir procurar pelo campo na interface que possui id "propriedadeInteiro" e adicionar a mensagem "validate.greaterThanZero" prximo a ele. 1.7 Implemente os mtodos writeObject e readObject. Eles devero "serializar" todos os atributos do pr i vat e st at i c f i nal i nt ver si on = 1; pr i vat e out . out . out . Ser i out . } voi wr i wr i wr i al i wr i d wr i t eObj ect ( Obj ect Out put St r eam out ) t hr ows I OExcept i on { t eI nt ( ver si on) ; t eI nt ( updat ePer i odType) ; t eI nt ( updat ePer i ods) ; z at i onHel per . wr i t eSaf eUTF( out , pr opr i edadeText o) ; t eI nt ( pr opr i edadeI nt ei r o) ;
pr i vat e voi d r eadObj ect ( Obj ect I nput St r eam i n) t hr ows I OExcept i on { i nt ver = i n. r eadI nt ( ) ; i f ( ver == 1) { updat ePer i odType = i n. r eadI nt ( ) ; updat ePer i ods = i n. r eadI nt ( ) ; pr opr i edadeText o = Ser i al i z at i onHel per . r eadSaf eUTF( i n) ; pr opr i edadeI nt ei r o = i n. r eadI nt ( ) ; } } Ateno: os mtodos devem ser escritos e recuperados na mesma ordem. Atente tambm para a maneira diferente de serializar atributos String. 1.8 Os mtodos de serializao JSON j serializam os parmetros "bsicos" automaticamente nas
superclasses. Apenas o atributo updatePeriodType (que serializado de forma diferente) deve ser adicionado nestes mtodos, como abaixo: publ i c voi d j sonDeser i al i ze( JsonReader r eader , JsonObj ect j son) t hr ows JsonExcept i on { super . j sonDeser i al i ze( r eader , j son) ; I nt eger val ue = deser i al i zeUpdat ePer i odType( j son) ; i f ( val ue ! = nul l ) updat ePer i odType = val ue; } publ i c voi d j sonSer i al i ze( M ap<St r i ng, Obj ect > m ap) { super . j sonSer i al i ze( m ap) ; ser i al i z eUpdat ePer i odType( m ap, updat ePer i odType) ; } 1.9 Faa a classe ProtocoloTemplatePointLocatorVO estender AbstractPointLocatorVO e adicione os
mtodos que devem ser implementados. 2.0 Adicione a propriedade int numeroPonto, tambm mais duas propriedades "comuns" a todos
datapoints: int dataTypeId e boolean settable. 2.1 Adicione tambm os mesmos 5 mtodos adicionados manualmente em ProtocoloTemplateVO e
preencha-os de forma similar. (para este caso, os mtodos de serializao JSON no precisam ter implementao) 2.2 A implementao de alguns mtodos desta classe como "createDataSourceRT()" em
ProtocoloTemplateVO, por exemplo, dependem de passos que sero abordados adiante, portanto no sero implementados agora.
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 7 / 16
Alguns outros mtodos como addPropertiesImpl no sero abordados aqui por no serem obrigatrios ou serem de implementao fcil, bastando analisar implementaes j feitas em outros protocolos.
Adicione manualmente os mtodos de inicializao e finalizao do datasource publ i c voi super . i } publ i c voi super . t } d i ni t i al i ze( ) { ni t i al i z e( ) ; d t er m i nat e( ) { er m i nat e( ) ;
2.3
Adicione o ProtocoloTemplateVO como atributo da classe ProtocoloTemplateDataSource. Altere o pr i v at e f i nal Pr ot ocol oTem pl at eVO<?> vo;
construtor. publ i c Pr ot ocol oTem pl at eDat aSour c e( Pr ot oc ol oTem pl at eVO<?> v o) { super ( vo) ; t hi s . v o = v o; set Pol l i ngPer i od( vo. get Updat ePer i odTy pe( ) , vo. get Updat ePer i ods( ) , f al s e) ; } 2.4 Implemente os mtodos de ProtocoloTemplateDataSource. Segue uma descrio da funo de doPoll(long time) Este mtodo ser chamado pelo runtime do ScadaBR periodicamente (de acordo, claro, com o tempo de polling especificado para o datasource). Portanto, neste mtodo que o datasource dever enviar a requisio, por exemplo, para o dispositivo escravo, receber os valores e atualizar os datapoints. setPointValue(DataPointRT dataPoint, PointValueTime valueTime, SetPointSource source) Este mtodo ser chamado quando um comando de escrita for requisitado. As informaes de qual datapoint, qual valor e outros esto nos parmetros recebidos. initialize() Este mtodo ser chamado ao iniciar (habilitar) o datasource. Dever executar todos os comandos necessrios para iniciar uma comunicao. terminate() Este mtodo ser chamado ao terminar (desabilitar) o datasource. Dever executar todos os comandos necessrios para finalizar uma comunicao. 2.5 Faa a classe ProtocoloTemplatePointLocatorRT estender PointLocatorRT e adicione os mtodos mtodos e atributos, como abaixo: publ i c c l ass Pr ot oc ol oTem pl at ePoi nt Locat or RT ex t ends Poi nt Loc at or RT { pr i v at e f i nal Pr ot ocol oTem pl at ePoi nt Loc at or VO v o; publ i c Pr ot oc ol oTem pl at ePoi nt Locat or RT ( Pr ot ocol oTem pl at ePoi nt Locat or VO vo) { t hi s . vo = v o; } @ Over r i de publ i c bool ean i s Set t abl e( ) { r et ur n vo. i sSet t abl e( ) ; } publ i c Pr ot oc ol oTem pl at ePoi nt Locat or VO get Vo( ) { r et ur n vo; }
cada um deles:
} 2.6
Termine de implementar os mtodos que ficaram faltando em ProtocoloTemplateVO @ Over r i de publ i c Dat aSour ceRT c r eat eDat aSour c eRT( ) { r et ur n new Pr ot oc ol oTem pl at eDat aSour c e( t hi s ) ; }
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 8 / 16
@ Over r i de publ i c Poi nt Loc at or VO c r eat ePoi nt Locat or ( ) { r et ur n new Pr ot oc ol oTem pl at ePoi nt Locat or VO( ) ; } 2.7 Termine de implementar o mtodo em ProtocoloTemplatePointLocatorVO @ Over r i de publ i c Poi nt Loc at or RT c r eat eRunt i m e( ) { r et ur n new Pr ot oc ol oTem pl at ePoi nt Locat or RT( t hi s ) ; }
3.2
constantsInitialize():
ct x. set At t r i but e( " const ant s . Dat aSour ceVO. Ty pes . PROTOCOLO_TEM PLATE" , Dat aSour c eVO. Type. PROTOCOLO_TEM PLATE. get I d( ) ) ;
3.3
i nser i -
f unct i on saveDat aSour c eI m pl ( ) { / / f uncao cham ada quando o usur i o s al v a o dat as our c e, dev e env i ar os dados ao s er v i dor par a / / l o/ al t er - l o. / / os dados par a env i ar ao s er v i dor dev em s er r ec uper ados dos c am pos pr eenc hi dos .
f unct i on edi t Poi nt CBI m pl ( l ocat or ) { / / f uncao cham ada quando o usur i o c l i c a par a al t er ar um dat apoi nt ex i st ent e. Deve l i st ar os dados do / / dat apoi nt ( que j v em c om o par am et r o ' l oc at or ' ) nos cam pos na t el a. } f unct i // i nser i - l o/ // } on savePoi nt I m pl ( l oc at or ) { f uncao cham ada quando o usuar i o s al v a o dat apoi nt . dev e env i ar os dados ao s er v i dor par a al t er a- l o. os dados que devem s er envi ados es t ao no obj et o l oc at or r ec ebi do c om o par am et r o.
f unct i on appendPoi nt Li st Col um nFunc t i ons( poi nt Li s t Col um nHeader s , poi nt Li s t Col um nFunc t i ons ) { / / f uncao ut i l i zada c as o s ej a nec ess r i o adi ci onar nov as c ol unas na t abel a que l i s t a os dat apoi nt s de um / / dat asour ce. } </ scr i pt > <c: set var =" dsDesc" > Pr ot ocol o Tem pl at e </ c: set > <c: set var =" dsHel pI d" val ue=" pr ot oc ol oTem pl at eDS" / > <% @ i ncl ude f i l e=" / W EB- I NF/ j sp/ dat aSour ceEdi t / dsHead. j spf " % > <t r > <t d cl ass=" f or m Label Requi r ed" ><f m t:m es sage key =" ds Edi t . updat ePer i od" / ></ t d> <t d cl ass=" f or m Fi el d" > <i nput t ype=" t ext " i d=" updat ePer i ods " v al ue=" ${ dat aSour c e. updat ePer i ods } " c l ass =" f or m Shor t " / > <sst : sel ect i d=" updat ePer i odTy pe" v al ue=" ${ dat aSour ce. updat ePer i odType} " >
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 9 / 16
<t ag: t i m ePer i odOpt i ons ss t =" t r ue" m s =" t r ue" s=" t r ue" m i n=" t r ue" h=" t r ue" / > </ sst : sel ect > </ t d> </ t r > <t r > <t d cl ass=" f or m Label Requi r ed" >Pr opr i edade Tex t o</ t d> <t d cl ass=" f or m Fi el d" ><i nput t y pe=" t ex t " i d=" pr opr i edadeText o" val ue=" ${ dat aSour ce. pr opr i edadeTex t o} " / ></ t d> </ t r > <t r > <t d cl ass=" f or m Label Requi r ed" >Pr opr i edade I nt ei r o</ t d> <t d cl ass=" f or m Fi el d" ><i nput t y pe=" t ex t " i d=" pr opr i edadeI nt ei r o" val ue=" ${ dat aSour ce. pr opr i edadeI nt ei r o} " / ></ t d> </ t r > <% @ i ncl ude f i l e=" / W EB- I NF/ j sp/ dat aSour ceEdi t / dsEvent sFoot . j spf " % > <t ag: poi nt Li st poi nt Hel pI d=" pr ot ocol oTem pl at ePP" > <t r > <t d cl ass=" f or m Label Requi r ed" ><f m t:m es sage key =" ds Edi t . s et t abl e" / ></ t d> <t d cl ass=" f or m Fi el d" ><i nput t y pe=" c heck box " i d=" s et t abl e" / ></ t d> </ t r > <t r > <t d cl ass=" f or m Label Requi r ed" ><f m t:m es sage key =" ds Edi t . poi nt Dat aTy pe" / ></ t d> <t d cl ass=" f or m Fi el d" > <sel ect i d=" dat aTypeI d" > <t ag: dat aTypeO pt i ons ex cl udeI m age=" t r ue" / > </ sel ect > </ t d> </ t r > <t r > <t d cl ass=" f or m Label Requi r ed" >Nm er o do Pont o</ t d> <t d cl ass=" f or m Fi el d" ><i nput t y pe=" t ex t " i d=" num er oPont o" / ></ t d> </ t r > </ t ag: poi nt Li st >
* esta implementao acima um bom modelo para implementar a interface de qualquer protocolo.
@ M et hodFi l t er publ i c Dwr ResponseI 18n s av ePr ot ocol oTem pl at ePoi nt Loc at or ( i nt i d, St r i ng xi d, St r i ng nam e, Pr ot oc ol oTem pl at ePoi nt Loc at or VO l oc at or ) { r et ur n val i dat ePoi nt ( i d, x i d, nam e, l ocat or , nul l ) ; }
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 10 / 16
f unct i on edi t Poi nt CBI m pl ( l oc at or ) { $set ( " set t abl e" , l oc at or . s et t abl e) ; $set ( " dat aTypeI d" , l oc at or . dat aTy peI d) ; $set ( " num er oPont o" , l ocat or . num er oPont o) ; } f unct i on savePoi nt I m pl ( l oc at or ) { l ocat or . set t abl e = $get ( " s et t abl e" ) ; l ocat or . dat aTypeI d = $get ( " dat aTy peI d" ) ; l ocat or . num er oPont o = $get ( " num er oPont o" ) ; Dat aSour ceEdi t Dwr . s av ePr ot oc ol oTem pl at ePoi nt Loc at or ( c ur r ent Poi nt . i d, $get ( " x i d" ) , $get ( " nam e" ) , l ocat or , savePoi nt CB) ; } f unct i on appendPoi nt Li s t Col um nFunc t i ons ( poi nt Li st Col um nHeader s , poi nt Li s t Col um nFunc t i ons ) { }
protocoloTemplateDS.htm e protocoloTemplatePP.htm e coloque neles os textos de ajuda. 8.2 Insira no arquivo dox/manifest.xml a referncia para os dois arquivos de ajuda: <i t em i d=" pr ot ocol oTem pl at eDS" > <r el at i on i d=" pr ot ocol oTem pl at ePP" / > </ i t em > <i t em i d=" pr ot ocol oTem pl at ePP" > <r el at i on i d=" pr ot ocol oTem pl at eDS" / > </ i t em > * Ateno: o id da tag <item> deve ser igual aos id referenciado no JSP e tambm igual ao nome dos arquivo de ajuda criado. lembrar: - implementar alguma simulacao no mtodo doPoll - implementar a funcao para adicionar uma coluna na tabela de datapoints
Extenso da API
1. Introduo
1.1 Informaes gerais A API do ScadaBR um servio web (web-service) implementado utilizando a tecnologia SOAP. Sua implementao foi realizada com a utilizao de uma ferramenta chamada Axis1, da Apache, que se encontra embarcado na aplicao. O desenvolvimento da API se deu por uma abordagem top-down, no sentido de que primeiramente se escreveu o WSDL (descritor dos servios), e com isso as classes que fazem a comunicao via SOAP (skeletons, para o caso do servidor) foram geradas utilizando ferramentas do Axis1 (wsdl2java), para que finalmente os servios fossem implementados. Todas as classes referentes a API se encontram no pacote br.org.scadabr.api, sendo sua maioria gerada automaticamente pelas ferramentas utilizadas, como dito acima. As duas principais classes so: br.org.scadabr.api.ScadaBRAPIImpl e br.org.scadabr.api.AuthenticationHandler. A primeira contem a implementao de todos os mtodos que so atualmente disponibilizados como servios e a segunda uma classe que intercepta todas as requisies para verificar a autenticao no cabealho (header) das mensagens.
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 11 / 16
1.2 Requisitos - Conhecimentos bsicos em Java. - Eclipse Helios (ou Galileo) instalado. - Projeto ScadaBR (cdigo fonte) configurado no Eclipse. - Apache Tomcat configurado no Eclipse. 1.3 Este documento Seo 1: Introduo Seo 2: Breve descrio do Apache Axis1 no ScadaBR Seo 3: Viso geral dos passos necessrios para se inserir um novo mtodo na API. Seo 4: Exemplo de implementao de um mtodo (readData) seguindo os passos acima. Seo 5: Informaes para ajudar na implementao dos servios.
2. Apache Axis1
O Axis1 oferece duas maneiras de se disponibilizar servios utilizando sua arquitetura: - bsica: envolve o deploy de arquivos .java (JWS) apenas, sem maiores configuraes. - avanada: envolve um arquivo de configurao geral dos servios (arquivo WSDD), que permite que configuraes mais avanadas sejam includas. No ScadaBR optou-se por utilizar o mtodo avanado. Os arquivos envolvidos na implementao da API no ScadaBR, portanto, so: - classes dos skeletons, implementao dos servios e outras que se encontram no pacote br.org.scadabr.api, j comentadas anteriormente. - server-config.wsdd: descritor dos servios, que detm configuraes gerais do Axis1 embarcado e dos servios disponibilizados no ScadaBR. Todos os arquivos envolvem complexidades, porm, como ser visto adiante, as ferramentas utilizadas para implementao da API no ScadaBR (Axis1 e Eclipse) geram tudo o que necessrio para que o desenvolvedor se preocupe apenas com a implementao dos servios em si.
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 12 / 16
nica classe que no dever ser substituda aps gerar as novas implementaes com o novo servio) Passo 2: Realizar um backup do arquivo server-config.wsdd, para posteriormente reconfigurar o Handler da autenticao. Como dito no passo 2, o server-config.wsdd envolve configuraes complexas, porm gerado automaticamente pelo Eclipse/Axis1. H, no entanto, uma nica configurao que foi feita manualmente que consiste na configurao do Handler de autenticao. Ao ser gerado novamente este arquivo pelas ferramentas, essa configurao manual ser perdida e dever ser recuperada. Passo 3: Alterar o WSDL da API de modo a incluir o novo mtodo e os objetos necessrios. Neste passo que se inicia a implementao de fato do novo servio. Embora configurar o WSDL envolva certa complexidade, todos os mtodos se implementam de forma parecida, de modo que se possa copiar os mtodos j definidos e apenas alterar os nomes e parmetros. Passo 4: Em um projeto WEB temporrio, utilizar o Eclipse (que j possui o Axis1 internamente) para gerar novamente o servio. (gera todas as classes do skeleton e o arquivo de configurao server-config.wsdd). Aps incluir no WSDL o novo servio, basta gerar os arquivos necessrios (skeletons e serverconfig.wsdd) utilizando as ferramentas j citadas (Eclipse/Axis1). (em um novo projeto temporrio, para evitar conflitos) Passo 5: Substituir os arquivos no ScadaBR. Aps a criao dos arquivos com o novo mtodo, deve-se substituir os arquivos do ScadaBR por estes. Copie primeiramente todo* o cdigo fonte gerado e depois substitua tambm o arquivo server-config.wsdd. * No substitua apenas o arquivo ScadaBRAPIImpl. Aps a cpia, basta incluir nele o novo mtodo manualmente. Dessa forma as antigas implementaes no sero perdidas. Passo 6: Recuperar a configurao no server-config.wsdd do Handler de Autenticao. Como dito, deve-se recuperar a nica configurao manual feita no arquivo server-config.wsdd. Passo 7: Implementar o novo servio em ScadaBRAPIImpl O novo servio j estar disponvel ao iniciar o ScadaBR. Basta agora realizar sua implementao na classe ScadaBRAPIImpl.
Passo 1: Realizar um backup da classe ScadaBRAPIImpl, para no perder as implementaes dos antigos mtodos. Passo 2: Realizar um backup do arquivo server-config.wsdd, para posteriormente reconfigurar o Handler da autenticao.
Copie os dois arquivos para uma pasta qualquer de backup.
Passo 3: Alterar o WSDL da API de modo a incluir o novo mtodo e os objetos necessrios.
3.1 Primeiramente, crie todos os objetos que sero utilizados em seu novo mtodo, nos parmetros ou em seus retornos. Veja o exemplo de como definir o objeto ItemValue no WSDL: <c om pl ex Ty pe nam e=" I t em Val ue" > <s equenc e> <el em ent nam e=" i t em Nam e" ni l l abl e=" t r ue" t y pe=" xs d: st r i ng" / > <el em ent nam e=" dat aTy pe" ni l l abl e=" t r ue" t y pe=" cons t : Dat aTy pe" / > <el em ent nam e=" val ue" ni l l abl e=" t r ue" t ype=" x sd: any Ty pe" / > <el em ent nam e=" qual i t y" ni l l abl e=" t r ue" t ype=" c onst : Qual i t y Code" / > <el em ent nam e=" t i m est am p" ni l l abl e=" t r ue" t ype=" x sd: dat eTi m e" / > </ sequence> </ com pl exType> Como o parmetro e o retorno do mtodo readData so objetos, eles devem ser definidos tambm: <x sd: el em ent nam e=" ReadDat aPar am s" > <c om pl ex Ty pe> <s equenc e> <el em ent m axOcc ur s=" unbounded" nam e=" i t em Pat hLi st " t y pe=" xs d: st r i ng" / >
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 13 / 16
<el em ent nam e=" opt i ons" ni l l abl e=" t r ue" t y pe=" da: ReadDat aOpt i ons" / > </ sequence> </ com pl exType> </ xs d: el em ent > <x sd: el em ent nam e=" ReadDat aResponse" > <c om pl ex Ty pe> <s equenc e> <el em ent m axOcc ur s=" unbounded" m i nOcc ur s=" 0" nam e=" er r or s " t y pe=" vo: API Er r or " / > <el em ent m axOcc ur s=" unbounded" m i nOcc ur s=" 0" nam e=" i t em sLi s t " t y pe=" vo: I t em Val ue" / > <el em ent nam e=" r epl yBas e" t ype=" v o: Repl yBas e" / > </ sequence> </ com pl exType> </ xs d: el em ent > * observe que os parmetros, embora sejam objetos normais, foram definidos como "<xsd:element>" e os outros objetos como "<complexType>". Isso se deu porque as mensagens ("<wsdl:message>") so definidas referenciando "elements", como ser visto abaixo: 3.2 Aps definir os objetos que sero utilizados, deve-se definir as "mensagens" no WSDL, que indicam a requisio e o retorno do mtodo sendo implementado: <! - - Requi s i o do M t odo: i ndi c a que t em com o par m et r o o obj et o ReadDat aPar am s --> <wsdl : m ess age nam e=" ReadDat aPar am s" > <wsdl : par t el em ent =" da: ReadDat aPar am s " nam e=" par am et er s " / > </ ws dl : m es sage> <! - - Ret or no do M t odo: i ndi ca que t em c om o r et or no o obj et o ReadDat aResponse - - > <wsdl : m ess age nam e=" ReadDat aRes pons e" > <wsdl : par t el em ent =" da: ReadDat aResponse" nam e=" r esponse" / > </ ws dl : m es sage> 3.3 Defina agora o mtodo (operao) em si: associe a ele como input a mensagem criada acima que representa a requisio e como output a mensagem criada para representar o retorno: <wsdl : oper at i on nam e=" r eadDat a" > <wsdl : i nput m es sage=" sbr : ReadDat aPar am s " nam e=" r eadDat aReques t " / > <wsdl : out put m ess age=" s br : ReadDat aRes pons e" nam e=" r eadDat aRes pons e" / > </ ws dl : oper at i on> 3.4 Crie agora os "bindings", que sero configuraes mais especficas do protocolo em relao a cada operao definida anteriormente: <wsdl : oper at i on nam e=" r eadDat a" > <s oap: oper at i on/ > <wsdl : i nput nam e=" r eadDat aRequest " > <s oap: body us e=" l i t er al " / > <s oap: header m ess age=" s br : header RQ" par t =" header " use=" l i t er al " / > </ ws dl : i nput > <wsdl : out put nam e=" r eadDat aResponse" > <s oap: body us e=" l i t er al " / > </ ws dl : out put > </ ws dl : oper at i on> * Observe que neste ponto que associado o header de autenticao a cada mtodo
Passo 4: Em um projeto WEB temporrio, utilizar o Eclipse (que j possui o Axis1 internamente) para gerar novamente o servio. (gera todas as classes do Skeleton e o arquivo de configurao server-config.wsdd).
4.1 Crie um novo "Dynamic Web Project" que ser usado temporariamente no Eclipse. 4.2 Copie o novo WSDL para uma pasta qualquer neste projeto. 4.3 Clique com o boto direito sobre o WSDL, navegue at Web Services -> Generate Java Bean Skeleton
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 14 / 16
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 15 / 16
5.2 Outras classes e mtodos teis Outras classes do ScadaBR oferecem funcionalidades que podem ser importantes na implementao dos servios: Classe com.serotonin.mango.rt.RuntimeManager
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012
Page 16 / 16
Oferece importantes funcionalidades de runtime do sistema: mtodos para iniciar e parar data sources e data points, para escrever valores nos data points, etc. Classe com.serotonin.mango.rt.EventManager Funcionalidades a respeito dos eventos do sistema: mtodos para iniciar, reconhecer e "retornar ao normal" os alarmes.
Comentrios
Voc no tem permisso para adicionar comentrios.
Fazer login | Denunciar abuso | Imprimir pgina | Remover acesso | Tecnologia Google Sites
https://sites.google.com/a/certi.org.br/certi_scadabr/home/minicursos/scada
13/12/2012