Está en la página 1de 120

UNIVERSIDAD AUTNOMA

METROPOLITANA
IZTAPALAPA
CONTROL DE VARIABLES
POR MEDIO DE PLC.
Alumnos: Ortiz Romero Juan Manuel. 96219208
Huerta Ayala Alfredo Carlos
Muoz Gonzlez Sal
Asesor: Victor Hugo Tllez Arrieta
Si puedes soarlo...
...puedes hacerlo
Mayo 2003
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- I -
CONTROL DE VARIABLES POR MEDIO DE PLC.
Durante el proyecto de ingeniera electrnica, en el primer perodo, se trabajo con el aprendizaje
del software, para el control del PLC, as como su manejo; se realizaron varias practicas,
comenzando con la programacin, planteando algunos problemas, para despus darle solucin, y
comprobando su desempeo fsicamente con el PLC, proporcionado por el profesor.
Durante el segundo periodo del proyecto de ingeniera electrnica, el trabajo realizado, se baso
principalmente en el conocimiento del manejo de la comunicacin PLC-PC, mediante Sockets,
para de esta forma pasar a la practica y desarrollar un programa, que realizara una simulacin de
la transmisin de datos entre el PLC y la PC.
El paso siguiente seria el realizar la interfaz grafica y lograr la interaccin entre el software y el
PLC, para tener el control de diferentes variables, por ejemplo la apertura y cierre de puertas y
ventanas, como un sistema de seguridad y control, con el propsito final de implementarlo en el
edificio A-T, principalmente en el rea de laboratorios.
El trabajo realizado, se muestra en 3 captulos, ubicados de la siguiente forma:
Captulo 1: Primer periodo del Proyecto.
Captulo 2: Segundo periodo del Proyecto.
Captulo 3: La parte de conclusiones dada por el equipo en la segunda parte del proyecto.
Esperamos sea un trabajo interesante e importante para las siguientes generaciones.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- II -
CAPITULO 1
INTRODUCCIN AL CONTROL INDUSTRIAL
Antecedentes Histricos
Topologa de los sistemas de control
Tipos de sistemas de control
CLASIFICACIN DE LOS SISTEMAS DE CONTROL SEGN LA
TECNOLOGA
Autmata programable
Control por ordenador
Arquitectura de los autmatas programables
INTRODUCCIN A LOS AUTMATAS PROGRAMABLES
Estructura externa
Clasificacin
Bloques que forman un autmata programable
Memorias internas
Convertidor A / D
Convertidor D / A
Otras variables que se almacenan en la memoria interna:
Memorias de programa
Interfaces de entrada y salida
Fuente de Alimentacin
PROGRAMACIN DE AUTMATAS
Introduccin a la programacin del autmata
Definicin del sistema de control
Descripciones literales
Funciones algebraicas
Esquemas de rels
Diagramas lgicos
Diagramas de flujo
Grafcet
Definir las variables que intervienen y asignarles direcciones de memoria
Lenguajes de programacin
Lista de instrucciones
Diagramas de contactos y funciones
Lenguajes de alto nivel
Grafcet
Introduccin
Smbolos normalizados
Reglas de evolucin del Grafcet
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- III -
Posibilidades de representacin de automatismos con Grafcet Estructuras base
Estructuras lgicas
Ejemplo
Implementacin del Grafcet sobre autmatas programables
Niveles de Grafcet
Representacin de situaciones especiales en Grafcet Secuencias exclusivas
Temporizadores y contadores en Grafcet
Marchas de intervencin
Marchas de ajuste del sistema
Seguridad
Tratamiento de alarmas y emergencias
Diseo estructurado de un sistema de control.
CAPITULO 2
COMUNICACIONES EN RED
Sockets
Sockets Stream (TCP)
Sockets Datagrama (UDP)
Sockets Raw
PROGRAMACIN DE SOCKETS
Programacin de URL
LA CLASE INETADDRESS
LA CLASE URL
LA CLASE URLCONNECTION
LA CLASE SOCKET
Cliente Eco
Cliente Fecha
Cliente HTTP
LA CLASE DE SERVERSOCKET
Agente de seguridad
Servidor Eco
Servidor HTTP
LA CLASE DATAGRAMPACKET
LA CLASE DATAGRAMSOCKET
Cliente Eco
Servidor UDP
CAPITULO 3
CONCLUSIONES
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- IV -
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 1 -
CAPITULO 1
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 2 -
Introduccin al Control Industrial
Se puede definir control como la manipulacin indirecta de las magnitudes de un
sistema llamado planta a travs de otro sistema llamado sistema de control.
Antecedentes Histricos
Los Primeros sistemas de control se desarrollaron en la Revolucin industrial a finales del siglo
XIX y principios del XX.
Basados en componentes mecnicos y electromagnticos, bsicamente
engranajes, palancas, pequeos motores, rels, contadores y temporizadores.
El uso de contadores, rels, temporizadores, ... para automatizar tareas fue aumentando a lo largo
del tiempo, con lo cual se tuvieron diversos problemas derivados de ello, como:
Armarios donde se alojaban muy grandes y voluminosos
Probabilidad de avera muy alta
Localizacin de la avera muy difcil y complicada
Stock de material muy importante. Costo econmico muy alto
No flexibles
A partir de los aos 50, se utilizaron semiconductores, y los primeros circuitos integrados
sustituiran las funciones realizadas por los rels.
Algunas de estas Mejoras fueron:
Sistemas de menor tamao y con menor desgaste.
Reduca el problema de fiabilidad y de stock.
El Problema de estos sistemas:
Su falta de FLEXIBILIDAD.
OPERADOR
SISTEMA DE
CONTROL
PLANTA
CONSIGNAS
SEALES DE
CONTROL
RESPUESTA
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 3 -
A finales de los aos 60, la industria estaba demandando cada vez ms un sistema econmico,
robusto, flexible y fcilmente modificable.
En 1968 nacieron los primeros autmatas programables (APIs o PLCs).
Los primeros PLCs estaban constituidos por memoria cableada y una unidad central diseada
por circuitos integrados.
A principios de los 70, Los PLCs incorporan el MICROPROCESADOR, los cual los llevo a:
Ms prestaciones, elementos de comunicacin hombre-mquina ms modernos,
manipulacin de datos, clculos matemticos, funciones de comunicacin, etc.
En la Segunda mitad de los 70 los PLCs tuvieron:
Ms capacidad de memoria, posibilidad de entradas/salidas remotas, analgicas y
numricas, funciones de control de posicionamiento, aparicin de lenguajes con mayor
nmero de instrucciones ms potentes y, desarrollo de las comunicaciones con
perifricos y ordenadores.
En la Dcada de los 80 la mejora de las prestaciones se refiere a:
Velocidad de respuesta, reduccin de las dimensiones, mayor concentracin de nmero
de entradas / salidas en los mdulos respectivos, desarrollo de mdulos de control
continuo, PID, servocontroladores, y control inteligente, fuzzy
Mas capacidad de diagnstico en el funcionamiento e incremento en los tipos de
lenguajes de programacin: desde los lenguajes de contactos, lenguajes de funciones
lgicas, lista de instrucciones basados en nemotcnicos, flujogramas, lenguajes
informticos, Grafcet, etc.
Debido al desarrollo de la electrnica. Hoy en da hay distintas variedades de autmatas que van
desde:
Microautmatas y Nanoautmatas que se utilizan en apertura y cierre de puertas,
domtica, control de iluminacin, control de riego de jardines, etc.
Autmatas de gama alta prestaciones de un pequeo ordenador
La principal virtud de un PLC es su robustez y facilidad de interconexin con el proceso.
Su tendencia actual es: dotarlo de funciones especficas de control y de canales de comunicacin
para que puedan conectarse entre si y con ordenadores en red. Red de autmatas. CIM
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 4 -
Estudio preliminar
Conocer con el mayor detalle posible las
caractersticas, el funcionamiento, las distintas
funciones, etc. De la mquina o proceso a
automatizar.
Anlisis tcnico y econmico
Especificaciones tcnicas del automatismo:
materiales, aparatos, su adaptacin al sistema, etc.
Valoracin econmica
Toma de la decisin final
- Ventajas e inconvenientes
- Posibles ampliaciones
- Rentabilidad de la inversin
- Etc
Topologa de los sistemas de control
Tipos de topologas
El objetivo de un sistema de control es:
Gobernar la respuesta de una planta, sin que el operador intervenga directamente sobre sus
elementos de salida. El operador manipula nicamente las magnitudes de consigna y el sistema
de control se encarga de gobernar dicha salida a travs de los accionamientos.
El sistema de control opera, en general, con magnitudes de baja potencia, llamadas
genricamente seales, y gobierna unos accionamientos que son los que realmente modulan la
potencia entregada a la planta.
INICIO
Especificaciones tcnicas del sistema o
proceso a automatizar
Toma de Decisiones
Lgica Programada Lgica Cableada
FIN
Eleccin de las opciones tecnolgicas
ms eficaces
Evaluacin de las opciones desde el
punto de vista econmico
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 5 -
Existen dos tipos de topologas:
Lazo Abierto
Lazo Cerrado
Lazo Abierto
Sistema de control no recibe informacin del comportamiento de la planta.
Lazo Cerrado
Existe una realimentacin a travs de los sensores desde la planta hacia el sistema de
control.
Tipos de sistemas de control
Clasificacin, segn el tipo de seales que interviene en la planta a controlar:
Sist. Control analgicos. Seales de tipo continuo (0 a 10 V, 4 a 20 mA, etc.)
proporcionales a unas determinadas magnitudes fsicas (presin, temperatura, velocidad,
etc.)
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 6 -
Sist. Control Digitales: seales binarias (todo o nada) slo puede representar dos estados
o niveles.
Sist. Control hbridos analgicos- digitales: Autmatas programables
La unidad de control esta formada por un microprocesador:
Seales digitales de entrada y salida
Seales analgicas de entrada previamente convertidas (A/D)
Seales analgicas de salida previamente convertidas (D/A)
Clasificacin de los sistemas de control segn la tecnologa
Tipos de sistemas de control
Caracterstica a estudiar Programada Lgica Cableada Lgica
Flexibilidad Baja Alta
Posibilidad de ampliacin Baja Alta
Tiempo de desarrollo del sistema Mucho Poco
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 7 -
Mantenimiento Difcil Fcil
Herramientas de simulacin No Si
Coste para pequeas series Alto Bajo
Estructuracin en bloques independientes Difcil Fcil
Autmata programable
Juega el papel de UNIDAD DE CONTROL
Incluye total o parcialmente las interfaces con las seales de la planta (niveles de tensin
e intensidad industriales, transductores y perifricos electrnicos)
Programable por el usuario
Entradas: seales de consigna y de realimentacin
Salidas: seales de control
Hardware estndar y modular (mdulos nterconectables, configurar sistema a la medida
de las necesidades)
Control por ordenador
Los Procesos complejos en los sistemas de control cuentan con:
Gran capacidad de clculo
Conexin a estaciones grficas
Mltiples canales de comunicacin
Facilidad de adaptacin
Capacidad multiproceso etc.
Para ellos se han utilizado mini ordenadores, con interfaces especficas para la planta a controlar.
INCONVENIENTE: Es caro y poco estndar
La frontera entre autmatas de gama alta y los mini ordenadores esta actualmente muy difusa
Actualmente
red de autmatas controlados por uno o varios ordenadores, con lo que se consigue
combinar las ventajas de ambos, facilidad de interfaces estndar (autmata) y la potencia
de clculo (ordenador).
El sistema resultante tiene las siguientes caractersticas
o Sistema programable con una capacidad de clculo elevada
o Interfaces hombre-mquina estndar, proporcionados por el ordenador
o Software estndar para el manejo de datos y gestin de la produccin
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 8 -
o Posibilidad de control descentralizado
o Sistemas de comunicacin estndar: LAN o WAN
o Mantenimiento fcil
o Interfase con la planta sencillo debido a los autmatas
o Visualizacin del proceso en tiempo real
o Multitud de herramientas para simulacin y mantenimiento
o Flexibilidad
Arquitectura de los autmatas programables
Introduccin a los autmatas programables
Estructura externa del autmata
Bloques que forman un autmata programable
Arquitectura interna de un autmata programable
Unidad central de proceso
Memoria
o Memorias internas
o Memoria de programa
Interfaces de entrada salida
Fuente de alimentacin
Introduccin a los autmatas programables
Un autmata programable es:
un equipo electrnico, basado en un microprocesador o microcontrolador, que tiene
generalmente una configuracin modular, puede programarse en lenguaje no informtico
y est diseado para controlar procesos en tiempo real y en ambiente agresivo (ambiente
industrial)
Una caracterstica diferenciadora del autmata programable frente a otros sistemas de control
programables est en la estandarizacin de su hardware, que permite la configuracin de
sistemas de control a medida.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 9 -
Estructura externa
Aspecto fsico exterior del mismo, los bloques en los que esta dividido, etc.
Clasificacin
Estructura compacta
En un solo bloque todos sus elementos : fuente de alimentacin, CPU, memorias,
entrada/salida, etc.
Aplicaciones en el que el nmero de entradas/salidas es pequeo, poco variable y
conocido a priori
carcasa de carcter estanco, que permite su empleo en ambientes industriales
especialmente hostiles
Estructura modular
Permite adaptarse a las necesidades del diseo, y a las posteriores actualizaciones.
Configuracin del sistema variable
Funcionamiento parcial del sistema frente a averas localizadas, y una rpida reparacin
con la simple sustitucin de los mdulos averiados.
Estructura modular del autmata S7-224.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 10 -
Bloques que forman un autmata programable
Bloques principales
Bloque de entradas
Adapta y codifica de forma comprensible para la CPU las seales procedentes de
los dispositivos de entrada o captadores, como por ejemplo, pulsadores, finales de
carrera, sensores, etc.
Misin: proteger los circuitos internos del Autmata, proporcionando una
separacin elctrica entre estos y los captadores.
Bloque de salidas
Decodifica las seales procedentes de la CPU, las amplifica y las enva a los
dispositivos de salida o actuadores, como lmparas, rels, contactores,
arrancadores, electrovlvulas, etc.
Unidad central de proceso (CPU)
Este bloque es el cerebro del autmata
Su funcin es la interpretacin de las instrucciones del programa de usuario y en
funcin de las entradas, activa las salidas deseadas.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 11 -
Bloques necesarios para el funcionamiento del autmata
Fuente de alimentacin
A partir de una tensin exterior proporciona las tensiones necesarias para el
funcionamiento de los distintos circuitos electrnicos del autmata.
Batera, condensador de alta potencia: para mantener el programa y algunos datos
en la memoria si hubiera un corte de la tensin exterior.
Consola de programacin
PC o consolas de programacin
Perifricos
Son aquellos elementos auxiliares, fsicamente independientes del autmata, que
se unen al mismo para realizar una funcin especfica y que amplan su campo de
aplicacin o facilitan su uso. Como tales no intervienen directamente ni en la
elaboracin ni en la ejecucin del programa.
Interfaces
Circuitos o dispositivos electrnicos que permiten la conexin a la Chp. de los
elementos perifricos descritos.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 12 -
Esquema de la arquitectura interna de un PLC
Unidad central de proceso (CPU)
La CPU (Control Processing Unit) es la encargada de ejecutar el programa de usuario y activar el
sistema de entradas y salidas
Tiene la misin, en algunos tipos de autmatas, de controlar la comunicacin con otros
perifricos externos, como son la unidad de programacin, LCDs, monitores, teclados,
otros autmatas u otros ordenadores, etc.
La CPU esta formada por el microprocesador (P), la memoria y circuitos lgicos
complementarios
El microprocesador se sustituye por dispositivos lgicos programables (DLP), o redes de
puertas lgicas (gate array), tambin llamados circuitos integrados de aplicacin
especfica ASIC.
La CPU ejecuta el programa de usuario, que reside en la memoria, adquiriendo las instrucciones
una a una.
El funcionamiento es de tipo Interpretado, con decodificacin de las instrucciones que cada vez
que son ejecutadas
Unidad central de proceso (CPU)
Lenguaje compilado vs interpretado
Compilado
programa fuente -> compilacin -> programa objeto -> enlazado linkado ->
programa ejecutable
Interpretado
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 13 -
analiza y ejecuta un programa sentencia a sentencia
Bloques fundamentales de una CPU
ALU (Arithmetic Logic Unit)
Acumulador
Flags
Contador de programa (PC)
Decodificadores de instucciones y secuenciador
Programa ROM
Esquema de los bloques fundamentales que componen una CPU
ALU
Unidad aritmtico lgica, es la parte de la CPU donde se realizan los clculos y las
decisiones lgicas (combinaciones Y, O, sumas, comparaciones, etc.).
ACUMULADOR
Almacena el resultado de la ltima operacin realizada por la ALU
FLAGS
Indicadores de resultado de operacin (mayor que, positivo, negativo, resultado cero,
etc.). El estado de estos flags puede ser consultado por el programa.
CONTADOR DE PROGRAMA (PC)
Direccionamiento de la memoria donde se encuentran las instrucciones del programa de
control, y del cual depende la secuencia de ejecucin de ellas.
DECODIFICADOR DE INSTRUCCIONES Y SECUENCIADOR
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 14 -
Cableado y/o programado, donde se codifican las instrucciones ledas en la memoria y se
generan las seales de control pertinentes.
PROGRAMA ROM
El fabricante suele grabar una serie de programas ejecutables fijos, firmware o software
del sistema y es a estos programas a los que acceder el microprocesador para realizar las
funciones ejecutivas.
El software de sistema de cualquier Autmata consta de una serie de funciones bsicas
que realiza en determinados tiempos de cada ciclo:
En el inicio o conexin
Durante el ciclo o ejecucin del programa y,
A la desconexin.
PROGRAMA ROM
Este software o programa del sistema es ligeramente variable para cada autmata, pero,
en general, contiene las siguientes funciones:
Supervisin y control de tiempo de ciclo (watchdog), tabla de datos, alimentacin,
batera, etc.
Autotest en la conexin y durante la ejecucin del programa. Inicio del ciclo de
exploracin de programa y de la configuracin del conjunto.
Generacin del ciclo base de tiempo.
Comunicacin con perifricos y unidad de programacin.
Etc.
Hasta que el programa del sistema no ha ejecutado todas las acciones necesarias que le
corresponden, no se inicia el ciclo de programa de usuario.
MEMORIA
Definicin
Cualquier tipo de dispositivo que permita almacenar informacin en forma de bits (unos
y ceros), los cuales pueden ser ledos posicin a posicin (bit a bit), o por bloques de 8
(byte) o diecisis posiciones (word)
Clasificacin
RAM (Random Access Memory), memoria de acceso aleatorio o memoria de
lectura-escritura. Pueden realizar los procesos de lectura y escritura por
procedimientos elctricos. Su informacin desaparece al faltarle la alimentacin.
ROM (Read Only Memory), o memoria de slo lectura. En estas memorias se
puede leer su contenido, pero no se puede escribir en pila; los <latos e
instrtirniones los riraha el fabricante y el usuario no puede alterar su contenido.
Aunque haya un fallo en la alimentacin.
Clasificacin (lectura/escritura)
Memorias de lectura/escritura, RAM
Memorias de slo lectura, no reprogramables, ROM
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 15 -
Memorias de slo lectura, reprogramables, con borrado por ultravioletas, EPROM
Memorias de slo lectura, reprogramables, alterables por medios elctricos,
EEPROM. Tienen un nmero mximo de ciclos de borrado/grabado.
Memorias internas
Se almacena el estado de las variables que maneja el autmata entradas, salidas, contadores, rels
internos, seales de estado, etc.
Clasificacin por el tipo de variables que almacena y el nmero de bits que ocupa la variable:
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 16 -
Posiciones de 1 bit (bits internos).
o Memoria imagen entradas/salidas
o Rels internos
o Rels especiales/auxiliares
Posiciones de 8,16 o ms bits (registros internos).
o Temporizaciones
o Contadores
o Otros registros de uso general
Las variables contenidas en la memoria interna pueden ser consultadas y modificadas
continuamente por el programa, cualquier nmero de veces. RAM
Memoria Imagen
almacena las ltimas seales ledas en la entrada y enviadas a la salida, actualizndose tras cada
ejecucin completa del programa.
Ciclo de tratamiento de las seales de entrada/salida a travs de las memorias imagen:
o Antes de la ejecucin del programa de usuario, la CPU consulta los estados de las
entradas fsicas y carga con ellos la memoria imagen de entradas.
Durante la ejecucin del programa de usuario, la CPU realiza los clculos a partir de los datos de
la memoria imagen y del estado de los temporizadores, contadores y rels internos. El resultado
de estos clculos queda depositado en la memoria imagen de salidas.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 17 -
o Finalizada la ejecucin, la CPU transfiere a las interfaces de salida los estados de las
seales contenidos en la memoria imagen de salidas, quedando el sistema preparado para
comenzar un nuevo ciclo
Ciclo real (optimizar)
Carga en la memoria imagen de entradas de las entrada digitales.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 18 -
Carga en la memoria imagen de entradas de las entradas analgicas.
Esquema de la transferencia de los datos contenidos en la memoria de salidas a las salidas
digitales
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 19 -
Esquema de la transferencia de los datos contenidos en la memoria de salidas a las salidas
analgicas.
Convertidor A / D
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 20 -
Convertidor D / A
OTRAS VARIABLES QUE SE ALMACENAN EN LA MEMORIA
INTERNA:
rels internos ocupan posiciones RAM de 1 bit, y son utilizados como rea de datos
temporales, como salida de resultados de operaciones intermedias, y para controlar otros
bits o registros, temporizadores y contadores.
rels auxiliares / especiales se guardan en posiciones de 1 bit, y mantienen informacin
sobre seales necesarias para el sistema, como relojes, bits de control, flags de estados de
la CPU, e informacin sobre el autmata (Run, Stop, Halt, errores, etc.). Estos rels
pueden consultarse y utilizarse desde el programa usuario.
rea de temporizadores y contadores ocupa posiciones de 16 bits o ms bits, capaces de
almacenar los valores de preseleccin y estado actualizados de estos elementos.
Memorias de programa
Almacena el programa de usuario.
Adems puede contener datos alfanumricos y textos variables, y tambin informacin
parametrizada sobre el sistema, por ejemplo nombre o identificacin del programa
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 21 -
escrito, indicaciones sobre la configuracin de E/S o sobre la red de autmatas, si existe,
etc.
Cada instruccin del programa de usuario ocupa un paso o direccin del programa y necesita
para ser almacenada dos posiciones de memoria (dos bytes o lo que es lo mismo una palabra
(word)).
MODELOS DE AUTMATAS Memoria central o memoria de programa
(memoria para programa y datos)
SIMATIC S7-200 (1 inst =2. bytes)
CPU 210 512 bytes / 185 instrucciones de programa
CPU 212 1 Kbytes / 500 instrucciones y 512 palabras
datos
CPU 216 8 Kbytes / 4K instrucciones y 2.5K palabras
datos
CPU 224 8 Kbytes / 4K instrucciones y 2560 palabras
datos
SIMATIC S7-300 (1 inst = 3 bytes)
CPU 312 ]FM 6 Kbytes / 2K instrucciones
CPU 313 12 Kbytes / 4K instrucciones
CPU 316 128 Kbytes / 42K instrucciones
Memoria de usuario es siempre de tipo permanente RAM + batera o EPROM / EEPROM
Secuencia normal de trabajo
En la fase de desarrollo y depuracin del programa de control se utilizan las memorias
RAM respaldadas por batera
Una vez se este seguro del funcionamiento correcto del programa se pasa este a las
memorias no voltiles EPROM o EEPROM. Cartuchos de memoria
A todas las posiciones de memoria que es capaz de direccionar el autmata se le denomina mapa
de memoria.
Depende de varios factores: La capacidad de direccionamiento de la CPU, que determina
el nmero de direcciones asignadas a los dispositivos internos. El nmero de
entradas/salidas conectadas, que determina la longitud de la memoria imagen de FIS. La
longitud de la memoria de usuario utilizada.
Interfaces de entrada y salida
Misin establecer un puente de comunicacin entre el autmata y el proceso
Interfaces de entrada filtran, adaptan y codifican de forma comprensible para la CPU las
seales procedentes de los elementos de entrada.
Las interfaces de salida son las encargadas de decodificar, y amplificar las seales
generadas durante la ejecucin del programa antes de enviarlas a los elementos de salida.
En los autmatas pequeos, el tipo de interfaces disponibles suele ser limitado, siendo las ms
frecuentes, clasificadas por entradas y salidas:
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 22 -
Entradas
Corriente continua a 24 o 48 Vcc. Corriente alterna a 110 o 220 Vca. Analgicas
de 0-10 Vcc o 4-20 mA
Salidas
Por rel. Estticas por triac a 220 Vca mximo. Colector abierto para 24 o 48 Vcc.
Analgicas de 0-10 V o 4-20 mA.
Fuente de Alimentacin
Misin: Proporcionar las tensiones necesarias pare el funcionamiento de los distintos circuitos
del sistema
Debido a:
Autmatas formados por bloques que requieren niveles de tensin y de potencia
diferentes
Estn en ambientes con un alto contenido en ruido electromagntico.
Por estos motivos normalmente la alimentacin se obtiene de diferentes fuentes separadas,
procurando aislar o independizar las siguientes partes del circuito:
Unidad central e interfaces E/S (alimentacin autmata).
Alimentacin de entradas.
Alimentacin de salidas (cargas) de tipo electromagntico.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 23 -
La alimentacin de la CPU:
Puede ser continua a 24 Vcc o alterna a 110/220 Vca
La propia CPU la que alimenta las interfaces conectadas a travs del bus interno.
La alimentacin de los circuitos de E / S puede realizarse, segn tipos , en alterna a 48/110/220
Vca, o en continua a 12/24/48 Vcc.
Formas de alimentar a un autmata y a sus unidades de expansin de entradas/salidas locales
(unidas por el bus interno del autmata), con sus sensores y actuadores:
Una nica fuente incorporada en el autmata alimenta a la CPU con sus interfaces de
entrada y salida y a los sensores y actuadores. A la unidad de expansin le llega la
tensin a travs del bus interno.
Varias fuentes de alimentacin diferentes para
o La propia del autmata
o La auxiliar para alimentacin de E/S
o Fuente de alimentacin CC para los actuadores de salida
o Fuente de alimentacin de CA para los actuadores de salida
La eleccin de uno u otro sistema de alimentacin depende de los siguientes aspectos:
Niveles de potencia necesarios para la aplicacin. Compatibilidad entre la
tensin auxiliar suministrada por el autmata y las necesarias en el sistema
de E/S
Funcionamiento o no de sensores y cargas a igual tensin de alimentacin
Necesidad de aislamiento galvnico en el sistema de E/S
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 24 -
Programacin de autmatas: Introduccin al Grafcet
Introduccin a la programacin del autmata
Definicin del sistema de control
Descripciones literales
Funciones algebraicas
Esquemas de rels
Diagramas lgicos
Diagramas de flujo
Grafcet
Definir las variables que intervienen y asignarles direcciones de memoria
Lenguajes de programacin
Lista de instrucciones
Diagramas de contactos y funciones
Lenguajes de alto nivel
Grafcet
Introduccin
Smbolos normalizados
Reglas de evolucin del Grafcet
Posibilidades de representacin de automatismos con Grafcet Estructuras base
Estructuras de secuencia nica
Estructuras de secuencias paralelas
Estructuras lgicas
Divergencia OR
Convergencia OR
Divergencia en AND
convergencia en AND
Saltos condicionales
Ejemplo
Implementacin del Grafcet sobre autmatas programables
Niveles de Grafcet
Representacin de situaciones especiales en Grafcet Secuencias exclusivas
Temporizadores y contadores en Grafcet
Programacin de autmatas: Introduccin al Grafcet
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 25 -
Introduccin a la programacin del autmata
Sistemas y recursos envueltos en la transferencia de informacin que rodean al autmata
Introduccin a la programacin del autmata
Podramos dividir la programacin del autmata en varios pasos:
Definir el sistema de control (que debe hacer, en que orden, etc.):
diagrama de flujo, la descripcin literal o un grafo GRAFCET.
Identificar las seales de entrada y salida del autmata.
Representar el sistema de control mediante un modelo, indicando todas las funciones que
intervienen, las relaciones entre ellas, y la secuencia que deben seguir. Algebraica
(instrucciones literales) o grfica (smbolos grficos).
Asignar las direcciones de entrada / salida o internas del autmata a las correspondientes
del modelo.
Codificar la representacin del modelo. Lenguaje de programacin.
Cargar el programa en la memoria del autmata desde la unidad de programacin.
Depurar el programa y obtener una copia de seguridad.
Esquema del desarrollo de un proceso controlado por un autnoma
INICIO
Documentacin del proceso:
-Memoria de funcionamiento
-Planos
-Etc.
Interpretacin del proceso a controlar
Determinacin de E / S , temporizadores,
contadores, etc, necesarios
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 26 -
Definicin del sistema de control
Se complementa con otras formas de representacin:
Funciones algebraicas Y = (BC + BC) A
Las funciones algebraicas de cada una de las salidas se obtienen:
O bien directamente de la descripcin literal del proceso a controlar
O bien se aplican mtodos de sintesis basados en el lgebra de Boole
(tablas de verdad, Kamaugh, etc.).
Eleccin del autmata
Asignacin de E / S
temporizadores, contadores, etc.
Programacin
Diagrama
Lista de instrucciones
Etc.
Esquema elctrico
De potencia
De proceso
Autmata
Puesta en funcionamiento
Plano Distribucin
componentes del
Puesta en modo RUN
Esquema de conexionado
E/S al autmata
Montaje
Proceso a controlar
FIN
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 27 -
Difcil de analizar y sintetizar sistemas secuenciales. Limitado a la representacin de
combinaciones de variables independientes del tiempo (condiciones de alarma,
operaciones aritmticas con variables analgicas, etc.)
Esquemas de rels
Origen: en la representaciones electromecnicas de sistemas de mando
Esquemas de rels
Es una representacin de sistemas sencillos: seales lgicas binarias todo - nada (digitales), o
bloques secuenciales predefinidos, como temporizadores y contadores.
Deficiencias en cuanto a la representacin de funciones secuenciales complejas y sobre todo en
la manipulacin de seales digitales de varios bits (por ejemplo, las obtenidas de una conversin
A/D).
Utilizado por electricistas o ingenieros con formacin elctrica
Esquema de rels
Funcin Lgica:
[(X1*X2)+(X4*X5)+Y1]*x3=Y1
Diagramas lgicos
Este tipo de representacin del sistema de control se utiliza en la documentacin de las
especificaciones y representacin de los mismos
En muy pocos casos los usuarios finales de autmatas utilizan esta representacin
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 28 -
Diagramas de flujo
Organigrama y flujograma, es un sistema de representacin que se basa en una serie de
smbolos que segn un convenio establecido tienen un determinado significado.
2 Niveles :
Nivel 1:
o secuencia de acciones a realizar
o representar el funcionamiento general del sistema
Nivel 2:
o especificadas las acciones en forma de instruccin: instrucciones entendibles
directamente por el autmata o en forma de funciones lgicas.
Grafcet (Graphe de Comande Etape Transition, cuya traduccin literal es Grfico de Orden
Etapa Transicin)
Es una secuencia de etapas que tienen asociadas unas determinadas acciones a realizar sobre el
proceso junto con las condiciones o transiciones que provocan que se produzca el paso de una
etapa a otra
Una de las mejores herramientas para representar automatismos secuenciales
INICIO
FIN
ACCIONES
TOMA DE
DECISION
NO
SI
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 29 -
Definir las variables que intervienen y asignarles direcciones de memoria
Con los mtodos anteriores:
Descripcin funcional del sistema de control
Fijadas las entradas y salidas que tendrn nombres simblicos

Ejemplo:
Control de una puerta corredera accionada por medio de un motor. El contador S1 produce la
apertura de la puerta, el contador S2 controla el cierre de la puerta. El interruptor E3 de final
de carrera se activa cuando la puerta esta abierta, y el interruptor E2 de fin de carrera se activa
cuando la puerta esta cerrada. La puerta se abre al aplicar una determinada presin sobre
un sensor de paso de vehculos El situado enfrente de la puerta. Si el sensor El no se activa, la
puerta se cierra despus de transcurridos 10 segundos. Si se activa El, se cierra el contador S2 y
se mantiene cerrado hasta que el interruptor E3 de final de carrera desactive el contador S2.
Cuando se esta abriendo la puerta, o bien cuando una vez abierta haya detectado un vehculo
con el sensor El, el temporizador TI no se activa. Si no se dan estas circunstancias y la puerta
esta abierta E3 activado, se activa el tempo rizador Tl, y transcurridos 10 segundos, la puerta se
cierra mediante el contador S1 por el temporizador TI. La accin de cerrar se produce hasta
que o bien se detecta fin de carrera E2 o bien se detecta otro vehculo mediante la activacin de
El en cuyo caso se abre la puerta activando para ello el contador S2.
Las lmparas LED1 y LED2 indican cuando se est cerrando o abriendo la puerta
respectivamente.
Tabla de asignacin de variables
Tipo Termino Smbolo Descripcin
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 30 -
El VEHCULO Sensor presencia
vehculo
E2 CERRADA Limite pueda cerrada
Entradas
E3 ABIERTA Limite puerta abierta
S1 CERRAR Contador cerrar
S2 ABRIR Contador abrir
LED1 LEDCER Lmpara puerta
cerrndose
Salidas
LED2 LEDABI Lmpara puerta
abrindose
Temporizador T1 TIEMPO Temporizador 10 seg
Posteriormente se asignan las direcciones fsicas a estas variables
Tipo Termino Smbolo Direccin
E1 VEHICULO I0.0
E2 CERRADA I0.1
Entradas
E3 ABIERTA I0.2
S1 CERRAR Q0.0
S2 ABRIR Q0.1
LED1 LEDCER Q0.2
Salidas
LED2 LEDABI Q0.3
Temporizador T1 TIEMPO T5
Adems de estas variables: necesitare un contador que cuente los periodos de temporizacin. En
las tablas anteriores este contador no se ha tenido en consideracin.
Lenguajes de programacin
Conjunto de instrucciones y/o smbolos que estn disponibles para escribir el programa, se
denomina lenguaje de programacin
Tipo Lenguajes de Programacin
Algebraicos Lenguajes Bolanos
Lista de Instrucciones
Lenguajes de alto nivel
Grficos Diagrama de contactos
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 31 -
Diagrama de Funciones
Interprete Grafcet
Si unidad de programacin acepta directamente la representacin del Sist. de control, se carga en
la CPU. Si no hay que traducirla al lenguaje de programacin pertinente.
Lista de instrucciones
Es un lenguaje booleano al cual se le ha aadido una serie de instrucciones que permiten la
manipulacin de datos y variables digitales y gestin del programa.
Y=(BC+BC)A
Diagrama de contactos. Diagrama de funciones
Es un lenguaje grfico procedente del lenguaje de rels que en base smbolos que representan
contactos, bloques funcionales, etc. codifican la secuencia de control.
Diagrama de funciones: deriva de la representacin lgica utilizada por los tcnicos en
electrnica digital
Lenguajes de alto nivel
Lista de instrucciones, diagramas de contactos, ... Insuficientes para programar aplicaciones
complejas para autmatas de gama media y alta.
Herramientas de ingeniera:
S7-SCL: lenguaje de alto nivel que se asemeja al Pascal
LD B
AN C
LDN B
A C
OLD
A A
= Y
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 32 -
M7-ProC/C++: Entorno Borland C/C++ y depurador multitarea.
Casi todos los fabricantes de autmatas este tipo de herramientas que permiten programar en
Basic, C, Pascal, Fortran, etc. mediante el uso de los interpretes o compiladores respectivos.
Estas herramientas permiten resolver tareas de clculo cientfico de alta resolucin,
clasificaciones y tratamiento de datos, estadsticas, etc., con acceso a subrutinas especficas de
lenguajes informticos.
Grafcet
Introduccin
El Grafcet es un mtodo grfico de modelado de sistemas de control secuenciales
Surgi en Francia a mediados de los aos 70, y fue creado por una agrupacin de algunos
fabricantes de autmatas, en concreto Telemecanique y Aper, junto con dos organismos
oficiales, AFCET (Asociacin Francesa para la Ciberntica, Economa y Tcnica y ADEPA
(Agencia Nacional para el Desarrollo de la Produccin Automatizada).
Fue homologado en Francia (NFC), Alemania (DIN), y con posterioridad por la Comisin
Electrotecnia Internacional ( IEC 848, en 1998).
Describe la evolucin de un proceso que se pretende controlar, indicando las acciones que hay
que realizar sobre dicho proceso que informaciones provocan el realizar una u otra accin
Smbolos normalizados
Etapas
La evolucin de un proceso representada mediante un grfico Grafcet, esta formada por
una sucesin de etapas que representan cada uno de sus estados, llevando cada una de
ellas asociada una o varias acciones a realizar sobre el proceso.
Las etapas se representan con un cuadro y un nmero o smbolo con un subndice
numrico en su interior, en ambos casos el nmero indica el orden que ocupa la etapa
dentro del Grafcet
Las etapas iniciales, aquellas en las que se posiciona el sistema al iniciarse el proceso, se
representan con un cuadro doble.
Accin asociada
Son una o varias acciones a realizar sobre el proceso, cuando la etapa de la cual dependen
dichas acciones se encuentra activada.
Dichas acciones correspondientes a una etapa, se simbolizan mediante rectngulos
conectados y situados a la derecha de dicha etapa. En el interior de estos rectngulos se
indica, bien de forma literal, bien de forma simblica, las acciones a realizar.
En una primera clasificacin se puede dividir las acciones en dos tipos:
Incondicionales: acciones que se ejecutan con solo quedar activadas las etapas
correspondientes.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 33 -
Condicionales : son las acciones que necesitan el cumplimiento de una condicin adems
de la propia activacin de la etapa correspondiente.
Clasificar las acciones en:
Internas : acciones que se producen en el equipo de control, por ejemplo
temporizaciones, contadores, clculos matemticos, etc.
Externas : las acciones que se producen sobre el proceso, por ejemplo abrir o cerrar una
vlvula, activar o desactivar una bomba, etc.
Transicin y Condicin de transicin
En el diagrama Grafcet, un proceso se compone de una serie de etapas secuenciales que
se activan una tras otra unidas mediante una transicin.
El paso de una etapa a la siguiente se realiza dependiendo de si se cumple o no la
condicin de transicin entre ellas.
Toda transicin lleva asociada una condicin de transicin o funcin lgica booleana que se
denomina receptividad, y que puede ser verdadera o falsa.
Se dice que la transicin est validada, cuando la etapa o etapas anteriores a la transicin estn
activadas. El franqueamiento de la transicin se producir si, y slo si, la transicin esta validada
y la receptividad es verdadera.
Arco
Es el segmento de recta que una transicin (con su condicin de transicin) con una etapa
y viceversa, pero nunca dos elemento iguales entre s. Los arcos pueden ser o verticales u
horizontales, adems los arcos verticales deben llevar una flecha indicando su sentido en
el caso de ser este ascendente
Reglas de evolucin del Grafcet
Reglas
La etapa inicial de un Grafcet se activan de forma incondicional. Esta situacin inicial se
corresponde en general con una situacin de reposo.
Activar Motor 2
A
Activar Motor 1 1
Activar Motor 1 1
Activar Motor 2 2
Condicin de transicin
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 34 -
Una transicin esta en disposicin de ser validada cuando todas las etapas
inmediatamente precedentes, unidas a dicha transicin, estn activadas. La activacin de
una transicin se produce cuando est validada y la condicin de transicin o
receptividad es verdadera. Se podra definir una etapa como activable cuando la
transicin precedente esta validada.
Franquear una transicin implica la activacin de todas las etapas siguientes inmediatas,
y la desactivacin de las inmediatas precedentes.
Transiciones conectadas en paralelo, se activan de forma simultnea si se cumplen las
condiciones para ello.
Una o varias acciones se asocian a cada etapa. Estas acciones slo estn activas cuando la
etapa esta activa.
Estructura Base
Grafcet soporta diferentes tipos de estructura secuencial:
Estructura base: trata conceptos de secuencialidad y concurrencia
Estructura lgica: trata conceptos de concatenacin de estructuras
Estructuras base
Estructuras de secuencia nica
o Son estructuras formadas por secuencias de etapas que se van activando una tras
otra, sin interaccin con ninguna otra estructura
Estructuras de secuencia paralela
o Son un conjunto de estructuras nicas activadas por una misma transicin de
forma simultanea. Despus de la activacin de las distintas secuencias su
evolucin se produce de forma independiente
1
2
Estructura base
11 21
22
n1
n2
1x
yx
2x
yy
nx
ny
Estructura de
secuencias
paralelas
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 35 -
Estructuras Lgicas
Funciones lgicas OR AND y saltos condicionales
Divergencia OR
Se utiliza cuando lo que se trata es de modelar la posibilidad de tomar dos o ms
secuencias alternativas a partir de una etapa comn.
La etapa n pasara a estar activa si estando activa la etapa n1 se
satisface la condicin de transicin o receptividad x , De igual
forma la etapa n2 pasara a estar activa si estando activa la etapa
n1, se satisface la condicin de transicin o receptividad y.
Convergencia OR
La etapa n1 pasara a estar activa si estando activa la etapa n se
satisface la condicin de transicin o receptividad x , o si
estando activa la etapa n2 se satisface la condicin de transicin
o receptividad y.
Divergencia AND
Permite la implementacin de procesos concurrentes sncronos, de forma que dos o ms
subprocesos del sistema, representados por las secuencias paralelas, pueden activarse de
forma sincronizada.
La etapa n2 y n pasaran al estado activo, si estando activa la etapa n1 se
satisface la condicin de transicin o receptividad d+c
Convergencia en AND
n1
n2
n
x y
n1
n2
n
x y
n1
n2
n
d+c
n1
n2
n
x
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 36 -
La etapa n1 pasara al estado activo, si estando las etapas n1 y n2 activas se satisface la condicin de transicin o
receptividad x
Saltos condicionales
(a) Se implementa un salto condicional a la etapa i+j+1 si
esta activada la etapa i y se cumple la condicin de
transicin o receptividad
(b) Se implementa un bucle que permite la receptividad de
la secuencia de etapas hasta que x sea igual a 1.
En el siguiente ejemplo, dos montacargas se mueven cuando se pulsa un botn (xl o x2) en
sentido ascendente hasta el final de recorrido (s,t), y de inmediato se descendiende a la situacin
inicial (q,r).
La pulsacin de xl o x2 deber iniciar el movimiento ascendente del montacargas ml o
m2 respectivamente. Slo un montacargas debe estar en funcionamiento a la vez.
Tambin inicialmente se supone que el accionamiento simultneo de los dos pulsadores
no puede ocurrir.
i
i+1
x
y
i+j
i+j+1
z
u
i
i+1
x
y
i+j
i+j+1
z
u
(a) (b)
U D1
q
s
X1
U D2
r
t
X2
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 37 -
Implementacin del Grafcet sobre A.P.I.
Diagrama Grafcet que representa el proceso, en un algoritmo de control y su posterior
programacin sobre un API.
Para ello a cada una de las etapas en las que se divide el Grafcet se le asocia una variable interna.
La condicin de transicin es la encarga de activar la etapa siguiente y desactivar la anterior;
para ello se utilizan las instrucciones Set y Reset que poseen todos los autmatas programables.
En el Siemens S7-200 las instrucciones SET y RESET son:
Cuando se ejecutan las operaciones Set (Poner a 1 (S)) y
Reset (Poner a O (R)), se activa (se pone a 1) o se desactiva
(se pone a 0) el nmero indicado de salidas (N) a partir del valor
indicado por el bit o por el parmetro OUT. EL margen de E / S
que se pueden poner a 0 est comprendido entre 1 y 255. Las
instrucciones Set y Reset se utilizan para activar o desactivar las
variables internas que en este autmata son las marcas internas
(M0.0, M0.l,.....etc.)
q
U1 1
D1 2
s
X1.q
0
r
U2 3
D2 4
t
X2..r
S
1
M0.0 I0.0
S
1
M0.0
S
1
M0.0 I0.1
R
1
M0.1
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 38 -
Activa la etapa y y
desactiva la etapa x
Activa la etapa z y desactiva
la etapa y
Para activar la etapa inicial 0 existen diferentes formas:
Como ltima lnea del programa de control del autmata, se pone a cero Reset de la
marca asignada a la ltima etapa, siempre que la condicin de transicin se cumpla.
Adems aadimos una lnea ms donde se active la marca correspondiente a la etapa
inicial siempre que todas las etapas anteriores estn desactivadas.
x b
S
1
M0.0
S
1
y
S
1
M0.0
R
1
x
x b
S
1
M0.0
S
1
z
S
1
M0.0
R
1
y
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 39 -
Otra posibilidad es que cuando se cumpla la ltima condicin de transicin se desactive
la ltima etapa activa y se active la etapa inicial.
Existe otra posibilidad de activacin de la etapa inicial, que se realiza mediante el uso de
variables internas del sistema. Esta ltima opcin depende del tipo de autmata utilizado.
Varios ejemplos de cmo codificar en lenguajes de contactos algunos casos que se
pueden dar en diagramas Grafcet
Divergencia OR
Caso de secuencias paralelas
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 40 -
Saltos condicionales a otras etapas
Mediante funciones lgicas en un diagrama de escalera
La ecuacin de activacin o desactivacin asociada a la etapa ensima
E
n
= E
n-1
.
T
n-1
+ (E
n+1
)
.
E
n
La etapa E
n
se activar, si estando activada la etapa E
n-1
y desactivada la E
n+1
se
satisface la transicin T
n-1
. Apartir de este instante permanecer activada hasta que se active la
E
n+1

UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 41 -
Aparte se tiene que afrontar las ecuaciones de activacin de las acciones asociadas a las
etapas. La expresin de estas ecuaciones depender del carcter condicional o
incondicional de estas acciones.
Partiendo de ecuacin General:
- CondA: condicin de activacin
- Cond
D
condicin de mantenimiento y desactivacin
Divergencia OR
Convergencia OR
Divergencia AND
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 42 -
Convergencia AND
Etapas iniciales
- La etapa/as inicial/es deben quedar activadas cuando se inicializa el sistema.
- Las etapas iniciales no tienen ninguna etapa ni transicin precedente que puedan
incluirse en las condiciones de activacin (CondA) de la expresin general.
- Para solucionar este problema se introducen unas condiciones de activacin iniciales
CondAl, adicionales a las condiciones de activacin CondA.
- Este tipo de etapas se implementan, mediante la siguiente expresin:
E
0
(t)=Cond
AI
+Cond
A
La expresin de las condiciones de activacin iniciales se puede obtener de dos formas:
- Aprovechando el hecho de que, en la fase de inicializacin del programa las variables
estn inicializadas a cero y por tanto, tambin todas las variables internas
representativas de las diversas etapas existentes estarn nicialzadas a cero.
Esta expresin puede llegar a ser laboriosa de implementar, si el Grafcet que se est realizando
dispone de un gran nmero de etapas.
Otra posibilidad, aparece por el hecho de que los autmatas programables disponen de una serie
de marcas del sistema o marcas especiales. Existe una de ellas que est activa durante el primer
ciclo de programa y desactiva en los restantes.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 43 -
Niveles de Grafcet
A la hora de representar mediante un grafcet el sistema de control es conveniente estructurarlo en
dos niveles
- Nivel 1 : En este nivel se representa solamente el funcionamiento lgico del sistema
en una terminologa prxima al lenguaje corriente, se realiza independientemente de
las decisiones que a posteriori se tomen en cuanto a la tecnologa a utilizar, a la
nomenclatura y tipo de variables seleccionadas, etc
- Nivel 2 : En este nivel se tienen en cuenta las decisiones tecnolgicas tomadas, la
nomenclatura y tipo de variables, etc. y se hace referencia a ellas en el diagrama
grafcet de este nivel
Ejemplo : Sistema de control de una mquina taladradora
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 44 -
Funcionamiento de la taladradora.
- Existe un pulsador B de inicialzacn del sistema, con objeto de que el motor
adquiera una velocidad de giro de rgimen permanente, que se obtiene accionando M.
El taladro posee varias velocidades en el sentido longitudinal del eje, lase bajada
lenta del utensilio del taladro BL, bajada rpida BR y subida rpida SR.
- La pieza en la que se va a realizar el taladro se detecta mediante un detector inductivo
P, y se sujeta mediante dos sujeciones accionadas por C. La tarea de realizar un
taladro sigue la siguiente secuencia: primero se detecta la pieza mediante el detector
inductivo, posteriormente se pulsa el botn A de inicio de operacin con lo que
actan las sujeciones de la pieza y al mismo tiempo se inicia el descenso rpido de la
broca BR.
- Antes de empezar a realizar el taladro propiamente dicho a la pieza, el detector Y
provoca el paso de descenso rpido de la broca a descenso lento BL, el cual se
interrumpe cuando se detecta el final de carrera Z. Inmediatamente se produce la
subida rpida de la broca hasta alcanzar la posicin de reposo X.
Grafcet de nivel 1:
Grafcet de nivel 2:
1 Motor de giro reg. permanente
Pulsador de inicializacin
Inicio de operacin y detectada pieza
2 Apresar pieza y descenso rpido de broca
Fin de descenso rpido
3 Descenso Lento
Final de carrera descendente
4 Ascenso rpido de la broca
Final de carrera ascendente
0
A . P
Y
Z
1 M
B
2
3
4
0
M C BR
M C BL
M C SR
1 M+
B
2
3
4
0
C+ BR+
M - SR- C-
A . P
Y
Z
BR- BL+
BL- SR+
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 45 -
Representacin de situaciones especiales en Grafcet
Secuencias exclusivas
Temporizadores y contadores
Funcin temporizacin en Grafcet se implementa a travs del operador de temporizacin
El valor de la temporizacin en seg. min. u hor.
Etapa a la cual esta referida la temporizacin.
Indica la operacin de temporizacin.
Clasificacin de las temporizaciones:
- Temporizacin con retardo: Cada dispositivo de temporizacin tiene asociada una
variable que en este tipo de temporizacin permanece en estado bajo 0, mientras
que se efecta la operacin de temporizacin.
- Temporizacin al arranque: Cada dispositivo de temporizacin tiene asociada una
variable que en este tipo de temporizacin permanece en estado lgico alto 1, desde
el mismo comienzo de la temporizacin, pasando a estado lgico bajo O cuando ha
transcurrido la temporizacin establecida. Su funcionamiento es el mismo que la
temporizacin con retardo si la variable asociada al temporizador es complementada,
9
11
2
10
ab ab
t / n / temp
temp
Variable de temporizacin
Etapa n
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 46 -
por lo tanto este tipo de temporizacin se denota complementando la notacin que
representa la temporizacin con retardo.
Incorporacin de las temporizaciones al Grafcet:
- Temporizacin de acciones: Es el caso en el cual se pretende temporizar la ejecucin
de la accin asociada a una etapa, de forma que no se ejecute la accin hasta que
transcurra un cierto instante de tiempo.
- Temporizacin de la transicin de una etapa: Es el caso en el cual la receptividad
asociada a una transicin depende de que la variable de temporizacin sea activada.
Si se trata de una temporizacin con retardo esta transicin no ser superada hasta
que transcurra un cierto instante de tiempo.
Contadores
- Hay tres tipos, los que realizan la operacin cuenta de forma ascendente, descendente
o ambas a la vez.
temp
Variable de temporizacin
Etapa n
Accion A
Trn
temp
Variable de temporizacin
Etapa n
n A
T r n-1
Trn
t / n / temp
Accion A
temp
Variable de temporizacin
Etapa n
n B
T r n-1
t / n / temp
n B = B+1
T r n-1
Trn
n B = B-1
T r n-1
Trn
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 47 -
Anteriormente, diagrama Grafcet teniendo en cuenta slo funcionamiento normal, sin considerar
posibles paradas de emergencia, tipos de funcionamiento manual o automtico, etc.
Como resulta obvio en todo diseo estructurado existen relaciones de intercambio de
informacin y jerarqua entre cada uno de los subsistemas.
- Orden: Seguridad, modos de marcha y funcionamiento normal
Los modos de marcha son los distintos modos de funcionamiento que pueden darse en los
sistemas automatizados(se excluye de esta definicin todo comportamiento no determinista del
sistema).
Funcionamiento normal de un sistema de control es cclico. Segn como se ejecute este ciclo,
CLASIFICACIN:
- Sistemas que ejecutan el ciclo de funcionamiento indefinidamente a partir de una
autorizacin del operador.
- Sistemas que ejecutan un ciclo y requieren la autorizacin del operador, para realizar el
siguiente y as consecutivamente.
- Sistemas en los que el operador tiene un control permanente sobre la activacin de cada
una de las etapas.
Con estos modos multitud de combinaciones. Dividir en dos grandes grupos: marchas
automticas y marchas de intervencin.
Es el modo de funcionamiento normal, para el cual el sistema ha sido diseado.
Se puede realizar una clasificacin dentro de las marchas automticas en:
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 48 -
- Funcionamiento semiautomtico
- Funcionamiento automtico
En este modo de funcionamiento cada ciclo necesita la autorizacin del operador para ejecutarse.
- La ejecucin de cada uno de los ciclos: mediante la variable CC (Comienzo de ciclo).
- Introducida e transicin inicial junto con las condiciones iniciales (CI) de inicio de ciclo.
Cuando se ejecuta la orden de comienzo de ciclo(CC), el sistema permanece funcionando de
forma ininterrumpida, hasta que se produce una orden de parada, complementaria de la anterior.
- La parada, es este modo de funcionamiento detiene el sistema al final del ciclo en curso,
a diferencia de las paradas de emergencia, cuyo objeto es parar de inmediato la ejecucin
del ciclo sea cual sea su situacin.
Para implementar este modo de funcionamiento se utiliza una estructura jerarquizada de dos
diagramas Grafcet, donde el de orden superior(maestro), controla el funcionamiento del de orden
inferior ( esclavo).
Grafcet, donde el de orden superior (maestro), controla el funcionamiento del de orden inferior
(esclavo).
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 49 -
Marchas de intervencin
Son modos de funcionamiento especiales, utilizados en los perodos de ajuste del
funcionamiento de los sistemas de control automticos.
- Una vez implementado un sistema automtico, pueden aparecer asincronismos en su
funcionamiento, de difcil previsin a priori, derivados entre otros motivos de la clase de
tecnologa utilizada.
- Adems estos asincronismos tambin pueden aparecer por envejecimiento, deterioro o
falta de mantenimiento de los elementos integrantes del proceso.
Marchas de ajuste del sistema
El operador ejerce un control estricto no ya sobre la ejecucin de un ciclo, sino sobre la
ejecucin de una etapa o conjunto de ellas en un mismo ciclo.
Es la forma de operacin utilizada, sobre todo en los procesos de ajuste y puesta a punto de los
sistemas automatizados, mediante el cual se corrigen funcionamientos imprevistos, fallos,
averas o correcciones precisas en el funcionamiento de las mquinas o dispositivos de control.
Frecuentemente la parada del sistema, bien sea por inhibicin de las acciones asociadas a las
etapas, o bien por congelacin del automatismo impidiendo el franqueamiento de determinadas
transiciones.
- Este modo de funcionamiento requiere un conocimiento exhaustivo del sistema, por parte
del operador, as como la implementacin del sistema mediante una tecnologa que haga
posible una fcil Intervencin.
Seguridad
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 50 -
El sistema de control diseado ha de tener en cuenta situaciones imprevistas, averas,
emergencias, etc de forma que se garantice el buen funcionamiento del sistema.
- Hay del que asegurar la integridad de los operadores humanos al cargo de los sistemas o
bien la seguridad de las propias instalaciones industriales donde se ubique el sistema,
cuya reparacin puede suponer un coste elevado.
Seguridad engloba:
- Seguridad: anular el posible peligro para las personas e instalaciones
- Disponibilidad: eliminar las paradas como consecuencia de fallos del sistema
El estudio de la seguridad del sistema tiene que abordar tanto el anlisis de riesgos(probabilidad
y gravedad en la aparicin), as como el cumplimiento de la normativa legal al respecto.
Tratamiento de alarmas y emergencias
Segn el grado en que la alarma pueda afectar al sistema:
- Alarmas locales: son las que afectan slo parcialmente al sistema.
- Alarmas generales: son las que afectan a la totalidad del sistema y por lo general sern
prioritarias.
Implementar mediante la introduccin de una nueva variable de la forma siguiente:
- Introduccin de la variable asociada en las condiciones de desactivacin de la funcin
lgica activadora / desactivadora de etapa.
- Introduccin de la variable asociada en las funciones lgicas asociadas a las
receptividades.
- Introduccin de la variable asociada <Orno condicin adicional a la ejecucin de las
acciones asociadas a las etapas.
Tratamiento de alarmas y emergencias
El tratamiento de las alarmas producidas en el sistema frente a situaciones de emergencia puede
ser:
- Sin secuencia de emergencia: ante una situacin de alarma, el sistema se imita a detener
su evolucin y suspende las operaciones bsicas, asociadas a la etapa donde se produce la
suspensin.
Inhibicin de acciones
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 51 -
Congelacin del automatismo
- Con secuencia de emergencia:
Alarma deriva hacia la ejecucin de una secuencia de emergencia, constituida por
una o ms etapas, cuyas acciones estn orientadas a situar a los operadores y al
proceso mismo en las mejores condiciones posibles, en orden a salvaguardar su
integridad.
Diseo estructurado de un sistema de control.
- Representacin separada de los diversos aspectos del modelo del sistema, tales como:
funcionamiento normal
modos de marcha posibles
paradas de emergencia, etc.
- Este diseo se consigue realizar con ayuda de diagramas funcionales parciales, as como
las relaciones existentes entre ellos.
Macro etapas
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 52 -
- Las macroetapas, sustituyen secuencias de etapas, cuya aparicin se repite en varias
ocasiones a la largo del diagrama grafcet. El objetivo que se persigue es la simplicidad y
legibilidad de los diagramas grafcet.
- Reglas:
La expansin de una macroetapa siempre tendr una sola etapa de entrada y una
sola etapa de salida.
La etapa de entrada (E) se activar cuando se active la macroetapa. La activacin
de la etapa de salida (S) implicar la validacin de las transiciones
inmediatamente posteriores a la macroetapa.
Diagramas Grafcet Jerarquizados
- Entre cada uno de estos diagramas grafcet parciales debe haber una relacin jerrquica.
Forzado de estados de uno u otro gracet.
- La jerarquizacin debe respetar una serie de reglas:
o Si un grafcet tiene la posibilidad de forzar otro, este no tendr ninguna posibilidad
de forzar al anterior
o En todo instante un grafcet slo podr ser forzado por un nico grafcet.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 53 -
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 54 -
CAPITULO 2
COMUNICACIONES EN RED
Cada uno de los dispositivos de la red puede considerarse corno un ,nodo. y cada no de estos
nodos est identificado mediante una direccin nica. La forma en que se signan esta
direcciones varan de un tipo de red a otro, pero en todos los casos la direccin de cada
dispositivo debe ser nica. para permitir distinguir a ese dispositivo Le cualquier otro. Las
direcciones son cifras con las cuales los computadores trabajan con facilidad, pero son muy
difciles de recordar para los humanos por lo tanto, algunas redes tambin proporcionan
nombres, que son ms fciles de recordar.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 55 -
Las redes actuales utilizan para la transferencia de datos un concepto conocido como packet
switching. Los datos son encapsulados en paquetes que son transferidos desde el origen hasta el
destino, en donde los datos se van extrayendo de uno o ms paquetes para reconstruir el mensaje
original.
Aunque el lector deba conocer todos estos parmetros para entender el funcionamiento de
una red, lo cierto es que el concepto de red no es nada difcil, ya que se trata solamente de pasar
la informacin de una maquina a otra, o viceversa: es decir, es semejante a la lectura y escritura
de archivos, excepto en que estos archivos estn situados en otra mquina remota, y esa maquina
remota puede decidir que es lo que quiere hacer con la informacin que le llega. Una de las
principales caractersticas de Java es precisamente su tratamiento de la red. Tanto como es
posible. Java abstrae todos los detalles de manejo a bajo nivel de la red. dejndole ese trabajo a
la Mquina virtual java. El modelo de programacin que se utiliza es el de archivos; de hecho, se
puede comparar una conexin de red (un socket) con un canal. Adems, la capacidad de manejo
de mltiples conexiones a la vez.
SOCKETS
Java proporciona dos formas diferentes de atacar la programacin de comunicaciones a
travs de red, al menos en lo que a la comunicacin web concierne. Por un lado estn las clases
Socket, DatagramSocket y ServerSocket, y por otro lado estn las clases URL, URLEncoder y
URLConnection.
Los sockets son puntos finales de enlaces de comunicaciones entre procesos. Los procesos
los tratan como descriptores de archivos, de forma que se pueden intercambiar datos con otros
procesos transmitiendo y recibiendo a travs de sockets. El tipo de sockets describe la forma en
la que se transfiere informacin a travs de ese socket.
Sockets Stream (TCP)
Son un servicio orientado a conexin, donde los datos se transfieren sin encuadrarlos en
registros o bloques. Si se rompe la conexin entre los procesos, stos sern informados de tal
suceso para que tomen las medidas oportunas.
El protocolo de comunicaciones con streams es un protocolo orientado a conexin, ya que
para establecer una comunicacin utilizando el protocolo TCP, hay que establecer en primer
lugar una conexin entre un par de sockets. Mientras uno de los sockets atiende peticiones de
conexin (servidor), el otro solicita una conexin (cliente). Una vez que los dos sockets estn
conectados, se pueden utilizar para transmitir datos en ambas direcciones.
Sockets Datagrama (UDP)
Son un servicio de transporte sin conexin. Son ms eficientes que TCP, pero en su utilizacin
no est garantizada la fiabilidad. Los datos se envan y reciben en paquetes, cuya entrega no est
garantizada. Los paquetes pueden ser duplicados, perdidos o llegar en un orden diferente al que
se envi.
El protocolo de comunicaciones con datagramas es un protocolo sin conexin, es decir, cada
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 56 -
vez que se enven datagramas es necesario enviar el descriptor del socket local y la direccin del
socket que debe recibir el datagrama. Como se puede observar, hay que enviar datos adicionales
cada vez que se realice una comunicacin, aunque tiene la ventaja de que se pueden indicar
direcciones globales y el mismo mensaje llegar a un muchas mquinas a la vez.
Sockets Raw
Son sockets que dan acceso directo a l a capa de software de red subyacente o a
protocolos de ms bajo nivel. Se utilizan sobre todo para la depuracin del cdigo
de los protocolos.
Programacin de Sockets
La programacin utilizando sockets involucra a dos clases principalmente: Socket y
DatagramSocket, a la que se incorpora una tercera no tan empleada, ServerSocket, que
solamente se utiliza para implementar servidores, mientras que las dos primeras se pueden usar
para crear tanto clientes como servidores, representando comunicaciones TCP la primera y
comunicaciones UDP la segunda.
La programacin con sockets es una aproximacin de bastante bajo nivel para la
comunicacin entre dos computadores que van a intercambiar datos. Uno de ellos ser el cliente
y el otro el servidor, como ya se ha repetido en numerosas ocasiones.
Aunque la distincin entre cliente y servidor se va haciendo menos clara cada da, en Java
hay una clara diferencia que es inherente al lenguaje. El cliente siempre inicia conversaciones
con servidores y los servidores siempre estn esperando a que un cliente quiera establecer una
conversacin. Ya despus, a nivel de aplicacin, se determinar lo que sucede una vez que se
establezca la conexin y se inicie la conversacin.
El hecho de que dos computadores puedan conectarse no significa que puedan comunicarse,
es decir, que adems de establecerse la conexin, las dos mquinas deben utilizar un protocolo
entendible por ambas para poder entenderse. Por ejemplo, el hecho de que se pueda marcar un
nmero de telfono de China, no da por sentado que se pueda establecer una comunicacin con
la persona que descuelgue al otro lado, porque no hay conocimiento del lenguaje chino; o la
persona habla espaol, o chapurrea ingls, o muy poca comunicacin va a poder tener lugar
aunque la conexin sea perfecta y la voz de ambos clara y sin distorsiones.
La programacin de sockets en el mundo Unix viene desde muy antiguo, Java simplemente
encapsula una gran parte de la complejidad de su uso en clases, permitiendo un acercamiento a
esa programacin mucho mas orientado a objetos de lo que poda hacerse antes. Bsicamente, la
programacin de sockets hace Posible que el flujo de datos se establezca en las dos direcciones
entre cliente y servidor, por ello lo de comentar que la diferencia entre cliente y servidor, que una
vez establecida la conexin, se diluye. El flujo de datos que se intercambian cliente y servidor se
puede considerar de la misma forma que cuando se guardan y recuperan datos de un disco: como
Un conjunto de bytes a travs de un canal., y como en todo proceso en el que intervienen datos,
el sistema es responsable de llevar esos datos desde su punto de origen al destino, y es
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 57 -
responsabilidad del programador el asignar significado a esos datos.
Y asignar significado tiene una especial relevancia en el caso de la utilizacin de sockets. En
particular, como se ha dicho, entre las responsabilidades del progrmador est la implementacin
de un protocolo de comunicaciones que sea mutuamente aceptable entre dos maquinas a nivel de
aplicacin para hacer que los datos fluyan de forma ordenada. Un protocolo a nivel de
aplicacin es un conjunto de reglas a travs de las cuales los programas que se ejecutan en los
dos computadores pueden establecer una conversacin e intercambiarse datos. Por ejemplo, el
lector puede escribir un programa utilizando el protocolo de correo SMTP para enviar un
mensaje de correo electrnico a alguien. Aqu tambin se desarrollarn ejemplos que
implementen de forma muy bsica el protocolo HTTP para poder descargar pginas web desde
un servidor de Internet y presentarlas en pantalla, o bien un servidor que soporte el protocolo
echo tanto para TCP como para UDP. Cada uno de estos programas involucran la aceptacin y
uso de un protocolo para poder entender la informacin que proviene o se enva a la otra
mquina.
Programacin de URL
La programacin de URL se produce a un nivel ms alto que la programacin de sockets y, al
menos en teora, resulta una idea muy poderosa. Esa teora dice que, utilizando la clase URL, se
puede establecer una conexin con cualquier recurso que se encuentre en Internet, especificando
un objeto URL y simplemente invocando el mtodo getContent() sobre ese objeto URL. El
contenido del recurso ser descargado y aparecer en la mquina cliente, incluso aunque requiera
un protocolo que no exista cuando el programa fue escrito y ese contenido no fuese entendido en
el momento de escribir la aplicacin.
Esta descripcin puede resultar un poco oscura, pero es concretamente lo que se proclama a los
cuatro vientos que se puede hacer. La idea es excelente, pero habr que esperar un poco ms al
futuro para recoger sus frutos. Si estuviese completamente implementada en los navegadores,
esta idea significara poder colocar un material y desconocido en un sitio web junto con los
manejadores de contenido y protocolos. Cuando un navegador bajase este contenido desde el
sitio web, se bajara el manejador del contenido y podra interpretarlo sin necesidad de instalar
ningn software nuevo.
La cosa vara si de lo que se trata es de una intranet, ya que si se quiere dotar a los clientes de la
capacidad de manejar nuevos contenidos, ser necesario proporcionar el adecuado protocolo y
manejador de esos contenidos; y probablemente ser necesario que los clientes ejecuten
aplicaciones escritas en Java en vez de usar los navegadores estndar para acceder a los datos.
La clase URL tambin proporciona una forma alternativa de conectar un computador con otro y
compartir datos, basndose en streams. En algn ejemplo se ver esta tcnica, que es un tanto
redundante con la programacin de sockets.
LA CLASE INETADDRESS
Hasta ahora se ha visto la fundamentacin terica en que se basa la programacin de
comunicaciones a travs de res, asi que ha llegado la hora de presentar cdigo Java que utilice
este tipo de comunicacin. El ejemplo siguiente presenta el uso de la clase InetAddress, y cmo
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 58 -
se emplean varios de sus mtodos.
Ser necesario estar conectado a Internet a la hora de ejecutarlos para que funcionen
correctamente; en caso contrario, se obtendra una excepcin de tipo UnknownHostException.
La salida que se obtiene al ejecutar el programa es la que se reproduce a continuacin.
Al utilizar un proveedor de Internet, la direccin IP puede ser diferente de una ejecucin a otra.
-> Direccin IP de una URL, por nombre
members.es.tripod. de/62 . 52 . 93. 153
-> Nombre a partir de la direccion
members.es tripod de/62 52 93. 153
-> Direccion IP actual de LocalHost
breogan/194.224.37.156
-> Nombre de LocalHost a partir de la direccion
iv156.eintec.es/
-> Nombre actual de LocalHost
iv156.eintec.es
-> Direccion IP actual de LocalHost
194 224 37 156
Y el cdigo completo del ejemplo es el que se reproduce a continuacin posteriormente se
comentar en detalle.
import java.net.*;
class java1701 {
public static void main( String[ ] args ) {
try {
System.out.println(
"-> Direccion IP de una URL, por nombre" );
InetAddress address =
InetAddress.getByName( "usuarios.tripod.es" );
System.out.println( address );
// Extrae la direccin IP a partir de la cadena que se
// encuentra a la derecha de la barra /, luego proporciona
// esta direccin IP como argumento de llamada al mtodo
// getByName()
System.out.println(
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 59 -
"-> Nombre a partir de la direccion" );
int temp = address.toString().indexOf( '/' );
address = InetAddress.getByName(
address.toString().substring(temp+1) );
System.out.println( address );
System.out.println(
"-> Direccion IP actual de LocalHost" );
address = InetAddress.getLocalHost();
System.out.println( address );
System.out.println(
"-> Nombre de LocalHost a partir de la direccion" );
temp = address.toString().indexOf( '/' );
address = InetAddress.getByName(
address.toString().substring(temp+1) );
System.out.println( address );
System.out.println(
"-> Nombre actual de LocalHost" );
System.out.println( address.getHostName() );
System.out.println(
"-> Direccion IP actual de LocalHost" );
// Coge la direccin IP como un array de bytes
byte[ ] bytes = address.getAddress();
// Convierte los bytes de la direccin IP a valores sin
// signo y los presenta separados por espacios
for( int cnt=0; cnt < bytes.length; cnt++ ) {
int uByte = bytes[cnt] < 0 ? bytes[cnt]+256 : bytes[cnt];
System.out.print( uByte+" " );
}
System.out.println();
} catch( UnknownHostException e ) {
System.out.println( e );
System.out.println(
"Debes estar conectado para que esto funcione bien." );
}
}
}
Todo el cdigo del programa est en el mtodo principal main( ). La clase InetAdress
proporciona objetos que se pueden utilizar para manipular tanto direcciones IP como nombres de
dominio; sin embargo, no se pueden instanciar estos objetos directamente. La clase proporciona
varios mtodos estticos que devuelven un objeto de tipo InetAddress.
El mtodo esttico getByName() devuelve un objeto InetAddress representando el host que se le
pasa como parmetro. Este mtodo se puede utilizar para determinar la direccin IP de un host,
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 60 -
conociendo su nombre; entendiendo por nombre del host el nombre de la mquina, como
java.sun.com, o la representacin como cadena de su direccin IP, como 206.26.48.100. El
mtodo getAllByName() devuelve un array de objetos InetAddress, y se puede utilizar para
determinar todas las direcciones IP asignadas a un host. El mtodo getLocalHost() devuelve un
objeto InetAddress representando el computador local sobre el que se ejecuta la aplicacin.
El primer trozo de cdigo interesante es el que obtiene un objeto InetAddress repreesentando un
determinado servidor y presenta esta direccin utilizando el mtodo sobrecargado toString() de
la clase InetAddress.
InetAddress address = InetAddress.getByName( members.es.trpod.de );
System.out.println( address );
El siguiente trozo de codigo es la accin contraria al anterio, en que se proporciona la direccin
IP para presentar el nombre del host. Como ya se ha indicado, el mtodo getByName( ) puede
aceptar como parmetro de entrada tanto el nombre del host, como su direccin IP en forma de
cadena. El cdigo, utiliza el resultado de la llamada al mtodo anterior para construir una cadena
con la parte numrica del resultado, que es pasada al mtodo getByName( ).
Int Temp. = address.toString( ).indexof( );
Address =
InetAdress.getByName( address.toString( ).substring(temp+1) ),
System.out.println( address);
El trmino localhost se utiliza para describir el computador local, la mquina en la que se est
ejecutando la aplicacin. Cuando se conecta a una red IP, el computador local debe tener una
direccin IP, que se puede conseguir de diferentes formas; no obstante, la siguiente explicacin
se basa en que el computador sobre el cual se ejecuta aplicacin se conecta a travs de la lnea
telefnica con un proveedor de Internet, que es el que abre el acceso a Internet de la mquina
local.
El proveedor de Internet tiene reservadas una serie de direcciones IP, que puede compartir entre
todos sus clientes. Cuando alguien se conecta al proveedor, automticamente se le asigna una
direccin a esa conexin, vlida durante todo el tiempo que dure la sesin. Si se produce una
desconexin y luego se vuelve a conectar, lo ms seguro es que la direccin IP no sea la misma
que se haba asignado a la primera conexin.
Aunque sa sea la situacin ms habitual del lector, en otras ocasiones puede ser diferente. Por
ejemplo, si el computador se encuentra en la red interna de computadores de una empresa, esa
empresa puede tener un bloque de direcciones IP reservadas asignar permanentemente las
direcciones a los computadores; en cuyo caso, cada que se ejecute el programa, la direccin IP
ser siempre la misma. Tambin es posible que el lector disponga de su propia direccin
permanente IP y nombre de dominio.
En cualquier caso, el mtodo getLocalHost() se puede utilizar para obtener un objeto de tipo
InetAddress que represente al computador en el cual se est ejecutan la aplicacin. Eso es
justamente lo que muestra el cdigo que aparece a continuacin.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 61 -
address =InetAddress.getLocalHost( );
System.out.println( address );
En este caso, la parte numrica que aparece al ejecutar el programa, corresponde la direccin que
el proveedor de Internet ha asignado a la conexin sobre la cual se estaba corriendo el programa.
Las lneas de cdigo siguientes realizan la operacin contraria a las anteriores; se utiliza el
mtodo getByNameQ para determinar el nombre por el cual el servidor de nombres de dominio
reconoce a esa direccin numrica.
Temp. = address.toString( ).indexof( );
Address =
InetAdress.getByName( address.toString( ).substring(temp+1) );
System.out.println(address );
Una vez que se ha obtenido el objeto InetAddress, hay otra serie de mtodos de la clase
InetAdress que se pueden utilizar par invocar a este objeto; por ejemplo, las siguientes lneas de
cdigo muestran la invocacin del mtodo gerHostName( ), para obtener el nombre de la
mquina.
System.out.println( address.gerHostName( ) );
De forma semejante, el siguiente fragmento de cdigo utiliza la invocacin del mtodo
getAddress() para obtener un array de bytes conteniendo la direccin IP de la mquina.
byte[] bytes =address.getAddress();
// Convierte los bytes de la direccin IP a valores sin
// signo y los presenta separados por espacios
for( int cnt=O; cnt < bytes.length; cnt++ ) {
int uByte =bytes[cnt] < O ? bytes[cnt]+256 bytes[cnt];
system.out.print( uByte+ );
}
Como no existe nada parecido a un byte sin signo en Java, la conversin del array de bytes en
algo que se pueda presentar en pantalla requiere una cierta manipulacin de los bytes, tal como
se hace en el bucle for del cdigo anterior.
LA CLASE URL
La clase URL contiene constructores y mtodos para la manipulacin de URL (Universal
Resource Locator): un objeto o servicio en Internet. El protocolo TCP, como ya se ha indicado,
necesita dos tipos de informacin: la direccin IP y el nmero de puerto. A continuacin se
expone la forma en que se recibe pues la pgina Web principal de uno de los buscadores al
teclear:
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 62 -
http://www.yahoo.com
En primer lugar, Yahoo tiene registrado su nombre, permitiendo que se use yahoo.com como su
direccin IP, o lo que es lo mismo, cuando se indica yahoo.com es como si se hubiese
especificado 205.216.146.71, su direccin IP real.
La verdad es que la cosa es un poco ms complicada que eso, al intervenir el servicio DNS
(Domain Name Service) , que traslada wwwyahoo.com a 205.216.146.71, que es realidad lo que
permite teclear www.yahoo.com, en lugar de tener que recordar su direccin IP.
Como se ha visto al tratar la clase InetAddress, si se quiere obtener la direccin IP real de la red
en que se est ejecutando una aplicacin, se pueden realizar llamadas a los mtodos
gerLocalHost( ) y getAddress( ). Primero, getLocalHost( ) devuelve un objeto InerAddress, que
si se usa con getAddress( ) generara un array con la direccin IP.
Una cosa interesante en este punot es que una red puede mapear muchas direcciones IP. Esto
puede ser necesario para un Servidor Web. Como Yahoo, que tiene que soportar grandes
cantidades de trfico y necesita mas de una direccin IP para poder atender todo ese trfico. El
nombre interno para la direccin 205.216.146.71, por ejemplo es www7.yahoo.com. el DNS
puede trasladar una lista de direcciones IP asignadas a Yahoo en www.yahoo.com.esto es una
cualidad til, pero abre un agujero en cuestion de seguridad.
Se conoce pues la direccin IP, falta el nmero del puerto. Si no se indica nada, se utilizar el
que se haya definido por defecto en el archivo de configuracin de los servicios del sistema. En
Unix se indican en el archivo /etc/services, en WindowsNT en el archivo services y en otros
sistemas puede ser diferente.
El puerto habitual de los servicios Web es el 80, as que, si no se indica un puerto especfico, la
entrada en el servidor de Yahoo se realiza por el puerto 80. Si se teclea la URL siguiente en un
navegador:
http://www.yahoo.com: 80
tambin se recibir la pgina principal de Yahoo. No hay nada que impida cambiar el puerto en
el que residir el servidor Web; sin embargo, el uso del puerto 80 es casi estndar, porque
elimina pulsaciones en el teclado y, adems, las direcciones URL son lo suficientemente difciles
de recordar como para aadirle encima el nmero del puerto.
Si se necesita otro protocolo, como:
ftp: //ftp.sun .com
el puerto a utilizar se derivar de ese protocolo. As el puerto FTP de Sun es el 21, segn su
archivo services. La primera parte, antes de los dos puntos, de la URL, indica el protocolo que se
quiere utilizar en la conexin con el servidor. El protocolo HTTP (HyperText Transmission
Protocol), es el utilizado para manipular documentos Web. Y si no se especifica ningn
documento, muchos servidores estn configurados para devolver un documento de nombre
index.html.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 63 -
Con todo esto, Java permite los siguientes cuatro constructores para la clase URL:
public URL( String spec )
public URL( String protocol,String host,int port,Striflg file )
public URL( string protocol,String host,String file )
throws Mal formedURLException;
public URL( URL context,Striflg spec )
as se podran especificar todos los components de una direccin URL como en:
URL( http, www.yahoo.com, 80index.html );
O dejar que los sistemas utilicen los valores por defecto definidos, como en:
URL( http://www.yahoo.com );
Y en los dos casos se obtendra la visualizacin de la pgina principal de Yahoo en el navegador desde el cual se ha invocado.
El siguiente ejemplo muestra cmo se utilizan los cuatro constructores de la clase URL y los
mtodos que proporciona dicha clase.
import java.net.*;
class java1702{
public static void main( String[] args ) {
java1702 obj = new java1702();
try {
System.out.println(
"Constructor simple para URL principal" );
obj.display( new URL( "http://usuarios.tripod.es" ) );
System.out.println(
"Constructor de cadena para URL + directorio" );
obj.display( new URL( "http://usuarios.tripod.es/froufe" ) );
System.out.println(
"Constructor con protocolo, host y directorio" );
obj.display( new URL(
"http","usuarios.tripod.es","/froufe" ) );
System.out.println(
"Constructor com protocolo, host, puerto y directorio" );
obj.display( new URL(
"http","usuarios.tripod.es",80,"/froufe" ) );
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 64 -
System.out.println(
"Construye una direccion absoluta a partir de la \n"+
"direccion del Host y una URL relativa" );
URL baseURL = new URL(
"http://usuarios.tripod.es/froufe/index.html");
obj.display( new URL( baseURL,
"/froufe/introduccion/indice.html" ) );
System.out.println(
"Uso de URLEncoder para crear una cadena x-www-form-url" );
System.out.println( URLEncoder.encode(
"http://espacio .tilde~.mas+.com","ISO-8859-1" ) );
} catch( Exception e ) {
System.out.println( e );
}
}
// Mtodo para poder presentar en la pantalla partes de una
// direccin URL
void display( URL url ) {
System.out.print( url.getProtocol()+" " );
System.out.print( url.getHost()+" " );
System.out.print( url.getPort()+" " );
System.out.print( url.getFile()+" " );
System.out.println( url.getRef() );
// Presentamos la direccin completa como una cadena
System.out.println( url.toString() );
System.out.println();
}
}
//------------------------------------------ Final del fichero java1702.java
El ltimo mtodo que aparece en cdigo del ejemplo, dispay()>, es aquel que ilustra el uso de
algunos de los mtodos de la clase URL, y tambin sirve como forma prctica de ver la
informacin que contiene un objeto URL. Este mtodo recibe un objeto URL como parmetro y
presenta todos sus componentes separados por un espacio en blanco; finalmente, utiliza el
mtodo sobrescrito toString() de la clase URL para presentar el contenido del objeto URL como
un solo objeto String.
Como se puede observar, hay un mtodo para obtener cada una de las partes que componen una
direccin URL, exceptuando el mtodo getFile() que devuelve el directorio y el nombre del
archivo combinados.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 65 -
El resto del cdigo de la clase se encuentra en el mtodo main(). El primer fragmento de cdigo
interesante es el que ilustra la instanciacin de un objeto de tipo URL utilizando la versin del
constructor que espera recibir la direccin URL como una cadena.
La primera lnea de cdigo es la instanciacin de un objeto de control de la clase para poder
acceder al mtodo display(). Luego se instancia un nuevo objeto URL utilizando la versin que
admite como parmetro una cadena, y se le pasa al mtodo display(), que va a presentar todos
sus componentes en pantalla. La salida de este fragmento de cdigo en pantalla es la siguiente:
http members.es.tripod.de -1 / null
http:/members.es.tripod.de/
El -1 que aparece es para indicar que no se ha especificado el puerto, y null es para indicar que
no se ha indicado ninguna pgina o archivo en el constructor del objeto URL.
El programa presenta a continuacin otras forma de construir el objeto URL, que no tienen
mayor trascendencia, excepto uno de ellos, que resulta muy interesante, y es el constructor que
necesita dos parmetros: una direccin URL y una cadena y su inters radica en que permite
construir tanto una direccin URL absoluta como relativa. Asmase que el inters se centra en
escribir un mtodo para presentar archivos HTML para que sean interpretados pur un navegador,
en vez de presentarlos como simples archivos de texto. Es normal que estos archivos contengan
enlaces a direcciones URL relativas, es decir, el enlace que se proporciona toma como referencia
la direccin URL base en donde reside el archivo HTML.
El siguiente fragmento de cdigo utiliza ese constructor para combinar la direccin base URL y
la direccin relativa del archivo que se desea para generar una nueva direccin que apunta
directamente a ese archivo
URL baseURL =
new URL( http://members.es.tripod.de/froufe/index.html );
obj.display( new URL( baseURL,/froufe/introduccion/indice.html ) );
La salida que generan esas lneas de cdigo se muestra a continuacin, en donde se puede
comprobar la construccin de la direccin relativa que se ha indicado para convertirla en la
direccin absoluta de la pgina, es perfecta.
http mernbers.es.tripo.de -1 /froufe/introduccion/indice.html null
http: //members.es.tripod.de/froufe/introduccion/indice. html
Y las ltimas lneas de cdigo interesantes son las finales, en que se utiliza la clase
URLEncoder. Esta clase intenta ayudar al programador en todos los problemas que causan los
espacios, caracteres especiales, caracteres no-alfanumricos, etc., que utilizan algunos sistemas
operativos y que pueden hacer que los nombres de archivos no lleguen a convertirse en una
direccin URL vlida.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 66 -
Si se desea crear un objeto URL utilizando una cadena URL que tiene los problemas que se han
indicado, primero es necesario utilizar el mtodo encode() de la clase URLEncoder, para
convertirla a una cadena URL ya entendible. Lo que hace este mtodo esttico encode() es
convertir la cadena que se le pasa a un formato llamado x-www-from-urlencoded y la devuelve
como un objeto String.
Para realizar la conversin, todos los caracteres se van examinando uno a uno, de izquierda a
derecha. Los caracteres ASCII de la a a la z, de la A a la Z y del 0 al 9, permanecen
igual. Los espacios en blanco se convierten a un signo ms, +, El resto de los caracteres se
convierten a una cadena de 3 caracteres de la forma %xydonde xy son dos dgitos en
hexadecimal que representan los 8 bits mas significativos del carcter.
El siguiente fragmento de cdigo muestra cmo se realiza esta conversin:
System.out . println(
URLEncoder.encode( http://espacio .tilde~.mas+.com ) );
En la pantalla, la cadena en el formato que se ha descrito aparecer como:
http%3%F%2Fespacio+.tilde%7E.mas%2B.com
Como bien puede observar el lector, los caracteres especiales han sido sustituidos por su valor
hexadecimal precedido del signo del tanto por ciento, excepto el espacio que se ha sustituido por
el signo ms y el carcter ms, que se ha sustituido por su valor hexadecimal, %2B.
El ejemplo que se presenta a continuacin, javal7O3 .java, muestra cmo se utiliza un objeto
URL para conectarse a una direccin URL y leer un archivo desde esa direccin a travs de un
canal de entrada de tipo stream. Tenga en cuenta el lector, que esto es ms ilustrativo que otra
cosa, porque se puede conseguir lo mismo utilizando sockets, como ya se ver.
La salida por pantalla del programa es la presentacin del cdigo HTML del archivo prueba0l.
html, cuyo contenido se reproduce a continuacin:
<!doctype html public -//w3c//dtd html 4.0 transitional//en>
<html>
<head>
<meta http-equiv=content-Type content=text/html;
charset=iso-8859-1>
<meta name=GENERATOR content= Mozilla/4.51 [en]
(x11; I; Linux 2.2.5-15 i686) [Netscape]>
</head>
<body>
<center>
<h3>Fichero de pruebas</h3></center>
Este es un programa de prueba utilizado, de comunicaciones por red.
<p><b><i>Agust&iacute;nFroufe,<i></b><br>
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 67 -
<a href=mailto:froufe arrakis.es>froufe@arrakis.es</a>,
<a href=http://members.es.tripod.de/froufe/>
http: //members.es.tripod.de/froufe/</a></i ><br>
&nbsp;
</body>
<html>
El listado completo del ejemplo es el que se aparece en las siguientes lneas de cdigo. De nuevo
es el mtodo main() el que contiene todo el programa, para evitar que resulte demasiado
farragoso el cdigo e ir directamente al manejo de las clases que interesan .
import java.net.*;
import java.io.*;
class java1703 {
public static void main( String[] args ) {
String cadena;
try {
// Creamos un objeto de tipo URL
URL url = new URL(
"http://usuarios.tripod.es/froufe/clases/prueba01.html" );
// Abrimos una conexin hacia esa URL, que devolver un canal de
// entrada por el cual se podr leer todo lo que llegue
BufferedReader paginaHtml =
new BufferedReader( new InputStreamReader(
url.openStream() ) );
// Leemos y presentamos el contenido del fichero en pantalla
// lnea a lnea
while( (cadena = paginaHtml.readLine()) != null ) {
System.out.println( cadena );
}
} catch( UnknownHostException e ) {
e.printStackTrace();
System.out.println(
"Debes estar conectado para que esto funcione bien." );
} catch( MalformedURLException e ) {
e.printStackTrace();
} catch( IOException e ) {
e.printStackTrace();
}
}
}
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 68 -
Como ya se ha visto en el ejemplo javal7O2 . java, la clase URL tiene diferentes constructores,
que se diferencian en la forma en que se le pasa la direccin URL. La siguiente lnea de cdigo
muestra cmo se crea el objeto URL en este caso, donde se utiliza la versin del constructor de
la clase URL que admite la direccin URL completa como una sola cadena. La direccin que se
pasa apunta al archivo prueba 01.html, de la cuenta del autor en el servidor gratuito del
proveedor tripod. La cadena que especifica la direccin URL no contiene la indicacin del
puerto porque se usa el de defecto, el puerto 80, para el protocolo HTTP.
Una vez que se dispone del objeto URL. se pueden hacer muchas cosas con l, unas muy
interesantes y otras no tanto. Una de las cosas que se puede hacer es abrir streams de entrada y
salida que se conectarn con el puerto del servidor que est monitorizando la conexin. Esto no
es demasiado interesante, ya que es una duplicidad de la capacidad que proporcionan los sockets,
pero es muy ilustrativo de lo que se puede hacer y por eso se muestra.
BufferedReader paginaHtml =
new BufferedReader( new InputStreamReader( url.openStream() ) );
Esta lnea de cdigo abre una conexin con la direccin URL descrita por el objeto URL y
devuelve un objeto stream como canal de entrada para la lectura de datos provenientes de esa
conexin. Tenga en cuenta que solamente la llamada al mtodo openStrea() es la que hace el
procesado de la direccin, el resto de la sentencia es compleja por la utilizacin de las nuevas
clases de lectura y escritura incorporadas al JDK.
El cdigo que muestran las lneas siguientes es mucho ms simple. La informacin se lee lnea a
lnea y se va presentando segn se lee. El mtodo readLine() devuelve null cuando ya no hay
ms datos que leer, haciendo que el programa termine.
while( (cadena = paginaHtml.readLine()) != null ) {
System.out.println( cadena );
}
El resto del cdigo del ejemplo consiste en el tratamiento de las excepciones.
LA CLASE URLCONNECTION
Es una clase abstracta que puede ser extendida, con un constructor protegido que admite un
objeto URL como parmetro. Tiene unas ocho variables que contienen informacin muy til
sobre la conexin que se haya establecido y cerca de cuarenta mtodos que se pueden utilizar
para examinar y manipular el objeto que se crea con la instanciacin de la clase.
Si el lector pretende utilizar la clase URL por las capacidades de alto nivel que proporciona, y su
intencin es escribir manejadores de protocolos o cosas as, es muy probable que tenga que
conocer en profundidad esta clase. Pero el objetivo que se pretende aqu no es llegar a ese
extremo, sino simplemente que el lector tenga conocimiento de la existencia de esta clase y de
alguno de sus mtodos.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 69 -
El ejemplo java17O4. java muestra cmo se realiza la conexin a una direccin URL y se crea
un objeto de tipo URLConnection. El programa usa entonces ese objeto para obtener y
presentar en pantalla algunos de los aspectos de alto nivel de la direccin URL, como son el tipo
de contenido, la fecha de la ltima modificacin o la propia direccin URL. Por ejemplo, la
ltima ejecucin del programa realizada por el autor gener la siguiente salida por pantalla:
% java javal7O4
http //members.es.tripod.de/froufe/clases/prueba0l.html
Sun Jul 23 10:22:10 GMT+1:OO 1999
text/html
El cdigo completo del ejemplo es el que se reproduce a continuacin.
import java.net.*;
import java.io.*;
import java.util.*;
class java1704 {
public static void main( String[] args ) {
String cadena;
try {
// Creamos un objeto de tipo URL
URL url = new URL(
"http://usuarios.tripod.es/froufe/clases/prueba01.html" );
// Se abre una conexin hacia la direccin recogiendola en un
// objeto de tipo URLConnection
URLConnection conexion = url.openConnection();
// Se utiliza la conexin para leer y presentar la direccin
System.out.println( conexion.getURL() );
// Se utiliza la conexin para leer y presentar la fecha de
// ltima modificacin
Date fecha = new Date( conexion.getLastModified() );
System.out.println( fecha );
// Se utiliza la conexin para leer y presentar el tipo de
// contenido
System.out.println( conexion.getContentType() );
// Se utiliza la conexin para conesguir un objeto de tipo
// InputStream, que luego se emplea para instanciar un
// objeto DataInputStream
BufferedReader paginaHtml =
new BufferedReader( new InputStreamReader(url.openStream()) );
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 70 -
// Se utiliza el objeto DataInputStream para leer y
// presentar el fichero lnea a lnea
while( (cadena = paginaHtml.readLine()) != null ) {
System.out.println( cadena );
}
} catch( UnknownHostException e ) {
e.printStackTrace();
System.out.println(
"Debes estar conectado para que esto funcione bien." );
} catch( MalformedURLException e ) {
e.printStackTrace();
} catch( IOException e ) {
e.printStackTrace();
}
}
}
la clase URLConnection, como se ha indicadom es abstracta, por lo que no se puede instanciar
directamente, pero s se uede extender. Una forma habitual de conseguir un objeto de tipo
URLConnection es invocar un mtodo sobre un objeto URL que devuelva un objeto de una
subclase de la clase URLConnection.
URL url = new URL (
http://members.es.tripod.de/froufe7clases7prueba01.html );
El primer trozo de cdigo que merece la pena, representado en la lnea anterior, es la
instanciacin de un objeto URL. Lalnea de cdigo que se muestra ahora crea un objeto de tipo
URLConnection invocando al mtodo openConection() del objeto que se ha instanciado antes.
URLConnection conexin = url.openConnection();
Solamente queda como interesante el fragmento de cdigo que se usa para invocar a tres de los
mtodos de la clase URLConnection. Sobre el objeto instanciado, para obtener la infomacin de
alto nivel que muestra la direccin URL, la ltima fecha en que se ha modificado y el tipo de
archivo del contenido al que apunta esa direccin URL.
System.out.println( conexin.getURL() ) ;
Date fecha = new Date( conexin.getLasModified() ) ,
System.out. println( fecha ) ;
System.out. println( conexion.getContentType() );
La verdad es que la informacin puede no ser demasiado fiable a veces, porque la impresin que
da es que, por ejemplo, el tipo de contenido est basado en la extensin del archivo, y la fecha de
ltima modificacin corresponde a la capacidad que pueda tener el sistema operativo para
mostrar la fecha a la hora de requerir el contenido de un directorio. No obstante, este tipo de
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 71 -
informacin puede ser til para mantener una utilizacin correcta del archivo apuntado por la
direccin URL. De nuevo, se recuerda al lector que la clase URLConnection dispone de ms
mtodos para proporcionar informacin relevante a la conexin que se haya establecido.
LA CLASE SOCKET
La programacin de sockets proporciona un mecanismo de muy bajo nivel para la comunicacin
e intercambio de datos entre dos computadores, uno considerado como cliente, que es el que
inicia la conexin con el otro, servidor, que est a la espera de conexiones de clientes.
El protocolo de comunicacin entre ambos, determinar lo que suceda tras el establecimiento de
la conexin. Para que las dos mquinas puedan entenderse, ambas deben implementar un
protocolo conocido por las dos. En la programacin de sockets, la comunicacin es full-duplex,
en ambos sentidos a la vez, entre cliente y servidor; siendo responsabilidad del sistema el
llevar los datos de una mquina a otra, dejando al programador el proporcionar
significado a esos datos. Parte de la informacin que fluye entre las dos mquinas es, pues, para
implementar el protocolo, y el resto son los propios datos que se quieren transferir.
Es muy sencilla la utilizacin de sockets para establecer la comunicacin entre cliente y servidor;
en realidad, no es ms complicada que lo que pueda serlo el escribir datos en un archivo. Enviar
y recoger los datos que se intercambian es la parte fcil del asunto; porque ms all de esto ya se
encuentra el protocolo de comunicacin que debe ser entendido por cliente y servidor, en caso
de ser necesario implementarlo, se convierte en algo verdaderamente complicado.
Cliente Eco
El primer ejemplo de programacin de sockets que presentamos java1705.java, implementa un
cliente que realiza una prueba de eco con un servidor, envindole una lnea de texto por el puerto
7 del servidor. Destinado a estos menesteres.
Para poder ejecutar este programa es necesario estar conectado en una red, o a interner, aunque
es posible que tambien pueda hacerse sobre el mismo computador si el lector usa un sistema
operativo que lo soporte, Linux por ejemplo; en cualquier otro caso, el resultado de la ejecucin
del ejemplo ser una triste UnknownHostException.
El programa comienza instanciando un objeto de tipo String que contiene el nombre del servidor
que se va a utilizar, seguido por la declaracin e inicializacin de la variable que guarda el
nmero del puerto, que en el caso del servidor estndar de echo es el 7. A continuacin se abren
los canales de entrada y salida desde el socket que se mapean en las clases Reader y Writer.
Una vez que se ha establecido la conexin y los canales de entrada y salida estn listos para ser
usados, el programa enva una lnea de texto al puerto de eco del servidor. Esto hace que el
servidor reenve esa misma lnea de vuelta al cliente, y el programa la leer y presentar en
pantalla.
El cdigo completo del ejemplo es el que se muestra a continuacion.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 72 -
import java.net.*;
import java.io.*;
import java.util.*;
class java1705 {
public static void main( String[] args ) {
String servidor = "www.fie.us.es";
int puerto = 7; // puerto echo
try {
// Abrimos un socket conectado al servidor y al
// puerto estndar de echo
Socket socket = new Socket( servidor,puerto );
// Conseguimos el canal de entrada
BufferedReader entrada =
new BufferedReader( new InputStreamReader(
socket.getInputStream() ) );
// Conseguimos el canal de salida
PrintWriter salida =
new PrintWriter( new OutputStreamWriter(
socket.getOutputStream() ),true );
// Enviamos una lnea de texto al servidor
salida.println( "Prueba de Eco" );
// Recogemos la lnea devuelta por el servidor y la
// presentamos en pantalla
System.out.println( entrada.readLine() );
// Cerramos el socket
socket.close();
} catch( UnknownHostException e ) {
e.printStackTrace();
System.out.println(
"Debes estar conectado para que esto funcione bien." );
} catch( IOException e ) {
e.printStackTrace();
}
}
}
En caso de que se seleccione un servidor que no tenga soporte para el protocolo echo en el
puerto 7, la salida que generar el programa ser diferente de la que cabra esperar. Por ejemplo,
si el lector intenta ejecutar este programa contra el servidor www.whitehouse.net, la respuesta
que obtendr ser un rechazo de la conexin, algo as como connection refused..
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 73 -
Como se puede ver en el listado, el mtodo main() es el que contiene todo el cdigo de la clase,
porque es muy sencillo y no merece la pena desglosarlo. Las dos primeras lneas que hay que ver
del ejemplo son las que contienen las variables a las que se asigna el nombre del servidor al que
se va a conectar y el nmero del puerto de ese servidor que se va a atacar.
String servidor =www.fie.us.es;
int puerto =7; 7/ puerto echo
El resto del programa se encuentra englobado en un bloque try-catch para tratar las excepciones.
La lnea siguiente es la clave del programa, en ella se establece una conexin con el puerto
indicado del servidor que se ha designado para instanciar un nuevo objeto de tipo Socket
Socket socket =new Socket( server,port );
Una vez que este objeto existe, es posible realizar la comunicacin con el servidor utilizando el
protocolo que tenga predefinido para el servicio que proporciona a travs de ese puerto. Lo
siguiente a destacar en el cdigo del ejemplo es el uso de las clases Reader y Writer.
// conseguimos el canal de entrada
BufferedReader entrada =
new BufferedReader( new InputStreamReader(
socket.getlnputStream() ) );
//Conseguimos el canal de salida
Printwriter salida =
new Printwriter( new OutputStreamwriter(
socket.getoutputStream() ) ,true );
El parmetro true de la ltima lnea hace que el canal de salida realice una descarga o limpieza
de su contenido automticamente. La realizacin de esta descarga o vaciado automtico de los
canales, es algo de vital importancia a la hora de la programacin con sockets.
Lo que resta del cdigo es solamente el uso del canal de salida para enviar la lnea de texto al
servidor de eco, la recogida de su respuesta a travs del canal de entrada y el cierre del socket;
una vez presentada la cadena devuelta por el servidor.
Salida.println( Prueba de Eco ;
System.out.println( entrada.readLine( ) ),
Socket.close( );
Y esto es todo lo que hay sobre sockets desde el punto de vista de la parte cliente, no piense que
la complejidad es mucho mayor, se haga lo que se haga, tal como podr comprobar en lo
ejemplos siguientes. Ahora bien, s que la programacin de sockets se puede complicar, pero
todos los problemas van a venir asociados a la necesidad de implementar un protocolo a nivel de
aplicacin para comunicarse correctamente con el servidor, no del uso en s de los sockets.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 74 -
Cliente Fecha
El ejemplo javal7O6. java tambin implementa un cliente, pero en este caso para atacar el puerto
que proporciona el da y la hora sobre un servidor que d soporte a este protocolo. El ejemplo es
incluso ms sencillo que el ejemplo javal7O5 .java, ya que no es necesario enviar nada al
servidor para obtener respuesta, todo lo que hay que hacer es establecer la conexin. El cdigo
por tanto es bien simple, tal como se muestra en el listado completo del programa.
import java.net.*;
import java.io.*;
import java.util.*;
class java1706 {
public static void main( String[] args ) {
String servidor = "www.whitehouse.net";
int puerto = 13; // puerto de daytime
try {
// Abrimos un socket conectado al servidor y al
// puerto estndar de echo
Socket socket = new Socket( servidor,puerto );
System.out.println( "Socket Abierto." );
// Conseguimos el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socket.getInputStream() ) );
System.out.println( "Hora actual en www.whitehouse.net:" );
System.out.println( "\t"+entrada.readLine() );
System.out.println( "Hora Actual en Sevilla, Spain:" );
System.out.println( "\t"+new Date() );
// Cerramos el socket
socket.close();
} catch( UnknownHostException e ) {
System.out.println( e );
System.out.println(
"Debes estar conectado para que esto funcione bien." );
} catch( IOException e ) {
System.out.println( e );
}
}
}
El programa recoge y presenta la hora del servidor www.whitehouse.net , y luego presenta la
fecha y hoara donde reside el autor ( o donde el lector est ejecutando el programa), por motivos
de comparacin solamente. La salida que se obtiene, por ejemplo puede ser:
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 75 -
% java java1706
socket abierto.
Hora actual en www.whitehouse.net:
Sun Jan 19 23:10:22 1999
Hora actual en sevilla, Spain:
Sun Jan 20 05:10:23 GMT+01:00 1999
Como se puede comprobar, hay diferencia en el da debido a las zonas en que se est obteniendo
la fecha. Tambin se puede ver que hay una diferencia de un segundo entre una hora y otra, el
autor sincroniz el reloj de su ordenador con el servidor de tiempo de bernina.ethz.ch, as que
esa diferencia solamente puede ser atribuible a la duracin de la transmisin entre el servidor y el
cliente.
La filosofa del programa es muy similar a la del ejemplo del cliente de eco. Se comienza con la
instanciacin de un objeto String para contener el nombre del servidor que va a servir la fecha, y
la declaracin de inicializacin de la variable que va a contener el nmero del puerto de ese
servidor que se va a atacar, en este caso el puerto 13, que es el puerto estndar para el servicio
daytime.
Luego el programa se agencia un canal de entrada a travs de la conexin socket que ha
establecido previamente y ya est listo, porque en este caso, la sola conexin es suficiente para
que el servidor enve la fecha y la hora. As que todo lo que hay que hacer es leer la lnea de
entrada que contiene esa fecha y hora enviada por el servidor. El programa la presenta y tambin
presenta la fecha y hora actuales de la mquina en que se est ejecutando el programa, para
establecer una comparacin con la que se ha llegado a travs del socket.
Como no hay diferencias significativas con el ejemplo javal7OS .java que vayan ms all del uso
del mtodo System.out.printlnO), no merece la pena detenerse a contar nada del programa, es
suficiente con que el lector lea los comentarios del cdigo.
Cliente HTTP
El ejemplo que se va a ver ahora, javal7O7 . java es un navegador extremadamente simple; o
ms correctamente, el programa es un cliente HTTP muy simple, implementado mediante
sockets. El programa implementa el suficiente protocolo HTTP para poder recoger un fichero
desde cualquier servidor Web. Si el lector desea realizar un navegador mas util, tambien tendra
que invertir mucho mas tiempo, pero para ver el funcionamiento, es suficiente con lo que se
muestra este ejemplo, cuyo codigo fuente se muestra a continuacin.
import java.net.*;
import java.io.*;
class java1707 {
public static void main( String[] args ) {
String servidor = "usuarios.tripod.es"; // servidor
int puerto = 80; // puerto
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 76 -
try {
// Crea un socket, conectado al servidor y al puerto
// que se indica
Socket socket = new Socket( servidor,puerto );
// Crea el canal de entrada desde el socket
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socket.getInputStream() ) );
// Crea el canal de salida
PrintWriter salida = new PrintWriter(
new OutputStreamWriter( socket.getOutputStream() ),true );
// Enva un comando GET al servidor
salida.println(
"GET /froufe/clases/prueba01.html" );
// En esta cadena se va a ir leyendo el fichero
String linea = null;
// Bucle para leer y presentar la lneas hasta que se
// reciba un null
while( (linea = entrada.readLine()) != null )
System.out.println( linea );
// Se cierra el socket
socket.close();
} catch( UnknownHostException e ) {
e.printStackTrace();
System.out.println(
"Debes estar conectado para que esto funcione bien." );
} catch( IOException e ) {
e.printStackTrace();
}
}
}
El programa se inicia definiendo el servidor y el puerto con el que se va a establecer la
comunicacin, abriendo a continuacin un socket sobre ese puerto. Al igual que en los ejemplos
anteriores, el programa crea canales de entrada y salida para la transferencia de informacin
entre la parte del cliente y la parte del servidor.
El programa enva un comando GET, actuando como cliente, al servidor indicndole el archivo
que desea recibir. Este comando forma parte del protocolo HTTP, que provoca la bsqueda en el
servidor del archivo indicado y su envi al cliente. Si el servidor esta montado sobre el puerto
con el que se ha establecido la conexin siempre enviara algo, si encuentra el archivo enviara su
contenido, y si no lo encuentra o hay algn otro problema siempre enva un mensaje de error
indicando la circunstancia por la cual el archivo no ha podido ser transferido al cliente.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 77 -
El programa lee el texto que recibe por el canal de entrada y lo presenta en el dispositivo
estndar de salida, por lo que se vera el cdigo HTML que forma la pagina, es decir se vera
como texto normal.
Si el lector revisa el cdigo del programa Java, recordar de ejemplos anteriores toda la parte
inicial de declaracin de variables para determinar el servidor y puerto al que conectarse y la
apertura de sockets para los canales de entrada y salida. As que la primera parte de cdigo que
realmente merece la pena revisar es el envo de comandos HTTP al servidor.
salida. println ( GET/froufe/clases/prueba0l. html );
Observe el lector que el rbol de directorios que se indica al servidor para que consiga localizar
el archivo es relativo a su pseudoraz, es decir, relativo al nivel inicial en que se encuentran los
documentos HTML. La peticin se realiza simplemente escribiendo el comando en el canal de
salida.
Si el comando GET ha sido enviado correctamente, hay que esperar siempre una respuesta del
servidor, aunque se trate de un mensaje de error. El siguiente fragmento de cdigo va leyendo
texto del canal de entrada, presentndolo a continuacin en la pantalla, cerrando el socket cuando
ya no hay ms datos que leer.
String linea =null;
while( (linea =entrada.readLine()) 1= null )
System.out.println( linea );
socket.close();
El resto del cdigo es ya la parte conocida de control de las excepciones. Si el lector desea
incorporar ms caractersticas a este ejemplo, a fin de convertirlo en un navegador til; se le
sugiere que revise las especificaciones HTML y escriba un mtodo de presentacin al estilo que
normalmente se asocia a las pgina web. E incluso puede englobar todo el ejemplo en AWT,
proporcionando una interfaz grfica mediante un rea de texto, TextArea, para la parte de
presentacin de la pgina y un campo de texto TextFill, para especificar la direccin del archivo
del servidor que se desea visualizar.
La Clase de ServerSocket
La clase de ServerSocket es la que se utiliza a la hora de crear servidores, al igual que, como ya
se ha visto, la clase socket se utilizaba para crear clientes.
El ejemplo java1709.java utiliza sockets para implementar dos sockets diferentes sobre una red
IP. Desde luego el programa es solamente ilustrativo, por lo que si el lector decide utilizarlo en
alguno de sus propsitos el autor declina toda reponsabilidad, siendo el lector el que asme el
riesgo de su uso. El porqu de esta advertencia reside en el uso del agente de seguridad que se
implementa en ste, y algunos ms, de los ejemplos que se van a presentar, que no es nada
restrictivo, y puede permitir el acceso no deseado a la mquina en que se ejecuten estos
programas de ejemplo. El control realizado se limita a no permitir la navegacin por encima del
directorio actual; pero esto es ms como ejemplo para que el lector pueda probar el envo de
mensaje de error al cliente, que un verdadero mtodo de seguridad.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 78 -
Este programa implementa dos servidores operando sobre dos puertos diferentes del computador
que est ejecutando el programa. Uno de los servidores es un servidor echo que est
implementado a travs de una tarea que monitoriza el puerto 7. Este servidor devuelve la cadena
que reciba por el puerto 7 al mismo cliente que la ha enviado. El otro servidor es un servidor
HTTP abreviado, que se ha implementado a travs de una tarea que monitoriza el puerto 80,
puerto estndar para el protocolo HTTP. En este servidor se ha implementado la respuesta al
comando GET, que devuelve al cliente el contenido del archivo que haya solicitado, o un
mensaje de error en caso de no encontrarlo.
Si el lector ejecuta los ejemplos en entorno Windows, es suficiente con que arranque los
ejemplos como cualquier otro programa Java, antes de lanzar la parte cliente, o al menos antes de
que la parte cliente solicite algo al servidor. Sin embargo, si la ejecucin se realiza en entornos
Solaris, Linux, etc. probablemente se encuentre con que no hay permiso para utilizar los puertos
que se asignan en los ejemplos. Esto es debido a que los puertos por debajo del 1024 estn
reservados para uso del sistema; no obstante, el lector puede cambiar el nmero de puerto ~ianto
en el servidor como en el cliente y ejecutarlos.
Los ejemplos javal7l0.java y java17ll.java son clientes implementados para probar los dos
servidores que se crean en este ejemplo. La parte del servidor de Eco se puede probar utilizando
el primero de los ejemplos, javal7l0.java, y el otro ejemplo permite probar la parte HTTP.
Tambin puede el lector comprobar el funcionamiento del agente de seguridad, solicitando
archivos no vlidos al servidor. El cdigo completo del programa es el que se muestra, que luego
se revisar detalladamente.
import java.net.*;
import java.io.*;
import java.util.*;
public class java1709 {
public static void main( String[] args ) {
// Se instancia el controlador de seguridad propio nuestro
System.setSecurityManager( new MiSecurityManager() );
// Se instancia un objeto servidor para escuchar el puerto 80
ServidorHttp servidorHttp = new ServidorHttp();
// Se instancia un objeto servidor para escuchar el puerto 7
ServidorEco servidorEcho = new ServidorEco();
}
}
// Esta clase se utiliza para instanciar un controlador de seguridad que
// solamente permita descargar los ficheros que se encuentren en el
// directorio actual o en cualquier subdirectorio de ese directorio.
// Evidentemente, no instalar este servidor en una red, sin antes haber
// hecho cambios para que el control sea ms exhaustivo, porque aqu
// se ha dejado muy abierto, ya que solamente se pretende utilizar para
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 79 -
// pruebas
class MiSecurityManager extends SecurityManager {
// Este mtodo sobreescrito es el que controla que el servidor solamente
// permita descargar los ficheros del directorio actual y sus ramas,
// es decir, que no permite navegar hacia arriba en el rbol, ni
// permite la descarga de una direccin absoluta, pero tiene
// muchos agujeros de seguridad, as que no debe utilizarse a no ser
// que se complete adecuadamente, y adems se implemente la respuesta
// que se va a dar en los dems mtodos del controlador de Seguridad
public void checkRead( String str ) {
if( new File(str).isAbsolute() || (str.indexOf("..") != -1 ) )
throw new SecurityException( "\n"+str+": Acceso denegado.");
}
// Ahora se sobreescriben los dems mtodos, que es lo que hace que el
// tema de seguridad quede totalmente abierto.
public void checkAccept( String s,int i ){}
public void checkAccess( Thread t ){}
public void checkAccess( ThreadGroup g ){}
public void checkAwtEventQueueAccess(){}
public void checkConnect( String s,int i ){}
public void checkConnect( String s,int i,Object o ){}
public void checkCreateClassLoader(){}
public void checkDelete( String s ){}
public void checkExec( String s ){}
public void checkExit( int i ){}
public void checkLink( String s ){}
public void checkListen( int i ){}
public void checkMemberAccess( Class c,int i ){}
public void checkMulticast( InetAddress a ){}
public void checkPackageAccess( String s ){}
public void checkPackageDefinition( String s ){}
public void checkPrintJobAccess(){}
public void checkPropertiesAccess(){}
public void checkPropertyAccess( String s ){}
public void checkRead( FileDescriptor f ){}
// public void checkRead( String s ){} // Este es el nico sobreescrito
public void checkRead( String s,Object o ){}
public void checkSecurityAccess( String s ){}
public void checkSetFactory(){}
public void checkSystemClipboardAccess(){}
public boolean checkTopLevelWindow( Object o ) {
return true;
}
public void checkWrite( FileDescriptor f ){}
public void checkWrite( String s ){}
}
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 80 -
// Esta es la clase que se utiliza para instanciar un hilo de ejecucin
// para el servidor que se encarga de escuchar el puerto 7, que es el
// definido como estndar para el protocolo de "echo"
class ServidorEco extends Thread {
// Constructor
ServidorEco() {
// Arrancamos el hilo e invocamos al mtodo run() para que empiece
// a correr
start();
}
public void run() {
try {
// Se instancia un objeto sobre el puerto 7
ServerSocket socket = new ServerSocket( 7 );
System.out.println( "Servidor escuchando el 7" );
// Entramos en bucle infinito ecuchando el puerto. Cuando se
// produce una llamada, se lanza un hilo de ejecucin de
// ConexionEcho para atenderla
while( true )
// Nos quedamos parados en el accept(), y devolvemos un socket
// cuando se recibe la llamada. Este socket es el que se pasa
// como parmetro al nuevo hilo de ejecucin que se crea
new ConexionEcho( socket.accept() );
} catch( IOException e ) {
e.printStackTrace();
}
}
}
// Esta clase se utiliza la lanzar un hilo de ejecucin que atienda
// la llamada recibida a travs del puerto 7, el puerto de eco
class ConexionEcho extends Thread {
Socket socket;
// Constructor
ConexionEcho( Socket socket ) {
System.out.println( "Recibida una llamada en el puerto 7" );
this.socket = socket;
// Trabajamos por debajo de la prioridad de los otros puertos
setPriority( NORM_PRIORITY-1 );
// Se arranca el hilo y se pone a correr
start();
}
public void run() {
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 81 -
System.out.println( "Lanzado el hilo de atencion del puerto 7" );
BufferedReader entrada = null;
PrintWriter salida = null;
try {
// Conseguimos un canal de entrada desde el socket
entrada = new BufferedReader( new InputStreamReader(
socket.getInputStream() ) );
// Conseguimos un canal de salida hacia el socket. El canal es
// con liberacin automtica (autoflush)
salida = new PrintWriter( new OutputStreamWriter(
socket.getOutputStream()),true );
// Recogemos la cadena que llegue al puerto y la devolvemos en
// el mismo instante
String cadena = entrada.readLine();
salida.println( cadena );
System.out.println( "Recibido: "+cadena );
socket.close();
System.out.println( "Socket cerrado" );
} catch( IOException e ) {
e.printStackTrace();
}
}
}
// Esta es la clase que se utiliza para instanciar un hilo de ejecucin
// para el servidor que se encarga de escuchar el puerto 80, que es el
// definido como estndar para el protocolo de "http"
class ServidorHttp extends Thread {
// Constructor
ServidorHttp() {
// Arrancamos el hilo e invocamos al mtodo run() para que empiece
// a correr
start();
}
public void run(){
try {
// Se instancia un objeto sobre el puerto 80
ServerSocket socket = new ServerSocket( 80 );
System.out.println( "Servidor escuchando el puerto 80" );
// Entramos en bucle infinito ecuchando el puerto. Cuando se
// produce una llamada, se lanza un hilo de ejecucin de
// ConexionHttp para atenderla
while( true )
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 82 -
// Nos quedamos parados en el accept(), y devolvemos un socket
// cuando se recibe la llamada. Este socket es el que se pasa
// como parmetro al nuevo hilo de ejecucin que se crea
new ConexionHttp( socket.accept() );
} catch( IOException e ) {
e.printStackTrace();
}
}
}
// Esta clase se utiliza la lanzar un hilo de ejecucin que atienda
// la llamada recibida a travs del puerto 80, el puerto de http
class ConexionHttp extends Thread {
Socket socket;
BufferedReader entrada = null;
PrintWriter salida = null;
DataOutputStream pagina = null;
// Constructor
ConexionHttp( Socket socket ) {
System.out.println( "Recibida una llamada en el puerto 80" );
this.socket = socket;
// Trabajamos por debajo de la prioridad de los otros puertos
setPriority( NORM_PRIORITY-1 );
// Se arranca el hilo y se pone a correr
start();
}
public void run() {
System.out.println( "Lanzado el hilo de atencion al puerto 80" );
try{
// Conseguimos un canal de entrada desde el socket
entrada = new BufferedReader( new InputStreamReader(
socket.getInputStream() ) );
// Conseguimos un canal de salida hacia el socket. El canal es
// con liberacin automtica (autoflush)
salida = new PrintWriter( new OutputStreamWriter(
socket.getOutputStream() ),true );
// Ahora conseguimos un canal de salida para enviar el contenido
// del ficero que haya solicitado el usuario
pagina = new DataOutputStream( socket.getOutputStream() );
// Recogemos la cadena que llegue al puerto
String peticion = entrada.readLine();
System.out.println( "Recibida peticion: "+peticion );
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 83 -
// Analizamos esa peticin e intentamos responder. Solamente se
// contesta a las peticiones GET, cualquier otra no tiene
// respuesta alguna
StringTokenizer st = new StringTokenizer( peticion );
if( ( st.countTokens() >= 2 )
&& st.nextToken().equals("GET") ) {
System.out.println( "Primer tag GET, correcto" );
if( (peticion = st.nextToken()).startsWith("/") ) {
System.out.println(
"Siguiente toque que empieza por /, se le quita" );
peticion = peticion.substring( 1 );
}
if( peticion.endsWith("/") || peticion.equals("") ) {
System.out.println( "Peticion terminada en / o blanco, "+
"se le incorpora: index.html" );
peticion = peticion + "index.html";
System.out.println( "Peticion modificada: "+peticion );
}
System.out.println( "Intento de desacarga de: "+peticion );
FileInputStream fichero = new FileInputStream( peticion );
// Se instancia un array de bytes igual al nmero de bytes que
// se pueden leer del canal de entrada sin bloquearlo.
// Y luego se rellena con los datos
byte[] datos = new byte[fichero.available()];
fichero.read( datos );
// Se enva el array de datos al cliente
pagina.write( datos );
pagina.flush();
} else
// La peticin que se ha hecho no es un GET
salida.println( "<HTML><BODY><P>400 Petici&oactute;n "+
"Err&oacute;nea<P></BODY></HTML>" );
socket.close();
System.out.println( "Socket cerrado" );
}catch( FileNotFoundException e ) {
salida.println(
"<HTML><BODY><P>404 No Encontrado<P></BODY></HTML>" );
try {
socket.close();
System.out.println( "Socket cerrado" );
}catch( IOException evt ) {
evt.printStackTrace();
}
}catch( SecurityException e ){
e.printStackTrace();
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 84 -
salida.println(
"<HTML><BODY><P>403 Acceso denegado<P></BODY></HTML>" );
salida.println( e );
try {
socket.close();
System.out.println( "Socket cerrado" );
}catch( IOException evt ) {
evt.printStackTrace();
}
}catch( IOException e ) {
e.printStackTrace();
try {
socket.close();
System.out.println( "Socket cerrado" );
}catch( IOException evt ) {
System.out.println(evt);
}
}
}
}
Como el lector puede comprobar, el programa dispone de un agente de seguridad, sin embargo,
se trata de una aplicacin java, no de un applet. La parte principal de la aplicacin se muestra en
el mtodo main(), conteniendo las tres sentencias que permiten el uso de las clases que
implementan el objetivo concreto de la creacin de los servidores y del agente de seguridad
public static void main( String [ ] args){
System.setSecurityManager (new MiSecurityManager() );
ServidorHttp servidorHttp = new ServidorHttp();
ServidorEco servidorEcho = new ServidorEco();
}
La primera sentencia establece el agente de seguridad que va a utilizar la aplicacin. La segunda
sentencia instancia un objeto servidor que monitoriza el puerto 80; este servidor implemeflta
parte del protocolo HTTP y permite la descarga de archivos a navegadores. Y, la tercera
sentencia instancia un objeto servidor que monitoriza el puerto 7; este servidor devuelve al
cliente TCP/IP la misma cadena que haya enviado al servidor. Estos dos servidores se
implementafl en tareas diferentes para que puedan funcionar en paralelo de forma asncrona.
Agente de seguridad
Normalmente cuando se ejecuta una aplicacin Java, no hay ningn agente de seguridad, o en
caso de que lo haya, no funciona de la forma restrictiva en que se hace en el ejemplo. Sin
embargo, cuando se establece un agente de seguridad para una aplicacin, mediante la llamada al
mtodo setSecurityManagerO, lo contrario es cierto. Es decir, cuando se coloca un agente de
seguridad en una aplicacin, a ese cdigo se le prohbe hacer cualquier cosa; la aplicacin deja
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 85 -
de tener privilegios, y es el programador, como diseador del sistema de seguridad, el que decide
qu privilegios va a tener disponibles y qu cosas van a estar prohibidas a esa aplicacin.
Esto es un proceso tedioso y complicado. Aunque no es difcil hacer que un privilegio est
disponible una vez que se haya decidido que va a estarlo, el llegar a esa conclusin requiere un
gran conocimiento de cmo se relacionan los privilegios con las operaciones que se pueden
realizar; por que hay ocaciones en que esta relacin entre privilegio y operacin no es tan obvia a
simple vista. Para crear un agente de seguridad propio, hay que extender la clase
SecurityManager, que contiene alrededor de una treintena de mtodos que comienzan con la
palabra check, como checkAccept(). Esos mtodos son los que controlan el acceso a los
priviliegios; cada uno de los mtodos controla el acceso a un privilegio que generalmente
coincide con lo que indica la segunda parte del nombre.
La versin que se instaura por defecto de cada uno de estos mtodos es la deshabilitacin del
privilegio que controla. Para poner disponible ese privilegio, hay que sobreescribir el mtodo,
bien con un mtodo vaco, o con un mtodo que implemente una versin propia de ese
privilegio. En este ejemplo, se han sobrescrito todos los mtodos, excepto uno, con un mtodo
vaco, haciendo que los privilegios asociados a esos mtodos estn disponibles, sin restriccin
alguna.
El mtodo checkReadO) est sobrescrito para modificar el privilegio asociado, de forma que el
servidor HTTP solamente pueda enviar archivos situados en su directorio pseudo-raz y en
cualquiera de los subdirectorios a partir de l. El cdigo que se proporciona para esta versin del
mtodo se muestra en las siguientes lneas.
public void checkRead( String str ) {
if( new File(str).isAbsolute() I I (str.indexof(..) 1= -1) )
throw new SecurityException( \n+str+: Acceso denegado.);
}
Como se puede comprobar, se controla que no se pueda invocar un archivo directamente
indicando el camino absoluto en donde se encuentra en el disco, ni que se pueda realizar la
llamada a un archivo del directorio padre del actual, que se indica con dos puntos (. .); en caso de
que se intente cualquiera de los dos mtodos de acceso, se lanzar la excepcin de seguridad.
Tenga en cuenta el lector que esto es solamente para probar y que no debe utilizarlo seriamente
ni en algo en que tenga inters, porque hay muchas circunstancias que no se controlan.
El resto de los mtodos se sobrescriben con un mtodo vaco, deshabilitando las operaciones que
se realizan por defecto y, dejando totalmente disponibles los privilegios que comprueban cada
uno de esos mtodos.
Servidor Eco
La siguiente parte interesante del cdigo del programa es la clase que implementa el servidor del
protocolo Echo, que es el ms simple de los dos que se muestran en el ejemplo. En general, los
dos servidores funcionan del mismo modo, corriendo cada uno de ellos en su propia tarea, y
escuchando el puerto que corresponde a su protocolo, en espera de conexiones de clientes.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 86 -
Mientras un servidor se encuentra en este estado de espera de conexiones, estar bloqueado para
consumir el mnimo de recursos del sistema.
Cuando un cliente requiere una conexin en cualquiera de los dos puertos, el servidor lanza otra
tarea para manejar las necesidades del cliente y luego vuelve para seguir escuchando el puerto en
su propia tarea. Las tareas para dar soporte a los clientes se lanzan con prioridad mnima, de
forma que estas tareas no interfieran la capacidad asignada a los servidores de reconocer y
responder a cualquier otro cliente que est solicitando una conexin. Si hay muchos clientes
solicitando conexiones, el servidor que atiende al puerto lanzara una tarea por cada una de esas
conexiones (dentro de las capacidades del sistema); de forma que puede haber muchas tareas
ejecutndose simultneamente, atendiendo cada una de ellas a las necesidades de un cliente
especfico.
La primera sentencia interesante del servidor de eco es el constructor, que simplemente invoca a
su propio mtodo start() que iniciar el arranque de su propia tarea.
Start();
La clave del funcionamiento de un servidor en Java se encuentra en el mtodo accept() de la
clase ServerSocket. Antes, hay que construir un objeto de esa clase y, como se puede ver en el
siguiente trozo de cdigo, el constructor de ServerSocket tiene solamente un parmetro: el
nmero del puerto que va a ser monitorizado por el servidor que construye.
ServerSocket socket =new serverSocket( 7 );
system.out.println( Servidor escuchando el 7 );
Y acto seguido se puede realizar la llamada al mtodo accept() para recoger las conexiones que
establezcan los clientes con el servidor a travs del puerto que est monitorizando ese servidor.
Las lneas siguientes muestran cmo se hace esto en el ejemplo.
while( true )
new ConexionEcho( socket.acceptO );
Cuando se instancia un objeto de tipo ServerSocket y se invoca el mtodo accept() sobre ese
objeto, este mtodo bloquea el servidor y se queda a la espera hasta que se produce una conexin
de un cliente en el puerto que controla. Cuando esto sucede, se instancia automticamente un
objeto Socket que es devuelto por el mtodo accept().
Observamos que hay muchos conceptos que se estn repitiendo, y que si va leyendo con
detenimiento, se vuelve sobre ellos una y otra vez. Esto est hecho deliberadamente, ya que hay
una serie de conceptos y mtodos muy simples en los que se basa todo el funcionamiento de las
comunicaciones en red con Java, y que son los que verdaderamente tienen que quedar arraigados
en la mente. Por ello aun a pesar de resultar un poco ladrillo, es preferible recaer una vez sobre
otra en los conceptos que el autor considera fundamentales, para que una vez concluida la lectura
del captulo, al menos esos conceptos hayan quedado lo suficientemente claros y grabados en el
conocimiento del lector.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 87 -
El objeto Socket devuelto por el mtodo accept() se conecta automticamente con el objeto
Socket utilizado por el cliente que ha establecido la conexin, y se puede utilizar para establecer
la comunicacin con el cliente. Esto es muy importante, as que hay que detenerse un poco en
ello.
No hay ninguna transferencia de datos por el hecho de disponer de un objeto de tipo
ServerSocket. Es en el momento en que el cliente solicita una conexin cuando se instancia
automticamente un objeto Socket que se conecta con el Socket del cliente que ha pedido la
conexin. Este nuevo socket es el devuelto por el mtodo accept() para poder establecer la
comunicacin con el socket del cliente.
En el trozo de cdigo anterior, se observa que cuando se recibe una conexin, se lanza una tarea
del tipo ConexionEcho que atiende al cliente que ha solicitado esa conexin. Al constructor de
la clase que maneja este nueva tarea, se le pasa como parmetro el objeto Socket que el mtodo
acceptO) devuelve, que ya est conectado con el cliente, y a travs del cual el protocolo de
comunicaciones para el servicio, echo en este caso, puede comunicarse con el cliente.
Observe el lector que la tarea en la cual est corriendo el objeto ServidorEco se encuentra en
medio de un bucle infinito. Luego una vez que la tarea ConexionEcho haya sido lanzada con
xito, el objeto ServidorEco volver a su funcin inicial de seguir esperando a la conexin de
otro cliente a travs del puerto de eco.
El siguiente trozo de cdigo en que merece la pena detenerse es el constructor de la clase
ConexionEcho. Los objetos de esta clase son creados a raz de la peticin de conexin de algn
cliente al servidor. No obstante, estos objetos no saben nada de clientes y servidores, lo nico
que conocen es que hay un socket TCP/IP conectado con otro socket en otra mquina, o con otro
proceso de la misma mquina.
ConexionEcho( Socket socket ) {
system.out.println( Recibida una llamada en el puerto 7 ); this.socket =socket;
setpriority( NORM..PRI0RITY-l );
startQ;
}
Como puede observar el lector, tras guardar el parmetro en una variable de instancia, el
constructor fija la prioridad de la tarea. Esto es para que las tareas que estn monitorizando los
puertos no se vean interrumpidas por las tareas que estn atendiendo a las conexiones ya
establecidas. Una vez ajustada la prioridad, solamente resta invocar al mtodo start() para que la
tarea se levante y empiece a correr. Como es habitual, el mtodo start() invocar al mtodo run()
de esta tarea.
El mtodo run() de esta tarea es similar al cdigo que ya se ha presentado en ejemplos anteriores
al programar la parte cliente. Por referenciar algo, se reproducen las lneas de cdigo en donde se
lee la cadena recibida del cliente y se devuelve a ese cliente, exactamente igual que se ha
recibido. Una vez hecho esto, se cierra el socket de conexin con el cliente y la tarea se muere.
string cadena =entrada.readLine();
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 88 -
salida.println( cadena );
System.out.println( Recibido: +cadena );
socket.close();
System.out.println( Socket cerrado );
Con esto se concluye el repaso al cdigo que implementa el servidor Eco en el programa y se
pasa a discutir la clase que atiende a las conexiones con el puerto estndar del protocolo HTTP.
Servidor HTTP
Este servidor HTTP es realmente simple, y solamente responde al comando GET del protocolo
HTTP, cualquier otro comando ser ignorado y el cliente obtendr como respuesta un mensaje
de error.
En el mtodo main() se instancia un objeto de la clase ServidorHttp, que monta una tarea que
instancia un objeto de tipo ServerSocket para atender al puerto estndar del protocolo HTTP, el
puerto 80.
ServerSocket socket =new ServerSocket( 80 );
System.out.prifltln( Servidor escuchando el puerto 80 );
El mtodo accept(), tal como muestran las lneas de cdigo siguientes, se invoca sobre este
objeto dentro de un bucle infinito para bloquear y monitorizar el puerto 80, esperando
conexiones de clientes. Cuando esto ocurre, el mtodo accept() instancia y devuelve un objeto
Socket, que estar conectado con la mquina cliente.
while( true )
new ConexionHttp( socket.acceptQ );
Este objeto Socket, se pasa como parmetro al constructor de un nuevo objeto de tipo
ConexionHttp, que lanzar una tarea especfica para atender a la conexin que se ha establecido
con el cliente, a travs de la versin abreviada del protocolo HTTP que se ha implementado en
esta clase.
El constructor es similar al visto para el servidor de Eco; as que, en aras de la brevedad no se
incluye aqu. Si el lector sigue el cdigo del ejemplo, no encontrar nada nuevo hasta llegar a la
transmisin de informacin al cliente, que en este caso se hace enviando un array de bytes. El
siguiente fragmento de cdigo muestra la creacin del canal de salida que va a permitir este tipo
de comunicacin.
pagina =new DataOutputStreafll( socket.getOutputStream () );
Esto se ecncuentra dentro del mtodo run(), corazn de la tarea que esta atendiendo a la
conexin. A continuacin, lo que se espera es la conexin del cliente, para lo que se utiliza el
mtodo readLine() sobre el canal de entrada que lee las peticiones y alma-cena esa peticin en
un objeto String.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 89 -
String peticion =entrada.readLineQ;
Lo siguiente que hay que hacer es el anlisis de la peticin que ha realizado el cliente para
comprobar si es posible atenderla o no, teniendo en cuenta que solamente se responde al
comando GET. Para realizar este anlisis se utiliza un objeto StringTokenizer, que indicar si
hay o no un comando GET en la peticin realizada por el cliente.
Stringiokenizer st = new Stringiokenizer( peticion );
if( ( st.countiokens() >= 2 )
&& st.nextloken().equals(GET) ) {
En caso de que no sea una peticin GET, se crear una pgina dentro del cdigo para devolver el
mensaje de error al cliente. Si la peticin s corresponde a un comando GET, lo que se intenta es
comprobar el nombre del archivo que ha solicitado el cliente y envirselo; y en caso de que no
solicite ninguno, completar el camino que haya indicado con el archivo index.html, que es el
archivo estndar que utilizan casi todos los navegadores como archivo de defecto en caso de no
especificar una pgina determinada en el acceso a un sitio Internet. Las siguiente lnea de cdigo
elimina la posibilidad de que la peticin contenga barras / extra.
if( (peticion = st.nextiokenQ).startswith() ) {
Si la peticin termina con una barra / o es una cadena vaca, se supone que el cliente quiere
descargar el archivo index.html; as que, en este caso, se aade este nombre de archivo a la
cadena que contiene la peticin realizada por el cliente.
if( peticion.endswith() II peticion.equals() ) {
System.out.println( Peticion terminada en / o blanco, +
se le incorpora: index.html );
peticion = peticion + index.html;
System.out.println( Peticion modificada: +peticion );
}
Llegados a este punto, ya se sabe cul es el archivo que hay que enviarle al cliente como
respuesta a su peticin, as que se intenta abrir un objeto de tipo FilelnputStream con ese
nombre de archivo y en el camino que se indique. Si no se puede conseguir, se lanzar una
excepcin que ser procesada en el bloque try-catch del final del programa. Si el archivo s se
puede leer, se crear un array de bytes igual al contenido del archivo y se leer ah ese
contenido.
FilelnputStream fichero = new FlelnputStream( petcion );
// Se instancia un array de bytes igual al nmero de bytes que
// se pueden leer del canal de entrada sin bloquearlo.
byte[] datos = new byte[tichero.ava1 fabIeUj;
fichero.read( datos );
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 90 -
Una vez que se ha identificado, localizado y ledo el archivo en un array en memoria, el siguiente
paso consiste en el uso del canal de salida que se haba creado anteriormente para transmitir el
contenido del array al cliente; concluyendo con la liberacin forzada de todo el contenido del
array, tal como se muestra en las siguientes lneas de cdigo.
pagina.write( datos );
pagina.flush();
El siguiente fragmento de cdigo se ejecuta en el caso de que el cliente no enve una peticin
GET, en cuyo caso se crea un documento sobre la marcha conteniendo el mensaje de error que
indica tal circunstancia y se le enva como respuesta al cliente.
} else
salida.println( <HTML><BODY><P>400 Petici&oactute;n +
Err&oacute ; nea<P></BODY></HTML> );
socket.close;
Esta ltima sentencia cierra el socket y permite que la tarea termine normalmente, siempre
asumiendo que no se ha lanzado ninguna excepcin mientras; porque en el caso de que se
hubiese generado alguna excepcin, hay varios controladores para recoger estas excepciones, e
incluso algunos, como el lector podr observar en el cdigo del ejemplo, generan pginas sobre
la marcha que se envan al cliente, indicando la circunstancia que ha provocado el lanzamiento
de la excepcin que controlan.
Quiz merezca la pena detenerse en el controlador de la ltima excepcin, la de tipo
IOExcepction, que se muestra en el siguiente trozo de cdigo.
}catch( IOException e ) {
e.printStacklrace();
try {
socket.cl ose ();
System.out.println( Socket cerrado );
}catch( IoException evt ) {
System.out.println(evt);
}
Es especial porque es necesario cerrar el socket dentro del controlador de la excepcin. La
verdad es que el autor no sabe a ciencia cierta cmo se puede forzar una excepcin de tipo
IOException, dentro del manejador de una excepcin de tipo IOException lanzada
anteriormente, pero vamos; es de suponer que funciona.
LA CLASE DATAGRAMPACKET
La clase DatagramPacket, junto con la clase DatagramSocket, es la que se utiliza para la
implementacin del protocolo UDP (User Datagram Protocol).
En este protocolo, a diferencia de lo que ocurra en el protocolo TCP, en el cual si un paquete se
daaba durante la transmisin se reenviaba ese paquete, para asegurar una comunicacin segura
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 91 -
entre cliente y servidor; con UDP no hay garanta alguna de que los paquetes lleguen en el orden
correcto a su destino y, ni tan siquiera hay seguridad de que lleguen todos los paquetes que se
hayan enviado. Sin embargo, los paquetes que consiguen llegar, lo hacen mucho ms
rpidamente que con TCP y, en algunos casos, la velocidad de transmisin es mucho ms
importante que el que lleguen todos los paquetes; por ejemplo, si lo que se estn transmitiendo
son seales de sensores en tiempo real para la presentacin en pantalla, la velocidad es ms
importante que la integridad, porque si un paquete no llega o no puede recomponerse, en el
instante siguiente llegar otro.
La programacin para uso del protocolo UDP se diferencia de la programacin del protocolo
TCP en que no existe el concepto de ServerSocket para los datagramas y que es el programador
el que debe construirse los paquetes a enviar por UDP.
Para enviar datos a travs de UDP, hay que construir un objeto de tipo DatagramPacket y
enviarlo a travs de un objeto DatagramSocket, y al revs para recibirlos, es decir, a travs de
un objeto DatagramSocket se recoge el objeto DatagramPacket. Toda la informacin respecto
a direccin, puerto y datos est contenida en el paquete.
Para enviar un paquete, primero se construye ese paquete con la informacin que se desea
transmitir, luego se almacena en un objeto DatagramSocket y, finalmente se invoca el mtodo
send() sobre ese objeto. Para recibir un paquete, primero se construye un paquete vaco y luego
se le presenta a un objeto DatagramSocket para que almacene all el resultado de la ejecucin del
mtodo receiveO) sobre ese objeto.
Hay que tener en cuenta que la tarea encargada de todo esto estar bloqueada en el mtodo
receive() hasta que un paquete fsico de datos se reciba a travs de la red; este paquete fsico ser
el que se utilice para rellenar el paquete vaco que se haba creado.
Tambin hay que tener cuidado cuando se pone a escuchar a un objeto DatagramSocket en un
puerto determinado, porque va a recibir los datagramas enviados por cualquier cliente. Es decir,
que si los mensajes enviados por los clientes estn formados por mltiples paquetes; en la
recepcin pueden llegar paquetes entremezclados de varios clientes y es responsabilidad de la
aplicacin el ordenarlos.
Para la clase DatagramPacket se dispone de dos constructores. uno utilizado cuando se quieren
enviar paquetes y el otro se usa cuando se quieren recibir paquetes. Ambos requieren que se les
proporcione un array de bytes y la longitud que tiene. En el caso de la recepcin de datos, no es
necesario nada ms, los datos que se reciban se depositarn en el array; aunque en el caso de que
se reciban ms datos fsicos de los el exceso de informacin se perder y se lanzar una
excpcinde tipo IllegalArgumentExceptio, que a pesar de que no sea necesaria su captura,
siempre es bueno recogerla.
Cuando se construye el paquete a enviar, es necesario colocar los datos en el array antes de
llamar al mtodo send(); adems de eso, hay que incluir la longitud de ese array, y tambin se
debe proporcionar un objeto de tipo InetAddress indicando la direccin de destino del paquete y
el nmero del puerto de ese destino en el cual estar escuchando el receptor del mensaje. Es
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 92 -
decir, que la direccin de destino y el puerto de escucha deben ir en el paquete, al contrario de lo
que pasaba en el caso de TCP que se indicaba en el momento de construir el objeto Socket.
El tamao ftsico mximo de un datagrama es 65535 bytes, y teniendo en cuenta que hay que
incluir datos de cabecera, esa longitud nunca est disponible para datos de usuario, sino que
siempre es algo menor.
La clase DatagramPacket proporciona varios mtodos para poder extraer los datos que llegan
en el paquete recibido. La informacin que se obtiene con cada mtodo coincide con el propio
nombre del mtodo, aunque hay algunos casos en que es necesario saber interpretar la
informacin que proporciona ese mismo mtodo.
El mtodo getAddress() devuelve un objeto de tipo InetAddress que contiene la direccin del
host remoto. El saber cul es el computador de origen del envo depende de la forma en que se
haya obtenido el datagrama. Si ese datagrama ha sido recibido a travs de Internet, la direccin
representar al computador que ha enviado el datagrama (el origen del datagrama); pero si el
datagrama se ha construido localmente, la direccin representar al computador al cual se intenta
enviar el datagrama (el destino del datagrama).
De igual modo, el mtodo getPort() devuelve el puerto desde el cual ha sido enviado el
datagrama, o el puerto a travs del cual se enviar, dependiendo de la forma en que se haya
obtenido el datagrama.
El mtodo getData() devuelve un array de bytes que contiene la parte de datos del datagrama, ya
eliminada la cabecera con la informacin de encaminamiento de ese datagrama. La forma de
interpretar ese array depende del tipo de datos que contenga. Los ejemplos que se ven en este
Tutorial utilizan exclusivamente datos de tipo String, pero esto no es un requerimiento, y se
pueden utilizar datagramas para intercambiar cualquier tipo de datos, siempre que se puedan
colocar en un array de bytes en un computador y extraerlos de ese array en la parte contraria. Es
decir, que la responsabilidad del sistema se limita al desplazamiento del array de bytes de un
computador a otro. y es responsabilidad del programador el asignar significado a esos bytes.
El mtodo getLength() devuelve el nmero de bytes que contiene la parte de datos del
datagrama, y el mtodo getOffset() devuelve la posicin en la cual empieza el array de bytes
dentro del datagrama completo.
LA CLASE DATAGRAMSOCKET
Un objeto de la clase DatagramSocket puede utilizarse tanto para enviar como para recibir un
datagrama.
La clase tiene tres constructores. Uno de ellos se conecta al primer puerto libre de la mquina
local; el otro permite especificar el puerto a travs del cual operar el socket; y el tercero permite
especificar un puerto y una direccin para identificar a una mquina concreta.
Independientemente del constructor que se utilice, el puerto desde el cual se enva el datagrama
siempre se incluir en la cabecera del paquete. Normalmente, la parte del servidor utilizar el
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 93 -
constructor que permite indicar el puerto concreto a usar, ya que si no, la parte cliente no tendra
forma de conocer el puerto por el cual le van a llegar los datagramas.
La parte cliente puede utilizar cualquier constructor, pero por flexibilidad, lo mejor es utilizar el
constructor que deja que el sistema seleccione uno de los puertos disponibles. El servidor debera
entonces comprobar cul es el puerto que se est utilizando para el envo de datagramas y enviar
la respuesta por ese puerto.
A diferencia de esta posibilidad de especificar el puerto, o no hacerlo, no hay ninguna otra
distincin entre los sockets datagrama utilizados por cliente y servidor. Si el lector se encuentra
un poco perdido, no desespere, porque en los ejemplos todo esto que es muy difcil explicar con
palabras, se ve mucho ms claramente al intuir el funcionamiento fsico de la comunicacin entre
cliente y servidor.
Para enviar un datagrama hay que invocar al mtodo send() sobre un socket datagrama existente,
pasndole el objeto paquete como parmetro. Cuando el paquete es enviado, la direccin y
nmero de puerto del computador origen se coloca automticamente en la porcin de cabecera
del paquete, de forma que esa informacin pueda ser recuperada en el computador destino del
paquete.
Para recibir datagramas, hay que instanciar un objeto de tipo DatagramSocket, conectarse a un
puerto determinado e invocar al mtodo receive() sobre ese socket. Este mtodo bloquea la tarea
hasta que se recibe un datagrama, por lo que si es necesario hacer alguna cosa durante la espera,
hay que invocar al mtodo receive() en su propia tarea.
Si se trata de un servidor, hay que conectarse con un puerto especfico. Si se trata de un cliente
que est esperando respuestas de un servidor, hay que escuchar en el mismo puerto que fue
utilizado para enviar el datagrama inicial. Si se enva un datagrama a un puerto annimo, se
puede mantener el socket abierto que fue utilizado en el envo del primer datagrama y utilizar ese
mismo socket para esperar la respuesta.
Tamabien se puede invocar al mtodo getLocalPort()sobre el socket antes de cerrarlo de forma
que se pueda saber y guardar el nmero del puerto que se ha empleado; de este modo se puede
cerrar el socket original y abrir otro en el mismo puerto en el momento en que se necesite.
Para responder a un datagrama, hay que obtener la direccin del origen y el nmero de puerto a
travs del cual fue enviado el datagrama, de la cabecera del paquete y luego, colocar esta
informacin en el nuevo paquete que se construya con la informacin a enviar como respuesta.
Una vez pasada esta informacin a la parte de datos del paquete, se invoca al mtodo send()
sobre el objeto DatagramSocket existente, pasndole el objeto paquete como parmetro.
Es importante tener en en cuenta que los nmeros de puerto TCP y UDP no estn relacionados.
Se puede utilizar el mismo nmero de puerto en dos procesos si uno se comunica a travs de
protocolo TCP y el otro lo hace a travs de protocolo UDP. Es muy comn que los servidores
utilicen el mismo puerto para proporcionar servicios similares a travs de los dos protocolos en
algunos servicios estndar, como puede ser el eco.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 94 -
Cliente Eco
Esta aplicacin no es ms que una actualizacin del ejemplo javal7OS . java, al que se le incluye
adems el protocolo UDP. El ejemplo javalll2 . java realiza dos pruebas del servicio Echo contra
el mismo servidor, enviando una lnea de texto al puerto estndar de este servicio, el puerto 7. En
la primera prueba utiliza el protocolo TCP/IP y en la segunda emplea un datagrama UDP.
import java.net.*;
import java.io.*;
import java.util.*;
class java1712 {
public static void main( String[] args ) {
String servidor = "www.fie.us.es"; // servidor
int puerto = 7; // puerto eco
String cadTcp = "Prueba de Eco TCP";
String cadUdp = "Prueba de Eco UDP";
// Primero realizamos el test de Eco con TCP/IP
try {
// Abrimos un socket conectado al servidor y al
// puerto estndar de echo
Socket socket = new Socket( servidor,puerto );
// Conseguimos el canal de entrada
BufferedReader entrada = new BufferedReader(
new InputStreamReader( socket.getInputStream() ) );
// Conseguimos el canal de salida, con liberacin automtica
PrintWriter salida = new PrintWriter(
new OutputStreamWriter( socket.getOutputStream() ),true );
// Enva la lnea de texto del mensaje al servidor
salida.println( cadTcp );
// Y recoge la respuesta del servidor, presentndola en pantalla
System.out.println( entrada.readLine() );
// se cierra el socket TCP
socket.close();
// Ahora se realiza la prueba con datagramas sobre el mimso
// puerto del mismo servidor
// Convertimos el mensaje en un array de bytes
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 95 -
byte[] mensajeUdp = cadUdp.getBytes();
// Obtenemos la direccin IP del servdor
InetAddress dirIp = InetAddress.getByName( servidor );
// Creamos el paquete que se va a enviar al pueto
DatagramPacket paquete =
new DatagramPacket( mensajeUdp,mensajeUdp.length,dirIp,puerto );
// Abrimos un socket datagrama para enviarle el mensaje
DatagramSocket socketDgrama = new DatagramSocket();
// Y lo enviamos
socketDgrama.send( paquete );
// Sobreescrimos el mensaje en el paquete para confirmar que el
// eco es realmente lo que llega
byte[] arrayDatos = paquete.getData();
for( int cnt=0; cnt < paquete.getLength(); cnt++ )
arrayDatos[cnt] = (byte)'x';
// Escribimos esta versin del mensaje
System.out.println( new String( paquete.getData() ) );
// Ahora recibimos el eco en ese mismo paquete, de forma que
// sobreescriba las "x" que se haban colocado
socketDgrama.receive( paquete );
// Presentamos en pantalla el eco
System.out.println( new String( paquete.getData() ) );
// Se cierra el socket
socketDgrama.close();
} catch( UnknownHostException e ) {
e.printStackTrace();
System.out.println(
"Debes estar conectado para que esto funcione bien." );
} catch( SocketException e ) {
e.printStackTrace();
} catch( IOException e ) {
e.printStackTrace();
}
}
}
En el programa se instancian dos objetos de tipo String, para utilizr uno deferente en dada
protocolo. Luego est la parte correspondiete a la prueba de eco a travs de TCP, sobre la que no
se insiste ms. Una vez cerrado el socket TCP, comienza la prueba de eco a travs de UDP.
En primer lugar se convierte el mensaje que se ha de enviar por UDP a un array de bytes. Hay
que instanciar un objeto de tipo InetAddress que contenga la direccin del servidor con el que se
va a realizar la conexin y el envo del datagrama con el array de bytes recin creado.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 96 -
Se crea un objeto de tipo DatagramPacket que contenga el array de bytes de la cadena a enviar,
junto con la direccin del servidor y el puerto al que hay que conectarse. Se crea ahora un objeto
de tipo DatagramSocket que ser utilizado para enviar el paquete al servidor. Sin embargo, hay
que recordar que el protocolo UDP no garantiza que el paquete llegue ntegro al servidor, o que
tan siquiera llegue.
Solamente resta invocar al mtodo send() sobre el objeto DatagramSocket, pasnsole el objeto
DatagramPacket como parmetro. Esto hace que la direccin local y el nmero de puerto se
incorporen en el paquete y ste sea enviado a la direccin y nmero de puerto que se ha
encapsulado en el objeto DatagramPacket en el momento de su creacin.
Los mismos objetos DatagramSocket y DatagramPacket sern los utilizados para recibir el
paquete de respuesta del servidor (siempre que la suerte acomrae). Se usa un bucle para
sobreescribir los datos en el paquete con una letra para poder comprobar que una vez recibido el
paquete de respuesta del servidor de eco, los datos son nuevos y no simplemente el residuo del
mensaje que se haba colocado originalmente en el paquete.
Luego se invoca el mtodo receive() sobre el objeto DatagramSocket, pasnsole el objeto
DatagramPacket como parmetro. Esto hace que la tarea se bloquee en el mismo puerto por el
que se ha enviado el paquete, hasta que llegue una respuesta. En el momento en que un paquete
fsico llegue desde el servidor, se extraen los datos y se colocan en el objeto DatagramPacket que
se le ha proporcionado como parmetro. Una vez hecho esto, la tarea se desbloquea y el flujo de
control de la aplicacin sigue por la sentencia que muestra el contenido del paquete.
Finalmente, se cierra el socket y el programa termina.
Como el ejemplo es una simple actualizacin de otro de los ejemplos del Tutorial, gran parte del
cdigo ya est ms que visto; y es exactamente igual al del ejemplo javal7OS . java. As que
solamente se van a repasar a continuacin algunas de las lneas de cdigo ms interesantes de la
parte que se aporta nueva en este ejemplo, que corresponder, evidentemente, a la
implementacin del intercambio de mensajes con el servidor a travs del puerto del servicio Eco,
pero con protocolo UDP.
El primer fragmento en que hay que detenerse es justo en la declaracin del mtodo mamo, en
donde se declaran e inicializan algunas variables importantes.
public static void main( string[] args ) {
string servidor www.fie.us.es ; // servidor
int puerto = 7; // puerto eco
string cadlcp = prueba de Eco TCP;
string cadudp = prueba de Eco UDP;
Luego esta todo el cdigo referente al protocolo TCP, que en este caso no resulta interesante, y
ya se alcanza el punto del programa en el que se convierte el mensaje en un array de bytes, y se
instancia un objeto que identifique al servidor. Se utiliza el mtodo getBytes() de la clase String
para convertir el mensaje a un array de bytes.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 97 -
byte[] mensajeUdp =cadudp.getBytes();
// Obtenemos la direccin IP del servidor
InetAddress dirIp =InetAddress.getByName ( servidor );
La siguiente lnea de cdigo importante es la que instancia un objeto de tipo DatagramPacket
para llevar toda la informacin del mensaje y del servidor, como es el array de bytes creado
antes, su longitud, y la direccin y puerto del servidor.
DatagramPacket paquete =
new oatagramPacket( mensajeudp,mensajeudp.length,dirlp,puerto );
A continuacin, se instancia un objeto DatagramSocket annimo. Esto de annimo puede
resultar confuso al lector. El objeto es annimo porque el nmero de puerto no est especificado.
En algn sitio anteriormente se ha indicado que los objetos annimos son aquellos que no tienen
una variable de referencia asignada; que no es el caso que se produce aqu. Este objeto se usa
para enviar el datagrama al servidor invocando al mtodo send() sobre el objeto
DatagramSocket.
Datagramsocket socketDgrama = new DatagramSocket();
socketDgrama.send( paquete );
Las siguientes lneas de cdigo son las que sobreescriben los datos del mensaje con una letra,
para el propsito que se ha indicado antes de comprobar que el mensaje que se recibe no es en
realidad el resto del que se ha mandado. Este fragmento de cdigo tambin muestra al lector
cmo acceder a la parte de datos de un objeto DatagramPacket en caso de que lo necesite para
cualquier otro propsito.
byte[] arrayDatos = paquete.getoata()
for( int cnt=O; cnt < paquete.getLength(); cnt++ )
arrayDatos[cnt] = (byte) ;
A partir de este punto, se asume que habr una respuesta del servidor, as que se invoca el
mtodo receive() sobre el mismo objeto DatagramSocket que se ha utilizado para enviar el
mensaje original al servidor. Esto bloquea la tarea, quedando a la espera de respuesta. Aunque no
se ha indicado en ningn sitio, es posible utilizar el mtodo setTimeout() para indicar la cantidad
de tiempo que el mtodo receiveO estar a la espera y bloqueando, lo cual permite colocar una
proteccin al programa para que no se quede colgado esperando una respuesta que no llegue
jams.
socketDgrama.receive( paquete );
Y el resto del cdigo del ejemplo es la presentacin en pantalla del mensaje recibido del
servidor, que debe coincidir con el enviado, y el cdigo de manejo de excepciones.
Servidor UDP
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 98 -
En el ejemplo javal7l3.java se utiliza como base el ejemplo javal7O9.java, para actualizarlo y
hacer que soporte el protocolo UDP. Adems, esta aplicacin se completa con el ejemplo
javal7l4. java, que es un programa que permite comprobar su funcionamiento, constituyendo la
parte cliente del servidor que se implementa.
Como el programa es una actualizacin del ejemplo j aval7O9 . java, el lector deber tener en
cuenta las mismas advertencias que se realizaban al respecto de ese ejemplo, en lo que se refiere
al agente de seguridad, en caso de que decida utilizar el ejemplo para sus propios propsitos.
Aqu solamente se muestra como ilustracin de lo que se puede hacer, no para que se haga uso
de l para cualquier otro menester.
En el ejemplo se implementan tres servidores. Uno de ellos es un servidor Eco UDP
implementado a travs de una tarea que monitoriza un DatagramSocket sobre el puerto 7. Este
servidor devuelve el array de bytes que llegue en cada datagrama que reciba, enviando esos datos
de regreso al cliente que haya originado el mensaje.
El segundo servidor es un servidor Eco TCP implementado a travs de una tarea que monitoriza
un ServerSocket sobre el puerto 7. Este servidor tambin devuelve los datos que recibe al cliente
que haya realizado la conexin.
El tercer servidor es un servidor HTTP muy simple implementado a travs de una tarea TCP que
monitoriza el puerto 80. Este servidor solamente responde al comando GET que se enve desde
un navegador, devolviendo un archivo como un stream de bytes. La inclusin de estos tres tipos
de servidores es para mostrar al lector la forma en que se pueden utilizar las tareas para dar
servicio a mltiples puertos, haciendo adems una mezcla de protocolos TCP y UDP.
La parte del servidor HTTP se puede comprobar a travs de un navegador indicando local host
como nombre del servidor, y los otros servidores se pueden chequear mediante el ejemplo
javal7l4 . java, pensado especficamente para probar los servidores Eco instalados en la propia
mquina en que se ejecuten cliente y servidor.
El cdigo completo del ejemplo es el que se muestra a continuacin.
import java.net.*;
import java.io.*;
import java.util.*;
public class java1713 {
public static void main( String[] args ) {
// Se instancia el controlador de seguridad propio nuestro
System.setSecurityManager( new MiSecurityManager() );
// Se instancia un objeto servidor para escuchar el puerto 80
ServidorHttp servidorHttp = new ServidorHttp();
// Se instancia un objeto servidor para escuchar el puerto 7
ServidorEco servidorEcho = new ServidorEco();
// Se instancia un objeto servidor UDP para escuchar el puerto 7
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 99 -
ServidorEcoUdp servidorEchoUdp = new ServidorEcoUdp();
}
}
// Esta clase se utiliza para instanciar un controlador de seguridad que
// solamente permita descargar los ficheros que se encuentren en el
// directorio actual o en cualquier subdirectorio de ese directorio.
// Evidentemente, no instalar este servidor en una red, sin antes haber
// hecho cambios para que el control sea ms exhaustivo, porque aqu
// se ha dejado muy abierto, ya que solamente se pretende utilizar para
// pruebas
class MiSecurityManager extends SecurityManager {
// Este mtodo sobreescrito es el que controla que el servidor solamente
// permita descargar los ficheros del directorio actual y sus ramas,
// es decir, que no permite navegar hacia arriba en el rbol, ni
// permite la descarga de una direccin absoluta, pero tiene
// muchos agujeros de seguridad, as que no debe utilizarse a no ser
// que se complete adecuadamente, y adems se implemente la respuesta
// que se va a dar en los dems mtodos del controlador de Seguridad
public void checkRead( String str ) {
if( new File(str).isAbsolute() || (str.indexOf("..") != -1 ) )
throw new SecurityException( "\n"+str+": Acceso denegado.");
}
// Ahora se sobreescriben los dems mtodos, que es lo que hace que el
// tema de seguridad quede totalmente abierto.
public void checkAccept( String s,int i ){}
public void checkAccess( Thread t ){}
public void checkAccess( ThreadGroup g ){}
public void checkAwtEventQueueAccess(){}
public void checkConnect( String s,int i ){}
public void checkConnect( String s,int i,Object o ){}
public void checkCreateClassLoader(){}
public void checkDelete( String s ){}
public void checkExec( String s ){}
public void checkExit( int i ){}
public void checkLink( String s ){}
public void checkListen( int i ){}
public void checkMemberAccess( Class c,int i ){}
public void checkMulticast( InetAddress a ){}
public void checkPackageAccess( String s ){}
public void checkPackageDefinition( String s ){}
public void checkPrintJobAccess(){}
public void checkPropertiesAccess(){}
public void checkPropertyAccess( String s ){}
public void checkRead( FileDescriptor f ){}
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 100 -
// public void checkRead( String s ){} // Este es el nico sobreescrito
public void checkRead( String s,Object o ){}
public void checkSecurityAccess( String s ){}
public void checkSetFactory(){}
public void checkSystemClipboardAccess(){}
public boolean checkTopLevelWindow( Object o ) {
return true;
}
public void checkWrite( FileDescriptor f ){}
public void checkWrite( String s ){}
}
// Esta es la clase que se utiliza para instanciar un hilo de ejecucin
// para el servidor Udp que se encarga de escuchar el puerto 7, que es
// el definido como estndar para el protocolo de "echo"
class ServidorEcoUdp extends Thread {
// Constructor
ServidorEcoUdp() {
// Arrancamos el hilo e invocamos al mtodo run() para que empiece
// a correr
start();
}
public void run() {
try {
// Se instancia un objeto sobre el puerto 7
DatagramSocket socketDgrama = new DatagramSocket( 7 );
System.out.println( "Servidor Udp escuchando el 7" );
// Entramos en bucle infinito ecuchando el puerto. Cuando se
// produce una llamada, se lanza un hilo de ejecucin de
// ConexionEchoUdp para atenderla
while( true ) {
// Limitamos la cadena de eco a 1024 bytes
DatagramPacket paquete = new DatagramPacket( new byte[1024],1024 );
// Nos quedamos parados en el receive(), y devolvemos un socket
// cuando se recibe la llamada. Este socket es el que se pasa
// como parmetro al nuevo hilo de ejecucin que se crrea
socketDgrama.receive( paquete );
new ConexionEcoUdp( paquete );
}
} catch( IOException e ) {
e.printStackTrace();
}
}
}
// Esta clase se utiliza la lanzar un hilo de ejecucin que atienda
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 101 -
// la llamada recibida a travs del puerto 7, el puerto de eco
class ConexionEcoUdp extends Thread {
DatagramPacket paquete;
// Constructor
ConexionEcoUdp( DatagramPacket paquete ) {
System.out.println( "Recibida una llamada en el puerto 7" );
this.paquete = paquete;
// Trabajamos por debajo de la prioridad de los otros puertos
setPriority( NORM_PRIORITY-1 );
// Se arranca el hilo y se pone a correr
start();
}
public void run() {
System.out.println( "Lanzado el hilo UDP de atencion del puerto 7" );
// Se crea el paquete de eco basndonos en los datos del paquete
// que se ha recibido como parmetro
DatagramPacket paqueteEnvio = new DatagramPacket(
paquete.getData(),paquete.getLength(),
paquete.getAddress(),paquete.getPort() );
// Declaramos el socket datagrama
DatagramSocket socketDgrama = null;
try {
// Abrimos un socket datagrama
socketDgrama = new DatagramSocket();
// Se utiliza el nuevo socket datagrama para enviar el mensaje
// y cerrar el socket
socketDgrama.send( paqueteEnvio );
socketDgrama.close();
System.out.println("Socket UDP cerrado." );
}catch( UnknownHostException e ) {
socketDgrama.close();
System.out.println("Socket UDP cerrado." );
e.printStackTrace();
}catch( SocketException e ) {
socketDgrama.close();
System.out.println("Socket UDP cerrado." );
e.printStackTrace();
}catch( IOException e ) {
socketDgrama.close();
System.out.println("Socket UDP cerrado." );
e.printStackTrace();
}
}
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 102 -
}
// Esta es la clase que se utiliza para instanciar un hilo de ejecucin
// para el servidor que se encarga de escuchar el puerto 7, que es el
// definido como estndar para el protocolo de "echo"
class ServidorEco extends Thread {
// Constructor
ServidorEco() {
// Arrancamos el hilo e invocamos al mtodo run() para que empiece
// a correr
start();
}
public void run() {
try {
// Se instancia un objeto sobre el puerto 7
ServerSocket socket = new ServerSocket( 7 );
System.out.println( "Servidor escuchando el 7" );
// Entramos en bucle infinito ecuchando el puerto. Cuando se
// produce una llamada, se lanza un hilo de ejecucin de
// ConexionEcho para atenderla
while( true )
// Nos quedamos parados en el accept(), y devolvemos un socket
// cuando se recibe la llamada. Este socket es el que se pasa
// como parmetro al nuevo hilo de ejecucin que se crea
new ConexionEcho( socket.accept() );
} catch( IOException e ) {
e.printStackTrace();
}
}
}
// Esta clase se utiliza la lanzar un hilo de ejecucin que atienda
// la llamada recibida a travs del puerto 7, el puerto de eco
class ConexionEcho extends Thread {
Socket socket;
// Constructor
ConexionEcho( Socket socket ) {
System.out.println( "Recibida una llamada en el puerto 7" );
this.socket = socket;
// Trabajamos por debajo de la prioridad de los otros puertos
setPriority( NORM_PRIORITY-1 );
// Se arranca el hilo y se pone a correr
start();
}
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 103 -
public void run() {
System.out.println( "Lanzado el hilo de atencion del puerto 7" );
BufferedReader entrada = null;
PrintWriter salida = null;
try {
// Conseguimos un canal de entrada desde el socket
entrada = new BufferedReader( new InputStreamReader(
socket.getInputStream() ) );
// Conseguimos un canal de salida hacia el socket. El canal es
// con liberacin automtica (autoflush)
salida = new PrintWriter( new OutputStreamWriter(
socket.getOutputStream()),true );
// Recogemos la cadena que llegue al puerto y la devolvemos en
// el mismo instante
String cadena = entrada.readLine();
salida.println( cadena );
System.out.println( "Recibido: "+cadena );
socket.close();
System.out.println( "Socket cerrado" );
} catch( IOException e ) {
e.printStackTrace();
}
}
}
// Esta es la clase que se utiliza para instanciar un hilo de ejecucin
// para el servidor que se encarga de escuchar el puerto 80, que es el
// definido como estndar para el protocolo de "http"
class ServidorHttp extends Thread {
// Constructor
ServidorHttp() {
// Arrancamos el hilo e invocamos al mtodo run() para que empiece
// a correr
start();
}
public void run(){
try {
// Se instancia un objeto sobre el puerto 80
ServerSocket socket = new ServerSocket( 80 );
System.out.println( "Servidor escuchando el puerto 80" );
// Entramos en bucle infinito ecuchando el puerto. Cuando se
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 104 -
// produce una llamada, se lanza un hilo de ejecucin de
// ConexionHttp para atenderla
while( true )
// Nos quedamos parados en el accept(), y devolvemos un socket
// cuando se recibe la llamada. Este socket es el que se pasa
// como parmetro al nuevo hilo de ejecucin que se crea
new ConexionHttp( socket.accept() );
} catch( IOException e ) {
e.printStackTrace();
}
}
}
// Esta clase se utiliza la lanzar un hilo de ejecucin que atienda
// la llamada recibida a travs del puerto 80, el puerto de http
class ConexionHttp extends Thread {
Socket socket;
BufferedReader entrada = null;
PrintWriter salida = null;
DataOutputStream pagina = null;
// Constructor
ConexionHttp( Socket socket ) {
System.out.println( "Recibida una llamada en el puerto 80" );
this.socket = socket;
// Trabajamos por debajo de la prioridad de los otros puertos
setPriority( NORM_PRIORITY-1 );
// Se arranca el hilo y se pone a correr
start();
}
public void run() {
System.out.println( "Lanzado el hilo de atencion al puerto 80" );
try{
// Conseguimos un canal de entrada desde el socket
entrada = new BufferedReader( new InputStreamReader(
socket.getInputStream() ) );
// Conseguimos un canal de salida hacia el socket. El canal es
// con liberacin automtica (autoflush)
salida = new PrintWriter( new OutputStreamWriter(
socket.getOutputStream() ),true );
// Ahora conseguimos un canal de salida para enviar el contenido
// del ficero que haya solicitado el usuario
pagina = new DataOutputStream( socket.getOutputStream() );
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 105 -
// Recogemos la cadena que llegue al puerto
String peticion = entrada.readLine();
System.out.println( "Recibida peticion: "+peticion );
// Analizamos esa peticin e intentamos responder. Solamente se
// contesta a las peticiones GET, cualquier otra no tiene
// respuesta alguna
StringTokenizer st = new StringTokenizer( peticion );
if( ( st.countTokens() >= 2 )
&& st.nextToken().equals("GET") ) {
System.out.println( "Primer tag GET, correcto" );
if( (peticion = st.nextToken()).startsWith("/") ) {
System.out.println(
"Siguiente toque que empieza por /, se le quita" );
peticion = peticion.substring( 1 );
}
if( peticion.endsWith("/") || peticion.equals("") ) {
System.out.println( "Peticion terminada en / o blanco, "+
"se le incorpora: index.html" );
peticion = peticion + "index.html";
System.out.println( "Peticion modificada: "+peticion );
}
System.out.println( "Intento de desacarga de: "+peticion );
FileInputStream fichero = new FileInputStream( peticion );
// Se instancia un array de bytes igual al nmero de bytes que
// se pueden leer del canal de entrada sin bloquearlo.
// Y luego se rellena con los datos
byte[] datos = new byte[fichero.available()];
fichero.read( datos );
// Se enva el array de datos al cliente
pagina.write( datos );
pagina.flush();
} else
// La peticin que se ha hecho no es un GET
salida.println( "<HTML><BODY><P>400 Petici&oactute;n "+
"Err&oacute;nea<P></BODY></HTML>" );
socket.close();
System.out.println( "Socket cerrado" );
}catch( FileNotFoundException e ) {
salida.println(
"<HTML><BODY><P>404 No Encontrado<P></BODY></HTML>" );
try {
socket.close();
System.out.println( "Socket cerrado" );
}catch( IOException evt ) {
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 106 -
evt.printStackTrace();
}
}catch( SecurityException e ){
e.printStackTrace();
salida.println(
"<HTML><BODY><P>403 Acceso denegado<P></BODY></HTML>" );
salida.println( e );
try {
socket.close();
System.out.println( "Socket cerrado" );
}catch( IOException evt ) {
evt.printStackTrace();
}
}catch( IOException e ) {
e.printStackTrace();
try {
socket.close();
System.out.println( "Socket cerrado" );
}catch( IOException evt ) {
System.out.println(evt);
}
}
}
}
Ahora llega el turno a la revisin de las partes ms interesantes del ejemplo, que en este caso se
limitan a las lneas de cdigo que se han incorporado nuevas al ejemplo javal7O9. java, para
implementar el servidor Eco a travs de UDP. Cada uno de los servidores se implementa
mediante tareas, as que los tres servidores actan concurrente y asncronamente en diferentes
tareas. Adems, siempre que un objeto servidor necesite proporcionar un servicio a un cliente,
lanzar otra tarea a una prioridad ms baja, para dar servicio a ese cliente, siguiendo a la escucha
de otros posibles clientes que requieran su atencin.
Dejando a un lado la parte ya vista en el ejemplo base, el primer trozo de cdigo en que hay que
detenerse es la implementacin del servidor UDP.
ServidorEcoudp servidorEchoudp =new ServidorEcoudp();
Lo siguiente es el propio constructor de esa clase que se utiliza para instanciar el objeto que va a
proporcionar los servicios UDP de Eco a atravs del puerto 7. Este constructor, como se muestra,
se limita a invocar a su propio mtodo start() para levantarse y empezar a correr. El mtodo
start() invoca al mtodo run().
Servi dorEcoudp() {
startQ
}
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 107 -
La siguiente lnea de cdigo muesta la instanciacin del objeto DatagramSocket sobre el puerto
7, que se encuentra dentro de la accin del mtodo run, es decir, es el comienzo de la tarea.
Datagramsocket socketDgrama = new Datagramsocket ( 7 );
Solamente queda el corazn de la tarea, que est formado por el bucle infinito que instancia en
primer lugar un objeto DatagramPacket vaco, para invocar al mtodo receive() sobre el
DatagramSocket, pasndole el objeto DatagramPacket como parmetro.
Observe el lector que se ha limitado a 1024 byes los datos de entrada, por lo que no va a poder
recibir mensajes de longitud mayor que sa. Si es necesaria una longitud mayor, es suficiente
con indicar el valor al constructor.
while( true )
DatagramPacket paquete = new DatagramPacket( new byte[1024],1024 );
socketDgrama.receive( paquete );
new conexionEcoudp( paquete );
}
El mtodo receive() bloquea la tarea y se queda a la espera de que llegue un paquete datagrama.
Cuando esto suceda, se rellenar el objeto DatagramPacket vaco y se instanciar una nueva
tarea de tipo ConexionEcoUdp para atender la peticin del cliente, pasndole tambin como
parmetro el objeto DatagramPacket, pero en este caso relleno con los datos recibidos en el
paquete enviado por el cliente.
Una vez satisfecho el requerimiento del cliente, la tarea vuelve al inicio del bucle, instanciando
un nuevo objeto DatagramPacket vaco y bloqueando la tarea a la espera de la llegada del
siguiente paquete datagrama.
Ese objeto es guardado por el constructor para usarlo ms tarde, a continuacin fija la prioridad
por debajo del nivel de las tareas que estn monitorizando los puertos, de forma que la actividad
de la tarea correspondiente a ConexionEchoUdp no interfiera con otras tareas que puedan
lanzarse para atender a las peticiones recibidas por esos puertos. Y, por fin, se invoca el mtodo
startO, que a su vez invoca al mtodo run() y la tarea se pone en marcha. Todo esto es lo que se
hace en el cdigo que se muestra.
conexionEchoudp( DatagramPacket paquete ) {
System.out.pnintln( Recibida una llamada en el puerto 7 );
this.paquete = paquete;
// irabajamos por debajo de la prioridad de los otros puertos
setPriorlty( NORM_PRIORITY-1 );
// Se arranca el hilo y se pone a correr
start()
}
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 108 -
La misin encargada a esta tarea se limita al envo de una copia de los datos que le llegan en el
paquete recibido, de vuelta al cliente que se lo ha enviado. La direccin y puerto de este cliente
estn incluidos en el paquete, donde el DatagramSocket del cliente los coloc antes de enviarlo.
El objeto DatagramPacket es casi directamente enviable de vuelta al cliente, pero para mostrar
el uso de algunos de los mtodos de la clase DatagramPacket, se construye un nuevo objeto
para enviar de regreso al cliente, lo cual suele suceder ms a menudo en servidores que realicen
tareas ms complejas. El cdigo siguiente es el que permite extraer la informacin necesaria para
generar un nuevo objeto.
El ltimo cdigo en que merece la pena detenerse en este ejemplo es la instanciacin del nuevo
objeto DatagramSocket que se va a utilizar para enviar el nuevo objeto DatagramPacket creado,
invocando al mtodo send() del socket, de regreso al cliente. El resto del cdigo es el cierre del
socket y el tratamiento de las excepciones.
socketDgrama = new DatagramSocket();
// se utiliza el nuevo socket datagrama para enviar el mensaje
// y cerrar el socket
socketDgrama.send( paqueteEnvio );
socketDgrama.close ();
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 109 -
CAPITULO 3
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 110 -
Conclusiones:
Despus de conocer tanto el funcionamiento del PLC, como de los Sockets, hemos
dedicado tiempo a buscar la forma de tener comunicacin en modo freeport. Para lograr esto
hemos revisado varios ejemplos en los que se puede trabajar en modo freeport, tanto para
transmisin como para recepcin, logrando tener uno que nos permite transmitir y recibir en un
mismo programa, a travs de una rutina de interrupcin, y trabajando con los bytes de marcas:
SM0.1, SMB30; que son necesarios para configurar el puerto, y el SMB2, que contiene todos los
bits recibidos, y nos permite hacer una comparacin, entre lo que recibimos por el puerto y lo
que queremos que encuentre.
Las marcas especiales (SM) ofrecen una serie de funciones de estado y control. Sirven
para intercambiar informaciones entre la CPU y el programa, pudindose utilizar en formato de
bits, bytes, palabras o palabras dobles. SMB0: SMB0 contiene ocho bits de estado que la CPU
S7-200 actualiza al final de cada ciclo.
B Bi it ts s d de e
m ma ar rc ca as s
Descripcin
SM0.0 Este bit siempre est activado.
SM0.1 Este bit se activa en el primer ciclo. Se utiliza p.ej. para llamar una subrutina de
inicializacin.
SM0.2 Este bit se activa durante un ciclo si se pierden los datos remanentes. Se puede
utilizar como marca de error o como mecanismo para llamar a una secuencia especial
de arranque.
SM0.3 Este bit se activa durante un ciclo cuando se pasa a modo RUN tras conectarse la
alimentacin. Se puede utilizar durante el tiempo de calentamiento de la instalacin
antes del funcionamiento normal.
SM0.4 Este bit ofrece un reloj que est activado durante 30 segundos y desactivado durante
30 segundos, siendo el tiempo de ciclo de 1 minuto. Ofrece un retardo fcil de utilizar
o un tiempo de reloj de 1 minuto.
SM0.5 Este bit ofrece un reloj que est activado durante 0,5 segundos y desactivado durante
0,5 segundos, siendo el tiempo de ciclo de 1 segundo. Ofrece un reloj que est
activado durante 0,5 segundos y desactivado durante 0,5 segundos, siendo el tiempo
de ciclo de 1 minuto.
SM0.6 Este bit es un reloj de ciclo que est activado en un ciclo y desactivado en el ciclo
siguiente. Se puede utilizar como entrada de conteo de ciclos.
SM0.7 Este bit indica la posicin del selector de modos de operacin (OFF = TERM; ON =
RUN). Si el bit se utiliza para habilitar el modo Freeport cuando el selector est en
posicin RUN, se podr habilitar la comunicacin normal con la unidad de
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 111 -
programacin cambiando el selector a TERM.
SMB2: Es el bfer de recepcin de caracteres en modo Freeport. Cada carcter recibido en dicho
modo se deposita en este bfer, accesible fcilmente desde el programa KOP
B By yt te e d de e
m ma ar rc ca as s
D De es sc cr ri ip pc ci i n n
SMB2 Este byte contiene todos los caracteres recibidos de los interfaces 0 1
en modo Freeport
SMB30 Controla la comunicacin Freeport SMB30 son marcas de lectura y escritura. Dichos
bytes configuran la comunicacin Freeport en los respectivos interfaces y permiten seleccionar si
se debe asistir el modo Freeport o el protocolo de sistema.
I In nt te er rf fa ac ce e 0 0 Descripcin
Formato de SMB30 MSB LSB
7 0 Byte de control del modo Freeport
p p d b b b m m
SM30.6 y SM30.7 pp Seleccin de paridad
00 = sin paridad
01 = paridad par
10 = sin paridad
11= paridad impar
SM30.5 d Bits por carcter
0 = 8 bits por carcter
1 = 7 bits por carcter
SM30.2 a SM30.4 bbb Velocidad de transferencia
000 = 38.400 bits/s (para la CPU 212: = 9.200 bits/s)
001 = 19.200 bits/s
010 = 9.600 bits/s
011 = 4.800 bits/s
100 = 2.400 bits/s
101 = 1.200bits/s
110 = 600 bits/s
111 = 300 bits/s
SM30.0 y SM30.1 mm Seleccin de protocolo
00 = Protocolo de interface punto a punto PPI/modo esclavo)
01 = Protocolo Freeport
10 = PPI/modo maestro
11 = Reservado (estndar: PI/modo esclavo)
Realizamos un circuito de prueba que se muestra a continuacin:
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 112 -
MAIN (PROGRAMA PRINCIPAL)
NETWORK 1
Activa el modo freeport y define el rea de memoria a transmitir
Primer_ciclo corresponde a la marca SM0.1
Config_0 corresponde a la marca SMB30
Se transfiere el binario 1001 al byte de marcas
SMB30, que es el registro de control del
modo freeport, esta combinacin binaria
configura el puerto de comunicacin a
9600 bits, 8 bits por carcter y sin paridad
Transferir la constante 1 al byte VB100
de la memoria de variables para indicar
la longitud del mensaje
(de un carcter ASCII).
Transferir el valor hexadecimal 41 al byte VB101
de la memoria de variables para indicar que
el carcter ASCII es "A" (en el cdigo ASCII
A = "41" en la notacin hexadecimal).
NETWORK 2
Asociar y habilitar rutina de interrupcin para recibir
Cargar marca especial SM0.1
correspondiente a Pprimer_ciclo
para procesar este segmento slo en
el primer ciclo.
Asociar el evento de interrupcin 8
a la rutina de interrupcin INT_0
NETWORK 3
Transmitir
Cargar la entrada E0.1.
Si hay un flanco positivo
Config_0
Mov_B
EN ENO
IN OUT 9
Mov_B
EN ENO
IN OUT 1
Mov_B
EN ENO
IN OUT 16#41
VB100
VB101
Primer _ ciclo
INT_0
ATCH
8
( ENI )
EN ENO
IN
Primer _ ciclo
EVNT
E0.1
EN ENO
TBL VB100
PORT
P
XMT
0
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 113 -
en la entrada, transmitir por el
puerto 0 el bfer de datos
que comienza en el byte VB100
de la memoria de variables.
NETWORK 4
Fin del programa principal
RUTINA DE INTERRUPCIN
NETWORK 1
Comienza rutina de interrupcin
NETWORK 2
Confirmar carcter recibido
Caract_rec corresponde al byte de marcas SMB2.
Carcter_A corresponde a la salida Q0.1.
El byte de marcas SMB2 contiene cada carcter recibido del
puertos 0 durante la comunicacin Freeport. Compara el
carcter en SMB2 con el valor hexadecimal 41 ("A" en cdigo
ASCII = "41" en la notacin hexadecimal). Si el
carcter contenido en SMB2 es "A", se activa la salida Q0.1.
NETWORK 3
Fin de la rutina de interrupcin INT0
==B
Caract_rec
16#41
( S )
Carcter_A
1
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 114 -
Este circuito fue probado en el laboratorio, tomando como receptor el hyperterminal,
previamente configurado a 9600 bits/s 8 bits de datos y sin paridad (al transmitir por el PLC) , y
como transmisor (al recibir por el PLC).
De esta forma teniendo ya la comunicacin entre el PLC y la mquina, Se puede realizar
la programacin de la interfaz grfica, la cual puede ser diseada en diversos programas, como
Java, y despus intereactuar con los sockets antes vistos, para lograr una perfecta comunicacin
entre el software, y el PLC.
Pensamos que el programa deber tener una tabla mayor a la del ejercicio realizado, la cual
depender de la cantidad de puertas que se deseen monitorear.
Cuando una de las puerta se abra, se observara en la mquina como es que se abre la puerta, y
adems se indicara cual es la que se abri, esta misma puerta podr ser cerrada, va remota,
desde donde se realiza el monitoreo, al transmitir al PLC la indicacin de cierre de puerta, por
medio de teclado.
Durante la realizacin de este proyecto, nos enfrentamos a varios retos, debido a que las ideas
no eran muy claras en un principio, pero poco a poco fuimos dndonos cuenta de la importancia
de un sistema automatizado de control como lo es el PLC, algo que nos pareci sumamente
importante y eficiente.
Desafortunadamente, la ultima parte falta por concluirla, esperando que con la informacin
obtenida y los ejemplos propuestos, sean de gran utilidad para quien este interesado en continuar
con el proyecto.
Estamos seguros que habr muchas personas interesadas en l, Les deseamos toda la Suerte para
que en un futuro prximo logren terminar con un Proyecto Tan importante.
UNIVERSIDAD AUTNOMA METROPOLITANA IZTAPALAPA CASA ABIERTA
AL TIEMPO
- 115 -
De la misma forma esperamos que el material aportado sea de utilidad para el desarrollo de otros
Proyectos en la utilizacin de PLC.
BIBLIOGRAFA
Agustn Froufe. Java 2 Manual de usuario y tutorial, Alfaomega, 2 Edicin, 2002, cap, 17.
Autmatas Programables, ISA-UMH, TDOC 99
Simens, Simatic, Manual del Usuario Visualizador de textos TD 200K, 2000
www.iespana.es/automatizacion
www.plcs.net
www.olmo.pntic.mec.es/jmarti50/automatizacion
www.siemens.com.mx

También podría gustarte