Apéndice B Códigos de programación

Anuncio
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 .
*/
Descargar