Lecture de variable automate en utilisant le service web de l ETZ (application J2SE) Sommaire 1. Objectifs...2 2. Création d un nouveau projet J2SE...2 3. Intégration du client Web Service...5 3.1. Description du service web du coupleur ETZ...5 3.2. Récupération du fichier WSDL du coupleur ETZ...6 3.3. Intégration du fichier WSDL dans NetBeans...8 4. Codage de l application...9 4.1. ArrayOfInt readmultipleregister(int UnitID, int Adresse, int nbvaleur)...9 4.2. Création du Thread ClassThreadLecture...10 4.3. Modification de la classe principale ClassJFrameLecture...12 5. Copie d écran en exécution...13 6. Code source...14 6.1. ClassJFrameLecture.java...14 6.2. ClassThreadLecture.java...15 BTS iris - Lycée Eiffel - Armentières Page 1 sur 15 30/05/2007
1. Objectifs L objectif de ce chapitre consiste uniquement à utiliser les méthodes du service web du coupleur ETZ pour afficher dans une application Java SE les codes lus par la caméra du Tapiris. L appel de la méthode readmultipleregisters() de lecture du code caméra et l affichage de ce code dans le JFrame seront codés dans un Thread. 2. Création d un nouveau projet J2SE File > New Project > General > Java Application Décochez «Create Main Class» BTS iris - Lycée Eiffel - Armentières Page 2 sur 15 30/05/2007
Création d une fiche graphique JFrame : Clic droit sur le projet > New > File/Folder > Java GUI Forms > JFrame Form BTS iris - Lycée Eiffel - Armentières Page 3 sur 15 30/05/2007
Donnez un nom à la classe : ClassJFrameLecture Créez en même temps le package «com.iris» Cliquez sur Finish Sélection du nouveau JFrame comme classe principale du projet : Clic droit sur le projet > Properties > Run >Main Class = «com.iris.classjframelecture» Création des composants de l IHM (affichage en mode «Design») : En cliquant glissant de la palette vers la JFrame, créez les composants suivants : 1. Ajout d un JButton : Variable Name = JBtnLancer et text = «Lancer la lecture» 2. Ajout d un JButton : Variable Name = JBtnQuitter et text = «Quitter» 3. Ajout d un JLabel : Variable Name = JLblCamera et text = «???» Création de l évènement «onclick» sur le bouton JButtonQuitter : Dans l affichage Design, clic droit sur le bouton JButtonQuitter > Events > Mouse > mouseclicked Modification du code de la fonction générée pour fermer l application : System.exit(0) ; BTS iris - Lycée Eiffel - Armentières Page 4 sur 15 30/05/2007
Code source généré : Remarque : les composants graphiques de la JFrame sont tous créés dans la méthode initcomponents(). Cette méthode n est pas modifiable à partir du code source, NetBeans ne présente pas son code directement, il est replié dans l éditeur de code source. package com.iris; public class ClassJFrameLecture extends javax.swing.jframe { public ClassJFrameLecture() { initcomponents(); // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initcomponents() { /* * Code de création des composants graphiques *... */ private void jbtnquittermouseclicked(java.awt.event.mouseevent evt) { System.exit(0) ; public static void main(string args[]) { java.awt.eventqueue.invokelater(new Runnable() { public void run() { new ClassJFrameLecture().setVisible(true); ); private javax.swing.jbutton jbtnlancer; private javax.swing.jbutton jbtnquitter; private javax.swing.jlabel jlblcamera; 3. Intégration du client Web Service 3.1. Description du service web du coupleur ETZ Voici les méthodes disponibles sur le service web (implémentation d un accès aux données en Modbus) : ReadDeviceIdentification Transparent Ready Modbus BASIC class. Operation to read device identification. inputs: int UnitID. outputs: DeviceIdentification ReadDeviceIdentificationResult. ReadMultipleRegisters Transparent Ready Modbus BASIC class. Operation to read multiple registers. inputs: int UnitID, int Address, int Quantity. outputs: int[] ReadMultipleRegistersResult. BTS iris - Lycée Eiffel - Armentières Page 5 sur 15 30/05/2007
WriteMultipleRegisters Transparent Ready Modbus BASIC class. Operation to write multiple registers. inputs: int UnitID, int Address, int[] Value. outputs: ReadCoils Transparent Ready Modbus REGULAR class. Operation to read multiple coils. inputs: int UnitID, int Address, int Quantity. outputs: int[] ReadCoilsResult. WriteMultipleCoils Transparent Ready Modbus REGULAR class. Operation to write multiple coils. inputs: int UnitID, int Address, int[] Value. outputs: ReadInt32 Extension of Transparent Ready Modbus REGULAR class. Operation to read integer (32 bits). inputs: int UnitID, int Address, int Quantity. outputs: int[] ReadInt32Result. WriteInt32 Extension of Transparent Ready Modbus REGULAR class. Operation to write integer (32 bits). inputs: int UnitID, int Address, int[] Value. outputs: Remarques : Les méthodes XXXRegisters() travaillent sur des mots mémoire (%MW) et les méthodes XXXCoils() travaillent sur des bits mémoire (%M). Le coupleur ETZ 510 est capable de traiter au maximum une requête SOAP toutes les 200 ms (appel d une méthode du Web Service). 3.2. Récupération du fichier WSDL du coupleur ETZ A l aide d un navigateur web, connectez-vous sur l adresse du coupleur ETZ : http://192.168.33.8 Cliquez sur Documentation puis Web Services. Choisissez le service web «ModbusXmlDa» (utilisation directe des adresses mémoires de l automate, les accès sont plus rapides que par les symboles) BTS iris - Lycée Eiffel - Armentières Page 6 sur 15 30/05/2007
Copier le raccourci vers WSDL 1.1 http://192.168.33.8/ws/modbusxmlda?wsdl BTS iris - Lycée Eiffel - Armentières Page 7 sur 15 30/05/2007
3.3. Intégration du fichier WSDL dans NetBeans Clic droit sur le projet > New > File / Folder > Web Services > Web Service Client Remplissez le champ «WSDL URL» avec l adresse du fichier WSDL récupéré précédemment Remplissez le champ «Package» avec modbusxmlda Cliquez sur Finish NetBeans génère le paquetage modbusxmlda. Les classes générées se situent dans le dossier \J2SELectureETZ\build\classes\ modbusxmlda. BTS iris - Lycée Eiffel - Armentières Page 8 sur 15 30/05/2007
Les méthodes du service web sont visibles dans l inspecteur de projet dans le dossier «Web Service References». 4. Codage de l application Nous créerons une classe Thread «ClassThreadLecture» pour appeler la méthode exportée du service web «readmultipleregisters()». La valeur lue par la caméra sera affichée dans la propriété «text» de JLblCamera du jframe. La lecture et l affichage s effectueront toutes les 200 ms. Le coupleur ETZ 510 est capable de traiter au maximum une requête SOAP toutes les 200 ms (appel d une méthode du Web Service). 4.1. ArrayOfInt readmultipleregister(int UnitID, int Adresse, int nbvaleur) Rappel : %MW162 = adresse mémoire de l automate contenant le code lu par la caméra Dans notre exemple, nous utiliserons la classe ArrayOfInt comme valeur de retour. Cette classe est créée avec le stub. BTS iris - Lycée Eiffel - Armentières Page 9 sur 15 30/05/2007
package modbusxmlda; import java.util.arraylist; import java.util.list; import javax.xml.bind.annotation.xmlaccesstype; import javax.xml.bind.annotation.xmlaccessortype; import javax.xml.bind.annotation.xmlelement; import javax.xml.bind.annotation.xmltype; @XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "ArrayOfInt", proporder = { "_int" ) public class ArrayOfInt { @XmlElement(name = "int", namespace = "http://www.schneiderelectric.com/ws/modbusxmlda/", type = Integer.class) protected List<Integer> _int; public List<Integer> getint() { if (_int == null) { _int = new ArrayList<Integer>(); return this._int; Les paramètres de la méthode readmultipleregister() sont : UnitID = 0 par défaut car non utilisé dans la version actuelle Adresse = 162, cf. adresse mémoire désirée de l automate nbvaleur = nombre d adresses mémoires consécutives à lire 4.2. Création du Thread ClassThreadLecture Clic droit sur le paquetage com.iris > New > Java Class Nommez la nouvelle classe : ClassThreadLecture Modifiez le code généré pour : Dérivation de la classe Thread Création de la méthode run() package com.iris; public class ClassThreadLecture extends Thread { public ClassThreadLecture() { public void run() { BTS iris - Lycée Eiffel - Armentières Page 10 sur 15 30/05/2007
L appel de la méthode readmultipleregisters() du service web peut se faire de deux façons : Cliquer glisser la méthode à partir de l inspecteur de projets vers le code source Clic droit dans le code > Web Service Client Resources > Call web Service Operation > Sélectionnez la méthode readmultipleregisters() > OK Modifiez le code généré dans la méthode run() du Thread en respectant les consignes suivantes : Le code mémoire de la caméra est address = 162 Le thread doit lire en boucle toutes les 200 ms Le résultat de la lecture est affiché dans jlblcamera de ClassJFrameLecture Remarque : par souci de lisibilité, nous avons supprimé le nom du paquetage modbusxmlda devant chaque objet et nous avons importé le paquetage au début du code source : import modbusxmlda.* ; BTS iris - Lycée Eiffel - Armentières Page 11 sur 15 30/05/2007
package com.iris; import javax.swing.jlabel; import modbusxmlda.* ; // @author BTS iris Armentières public class ClassThreadLecture extends Thread { ModbusXmlDa service ; ModbusXmlDaSoap port ; ArrayOfInt result ; JLabel adrjlabel ; public ClassThreadLecture(JLabel prmlbl) { adrjlabel = prmlbl ; try { // Call Web Service Operation service = new modbusxmlda.modbusxmlda(); port = service.getmodbusxmldasoap(); catch (Exception ex) { //ex.printstacktrace(); public void run() { try { while (!interrupted()){ result = port.readmultipleregisters(0, 162, 1); adrjlabel.settext(result.getint().get(0).tostring()) ; sleep(200) ; // pour ne pas surcharger le service web ETZ // et en tenant compte du cycle de l'automate catch (InterruptedException ex) { //ex.printstacktrace(); 4.3. Modification de la classe principale ClassJFrameLecture Dans ClassJFrameLecture.java : Création d un attribut private ClassThreadLecture objthreadlecture ; Dans le constructeur, création de l objet Thread objthreadlecture = new ClassThreadLecture (jlblcamera) ; Création et lancement des Threads dans l évènement «onclick» du bouton JBtnLancer objthreadlecture.start() ; Arrêt des Threads dans l évènement «onclick» du bouton JBtnQuitter objthreadlecture.interrupt() ; try { objthreadlecture.join() ; catch (InterruptedException ex) { ex.printstacktrace(); BTS iris - Lycée Eiffel - Armentières Page 12 sur 15 30/05/2007
5. Copie d écran en exécution BTS iris - Lycée Eiffel - Armentières Page 13 sur 15 30/05/2007
6. Code source 6.1. ClassJFrameLecture.java package com.iris; /** * @author BTS iris Armentières */ public class ClassJFrameLecture extends javax.swing.jframe { private ClassThreadLecture objthreadlecture ; /** Creates new form ClassJFrameLecture */ public ClassJFrameLecture() { initcomponents(); objthreadlecture = new ClassThreadLecture (jlblcamera) ; // <editor-fold defaultstate="collapsed" desc=" Generated Code "> private void initcomponents() { [ ] // </editor-fold> private void jbtnlancermouseclicked(java.awt.event.mouseevent evt) { objthreadlecture.start() ; jbtnlancer.setenabled(false) ; private void jbtnquittermouseclicked(java.awt.event.mouseevent evt) { objthreadlecture.interrupt() ; try { objthreadlecture.join() ; catch (InterruptedException ex) { ex.printstacktrace(); System.exit(0) ; public static void main(string args[]) { java.awt.eventqueue.invokelater(new Runnable() { public void run() { new ClassJFrameLecture().setVisible(true); ); // Variables declaration - do not modify private javax.swing.jbutton jbtnlancer; private javax.swing.jbutton jbtnquitter; private javax.swing.jlabel jlblcamera; // End of variables declaration BTS iris - Lycée Eiffel - Armentières Page 14 sur 15 30/05/2007
6.2. ClassThreadLecture.java package com.iris; import javax.swing.jlabel; import modbusxmlda.* ; /** * @author BTS iris Armentières */ public class ClassThreadLecture extends Thread { ModbusXmlDa service ; ModbusXmlDaSoap port ; ArrayOfInt result ; JLabel adrjlabel ; public ClassThreadLecture(JLabel prmlbl) { adrjlabel = prmlbl ; try { // Call Web Service Operation service = new modbusxmlda.modbusxmlda(); port = service.getmodbusxmldasoap(); catch (Exception ex) { //ex.printstacktrace(); public void run() { try { while (!interrupted()){ result = port.readmultipleregisters(0, 162, 1); adrjlabel.settext(result.getint().get(0).tostring()) ; sleep(200) ; // pour ne pas surcharger le service web ETZ // et en tenant compte du cycle de l'automate catch (InterruptedException ex) { //ex.printstacktrace(); BTS iris - Lycée Eiffel - Armentières Page 15 sur 15 30/05/2007