Apéndice B Códigos de programación B.1. Código del PLC La configuración y programación del PLC se ha realizado mediante el software suministrado por Modicon Telemecanique. El programa crea 5 archivos de extensión, .FEF, .SCY, .ST, .TAB y .PL7, que contienen la configuración del PLC y el programa de ejecución. Dado que la información que continúen dichos archivos resulta redundante se ha creı́do oportuno incluir tan solo los fragmentos del programa y las variables del PLC. Para mayor información se incluyen todos los archivos en el CD del proyecto. B.1.1. Programa del PLC (* Programa realizado por Daniel Gasa Fonollosa *) (* y Ignacio Garrido Girón *) (* Las variables llamadas Marca a lo largo del *) (* programa han sido utilizadas como método de depuración *) (* para saber en que parte la*) (* aplicación dejaba de funcionar *) (* Inicialización de tablas y variables !! En este *) (* bloque se realiza la inicilización de todos las *) (* variables que participan en*) (*la aplicación . Este bloque está controlado por *) (*un par de variables según el estado de estas se *) (* podrá acceder o no . La variables son Ini *) (*y Play . Siempre la primera vez que se pone en*) (* marcha el PLC se entra en este bloque , por lo tanto *) 102 Maqueta de ascensor para la realización de prácticas por Internet (* toda la información referente *) (*a otros grafos queda borrada automáticamente .*) (* Posteriormente el estudiante tendrá la capacidad de*) (* modificar estas dos variables para *) (* poder volver a inicializar el PLC . Recordar que *) (* este proceso es como la simulación de la Marcha y*) (* Paro del PLC.*) SET %M10 ; IF NOT %M2 THEN (* Inicialización de variables y tablas solo si Ini no esta activo (no inicio )*) %MW500: = 0 ; %MW507: = 0 ; %MW501: = 0 ; %MW502: = 0 ; %MW505: = 0 ; % MW0: 1 6 0 : = 0 ; %MW160: 1 6 0 : = 0 ; %MW320: 1 6 0 : = 0 ; %MW480: 2 0 : = 0 ; RESET %M4; END IF ; RESET %M10 ; SET %M11 ; (*En esta rutina se mantiene la variable *) (* Ini que impide la Inicialización mientras *) (* este la variable play activa *) IF %M0 THEN SET %M2; ELSE RESET %M2; END IF ; RESET %M11 ; (* Descodificador de entradas fı́sicas !!En este *) (* bloque se procesa la entrada fı́sica que está *) (* cableada en el PLC.*) (*En este proyecto solo se han cableado variables *) (* digitales por lo tanto no se tendrá que *) (* diferenciar en la entrada *) (* las variables digitales de las analógicas . *) Capı́tulo B: Códigos de programación (*El proceso es el siguiente : se recogen todos los *) (* valores en el modulo de *) (* entradas y todos esos bits se transformana un *) (* número decimal que será procesado por la aplicación *) (* para devolver la salida *) (*y el estado siguiente *) SET %M12 ; (*se graba cada entrada fı́sica a cada bit de *) (* una palabra de 16 bits que posteriormente se*) (* utilizará como valor decimal *) %MW503: X0:= %I 1 . 0 ; %MW503: X1:= %I 1 . 1 ; %MW503: X2:= %I 1 . 2 ; %MW503: X3:= %I 1 . 3 ; %MW503: X4:= %I 1 . 4 ; %MW503: X5:= %I 1 . 5 ; %MW503: X6:= %I 1 . 6 ; %MW503: X7:= %I 1 . 7 ; %MW503: X8:= %I 1 . 8 ; %MW503: X9:= %I 1 . 9 ; %MW503: X10:= %I 1 . 1 0 ; %MW503: X11:= %I 1 . 1 1 ; %MW503: X12:= %MW508: X0 ; %MW503: X13:= %MW509: X0 ; %MW503: X14:= %MW510: X0 ; %MW503: X15:= %MW511: X0 ; RESET %M12 ; SET %M13 ; (* Rutina que identifica un cambio de*) (* valor en el módulo de entrdas *) IF %MW506<> %MW503 THEN %MW506:= %MW503; %MW507: = 0 ; SET %M3; END IF ; RESET %M13 ; 103 104 Maqueta de ascensor para la realización de prácticas por Internet (* Busqueda de la primera tabla ’ transiciones ’!! *) (*En este bloque hay anidada otra subfunción SR0 *) (*(el código se presenta más adelante )*) (* Este bloque realiza la busqueda de la transición *) (* que coincida con el estado real , las variables *) (*de entrada de la busqueda son *) (*la codificación de la entrada fı́sica y la *) (* variable EstadoActual ( donde se guarda el estado *) (* actual en cada momento ), con estas dos *) (*de entrada se obtendrán dos variables de salida *) (*, el EstadoSiguiente y la Salida *) (* Este bloque solo se ejecutará cuando en el bloque *) (* anterior se detecte un cambio en las entradas *) (* fı́sicas . Este cambio se reflejará *) (*en la activación o desactivación de la variable *) (*’ Confirmació ’*) SET %M14 ; (* Rutina de busqeda dentro de las tablas introducidas por el estudiante *) IF %M3 THEN WHILE NOT %M4 DO %MW502:=FIND EQWP( %MW160:160, %MW506, %MW507 ) ; %MW507:= %MW502; IF %MW502=−1 THEN SET %M4; ELSE SR0 ; END IF ; RESET %M19 ; RESET %M14 ; END WHILE ; RESET %M4; SET %M15 ; RESET %M3; END IF ; RESET %M15 ; (*En este bloque se busca dentro de la tabla *) (*de salidas la salida que corresponde al*) (* estado actual *) Capı́tulo B: Códigos de programación SET %M16 ; %MW501:= %MW480[ %MW500 ] ; RESET %M16 ; (* Codificación de las Salidas fı́sicas !!*) (* Este último bloque serı́a el antagonico del *) (* segundo bloque . En este bloque se realiza *) (*la codificación a binario de un número *) (* decimal para que las salidas binarias puedan *) (* representar la salida correspondiente *) SET %M17 ; (* Igualación de una sálida fı́sica a una *) (* variable de la aplicación ( bit)*) %Q2.0:= %MW501: X0 ; %Q2.1:= %MW501: X1 ; %Q2.2:= %MW501: X2 ; %Q2.3:= %MW501: X3 ; %Q2.4:= %MW501: X4 ; %Q2.5:= %MW501: X5 ; %Q2.6:= %MW501: X6 ; %Q2.7:= %MW501: X7 ; %Q2.8:= %MW501: X8 ; %Q2.9:= %MW501: X9 ; %Q2.10:= %MW501: X10 ; %Q2.11:= %MW501: X11 ; %Q2.12:= %MW501: X12 ; %Q2.13:= %MW501: X13 ; %Q2.14:= %MW501: X14 ; %Q2.15:= %MW501: X15 ; RESET %M17 ; END PROGRAM (* Subrutina Sr0 *) PROGRAM (* Comprobación de Entrada y Estado Correcto !! *) 105 106 Maqueta de ascensor para la realización de prácticas por Internet (*En esta subfunción se analiza el valor de la *) (* entrda y estado entrados por el usuario para (* certificar que esta transición existe en la *) (* tabla suministrada *) SET %M20 ; IF %MW0[ %MW502]= %MW500 THEN SET %M18 ; %MW500:= %MW320[ %MW502 ] ; %MW507:= %MW502+1; RESET %M18 ; SET %M19 ; SET %M4; RESET %M3; RETURN; ELSE SET %M19 ; %MW507:= %MW502+1; RETURN; END IF ; RESET %M20 ; RETURN; END PROGRAM Capı́tulo B: Códigos de programación B.1.2. Listado de variables del PLC (*El formato es : ’ Nombre de Variable ’ AT ’ Dirección PLC’ : ’ tipo de variable ’*) (* Tabla con las variables de ’ EstadoActual ’: Solo se muestran las 5 primeras variables de la tabla .*) E s t a t s AT %MW0 : WORD; E s t a t s 1 AT %MW1 : WORD; E s t a t s 2 AT %MW2 : WORD; E s t a t s 3 AT %MW3 : WORD; E s t a t s 4 AT %MW4 : WORD; (* Tabla con las variables de ’ Entradas ’: Solo se muestran las 5 primeras variables de la tabla .*) Entrades AT %MW160 : Entrades1 AT %MW161 Entrades2 AT %MW162 Entrades3 AT %MW163 Entrades4 AT %MW164 WORD; : WORD; : WORD; : WORD; : WORD; (* Tabla con las variables de ’ EstadoSiguiente ’: Solo se muestran las 5 primeras variables de la tabla .*) E s t a t s s e g u e n t s AT %MW320 : E s t a t s s e g u e n t s 1 AT %MW321 E s t a t s s e g u e n t s 2 AT %MW322 E s t a t s s e g u e n t s 3 AT %MW323 E s t a t s s e g u e n t s 4 AT %MW324 WORD; : WORD; : WORD; : WORD; : WORD; (* Tabla con las variables de ’ Salidas ’: Solo se muestran las 5 primeras variables de la tabla .*) S o r t i d e s AT %MW480 : WORD; S o r t i d e s 1 AT %MW481 : WORD; S o r t i d e s 2 AT %MW482 : WORD; 107 108 Maqueta de ascensor para la realización de prácticas por Internet S o r t i d e s 3 AT %MW483 : WORD; S o r t i d e s 4 AT %MW484 : WORD; (* Variables utilizdas por el PLC:*) E s t a t a c t u a l AT %MW500 : WORD; S o r t i d a a c t u a l AT %MW501 : WORD; Index AT %MW502 : WORD; E n t r a d a s e g u e n t 1 AT %MW503 : WORD; E n t r a d a s e g u e n t 2 AT %MW504 : WORD; Crc AT %MW505 : WORD; E n t r a d e s a c t u a l s AT %MW506 : WORD; Simllamada0 AT %MW508 : WORD; Simllamada1 AT %MW509 : WORD; Simllamada2 AT %MW510 : WORD; Simllamada3 AT %MW511 : WORD; Nuevoestado1 AT %MW0: X0 : BOOL; Nuevoestrado2 AT %MW0: X1 : BOOL; Play AT %M0 : EBOOL; Paro AT %M1 : EBOOL; I n i AT %M2 : EBOOL; C o n f i r m a c i o AT %M3 : EBOOL; END VAR Capı́tulo B: Códigos de programación B.2. 109 Códigos de Java El Applet que se ha creado y que realiza las funciones de envió, recepción, visualización y SCADA del sistema, se llama FinalApplet. Para realizar cada una de la funciones especificas, se han creado diferentes clases de Java que facilitan la comprensión del código y la programación de la aplicación. Aunque en el apéndice B.3 se incluye toda la documentación necesaria en formato HTML para la comprensión de la estructura del Applet y sus funciones, se ha creı́do oportuno incluir el código fuente y un pequeño esquema de las diferentes clases. En el esquema también se representa la herencia de cada una de las clases creadas. class java.lang.Object • class javax.swing.table.AbstractTableModel ◦ class DataModel1 ◦ class DataModel2 ◦ class DataModel3 ◦ class DataModel4 ◦ class DataModel5 class java.awt.Component • class javax.swing.Container.JComponent ◦ class javax.swing.JPanel class PanelAscensor • class java.awt.Panel • class java.applet.Applet ◦ class javax.swing.JApplet class FinalApplet class Estructura class FinalApplet.AñadirSalidas actionPerformed class FinalApplet.AñadirTransiciones actionPerformed class FinalApplet.BorrarTabla actionPerformed class FinalApplet.BorrarUnaTransicion actionPerformed Maqueta de ascensor para la realización de prácticas por Internet 110 class FinalApplet.EnvioTablaPLC actionPerformed class FinalApplet.LeerBoton actionPerformed class FinalApplet.MostrarHTML actionPerformed class FinalApplet.MyValueListener class FinalApplet.RegistrarMarcas actionPerformed class PanelAscensor.Cabina class PanelAscensor.Leds class PanelAscensor.Puertas Para facilitar la comprensión del código se han distribuido las distintas clases en distintos capı́tulos en función del archivo origen. Ası́ pues, en cada sección se ha incluido el código de un solo archivo. También se han subrayado las palabras clave ası́ como todas las variables de la clases. De este modo es más sencillo hacer un seguimiento del código. B.2.1. import import import import import import import import import import FinalApplet.java com . s c h n e i d e r a u t o m a t i o n . f a c t o r y c a s t . ∗ ; j a v a x . swing . ∗ ; j a v a x . swing . b o r d e r . Border ; j a v a x . swing . t a b l e . TableColumn ; j a v a . awt . ∗ ; j a v a . awt . e v e n t . ActionEvent ; j a v a . awt . e v e n t . A c t i o n L i s t e n e r ; j a v a . beans . PropertyChangeEvent ; j a v a . beans . P r o p e r t y C h a n g e L i s t e n e r ; j a v a . n e t .URL; /** * <p> Tı́tulo : Maqueta de ascensor per a la realitzación de prácticas por internet </p> * <p> Descripción : Applet para interconectar a un * usuario con un PLC . SCADA que ayuda a introducir Capı́tulo B: Códigos de programación * un diagrama de estados a un PLC y visualizar los * resultados </p> * * @see Estructura * @see DataModel1 * @see DataModel2 * @see DataModel3 * @see DataModel4 * @see DataModel5 * @see <a href =" http :// java.sun.com/j2se /1.4.2/ docs /"> * J2SE Documentation </a> * @see <a href =" http :// www.awl.com/cp/ javaseries / jcl1_2 .html "> * Reference : The Java Class Libraries ( update file )</a> * @see <a href =" http :// java.sun.com/api //"> Apis de Java </a> * * @since JDK 1.4 * @author Ignacio Garrido Girón * @version 1.0 27.7.03 */ public f i n a l c l a s s F i n a l A p p l e t extends JApplet { /** * Varible que nos indica las transiciones que hemos * a~ n adido a las tablas . * Se incrementa a cada transición * * @see A~ n adirTransiciones_actionPerformed */ private int count = 0 ; /** * Establece la conexión con el PLC mediante la * dirección que se le suministra . * *@see com. schneiderautomation . factorycast . SetInt *@see com. schneiderautomation . factorycast . GetInt *@see com. schneiderautomation . factorycast . MonitorInt *@see com. schneiderautomation . factorycast . SetBool */ private CommBean comm ; 111 112 Maqueta de ascensor para la realización de prácticas por Internet /** * Envia los 500 valores reales al PLC en función * del host obtenido en { @link # comm }, de la dirección , * por ejemplo marca %MW203 , de la cantidad de valores * que queremos enviar y del tipo de valor . * *@see com. schneiderautomation . factorycast . SetInt *@see com. schneiderautomation . factorycast . SetBool */ private f i n a l S e t I n t [ ] s e t t e r = new S e t I n t [ 5 0 0 ] ; /** * Envia un Int al PLC para modificar una variable y * simular una llamada a un nivel . * *@see com. schneiderautomation . factorycast . SetInt *@see com. schneiderautomation . factorycast . SetBool */ private S e t I n t v a l o r E n v i a d o = new S e t I n t ( ) ; /** * Envia los valores booleanos al PLC en función * del host obtenido en { @link # comm }, de la * dirección , por ejemplo marca %M2 , de la * cantidad de valores que deseamos enviar y * del tipo de valor . * * @see CommBean * @see com. schneiderautomation . factorycast . SetInt * @see com. schneiderautomation . factorycast . SetBool */ private S e t B o o l i n i c i a l i z a r V a r i a b l e s = new S e t B o o l ( ) ; /** * Lee los 500 valores reales del PLC en función * del host obtenido en { @link # comm },de la dirección * y de la cantidad de datos que queremos recibir . * * @see CommBean * @see MonitorInt */ private f i n a l GetInt [ ] g e t t e r = new GetInt [ 5 0 0 ] ; /** Capı́tulo B: Códigos de programación * Establece un lectura en tiempo real de la variable * que escojamos . A partir de la dirección de la variable * en el PLC y del hot obtenido en { @link # comm }, nos avisa * de cualquier cambio en las propiedades de los datos . * * @see com. schneiderautomation . factorycast . CommBean */ private M o n i t o r I n t monitor = new M o n i t o r I n t ( ) ; /** * Almacena los valores de las tablas de transición en * 3 columnas . * * @see Estructura * */ private f i n a l E s t r u c t u r a [ ] v a l o r e s T r a n s i c i o n e s = new E s t r u c t u r a [ 1 6 0 ] ; /** * Almacena las marcas que estan associadas a cada * posición de las tablas de transicione . * * @see Estructura * */ private f i n a l E s t r u c t u r a [ ] m a r c a s T r a n s i c i o n e s = new E s t r u c t u r a [ 1 6 0 ] ; /** * Almacena la marcas associadas a la tabla de las * se~ n ales de salida . */ private f i n a l int [ ] m a r c a s S a l i d a s = new int [ 2 0 ] ; /** * Almacena los valores de la tabla de las * se~ n ales de salida . */ private f i n a l int [ ] v a l o r e s S a l i d a = new int [ 2 0 ] ; /** * Tabla de transiciones según el modelo de * tablas { @link DataModel1 }. 113 114 Maqueta de ascensor para la realización de prácticas por Internet * * @see DataModel1 * @see JTable */ private f i n a l JTable t a b l a T r a n s i c i o n e s 1 = new JTable (new DataModel1 ( ) ) ; /** * Tabla de transiciones según el modelo de * tablas { @link DataModel1 }. * * @see DataModel1 * @see JTable */ private f i n a l JTable t a b l a T r a n s i c i o n e s 2 = new JTable (new DataModel1 ( ) ) ; /** * Tabla de transiciones según el modelo * de tablas { @link DataModel2 }. * * @see DataModel2 * @see JTable */ private f i n a l JTable t a b l a T r a n s i c i o n e s 3 = new JTable (new DataModel2 ( ) ) ; /** * Tabla de transiciones según el modelo * de tablas { @link DataModel3 }. * * @see DataModel3 * @see JTable */ private f i n a l JTable t a b l a T r a n s i c i o n e s 4 = new JTable (new DataModel3 ( ) ) ; /** * Tabla de transiciones para visualizar * valores del PLC según el * modelo de tablas { @link DataModel1 }. * * @see DataModel1 * @see JTable */ Capı́tulo B: Códigos de programación private f i n a l JTable t a b l a V i s u a l i z a c i o n 1 = new JTable (new DataModel1 ( ) ) ; /** * Tabla de transiciones para visualizar * valores del PLC según el * modelo de tablas { @link DataModel1 }. * * @see DataModel1 * @see JTable */ private f i n a l JTable t a b l a V i s u a l i z a c i o n 2 = new JTable (new DataModel1 ( ) ) ; /** * Tabla de transiciones para visualizar * valores del PLC según el * modelo de tablas { @link DataModel2 }. * * @see DataModel2 * @see JTable */ private f i n a l JTable t a b l a V i s u a l i z a c i o n 3 = new JTable (new DataModel2 ( ) ) ; /** * Tabla de transiciones para visualizar * valores del PLC según el * modelo de tablas { @link DataModel3 }. * * @see DataModel3 * @see JTable */ private f i n a l JTable t a b l a V i s u a l i z a c i o n 4 = new JTable (new DataModel3 ( ) ) ; /** * Tabla de Entradas del PLC para visualizar * los valores en tiempo real. * El modelo de tablas { @link DataModel4 }. * * @see DataModel4 * @see JTable */ 115 116 Maqueta de ascensor para la realización de prácticas por Internet private f i n a l JTable t a b l a E n t r a d a s = new JTable (new DataModel4 ( ) ) ; /** * Tabla de Salidas del PLC para visualizar * los valores en tiempo real. * El modelo de tablas { @link DataModel5 }. * * @see DataModel5 * @see JTable */ private f i n a l JTable t a b l a S a l i d a s = new JTable (new DataModel5 ( ) ) ; /** * JtabbedPane que almacena todas las capas que * se muestran en el Applet . Este elemento gestiona * que todas las capas que se muestran , se * visualizen correctamente . * * @see JTabbedPane */ private f i n a l JTabbedPane s o l a p a s = new JTabbedPane ( ) ; /** * Panel para alamacenar todos los elementos para * la definicion los diagramas de estados . */ private f i n a l JPanel capa1 = new JPanel ( ) ; /** * Panel para alamacenar todos los elementos para * la visualización de la tabla de transiciones . */ private f i n a l JPanel capa2 = new JPanel ( ) ; /** * Panel para alamacenar todos los elementos * para la visualización de los valores del PLC. */ private f i n a l JPanel capa3 = new JPanel ( ) ; /** * Panel para visualizar el Scada del ascensor . */ private f i n a l P a n e l A s c e n s o r p a n e l a s c e n s o r = Capı́tulo B: Códigos de programación new P a n e l A s c e n s o r ( ) ; /** * JCombobox que ayuda a introducir el diagrama * de estados en el PLC. * Selecciona el estado actual de la transición . */ private f i n a l JComboBox jComboBox1 = new JComboBox ( ) ; /** * JCombobox que ayuda a introducir el diagrama de * estados en el PLC . Selecciona el estado siguiente * de la transición . */ private f i n a l JComboBox jComboBox2 = new JComboBox ( ) ; /** * JCombobox que ayuda a introducir el diagrama * de estados en el PLC. * Selecciona el estado actual de la tabla * de salida . */ private f i n a l JComboBox jComboBox3 = new JComboBox ( ) ; /** * JCombobox que ayuda a introducir el diagrama * de estados en el PLC. * Este elemento controla el numero de estados * de nuestro diagrama de estados . Mediante este * elemento se controla * las filas que hay que enviar al PLC * de la tabla de salidas . */ private f i n a l JComboBox jComboBoxnumeroestados = new JComboBox ( ) ; /** * JCombobox que ayuda a introducir el * diagrama de estados en el PLC. * Este elemento controla el numero de * transiciones de nuestro diagrama de estados . * Mediante este elemento * se controla las filas que hay que enviar al PLC * de la tabla transiciones . */ 117 118 Maqueta de ascensor para la realización de prácticas por Internet private f i n a l JComboBox jComboBoxnumeroTransicones = new JComboBox ( ) ; /** * Gestor para gestionar la colocación de los * componentes en el Applet . */ private f i n a l FlowLayout flowLayout1 = new FlowLayout ( ) ; private f i n a l FlowLayout flowLayout2 = new FlowLayout ( ) ; private f i n a l JLabel j o o = new JLabel ( ) ; // para pruebaaaaa /** * Entradas posibles del ascensor . */ private f i n a l S t r i n g [ ] e n t r a d a s = { ” F i n a l de C a r r e r a c i e r r e de Puerta en n i v e l 3 ” , ” F i n a l de C a r r e r a a p e r t u r a de Puerta en n i v e l 3 ” , ” S e n s o r Cabina en n i v e l 3 ” , ” F i n a l de C a r r e r a c i e r r e de Puerta en n i v e l 2 ” , ” F i n a l de C a r r e r a a p e r t u r a de Puerta en n i v e l 2 ” , ” S e n s o r Cabina en n i v e l 2 ” , ” F i n a l de C a r r e r a c i e r r e de Puerta en n i v e l 1 ” , ” F i n a l de C a r r e r a a p e r t u r a de Puerta en n i v e l 1 ” , ” S e n s o r Cabina en n i v e l 1 ” , ” F i n a l de C a r r e r a c i e r r e de Puerta en n i v e l 0 ” , ” F i n a l de C a r r e r a a p e r t u r a de Puerta en n i v e l 0 ” , ” S e n s o r Cabina en n i v e l 0 ” , ” S i m u l a c i ó n llamada n i v e l 0 ” , ” S i m u l a c i ó n llamada n i v e l 1 ” , ” S i m u l a c i ó n llamada n i v e l 2 ” , ” S i m u l a c i ó n llamada n i v e l 3 ” } ; /** * Salidas posibles del ascensor . */ private f i n a l S t r i n g [ ] s a l i d a s = { ” Motor de A s c e n s o r Ascendiendo ” , ” Motor de A s c e n s o r Descendiendo ” , ”Led v i a j e r o en n i v e l 3 ” , ”Led v i a j e r o en n i v e l 2 ” , ”Led v i a j e r o en n i v e l 1 ” , ”Led v i a j e r o en n i v e l 0 ” , Capı́tulo B: Códigos de programación ” Motor c i e r r e de Puerta en n i v e l 3 ” , ” Motor a p e r t u r a de Puerta en n i v e l 3 ” , ” Motor c i e r r e de Puerta en n i v e l 2 ” , ” Motor a p e r t u r a de Puerta en n i v e l 2 ” , ” Motor c i e r r e de Puerta en n i v e l 1 ” , ” Motor a p e r t u r a de Puerta en n i v e l 1 ” , ” Motor c i e r r e de Puerta en n i v e l 0 ” , ” Motor a p e r t u r a de Puerta en n i v e l 0 ” , ”Led v i a j e r o a s c e n d i e n d o ” , ”Led v i a j e r o d e s c e n d i e n d o ” } ; /** * Numero de estados del sistema . */ private f i n a l S t r i n g [ ] numeroEstados = { ” 0” , ”1” , ” 2” , ” 3” , ”4” , ” 5” , ” 6” , ”7” , ” 8” , ” 9” , ” 10 ” , ” 11 ” , ” 12 ” , ” 13 ” , ” 14 ” , ” 15 ” , ” 16 ” , ” 17 ” , ” 18 ” , ” 19 ” } ; /** * Numero de estados del sistema . */ private f i n a l S t r i n g [ ] numeroEstados1 = { ” 1” , ”2” , ” 3” , ”4” , ” 5” , ” 6” , ”7” , ” 8” , ” 9” , ” 10 ” , ” 11 ” , ” 12 ” , ” 13 ” , ” 14 ” , ” 15 ” , ” 16 ” , ” 17 ” , ” 18 ” , ” 19 ” , ” 20 ” } ; /** * Numero de transiciones del sistema . */ private f i n a l S t r i n g [ ] n u m e r o T r a n s i c i o n e s = new S t r i n g [ 1 6 0 ] ; /** * Gestiona los elementos que hay que mostrar en el * { @link # jList1 } */ 119 120 Maqueta de ascensor para la realización de prácticas por Internet private f i n a l D e f a u l t L i s t M o d e l e l e m e n t o s L i s t 1 = new D e f a u l t L i s t M o d e l ( ) ; /** * Muestra las entradas disponibles del ascensor . * Mediante los elementos seleccionados * se determina la se~ n al de entrada para cada transición . */ private f i n a l J L i s t j L i s t 1 = new J L i s t ( e l e m e n t o s L i s t 1 ) ; /** * Gestiona los elementos que hay que mostrar en el * { @link # jList2 } */ private f i n a l D e f a u l t L i s t M o d e l e l e m e n t o s L i s t 2 = new D e f a u l t L i s t M o d e l ( ) ; /** * Muestra las salidas disponibles del ascensor . * Mediante los elementos seleccionados * se determina la se~ n al de salida para cada estado . */ private f i n a l J L i s t j L i s t 2 = new J L i s t ( e l e m e n t o s L i s t 2 ) ; /** * Borde utilizado en todos los elementos del Applet . * * # @see Border */ private Border b o r d e r 2 ; /** * Botón para a~ n adir una transición seleccionada en * { @link # jList1 } a la tabla de transiciones . El * estado actual y el estdo siguiente se selecionant * mediante { @link # jComboBox1 } y{@link # jComboBox2 }. */ private f i n a l JButton b o t o n T r a n s i c i o n e s = new JButton ( ” A ñadir T r a n s i c i ó n a l a Tabla ” ) ; /** * Botón para a~ n adir la salida seleccionada en el * { @link # jList2 } en la tabla de salidas . */ private f i n a l JButton b o t o n S a l i d a s = new JButton ( ” A ñadir S e l e c c i ó n a l a Tabla de S a l i d a s ” ) ; Capı́tulo B: Códigos de programación 121 /** * Botón para visualizar los valores almacenados en el PLC. * Se visualizan el numero de transiciones seleccionadas * en { @link # jComboBoxnumeroTransicones } en * la tabla de Visualización . */ private f i n a l JButton b o t o n V i s u a l i z a r V a r i a b l e s = new JButton ( ” V i s u a l i z a r v a r i a b l e s ” ) ; /** * Botón para enviar la tabla de transiciones y * la tabla de salidas al PLC. */ private f i n a l JButton botonEnvioPlc = new JButton ( ” Enviar v a l o r e s PLC” ) ; /** * Botón para registrar 2 marcas del PLC . Registramos * la marca de entradas y salidas del PLC. */ private f i n a l JButton b o t o n R e g i s t r o = new JButton ( ” V i s u a l i z a r v a l o r e s en tiempo r e a l ” ) ; /** * Botón que muestra la web de las camaras . */ private f i n a l JButton botonMostrarCamaras = new JButton ( ” V i s u a l i z a r r e s u l t a d o s mediante e l ” + ” s i s t e m a de camaras ” ) ; /** * Botón para borrar una transición de la tabla de transiciones . */ private f i n a l JButton b o t o n B o r r a r t r a n s i c i o n e s = new JButton ( ” B o r r a r Toda l a Tabla de T r a n s i c i o n e s ” ) ; /** * Botón para borrar toda la tablas de transiciones . */ private f i n a l JButton b o t o n B o r r a r U n a T r a n s i c i o n = new JButton ( ” B o r r a r 1 T r a n s i c i ó n de t a b l a ” ) ; /** * Botón para simular la llamada al nivel 0 en el ascensor . * Envia un 1 siempre y cuando las marcas del PLC * esten registradas . De esta manera se puede hacer * un seguimiento de la se~ n al que enviamos al PLC. 122 Maqueta de ascensor para la realización de prácticas por Internet * * * @see JButton */ private f i n a l JButton cb0 = new JButton ( ” S i m u l a c i ó n llamada n i v e l 0 ” ) ; /** * Botón para simular la llamada al nivel 1 en el ascensor . * Envia un 1 siempre y cuando las marcas del PLC * esten registradas . De esta manera se puede hacer * un seguimiento de la se~ n al que enviamos al PLC. * * @see JButton */ private f i n a l JButton cb1 = new JButton ( ” S i m u l a c i ó n llamada n i v e l 1 ” ) ; /** * Botón para simular la llamada al nivel 2 en el ascensor . * Envia un 1 siempre y cuando las marcas del PLC * esten registradas . De esta manera se puede hacer * un seguimiento de la se~ n al que enviamos al PLC. * * @see JButton */ private f i n a l JButton cb2 = new JButton ( ” S i m u l a c i ó n llamada n i v e l 2 ” ) ; /** * Botón para simular la llamada al nivel 3 en el ascensor . * Envia un 1 siempre y cuando las marcas del PLC * esten registradas . De esta manera se puede hacer * un seguimiento de la se~ n al que enviamos al PLC. * * @see JButton */ private f i n a l JButton cb3 = new JButton ( ” S i m u l a c i ó n llamada n i v e l 3 ” ) ; /** * Contador para que el botón de simulación de llamada * no envie un 1 continuamente a la se~ n al de entrada . Se * controla el botón como si fuera un biestable . */ Capı́tulo B: Códigos de programación 123 private int c o n t a d o r c b 0 ; /** * Contador para que el botón de simulación de llamada * no envie un 1 continuamente a la se~ n al de entrada . Se * controla el botón como si fuera un biestable . */ private int c o n t a d o r c b 1 ; /** * Contador para que el botón de simulación de llamada * no envie un 1 continuamente a la se~ n al de entrada . Se * controla el botón como si fuera un biestable . */ private int c o n t a d o r c b 2 ; /** * Contador para que el botón de simulación de llamada * no envie un 1 continuamente a la se~ n al de entrada . Se * controla el botón como si fuera un biestable . */ private int c o n t a d o r c b 3 ; /* * Contador para que los botones de simulación de llamada solo funciones cuando se hayan registrado las marcas * del PLC. */ private boolean a c t i v a r S c a d a ; private private private private private private private private private private final final final final final final final final final final JLabel JLabel JLabel JLabel JLabel JLabel JLabel JLabel JLabel JLabel j L a b e l 1 = new JLabel ( ) ; j L a b e l 2 = new JLabel ( ) ; j L a b e l 3 = new JLabel ( ) ; j L a b e l 4 = new JLabel ( ) ; j L a b e l 5 = new JLabel ( ) ; j L a b e l 6 = new JLabel ( ) ; j L a b e l 7 = new JLabel ( ) ; j L a b e l 8 = new JLabel ( ) ; j L a b e l 9 = new JLabel ( ) ; j L a b e l 1 0 = new JLabel ( ) ; /** * Constructor del Applet */ 124 Maqueta de ascensor para la realización de prácticas por Internet public F i n a l A p p l e t ( ) { } /** * Se llama cuando se crea el Applet . Conecta con el PLC y * inicializa los valores . * * @see JApplet */ public void i n i t ( ) { /** * Definimos el grosor de cada columna para todas * las Tablas . */ TableColumn column = null ; for ( int i = 0 ; i < 3 ; i ++) { column = t a b l a T r a n s i c i o n e s 1 . getColumnModel ( ) . getColumn ( i ) ; i f ( ( i = = 1 ) | | ( i == 3)) { column . s e t P r e f e r r e d W i d t h ( 1 8 ) ; // sport column is bigger } else { column . s e t P r e f e r r e d W i d t h ( 5 0 ) ; } } for ( int i = 0 ; i < 3 ; i ++) { column = t a b l a T r a n s i c i o n e s 2 . getColumnModel ( ) . getColumn ( i ) ; i f ( ( i = = 1 ) | | ( i == 3)) { column . s e t P r e f e r r e d W i d t h ( 1 8 ) ; // sport column is bigger } else { column . s e t P r e f e r r e d W i d t h ( 5 0 ) ; } } for ( int i = 0 ; i < 3 ; i ++) { column = t a b l a T r a n s i c i o n e s 3 . getColumnModel ( ) . getColumn ( i ) ; Capı́tulo B: Códigos de programación i f ( ( i = = 1 ) | | ( i == 3)) { column . s e t P r e f e r r e d W i d t h ( 1 8 ) ; // sport column is bigger } else { column . s e t P r e f e r r e d W i d t h ( 5 0 ) ; } } for ( int i = 0 ; i < 3 ; i ++) { column = t a b l a V i s u a l i z a c i o n 1 . getColumnModel ( ) . getColumn ( i ) ; i f ( ( i = = 1 ) | | ( i == 3)) { column . s e t P r e f e r r e d W i d t h ( 1 8 ) ; // sport column is bigger } else { column . s e t P r e f e r r e d W i d t h ( 5 0 ) ; } } for ( int i = 0 ; i < 3 ; i ++) { column = t a b l a V i s u a l i z a c i o n 2 . getColumnModel ( ) . getColumn ( i ) ; i f ( ( i = = 1 ) | | ( i == 3)) { column . s e t P r e f e r r e d W i d t h ( 1 8 ) ; // sport column is bigger } else { column . s e t P r e f e r r e d W i d t h ( 5 0 ) ; } } for ( int i = 0 ; i < 3 ; i ++) { column = t a b l a V i s u a l i z a c i o n 3 . getColumnModel ( ) . getColumn ( i ) ; i f ( ( i = = 1 ) | | ( i == 3)) { column . s e t P r e f e r r e d W i d t h ( 1 8 ) ; // sport column is bigger } else { column . s e t P r e f e r r e d W i d t h ( 5 0 ) ; } } for ( int i = 0 ; i < 2 ; i ++) { column = t a b l a E n t r a d a s . getColumnModel ( ) . getColumn ( i ) ; i f ( ( i == 1)) { 125 126 Maqueta de ascensor para la realización de prácticas por Internet column . s e t P r e f e r r e d W i d t h ( 1 8 ) ; // sport column is bigger } else { column . s e t P r e f e r r e d W i d t h ( 2 0 0 ) ; } } for ( int i = 0 ; i < 2 ; i ++) { column = t a b l a S a l i d a s . getColumnModel ( ) . getColumn ( i ) ; i f ( ( i == 1)) { column . s e t P r e f e r r e d W i d t h ( 1 8 ) ; // sport column is bigger } else { column . s e t P r e f e r r e d W i d t h ( 2 0 0 ) ; } } /** * Introducimos las entradas y las salidas en la primera * columna de las tablas correspondiente . */ for ( int i = 0 ; i < e n t r a d a s . l e n g t h ; i ++) { tablaEntradas . setValueAt ( entradas [ i ] , i , 0 ) ; } for ( int i = 0 ; i < s a l i d a s . l e n g t h ; i ++) { t a b l a S a l i d a s . setValueAt ( s a l i d a s [ i ] , i , 0 ) ; } /** * Introducimos los valores guardados en las varibles * numeroEstados en los JComboBox1 , JComboBox2 , * JComboBox3 . */ for ( int i = 0 ; i < numeroEstados . l e n g t h ; i ++) { jComboBox1 . addItem ( numeroEstados [ i ] ) ; jComboBox2 . addItem ( numeroEstados [ i ] ) ; jComboBox3 . addItem ( numeroEstados [ i ] ) ; jComboBoxnumeroestados . addItem ( numeroEstados1 [ i ] ) ; } Capı́tulo B: Códigos de programación 127 for ( int i = 0 ; i < n u m e r o T r a n s i c i o n e s . l e n g t h ; i ++) { numeroTransiciones [ i ] = S t r i n g . valueOf ( i + 1 ) ; jComboBoxnumeroTransicones . addItem ( n u m e r o T r a n s i c i o n e s [ i ] ) ; } /** * Introducimos los valores guardados en { @link # entradas }. */ for ( int i = 0 ; i < e n t r a d a s . l e n g t h ; i ++) { e l e m e n t o s L i s t 1 . addElement ( e n t r a d a s [ i ] ) ; } /** * Introducimos los valores guardados en { @link # salidas }. */ for ( int i = 0 ; i < s a l i d a s . l e n g t h ; i ++) { e l e m e n t o s L i s t 2 . addElement ( s a l i d a s [ i ] ) ; } /** * Consigue el host del PLC */ f i n a l S t r i n g h o s t = getCodeBase ( ) . g e t H o s t ( ) ; /** * Creamos los ’ Comm Beans ’ para el PLC comm . Se suministra al * CommBean el host del PLC. */ comm = new CommBean( g e t L o c a l e ( ) ) ; /** * Creamos los comm Beans de las variables para escribir * los datos en el PLC. */ for ( int i = 0 ; i < s e t t e r . l e n g t h ; i ++) { s e t t e r [ i ] = new S e t I n t (comm . g e t S e r v e r ( ) ) ; } v a l o r E n v i a d o = new S e t I n t (comm . g e t S e r v e r ( ) ) ; 128 Maqueta de ascensor para la realización de prácticas por Internet /** * Creamos los comm Beans de la variable booleana para * escribir en las marcas booleanas . */ i n i c i a l i z a r V a r i a b l e s = new S e t B o o l (comm . g e t S e r v e r ( ) ) ; /** * Creamos los comm Beans de las variables para leer los * datos del PLC. */ for ( int i = 0 ; i < g e t t e r . l e n g t h ; i ++) { g e t t e r [ i ] = new GetInt (comm . g e t S e r v e r ( ) ) ; } /** * Registramos la variable de entrada y salida del PLC,para * controlar los cambios de cualquier bit. */ monitor = new M o n i t o r I n t (comm . getAdaptor ( ) ) ; /** * A~ n adimos un oyente para hacer un seguimiento de las * marcas registradas . */ monitor . a d d P r o p e r t y C h a n g e L i s t e n e r (new MyValueListener ( ) ) ; /** * Inicializamos las marcas del PLC asignando el valor * correspondiente a cada posición de la tabla de 160 filas * y 3 columnas */ for ( int i = 0 ; i < m a r c a s T r a n s i c i o n e s . l e n g t h ; i ++) { m a r c a s T r a n s i c i o n e s [ i ] = new E s t r u c t u r a ( ) ; marcasTransiciones [ i ] . asignarValor ( i , i + 160, i + 320); } /** * Inicializamos las marcas de salida del PLC asignando * el valor correspondiente a la tabla de salida . */ for ( int i = 0 ; i < m a r c a s S a l i d a s . l e n g t h ; i ++) { marcasSalidas [ i ] = 480 + i ; } for ( int i = 0 ; i < v a l o r e s T r a n s i c i o n e s . l e n g t h ; i ++) { v a l o r e s T r a n s i c i o n e s [ i ] = new E s t r u c t u r a ( ) ; } Capı́tulo B: Códigos de programación 129 activarScada = false ; /** * Establecemos la conexión con el PLC. */ try { comm . c o n n e c t ( h o s t , f a l s e ) ; comm . s t a r t ( ) ; } catch ( E x c e p t i o n e ) { e . printStackTrace ( ) ; /** * Desactibamos los botones del * Applet en caso de que la conexión no * se establezca correctamente . */ botonTransiciones . setEnabled ( false ) ; botonSalidas . setEnabled ( false ) ; botonEnvioPlc . s e t E n a b l e d ( f a l s e ) ; botonVisualizarVariables . setEnabled ( false ) ; botonRegistro . setEnabled ( false ) ; botonBorrartransiciones . setEnabled ( false ) ; botonBorrarUnaTransicion . setEnabled ( false ) ; } try { jbInit (); } catch ( E x c e p t i o n e ) { e . printStackTrace ( ) ; } } /** * Inicialización de componentes para mostrarlos en el applet * 130 Maqueta de ascensor para la realización de prácticas por Internet */ private void j b I n i t ( ) { /** * Realizamos la simulación de llamada * de nivel mediante la llamada al metodo * " llamada ". Asignamos el valor que suministramos * al método a la marca %MW508, %MW509 .. etc. * */ cb0 . a d d A c t i o n L i s t e n e r (new A c t i o n L i s t e n e r ( ) { public void a c t i o n P e r f o r m e d ( f i n a l ActionEvent e ) { i f ( ( c o n t a d o r c b 0 == 0) && a c t i v a r S c a d a ) { llamada ( ( 5 0 8 ) , 1 ) ; contadorcb0 = 1; } else { } ; } }); cb1 . a d d A c t i o n L i s t e n e r (new A c t i o n L i s t e n e r ( ) { public void a c t i o n P e r f o r m e d ( f i n a l ActionEvent e ) { i f ( ( c o n t a d o r c b 1 == 0) && a c t i v a r S c a d a ) { llamada ( ( 5 0 9 ) , 1 ) ; contadorcb1 = 1; } else { } ; } }); cb2 . a d d A c t i o n L i s t e n e r (new A c t i o n L i s t e n e r ( ) { public void a c t i o n P e r f o r m e d ( f i n a l ActionEvent e ) { i f ( ( c o n t a d o r c b 2 == 0) && a c t i v a r S c a d a ) { llamada ( ( 5 1 0 ) , 1 ) ; contadorcb2 = 1; } else { } Capı́tulo B: Códigos de programación 131 ; } }); cb3 . a d d A c t i o n L i s t e n e r (new A c t i o n L i s t e n e r ( ) { public void a c t i o n P e r f o r m e d ( f i n a l ActionEvent e ) { i f ( ( c o n t a d o r c b 3 == 0) && a c t i v a r S c a d a ) { llamada ( ( 5 1 1 ) , 1 ) ; contadorcb3 = 1; } else { ; } } }); b o r d e r 2 = BorderFactory . c r e a t e L i n e B o r d e r ( SystemColor . windowText , 1 ) ; /** * Establecemos la posición y el tama~ n o de cada uno de los * botones del Applet . */ botonEnvioPlc . setBounds ( new R e c t a n g l e ( 1 3 5 , 6 3 0 , 1 5 5 , 2 5 ) ) ; b o t o n V i s u a l i z a r V a r i a b l e s . setBounds ( new R e c t a n g l e ( 1 3 5 , 6 6 0 , 1 5 9 , 2 5 ) ) ; b o t o n S a l i d a s . setBounds ( new R e c t a n g l e ( 6 1 3 , 4 7 0 , 2 6 3 , 2 5 ) ) ; b o t o n T r a n s i c i o n e s . setBounds ( new R e c t a n g l e ( 1 3 5 , 4 7 0 , 2 2 9 , 2 5 ) ) ; b o t o n R e g i s t r o . setBounds ( new R e c t a n g l e ( 3 1 0 , 7 2 0 , 2 2 0 , 2 5 ) ) ; b o t o n B o r r a r U n a T r a n s i c i o n . setBounds ( new R e c t a n g l e ( 1 3 5 , 5 0 0 , 2 2 9 , 2 5 ) ) ; b o t o n B o r r a r t r a n s i c i o n e s . setBounds ( new R e c t a n g l e ( 1 3 5 , 5 3 0 , 2 8 5 , 2 5 ) ) ; botonMostrarCamaras . setBounds ( new R e c t a n g l e ( 3 1 0 , 7 5 0 , 3 5 2 , 2 5 ) ) ; botonMostrarCamaras . s e t T e x t ( ” V i s u a l i z a r r e s u l t a d o s mediante e l s i s t e m a de camaras ” ) ; 132 Maqueta de ascensor para la realización de prácticas por Internet /** * Establecemos la posición y el tama~ n o de cada uno de los * JcomboBox del Applet . */ jComboBox2 . setBounds ( new R e c t a n g l e ( 3 9 , 2 0 4 , 5 1 , 2 5 ) ) ; jComboBox1 . setBounds ( new R e c t a n g l e ( 3 9 , 7 1 , 5 1 , 2 5 ) ) ; jComboBox3 . setBounds ( new R e c t a n g l e ( 5 4 0 , 8 5 , 5 1 , 2 5 ) ) ; jComboBoxnumeroestados . setBounds ( new R e c t a n g l e ( 6 4 5 , 6 1 0 , 5 1 , 2 5 ) ) ; jComboBoxnumeroTransicones . setBounds ( new R e c t a n g l e ( 6 4 5 , 7 1 0 , 5 1 , 2 5 ) ) ; /** * Establecemos la posición y el tama~ n o de cada uno de las * etiquetas del Applet . */ j L a b e l 1 . s e t T e x t ( ” Estado a c t u a l ” ) ; j L a b e l 1 . setBounds (new R e c t a n g l e ( 1 9 , 3 6 , 1 0 4 , 2 0 ) ) ; j L a b e l 2 . setBounds (new R e c t a n g l e ( 1 1 , 1 6 8 , 1 2 1 , 2 0 ) ) ; jLabel2 . setToolTipText ( ”” ) ; j L a b e l 2 . s e t T e x t ( ” Estado s i g u i e n t e ” ) ; j L a b e l 3 . setBounds (new R e c t a n g l e ( 1 3 5 , 1 7 , 1 8 1 , 2 0 ) ) ; j L a b e l 3 . s e t T e x t ( ” Entrada que a c t i v a l a t r a n s i c i ó n ” ) ; j L a b e l 4 . setBounds (new R e c t a n g l e ( 8 2 0 , 1 6 4 , 7 6 , 2 0 ) ) ; jLabel5 . setText ( ” S e l e c c i o n a r estado ” ) ; j L a b e l 5 . setBounds (new R e c t a n g l e ( 4 6 1 , 5 4 , 1 3 2 , 2 1 ) ) ; j L a b e l 6 . s e t T e x t ( ” S a l i d a s p o s i b l e s para cada e s t a d o ” ) ; j L a b e l 6 . setBounds (new R e c t a n g l e ( 6 1 4 , 1 0 , 3 2 1 , 2 2 ) ) ; j L a b e l 7 . s e t T e x t ( ”Numero t o t a l de Estados d e l s i s t e m a ” ) ; j L a b e l 7 . setBounds (new R e c t a n g l e ( 6 4 5 , 5 8 0 , 2 2 6 , 2 3 ) ) ; j L a b e l 8 . s e t T e x t ( ” Tabla de Entradas ” ) ; j L a b e l 8 . setBounds (new R e c t a n g l e ( 7 2 5 , 3 0 , 2 6 3 , 2 1 ) ) ; Capı́tulo B: Códigos de programación j L a b e l 9 . s e t T e x t ( ” Tabla de S a l i d a s ” ) ; j L a b e l 9 . setBounds (new R e c t a n g l e ( 7 2 5 , 3 7 0 , 2 6 3 , 2 1 ) ) ; jLabel10 . setText ( ”Numero t o t a l de T r a n s i c i o n e s d e l s i s t e m a ” ) ; j L a b e l 1 0 . setBounds ( new R e c t a n g l e ( 6 4 5 , 6 7 0 , 2 6 3 , 2 3 ) ) ; /** * Establece la posición y el tama~ n o de los * botones de simulación de llamada . */ cb3 . setBounds (new R e c t a n g l e ( 5 0 , 1 2 5 , 2 0 0 , 2 5 ) ) ; cb2 . setBounds (new R e c t a n g l e ( 5 0 , 2 5 0 , 2 0 0 , 2 5 ) ) ; cb1 . setBounds (new R e c t a n g l e ( 5 0 , 3 7 5 , 2 0 0 , 2 5 ) ) ; cb0 . setBounds (new R e c t a n g l e ( 5 0 , 5 0 0 , 2 0 0 , 2 5 ) ) ; /** * Definimos el tama~ n o del Applet . */ t h i s . s e t S i z e (new Dimension ( 1 4 9 0 , 9 0 0 ) ) ; t h i s . getContentPane ( ) . add ( s o l a p a s , BorderLayout .NORTH) ; s o l a p a s . setBackground ( C o l o r . l i g h t G r a y ) ; s o l a p a s . setForeground ( Color . black ) ; s o l a p a s . setAlignmentY ( ( f l o a t ) 0 . 5 ) ; /** * A~ n adimos cada una de las capas del JTabbedPane */ s o l a p a s . add ( capa1 , ” D e f i n i r Diagrama de e s t a d o s ” ) ; s o l a p a s . add ( capa2 , ” Tabla de T r a n s i c i o n e s ” ) ; s o l a p a s . add ( capa3 , ” V i s u a l i z a c i ó n de v a l o r e s en e l PLC” ) ; s o l a p a s . add ( p a n e l a s c e n s o r , ” M o n i t o r i z a c i ó n mediante Scada ” ) ; /** * Asignamos a cada una de las capas el gestor para * mostrar los elementos . 133 134 Maqueta de ascensor para la realización de prácticas por Internet */ capa1 . s e t L a y o u t ( null ) ; capa2 . s e t L a y o u t ( flowLayout1 ) ; capa3 . s e t L a y o u t ( flowLayout2 ) ; p a n e l a s c e n s o r . s e t L a y o u t ( null ) ; /** * Definimos a cada botón del Appplet la acción * que ejecuta cuando es pulsado . Cada botón tiene * definido una clase que representa la acción que * realiza . */ botonTransiciones . addActionListener ( new A ñ a d i r T r a n s i c i o n e s a c t i o n P e r f o r m e d ( ) ) ; botonSalidas . addActionListener ( new A ñ a d i r S a l i d a s a c t i o n P e r f o r m e d ( ) ) ; botonEnvioPlc . a d d A c t i o n L i s t e n e r ( new EnvioTablaPLC actionPerformed ( ) ) ; botonVisualizarVariables . addActionListener ( new L e e r B o t o n a c t i o n P e r f o r m e d ( ) ) ; botonRegistro . addActionListener ( new R e g i s t r a r M a r c a s a c t i o n P e r f o r m e d ( ) ) ; botonMostrarCamaras . a d d A c t i o n L i s t e n e r ( new MostrarHTML actionPerformed ( ) ) ; botonBorrartransiciones . addActionListener ( new B o r r a r T a b l a a c t i o n P e r f o r m e d ( ) ) ; botonBorrarUnaTransicion . addActionListener ( new B o r r a r U n a T r a n s i c i o n a c t i o n P e r f o r m e d ( ) ) ; /** * Creamos los bordes de los componentes tablas */ tablaTransiciones1 . setBorder ( border2 ) ; tablaTransiciones2 . setBorder ( border2 ) ; tablaTransiciones3 . setBorder ( border2 ) ; tablaTransiciones4 . setBorder ( border2 ) ; t a b l a V i s u a l i z a c i o n 1 . setBorder ( border2 ) ; t a b l a V i s u a l i z a c i o n 2 . setBorder ( border2 ) ; t a b l a V i s u a l i z a c i o n 3 . setBorder ( border2 ) ; t a b l a V i s u a l i z a c i o n 4 . setBorder ( border2 ) ; tablaEntradas . setBorder ( border2 ) ; Capı́tulo B: Códigos de programación t a b l a S a l i d a s . setBorder ( border2 ) ; /** * Creamos el borde de los componentes Jlist . */ j L i s t 1 . s e t B o r d e r ( BorderFactory . c r e a t e E t c h e d B o r d e r ( ) ) ; j L i s t 1 . setBackground ( SystemColor . a c t i v e C a p t i o n B o r d e r ) ; j L i s t 2 . s e t B o r d e r ( BorderFactory . c r e a t e E t c h e d B o r d e r ( ) ) ; j L i s t 2 . setBackground ( SystemColor . a c t i v e C a p t i o n B o r d e r ) ; /** * Definimos el tama~ n o de las tablas . */ tablaTransiciones1 . setPreferredScrollableViewportSize ( new Dimension ( 2 9 0 , 8 0 0 ) ) ; tablaTransiciones2 . setPreferredScrollableViewportSize ( new Dimension ( 2 9 0 , 8 0 0 ) ) ; tablaTransiciones3 . setPreferredScrollableViewportSize ( new Dimension ( 2 9 0 , 8 0 0 ) ) ; tablaTransiciones4 . setPreferredScrollableViewportSize ( new Dimension ( 1 8 0 , 8 0 0 ) ) ; tablaVisualizacion1 . setPreferredScrollableViewportSize ( new Dimension ( 2 9 0 , 8 0 0 ) ) ; tablaVisualizacion2 . setPreferredScrollableViewportSize ( new Dimension ( 2 9 0 , 8 0 0 ) ) ; tablaVisualizacion3 . setPreferredScrollableViewportSize ( new Dimension ( 2 9 0 , 8 0 0 ) ) ; tablaVisualizacion4 . setPreferredScrollableViewportSize ( new Dimension ( 1 8 0 , 8 0 0 ) ) ; /** * A~ n adimos a cada una de las tablas un JCrollPane para * poder desplazarnos por la tabla en caso que no haya * espacio suficiente . */ final JScrollPane jScrollpaneListaEntradas = new J S c r o l l P a n e ( j L i s t 1 ) ; final JScrollPane jScrollpaneListaSalidas = new J S c r o l l P a n e ( j L i s t 2 ) ; final JScrollPane jScrollpanetabla1 = 135 136 Maqueta de ascensor para la realización de prácticas por Internet new J S c r o l l P a n e ( t a b l a T r a n s i c i o n e s 1 ) ; final JScrollPane jScrollpanetabla2 = new J S c r o l l P a n e ( t a b l a T r a n s i c i o n e s 2 ) ; final JScrollPane jScrollpanetabla3 = new J S c r o l l P a n e ( t a b l a T r a n s i c i o n e s 3 ) ; final JScrollPane jScrollpanetabla4 = new J S c r o l l P a n e ( t a b l a T r a n s i c i o n e s 4 ) ; final JScrollPane jScrollpanetablaVisualizacion1 new J S c r o l l P a n e ( t a b l a V i s u a l i z a c i o n 1 ) ; final JScrollPane jScrollpanetablaVisualizacion2 new J S c r o l l P a n e ( t a b l a V i s u a l i z a c i o n 2 ) ; final JScrollPane jScrollpanetablaVisualizacion3 new J S c r o l l P a n e ( t a b l a V i s u a l i z a c i o n 3 ) ; final JScrollPane jScrollpanetablaVisualizacion4 new J S c r o l l P a n e ( t a b l a V i s u a l i z a c i o n 4 ) ; final JScrollPane jScrollpanetablaEntradas = new J S c r o l l P a n e ( t a b l a E n t r a d a s ) ; final JScrollPane jScrollpanetablaSalidas = new J S c r o l l P a n e ( t a b l a S a l i d a s ) ; /** * Definimos la posición y el tama~ n o de cada * uno de los ScrollPane . */ j S c r o l l p a n e L i s t a S a l i d a s . setBounds ( new R e c t a n g l e ( 6 1 3 , 5 0 , 3 0 0 , 4 0 0 ) ) ; j S c r o l l p a n e L i s t a E n t r a d a s . setBounds ( new R e c t a n g l e ( 1 3 1 , 5 0 , 3 0 0 , 4 0 0 ) ) ; jScrollpaneListaEntradas . setPreferredSize ( new Dimension ( 3 0 0 , 4 0 0 ) ) ; jScrollpaneListaSalidas . setPreferredSize ( new Dimension ( 3 0 0 , 4 0 0 ) ) ; jScrollpanetablaEntradas . setPreferredSize ( new Dimension ( 4 2 5 , 2 8 0 ) ) ; jScrollpanetablaSalidas . setPreferredSize ( new Dimension ( 4 2 5 , 2 8 0 ) ) ; j S c r o l l p a n e t a b l a E n t r a d a s . setBounds ( new R e c t a n g l e ( 7 0 5 , 5 5 , 4 2 5 , 2 8 0 ) ) ; j S c r o l l p a n e t a b l a S a l i d a s . setBounds ( = = = = Capı́tulo B: Códigos de programación new R e c t a n g l e ( 7 0 5 , 4 0 0 , 4 2 5 , 2 8 0 ) ) ; /** * A~ n adimos todos los componente que debe * estar en la primera * lengueta a la capa1 . */ capa1 . add ( j L a b e l 1 , null ) ; capa1 . add ( j L a b e l 2 , null ) ; capa1 . add ( jComboBox1 ) ; capa1 . add ( j L a b e l 4 , null ) ; capa1 . add ( b o t o n V i s u a l i z a r V a r i a b l e s ) ; capa1 . add ( botonEnvioPlc ) ; capa1 . add ( jComboBoxnumeroestados ) ; capa1 . add ( j L a b e l 7 , null ) ; capa1 . add ( j S c r o l l p a n e L i s t a E n t r a d a s ) ; capa1 . add ( j L a b e l 3 , null ) ; capa1 . add ( jComboBox3 ) ; capa1 . add ( b o t o n T r a n s i c i o n e s ) ; capa1 . add ( j S c r o l l p a n e L i s t a S a l i d a s ) ; capa1 . add ( j L a b e l 6 , null ) ; capa1 . add ( b o t o n S a l i d a s ) ; capa1 . add ( j L a b e l 5 , null ) ; capa1 . add ( jComboBox2 ) ; capa1 . add ( b o t o n B o r r a r t r a n s i c i o n e s ) ; capa1 . add ( b o t o n B o r r a r U n a T r a n s i c i o n ) ; capa1 . add ( jComboBoxnumeroTransicones ) ; capa1 . add ( j L a b e l 1 0 ) ; /** * A~ n adimos todos los componente que debe estar en * la segunda lengueta a la capa2 . */ capa2 . add ( j S c r o l l p a n e t a b l a 1 ) ; capa2 . add ( j S c r o l l p a n e t a b l a 2 ) ; capa2 . add ( j S c r o l l p a n e t a b l a 3 ) ; capa2 . add ( j S c r o l l p a n e t a b l a 4 ) ; /** * A~ n adimos todos los componente que debe estar en * la tercera lengueta a la capa3 . */ capa3 . add ( j S c r o l l p a n e t a b l a V i s u a l i z a c i o n 1 ) ; 137 Maqueta de ascensor para la realización de prácticas por Internet 138 capa3 . add ( j S c r o l l p a n e t a b l a V i s u a l i z a c i o n 2 ) ; capa3 . add ( j S c r o l l p a n e t a b l a V i s u a l i z a c i o n 3 ) ; capa3 . add ( j S c r o l l p a n e t a b l a V i s u a l i z a c i o n 4 ) ; /** * A~ n adimos todos los componente que debe * estar en el Scada a la capa panelascensor . */ p a n e l a s c e n s o r . add ( b o t o n R e g i s t r o ) ; p a n e l a s c e n s o r . add ( botonMostrarCamaras ) ; p a n e l a s c e n s o r . add ( j S c r o l l p a n e t a b l a E n t r a d a s ) ; p a n e l a s c e n s o r . add ( j S c r o l l p a n e t a b l a S a l i d a s ) ; p a n e l a s c e n s o r . add ( j L a b e l 8 ) ; p a n e l a s c e n s o r . add ( j L a b e l 9 ) ; p a n e l a s c e n s o r . add ( cb0 ) ; p a n e l a s c e n s o r . add ( cb1 ) ; p a n e l a s c e n s o r . add ( cb2 ) ; p a n e l a s c e n s o r . add ( cb3 ) ; } /** * Se llama cuando el applet se inicia . * Conexión con el PLC. * * @see JApplet */ public void s t a r t ( ) { try { comm . resume ( ) ; } catch ( E x c e p t i o n e ) { e . printStackTrace ( ) ; } } /** * Se llama cuando el applet se detiene . Suspende la * conexión comm con el PLC. * Capı́tulo B: Códigos de programación * @see JApplet */ public void s t o p ( ) { try { comm . suspend ( ) ; } catch ( E x c e p t i o n e ) { e . printStackTrace ( ) ; } } /** * Se llama cuando el applet se destruye . * Desconecta con el PLC. * @see JApplet */ public void d e s t r o y ( ) { try { comm . d i s c o n n e c t ( ) ; } catch ( E x c e p t i o n e ) { e . printStackTrace ( ) ; } } /** * Retorna el complemento a dos * de los elementos seleccionados * en el Jlist . * * @param i JList que deseamos calcular * el valor complemento a 2 * @return int en Complemento a 2 de * los valores selecionados en el Jlist * * @see JList * @since JDK 1.4 */ private s t a t i c int valorComplemento2 ( f i n a l J L i s t i ) { int var1 = 0 ; if ( i . isSelectedIndex (0)) { 139 140 Maqueta de ascensor para la realización de prácticas por Internet var1 = var1 + 1 ; } if ( i . isSelectedIndex (1)) { var1 = var1 + 2 ; } if ( i . isSelectedIndex (2)) { var1 = var1 + 4 ; } if ( i . isSelectedIndex (3)) { var1 = var1 + 8 ; } if ( i . isSelectedIndex (4)) { var1 = var1 + 1 6 ; } if ( i . isSelectedIndex (5)) { var1 = var1 + 3 2 ; } if ( i . isSelectedIndex (6)) { var1 = var1 + 6 4 ; } if ( i . isSelectedIndex (7)) { var1 = var1 + 1 2 8 ; } if ( i . isSelectedIndex (8)) { var1 = var1 + 2 5 6 ; } if ( i . isSelectedIndex (9)) { var1 = var1 + 5 1 2 ; } if ( i . isSelectedIndex (10)) { var1 = var1 + 1 0 2 4 ; } if ( i . isSelectedIndex (11)) { var1 = var1 + 2 0 4 8 ; } if ( i . isSelectedIndex (12)) { var1 = var1 + 4 0 9 6 ; } if ( i . isSelectedIndex (13)) { var1 = var1 + 8 1 9 2 ; } if ( i . isSelectedIndex (14)) { Capı́tulo B: Códigos de programación var1 = var1 + 1 6 3 8 4 ; } if ( i . isSelectedIndex (15)) { var1 = var1 − 3 2 7 6 8 ; } return var1 ; } /** * Cambia el primer bit de las Marcas del PLC en función * del JCheckBox seleccionado . El { @link # cb0 } cambia * el bit de la Marca %MW508 ,el { @link # cb1 } el de * la %MW509 , el { @link # cb2 } el de la %MW510 , y el * de { @link # cb3 } el de la marca %MW511 . La varibale * marca contiene la direccion en el PLC que hay que * modificar . Si el JCheckBox esta activado el bit * vale 1, por contra , si no lo esta , el bit vale 0; * * * @param marca Contiene la direccion de la marca * que hay que * modificar para simular una llamada al ascensor . * @param j * @see com. schneiderautomation . factorycast . CommBean * @see GetInt * @see SetInt * @see JCheckBox * * @since JDK 1.4 */ private void llamada ( f i n a l int marca , f i n a l int j ) { valorEnviado . setAddress ( ” % MW” + S t r i n g . v a l u e O f ( marca ) ) ; valorEnviado . setValue ( Short . parseShort ( S t r i n g . valueOf ( j ) ) ) ; try { valorEnviado . sendValues ( ) ; } catch ( E x c e p t i o n e ) { e . printStackTrace ( ) ; } 141 Maqueta de ascensor para la realización de prácticas por Internet 142 } /** * Envia los valores del estado y la salida seleccionados * en el JComboBox y el Jlist . El { @link # jComboBox3 } * selecciona el estado y la { @link # jList2 } las * salidas associadas a este estado . * La clase a~ n ade un transición en la tabla de salidas * cada vez que es llamada . * * @see ActionEvent * @see ActionListener * @see JComboBox * @see JList * @see JTable * @see Estructura * @see <a href =" http :// java.sun.com/docs/ books / * tutorial /post1 .0/ ui/ eventmodel .html "> * Tutorial : Java 1.1 Event Model </a> * @see <a href =" http :// www.awl.com/cp/ * javaseries / jcl1_2 .html "> * Reference : The Java Class Libraries ( update file )</a> * * @author Ignacio Garrido * @version 1.0 25.7.03 * @since JDK 1.4 */ public f i n a l c l a s s A ñ a d i r S a l i d a s a c t i o n P e r f o r m e d implements A c t i o n L i s t e n e r { /** * Se ejecuta cuando ocurre la acción * @see ActionEvent * @param evt */ public void a c t i o n P e r f o r m e d ( f i n a l ActionEvent e v t ) { f i n a l S t r i n g [ ] i i = new S t r i n g [ 2 ] ; /** * Obtenemos el valor seleccionado en JcomBox3 , * que selecciona el estado actual , y las * salidas marcadas en jList2 . Enviamos los * valores a la tabla de salidas . Capı́tulo B: Códigos de programación 143 * */ i i [ 0 ] = S t r i n g . v a l u e O f ( jComboBox3 . g e t S e l e c t e d I t e m ( ) ) ; i i [ 1 ] = S t r i n g . v a l u e O f ( valorComplemento2 ( j L i s t 2 ) ) ; for ( int i = 0 ; i < i i . l e n g t h ; i ++) { t a b l a T r a n s i c i o n e s 4 . setValueAt ( i i [ i ] , jComboBox3 . g e t S e l e c t e d I n d e x ( ) , i ) ; } /** * Se almacena los valores * de en " valoresSalida " para facilitar * el trabajo . */ v a l o r e s S a l i d a [ jComboBox3 . g e t S e l e c t e d I n d e x ( ) ] = Integer . parseInt ( i i [ 1 ] ) ; } } // Final de la class A~ n adirSalidas_actionPerformed /** * Envia los valores de los estados y las entradas * seleccionados en los { @link # jComboBox1 }, * { @link # jComboBox2 } y en la { @link # jList1 } a * las tablas de transiciones . El primer JComboBox , * { @link # jComboBox1 }, selecciona el estado actual , * el Jlist las entradas asociadas a la transicion , y * el segundo { @link # jComboBox2 } el estado * siguiente . El { @link # jList1 } nos determina * las entradas para cada transición * La classe distribuye las 160 transiciones en función * de las tablas que se dispone . Se muestran en 3 trablas . * * * @see ActionEvent * @see ActionListener * @see javax .swing . JComboBox * @see javax .swing .JList * @see javax .swing . JTable * @see Estructura * @see <a href =" http :// java.sun.com/docs/books / * tutorial / post1 .0/ ui/ * eventmodel .html "> * Tutorial : Java 1.1 Event Model </a> 144 Maqueta de ascensor para la realización de prácticas por Internet * @see <a href =" http :// www.awl.com/cp/ javaseries / jcl1_2 .html "> * Reference : The Java Class Libraries ( update file )</a> * * @author Ignacio Garrido * @version 1.0 25.7.03 * @since JDK 1.4 */ f i n a l c l a s s A ñ a d i r T r a n s i c i o n e s a c t i o n P e r f o r m e d implements A c t i o n L i s t e n e r { /** * Se ejecuta cuando ocurre la acción * @see ActionEvent * @param evt */ public void a c t i o n P e r f o r m e d ( f i n a l ActionEvent e v t ) { /** * Obtenemos el valor de la selección de los 2 combos y * la lista */ f i n a l S t r i n g [ ] i i = new S t r i n g [ 3 ] ; i i [ 0 ] = S t r i n g . v a l u e O f ( jComboBox1 . g e t S e l e c t e d I t e m ( ) ) ; /** * El indice seleccionado es uno menos que el * estado elegido */ i i [ 1 ] = S t r i n g . v a l u e O f ( valorComplemento2 ( j L i s t 1 ) ) ; i i [ 2 ] = S t r i n g . v a l u e O f ( jComboBox2 . g e t S e l e c t e d I t e m ( ) ) ; i f ( count < 5 4 ) { for ( int j = 0 ; j < i i . l e n g t h ; j ++) { t a b l a T r a n s i c i o n e s 1 . s e t V a l u e A t ( i i [ j ] , count , j ) ; } // asigno a valoresTransiciones el // valor de la transición v a l o r e s T r a n s i c i o n e s [ count ] . a s i g n a r V a l o r ( Integer . parseInt ( i i [ 0 ] ) , Integer . parseInt ( i i [ 1 ] ) , Integer . parseInt ( i i [ 2 ] ) ) ; Capı́tulo B: Códigos de programación 145 } e l s e i f ( ( count >= 54) && ( count < 1 0 8 ) ) { for ( int j = 0 ; j < i i . l e n g t h ; j ++) { t a b l a T r a n s i c i o n e s 2 . setValueAt ( i i [ j ] , count − 5 4 , j ) ; } v a l o r e s T r a n s i c i o n e s [ count Integer . parseInt ( Integer . parseInt ( Integer . parseInt ( ]. ii ii ii asignarValor ( [0]), [1]), [2])); } e l s e i f ( ( count >= 108) && ( count < 1 6 0 ) ) { for ( int j = 0 ; j < i i . l e n g t h ; j ++) { t a b l a T r a n s i c i o n e s 3 . setValueAt ( i i [ j ] , count − 1 0 8 , j ) ; } v a l o r e s T r a n s i c i o n e s [ count ] . a s i g n a r V a l o r ( Integer . parseInt ( i i [ 0 ] ) , Integer . parseInt ( i i [ 1 ] ) , Integer . parseInt ( i i [ 2 ] ) ) ; } e l s e i f ( count > 1 6 0 ) { // Error no se puede lincarse mas marcas . joo . setText ( ”No e s p o s i b l e a ñ a d i r más t r a n s i c i o n e s ” ) ; } count++; } } // Final de la class A~ n adirTransiciones_actionPerformed /** * Lee los valores que hay en el PLC en función de las * transiciones que se hayan seleccionado en el * { @link # jComboBoxnumeroTransicones } y en * { @link # jComboBoxnumeroestados }. * Los valores se a~ n aden a las tablas en el lugar * correspondiente . 146 Maqueta de ascensor para la realización de prácticas por Internet * * @see com. schneiderautomation . factorycast . CommBean * @see com. schneiderautomation . factorycast . GetInt * @see ActionEvent * @see ActionListener * @see JCheckBox * @see Estructura * @see <a href =" http :// java.sun.com/docs/ * books / tutorial / post1 .0/ ui/ eventmodel .html "> * Tutorial : Java 1.1 Event Model </a> * @see <a href =" http :// www.awl.com/cp/ * javaseries / jcl1_2 .html "> * Reference : The Java Class Libraries ( update file )</a> * * @author Ignacio Garrido * @version 1.0 25.7.03 * @since JDK 1.4 */ public f i n a l c l a s s L e e r B o t o n a c t i o n P e r f o r m e d implements A c t i o n L i s t e n e r { /** * Se ejecuta cuando ocurre la acción * @see ActionEvent * @param evt */ public f i n a l void a c t i o n P e r f o r m e d ( f i n a l ActionEvent e v t ) { /** * Lee los valores almacenados en el PLC en función del * jComboBoxnumeroTransicones . Lee tantas transiciones * como se hayan seleccionado . */ for ( int i = 0 ; i < ( jComboBoxnumeroTransicones . g e t S e l e c t e d I n d e x ( ) + 1 ) ; i ++) { for ( int j = 0 ; j < 3 ; j ++) { /** * Enviamos las marcas que queremos observar */ getter [ marcasTransiciones [ i ] . valorIndice ( j ) ] . Capı́tulo B: Códigos de programación 147 setAddress ( ” % MW” + S t r i n g . valueOf ( marcasTransiciones [ i ] . valorIndice ( j ) ) ) ; getter [ marcasTransiciones [ i ] . valorIndice ( j ) ] . setQuantity ( S h o r t . p a r s e S h o r t ( ”1 ” ) ) ; try { /** * Obtenemos el valor de la marcas . */ getter [ marcasTransiciones [ i ] . v a l o r I n d i c e ( j ) ] . readValues ( ) ; } catch ( E x c e p t i o n e ) { e . printStackTrace ( ) ; } /** * Asignamos los valores obtenidos * a las tablas de salida y transición . */ i f ( i < 54) { t a b l a V i s u a l i z a c i o n 1 . setValueAt ( S t r i n g . valueOf ( g e t t e r [ marcasTransiciones [ i ] . v a l o r I n d i c e ( j ) ] . getValue ( ) ) , i , j ); } e l s e i f ( ( i >= 54) && ( i < 1 0 8 ) ) { t a b l a V i s u a l i z a c i o n 2 . setValueAt ( S t r i n g . valueOf ( g e t t e r [ marcasTransiciones [ i ] . v a l o r I n d i c e ( j ) ] . getValue ( ) ) , i − 54, j ); } e l s e i f ( ( i >= 108) && ( i < 1 6 0 ) ) { t a b l a V i s u a l i z a c i o n 3 . setValueAt ( S t r i n g . valueOf ( g e t t e r [ marcasTransiciones [ i ] . v a l o r I n d i c e ( j ) ] . getValue ( ) ) , i − 108, j ); } else i f ( i > 160) { // no puede lincarse mas marcas . joo . setText ( ”No e s p o s i b l e a ñ a d i r más t r a n s i c i o n e s ” ) ; } 148 Maqueta de ascensor para la realización de prácticas por Internet } } ; /** * Lee los valores almacenados en el PLC en función del * jComboBoxnumeroestados . Lee los valores * almacenados en la tabla de salidas del PLC. */ for ( int i = 0 ; i < jComboBoxnumeroestados . g e t S e l e c t e d I n d e x ( ) + 1 ; i ++) { getter [ i + 480]. setAddress ( ” % MW” + S t r i n g . valueOf ( marcasSalidas [ i ] ) ) ; g e t t e r [ i + 4 8 0 ] . s e t Q u a n t i t y ( S h o r t . p a r s e S h o r t ( ”1” ) ) ; try { g e t t e r [ i + 4 8 0 ] . readValues ( ) ; } catch ( E x c e p t i o n e ) { e . printStackTrace ( ) ; } t a b l a V i s u a l i z a c i o n 4 . setValueAt ( S t r i n g . valueOf ( i + 1 ) , i , 0); t a b l a V i s u a l i z a c i o n 4 . setValueAt ( S t r i n g . valueOf ( g e t t e r [ i + 4 8 0 ] . getValue ( ) ) , i , 1 ) ; } ; } }// Final de la class LeerBoton_actionPerformed /** * Registra la Marca %M501, %MW502 y %MW503 para poder * observar en tiempo real los cambios en las salidas * y entradas del PLC. * * @see com. schneiderautomation . factorycast . CommBean * @see com. schneiderautomation . factorycast . MonitorInt * @see ActionEvent * @see ActionListener * @see javax . swing . JCheckBox * @see Estructura Capı́tulo B: Códigos de programación * @see <a href =" http :// java.sun.com/docs/books / * tutorial / post1 .0/ ui/ eventmodel .html "> * Tutorial : Java 1.1 Event Model </a> * @see <a href =" http :// www.awl.com/cp/ * javaseries / jcl1_2 .html "> * Reference : The Java Class Libraries ( update file )</a> * * @author Ignacio Garrido * @version 1.0 25.7.03 * @since JDK 1.4 */ final class RegistrarMarcas actionPerformed implements A c t i o n L i s t e n e r { /** * Se ejecuta cuando ocurre la acción * @see ActionEvent * @param evt */ public f i n a l void a c t i o n P e r f o r m e d ( f i n a l ActionEvent e v t ) { a c t i v a r S c a d a = true ; /** * Enviamos el valor de la marca que * queremos registrar . */ monitor . s e t A d d r e s s ( ” %MW501” ) ; /** * La cantidad de marcas que queremso registrar . */ monitor . s e t Q u a n t i t y ( S h o r t . p a r s e S h o r t ( ”3 ” ) ) ; /** * Registramos las marcas anteriomente * seleccionadas . */ monitor . r e g i s t e r ( ) ; } } // Final de la class RegistrarMarcas_actionPerformed /** * Envia las tablas de transiciones registradas en el Applet 149 150 Maqueta de ascensor para la realización de prácticas por Internet * al PLC . Hay que selecionar el numero de transiciones * que tenemos en el sistema mediante * { @link # jComboBoxnumeroTransicones } para la tabla * de transiciones . Para la tabla de salidas hay * que seleccionar el numero de estados del diagrama * de estados mediante y el { @link # jComboBoxnumeroestados } * estados que tenemos en el sistema mediante el * jComboBoxnumeroestados . En función del valor selecionado * envia más o menos transiciones al PLC. * Envia 8 transiciones por estado seleccionado . * * @see com. schneiderautomation . factorycast . CommBean * @see com. schneiderautomation . factorycast . SetInt * @see ActionEvent * @see ActionListener * @see javax . swing . JCheckBox * @see Estructura * @see <a href =" http :// java.sun.com/docs/ books / tutorial / * post1 .0/ ui/ eventmodel .html "> * Tutorial : Java 1.1 Event Model </a> * @see <a href =" http :// www.awl.com/cp/ javaseries / jcl1_2 .html "> * Reference : The Java Class Libraries ( update file )</a> * * @author Ignacio Garrido * @version 1.0 25.7.03 * @since JDK 1.4 */ public f i n a l c l a s s EnvioTablaPLC actionPerformed implements A c t i o n L i s t e n e r { /** * Se ejecuta cuando ocurre la acción * @see ActionEvent * @param evt */ public f i n a l void a c t i o n P e r f o r m e d ( f i n a l ActionEvent e v t ) { /** * Inicializamos todas las variables que hay en el PLC * mediante la variable INI( %Mm2 ). Ponemos esta variable * a durante un instante , lo suficiente para que el PLC * tenga tiempo de poner a zero todas las variables del * sistema . */