FactoryCast HMI Premium & Quantum PLC Applets 2004-10-28
INNEHÅLLSFÖRTECKNING 1 OM DETTA DOKUMENT...3 2 FÖRUTSÄTTNINGAR...3 3 PROJEKT I J++...4 3.1 LÄSA PLC-VARIABLER...4 3.1.1 Gränssnittet...4 3.1.2 Upprätta kommunikation med PLC-systemets variabler...6 Huvudkontor Centrallager Säljkontor Hemsida Schneider Electric AB Schneider Electric AB Göteborg: 031-748 35 00 http://www.schneider-electric.se Box 1009, Norrköpingsvägen 13 Brogetorp Malmö: 040-22 75 40 611 29 NYKÖPING 642 83 FLEN Sollentuna: 08 623 84 00 Tel: 0155-26 54 00 Tel: 0157-652 00 Sundsvall: 060-57 27 00 Fax: 0155-21 42 86 Fax: 0157-652 50
1 OM DETTA DOKUMENT Detta dokument beskriver hur en java applet lokaliserad hos FactoryCast HMImodulen TSX WMY100 kan fås att läsa/skriva PLC-variabler. Dokumentet tar inte upp handhavandet av FactoryCast HMI Configurator. Ingående delar: TSX P57 3634 TSX WMY 100 Visual Studio J++6.0 Java RTE för Windows 1.4.2 FactoryCast HMI Configurator 1.0 PLC Premium CPU FactoryCast HMI webmodul Microsofts Java IDE Sun Microsystems java motor Verktyg för FactoryCast HMI-modulen 2 FÖRUTSÄTTNINGAR Tre stycken PLC-register av typen IEC DINT ska kunna läsas i appleten, registren är: %MD100 %MD102 %MD104 Tre stycken PLC-register av typen IEC DINT ska kunna skrivas i appleten med en knapp. Knappen fungerar som återställning av värden. Registren är: %MD100 %MD102 %MD104 Schneider Electric AB 3 (12)
3 PROJEKT I J++ För att underlätta debugging är det att föredra om all kod som inte har med kopplingen till PLC-systemet definieras först. Den koden kan då debuggas på PC:n med Internet Explorer eller J++:s inbyggda appletviewer. 3.1 LÄSA PLC-VARIABLER 3.1.1 Gränssnittet Läsningen ska göras från PLC-variabler till TextField objekt i java appleten. Tre Label objekt som indikerar vilket register det är frågan om, definieras tillsammans med tre TextField objekt. import java.awt.*; import java.applet.applet; import java.awt.graphics; public class FCapplets extends Applet GridBagLayout gbl=new GridBagLayout(); GridBagConstraints cons=new GridBagConstraints(); Panel p; Label l1; Label l2; Label l3; TextField tf1; TextField tf2; TextField tf3; En layout-hanterare av typen GridBagLayout deklareras med för hanteraren ett regelobjekt av typen GridBagConstraints. Detta skapar ett rutnät där objekten (TextFields och Labels) kan placeras. Ett panelobjekt samt tre Labels och tre TextFields deklareras också. Init metoden skapar gränssnittet: public void init() p=new Panel(gbl); // Förskjutningsobjekt enligt Top,left,bottom,right Insets ins=new Insets(0,20,0,0); Insets insnull=new Insets(0,0,0,0); // Label 1 l1=new Label("Värde %MD100"); // Skapa Label med text cons.insets=insnull; // Ingen förskjutning cons.gridx=0; cons.gridy=0; // Placera Label 1 i kordinater 0,0 gbl.setconstraints(l1,cons); // Label 2 l2=new Label("Värde %MD102"); // Skapa Label med text cons.insets=ins; // Förskjutn till vänster cons.gridx=1; cons.gridy=0; // Placera Label 2 i kordinater 1,0 gbl.setconstraints(l2,cons); // Label 3 l3=new Label("Värde %MD104"); cons.insets=ins; // Skapa Label med text // Förskjutn till vänster Schneider Electric AB 4 (12)
cons.gridx=2; cons.gridy=0; // Placera Label 3 i kordinater 2,0 gbl.setconstraints(l3,cons); // Lägg in labels i panel p.add(l1); p.add(l2); p.add(l3); // TextField 1 tf1=new TextField(10); cons.insets=insnull; // Ingen förskjutning cons.gridx=0; cons.gridy=1; // Placera TextField i kordinater 0,1 gbl.setconstraints(tf1,cons); // TextField 2 tf2=new TextField(10); cons.insets=ins; // Förskjutn till vänster cons.gridx=1; cons.gridy=1; // Placera TextField i kordinater 1,1 gbl.setconstraints(tf2,cons); // TextField 3 tf3=new TextField(10); cons.insets=ins; // Förskjutn till vänster cons.gridx=2; cons.gridy=1; // Placera TextField i kordinater 2,1 gbl.setconstraints(tf3,cons); // Lägg in TextFields i panel p.add(tf1); p.add(tf2); p.add(tf3); // Lägg in panelen i Appleten add(p); Gränssnittet får följande utseende: Schneider Electric AB 5 (12)
3.1.2 Upprätta kommunikation med PLC-systemets variabler Följande behöver göras för att få en möjlighet att komma åt PLC-systemets variabler: 1. Definiera en Classpath till paketet FactoryCast.jar. I J++ 6.0 görs detta via menyn Project Properties flik Classpath. FactoryCast.jar är paketet som Classpath:en sätts till i J++ 6.0 projektet, det används i utvecklingsmiljön men kommer via html filen att styras till de riktiga paketen som finns i modulen. 2. I projektet, importera följande ur FactoryCast.jar: // Klasspaket där kommunikations objekten bl.a ingår import com.schneiderautomation.factorycast.*; import com.schneiderautomation.factorycast.comm.statusmessages; 3. Deklarera PLC objekten (klassinstansvariabler) // Objekt för PLC kommunikation, gällande IEC typ DINT private CommBean comm; // Kom objeketet private SetDInt setter; // Skriv objektet private GetDInt getter; // Läs objektet private MonitorDInt monitor; // Monitoreringsobjektet Schneider Electric AB 6 (12)
4. Implementera interfacet PropertyChangeListener till appleten public class FCapplets extends Applet implements PropertyChangeListener 5. Följande läggs till i appletens init metod // Ta PLC:ns host namn String host = getcodebase().gethost(); // Skapa kom objekten för PLC comm = new CommBean( getlocale() ); setter = new SetDInt( comm.getserver() ); getter = new GetDInt( comm.getserver() ); monitor = new MonitorDInt( comm.getadaptor() ); // Lägg på händelselyssning (PropertyChangeListener) // på PLC objekt getter.addpropertychangelistener( this ); monitor.addpropertychangelistener( this ); // Anslut kom objekt till PLC try comm.connect( host, false ); comm.start(); catch( Exception e ) // Definitioner om kom misslyckas // Registrera tre variabler String adr="%md100"; // Startadress short no=3; // Antal ifrån startadress monitor.setaddress(adr ); // Sätt adressen monitor.setquantity(no); // Sätt antalet monitor.register(); // Registrera 6. PropertyChange lyssnaren som implementerades kastar nu en händelse PropertyChange var gång ett värde förändras för de tre PLC-variablerna som registrerades. Händelsen som kastas ska strax definieras, men först en metod som den händelsen eventuellt kommer att anropa. Denna metod ska sortera ut värdena för de tre PLC-variablerna till respektive TextFieldobjekt private void setvalues(int values[]) String sval=""; sval=integer.tostring(values[0]); tf1.settext(sval); sval=integer.tostring(values[1]); tf2.settext(sval); sval=integer.tostring(values[2]); tf3.settext(sval); Schneider Electric AB 7 (12)
7. PropertyChange lyssnarens metod PropertyChange. I detta fall används bara händelsetypen values som ger en array med värdena för de tre PLC-variablerna som registrerats. En string klassinstansvariabel smsg tilldelas textinfo om händelsetypen. // Anropas om PLC variabler förändrats. public void propertychange( PropertyChangeEvent evt ) // Fånga upp vad händelsen handlar om String prop = evt.getpropertyname(); // Om händelse 'Nya värden' --------------- if( prop.equals( "values" ) ) int[] values = (int[]) evt.getnewvalue(); smsg="värdesförändring skedde"; // ##### HÄR ########## // Här anropas metoden se punkt 6 setvalues(values); // Om händelse 'Ett (1) nytt värde --------- else if( prop.equals( "value" ) ) int[] value = (int[]) evt.getnewvalue(); smsg="värdesförändring skedde"; // Om händelse status (kommfel) ----------- else if( prop.equals( "status" ) ) // Visa kom status för PLC variabeln Integer idstatus = (Integer) evt.getnewvalue(); // Om ej noll ->FEL if( idstatus.intvalue()!= 0 ) // Visa kom felmeddelande smsg=statusmessages.get(idstatus); else // Värdet noll allt ok // Värde hämtades utan fel smsg="status ok"; // Om händelse subscriberstatus ----------- else if( prop.equals( "subscribestatus" ) ) smsg="subscribe skedde"; // Om händelse registrerad ---------------- else if( prop.equals( "registered" ) ) smsg="registrering skedde"; Schneider Electric AB 8 (12)
8. Förutom init metoden kan en applet anropa någon av nedan definierade. // Anropas då applet startas, återta kommunikation public void start() try comm.resume(); catch( Exception e ) e.printstacktrace(); // Anropas då applet stoppas, stäng av kommunikation public void stop() try comm.suspend(); catch( Exception e ) e.printstacktrace(); // Anropas då appleten förstörs (applet avslutas), // Koppla bort kommunikation public void destroy() try comm.disconnect(); catch( Exception e ) e.printstacktrace(); 9. Meddelanden som PropertyChange genererar och tilldelar klassinstansvariabeln smsg skrivs ut i nedre vänstra hörnet public void paint(graphics g) // Skriv ut händelser nere i vänstra hörnet g.drawstring(smsg,5,380); Schneider Electric AB 9 (12)
10. HTM filen page1.htm definieras <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> </HEAD> <BODY> <P> </P> <!-- Applet taggen --> <!-- Attribut codebase: Var applet koden finns --> <!-- Attribut archive: Var kom objekten kan hittas --> <!-- Attibut code: Vad applet klassfilen heter --> <!-- Attribut width och height: Storleken på appleten --> <APPLET codebase="/cj/fcapplets" archive="/classes/sacomm.jar" code="fcapplets.class" width="400" height="400"> </APPLET> </BODY> </HTML> 11. Kompilera javaprojektet och spara class filen och htm filen i mappstrukturen cj\fcapplets\ 12. Kopiera mappen cj och i FactoryCast HMI programvaran klistra in under wwwroot 13. I FactoryCast HMI programvaran, för över till modulen 14. Starta Internet Explorer och i adressfältet skriv in [ MODULENS IP ADRESS ] /cj/fcapplets/page1.htm eller t.ex http://192.168.0.102/cj/fcapplets/page1.htm 15. Resultatet borde bli Schneider Electric AB 10 (12)
16. Tillbaka i java projektet, nu ska knappen som återställer värdena i de tre registren definieras. Deklarera en klassinstansvariabel av typen Button. Konstanten tjänar som knappens text samt identifierar knappen Button cmdsetvalues; final String CMD_SET="Återställning"; 17. I appletens init metod skapas knappen och läggs in i panelen // Knappen Insets instop=new Insets(20,20,0,0); cmdsetvalues=new Button(CMD_SET); cons.insets=instop; // Förskjut knappen nedåt och till vänster cons.gridx=2; cons.gridy=2; // Placera knapp i kordinater 2,2 gbl.setconstraints(cmdsetvalues,cons); p.add(cmdsetvalues); 18. Händelsen då knappen klickas fångas upp i följande metod // Knapp händelse avgörs och aktuell metod anropas public boolean action(event evt,object arg) // Ta objektet i string form String s= arg.tostring(); // Koll om det är ett knapp obj if(evt.target instanceof Button) // Vilket knapp obj if(s.equals(cmd_set)) // Om knappen, anropa metod cmdset_click(); return true; 19. Metoden som anropas då knappen klickas private void cmdset_click() int ivalues[]=new int[3]; // Tilldela värdena ivalues[0]=666; ivalues[1]=777; ivalues[2]=888; // Startadressen String adr="%md100"; try setter.setaddress(adr); setter.setvalues(ivalues ); setter.sendvalues(); catch(exception e) // Definiera om skrivning går fel Schneider Electric AB 11 (12)
20. Kompilera och för över class filen till modulen, resultatet borde bli... Schneider Electric AB 12 (12)