Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Moreno Quintero Joel Mateo 2016
Moreno Quintero Joel Mateo 2016
Directora:
Diana Marcela Ovalle Martı́nez. PhD.
Lı́nea de Investigación:
Señales y Control
Grupo de Investigación:
IDEAS
Primero y antes que todo, agradecer a Dios que nos dio las fuerzas necesarias para afrontar
este gran reto, y darle culminación a cinco años de estudio en donde se presentaron dificul-
tades, pero también logros con alegrı́as.
A nuestros familiares que supieron entender y apoyar tantos esfuerzos, dándonos valor en
cada paso que dábamos en esta etapa de formación profesional.
A nuestros compañeros y amigos, quienes fueron soporte y compañı́a durante largas horas
de trabajo, y con los cuales compartimos tantas cosas y momentos especiales.
A nuestra Directora la Doctora Diana Marcela Ovalle, que nos brindo esta oportunidad de
trabajar a su lado, y que mas que nuestra directora se convirtió en una amiga de la cual
aprendimos muchas cosas durante estos últimos dos años.
Por ultimo a la Universidad Distrital, lugar que nos formó, no solo como profesionales si no
como personas, y en donde conocimos docentes y compañeros excepcionales.
A todos gracias.
Resumen
Otra de las ventajas ofrecidas por el desarrollo de esta estación remota, es que se elimina
la limitante dada por los elementos de medición, los cuales el estudiante no siempre tiene a
su disposición, o simplemente no son suficientes debido a sus limitantes técnicas las cuales
no le permiten mediciones en grandes intervalos de tiempo o no admiten la extracción de la
información para su posterior análisis.
Resumen IX
Introducción 1
Objetivos 3
Justificación 4
3. Arquitectura de Comunicación 44
3.1. Comunicación Planta – Acondicionamiento de Señal – Microcontrolador . . . 45
3.2. Comunicación Microcontrolador-Computador Servidor Local . . . . . . . . . 45
3.2.1. Protocolo de Comunicación Serial Ası́ncrono - Microcontrolador y Ser-
vidor Local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
3.3. Protocolos de Comunicación de Internet, Websockets y PubNub . . . . . . . 47
3.3.1. PubNub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3.4. Comunicación Computador Local – Internet – Servidor web . . . . . . . . . 50
3.5. Comunicación Computador cliente – Servidor Aplicación web - Base de datos
mySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5. Resultados 66
5.1. Resultados Planta de Velocidad . . . . . . . . . . . . . . . . . . . . . . . . . 66
5.1.1. Resultados Prueba Respuesta al Escalón . . . . . . . . . . . . . . . . 66
5.1.2. Resultados Prueba Respuesta en Frecuencia . . . . . . . . . . . . . . 70
5.1.3. Resultados Prueba Controlador ON-OFF . . . . . . . . . . . . . . . . 71
5.1.4. Resultados Prueba Controlador Digital . . . . . . . . . . . . . . . . . 72
5.2. Resultados Planta de Temperatura . . . . . . . . . . . . . . . . . . . . . . . 74
5.2.1. Resultados Prueba Respuesta al Escalón . . . . . . . . . . . . . . . . 74
5.2.2. Resultados Prueba Controlador ON-OFF . . . . . . . . . . . . . . . . 76
5.2.3. Resultados Prueba Controlador Digital . . . . . . . . . . . . . . . . . 77
5.3. Análisis de Resultados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
5.3.1. Análisis de Resultados Planta de Velocidad . . . . . . . . . . . . . . . 79
5.3.2. Análisis de Resultados Planta de Temperatura . . . . . . . . . . . . . 80
Otra de las causas que motivaron a realizar éste trabajo, fue darle continuidad al proyecto [1],
en donde se desarrollaron y se implementaron los prototipos de plantas básicas de control, las
cuales fueron: la planta de temperatura, y la planta de velocidad. ya que con la culminación
de ese proyecto, se presentó una gran oportunidad para convertir estos prototipos en parte
fundamental de la implementación de la estación remota propuesta en éste trabajo.
La metodologı́a que se propone para dar solución al problema, se basa en dar cumplir con
cada uno de los objetivos especı́ficos, los cuales se efectúan en cada una de las partes que
conforman el desarrollo del proyecto, que se encuentran a continuación:
Este proyecto esta dividido en cinco grandes partes, las cuales son la identificación de los sis-
temas, la etapa de adquisición y procesamiento de datos con su respectivo acondicionamiento
de señal, la arquitectura general de conexión de las etapas para su integración con internet,
el desarrollo de la interface gráfica para la manipulación de la planta de forma remota, y por
ultimo la obtención y muestra de resultados hechos en la estación remota para su posterior
análisis.
2 INTRODUCCIÓN
Por ultimo se presentan los resultados obtenidos para las pruebas realizadas con las plantas
de forma presencial y con la estación remota. Estos resultados se analizan y se comparan
entre si, para ambas plantas y para cada una de las pruebas que puedan realizarse en la
estación remota, con el fin de validar su correcto funcionamiento.
Objetivos
Objetivo General
Diseñar e implementar una estación de accesibilidad remota, para la enseñanza de conceptos
de control, con el fin de reducir los tiempos empleados en la experimentación, facilitar el
acceso y disposición de estas plantas a la comunidad académica.
Objetivos Especı́ficos
Verificar y garantizar el funcionamiento de las plantas a utilizar, para realizar la iden-
tificación de los sistemas dinámicos con los cuales se va a trabajar.
Diseñar y desarrollar la interfaz gráfica usuario que le permita interactuar con la es-
tación remota de manera que se pueda recibir y enviar datos, y también gestionar el
acceso a las plantas.
Obtener, comparar y analizar los resultados adquiridos de las diferentes pruebas que
se puedan realizar en la estación remota y en las plantas de manera presencial.
Por otro lado, la comunidad académica relacionada con el área de control, tienen que realizar
grandes esfuerzos para la construcción de prototipos que les permitan realizar experimentos
en esta área, desperdiciando gran parte de su tiempo en la implementación y no en la obser-
vación de comportamientos propios del sistema. A estos problemas mostrados anteriormente
se suma el hecho de que al realizar este tipo de prácticas de manera tradicional, es necesario
apartar un lugar de laboratorio, trasladarse a ese lugar, preparar el equipo para realizar las
pruebas, conectar el prototipo de forma correcta, extraer los datos y analizarlos posterior-
mente. Parte de este tiempo podrı́a ser utilizado en labores académicas y no en transportes
o montajes de circuitos.
Es por estas razones presentadas anteriormente que surge la necesidad de preguntarse: ¿exis-
te actualmente un sistema de acceso remoto para plantas básicas utilizadas en la enseñanza
de conceptos de control en ingenierı́a para realizar experimentos? Si Existe ¿es de fácil acceso
para la comunidad académica o personas afines al área?, ¿reducirı́a el tiempo empleado en
la realización de prácticas de control utilizando este tipo de sistema remoto?, ¿tendrı́a este
sistema, un impacto positivo en la metodologı́a de la enseñanza?.
Las plantas utilizadas para el desarrollo de este trabajo fueron desarrolladas anteriormente
en el proyecto de investigación DISEÑO E IMPLEMENTACION DE PLANTAS BASICAS
PARA LA ENSEÑANZA DE CONCEPTOS DE CONTROL EN INGENIERIA [1] el cual
fue financiado por el Centro de Investigaciones de la Universidad Distrital (CIDC), en el
mismo grupo de investigación de este proyecto: Investigación, Desarrollo y Aplicaciones en
Señales (IDEAS), e implementado por las mismas personas que desarrollan este trabajo. En
total se construyeron dos sistemas térmicos y dos sistemas de velocidad, de los cuales solo
se utilizó un prototipo de cada uno de los sistemas. Para la realización del presente proyecto
se seleccionó un prototipo de cada una de las plantas, para la planta de temperatura se
seleccionó el prototipo N◦ 2 y para la planta de velocidad el prototipo N◦ 1.
Las plantas cuentan con sus respectivas estructuras fı́sicas, circuitos impresos, fuentes de
alimentación, conexiones exteriores, y elementos de visualización e interacción para su uso
práctico, las plantas a utilizar se muestran en la Figura 1-1.
La planta tiene una fuente de alimentación sencilla de 12 V a 4,2 amperios que suministra
la energı́a suficiente para alimentar el circuito de la planta y el bombillo.
1 Funcionamiento de los sistemas dinámicos, identificación y
6 caracterización de las Plantas
Como la potencia suministrada al bombillo debe ser lineal con respecto a la entrada, se
empleó un circuito seguidor de potencia como se muestra en la Figura 1-2, el cual utiliza
un amplificador operacional y un transistor de potencia junto con un transistor común que
cumplieran la función de driver de corriente en configuración Darlington.
Para la entrada del ventilador se utiliza un arreglo de resistencias que atenúa la señal de
voltaje de entrada, este voltaje debe estar en el rango admitido por el ADC del microcontro-
lador de la planta, el cual es un MSP430G2553 [4], este voltaje es transformado en una señal
pwm proporcional a la señal de entrada, con el cual se controla la velocidad del ventilador.
Este motor funciona en un rango entre -10 V a 10 V con cambio en sentido de giro dependien-
do de la polaridad de la señal de entrada, con la posibilidad de cambio de variable de salida
ya sea posición o velocidad. La salida se encuentra en un rango de voltajes entre -10 V a 10 V.
La planta cuenta con dos fuentes que permiten una polarización dual del circuito interno,
estas son necesarias para permitir voltajes de entrada y salida tanto positivos como negati-
vos, las dos fuentes son de 12 V a 3 A y se conectan en serie para la polarización del circuito.
Además, el circuito cuenta con reguladores de 5 V y 3 V para la polarización del encoder
del motor y de los microcontroladores.
En la etapa de salida se pueden tener 2 señales distintas, ya sea velocidad o posición. Para
la lectura de la posición o velocidad del motor se utiliza un encoder, la señal enviada por el
encoder tiene una resolución de 1024 datos en un giro, si se toman ambos canales y flancos
de subida y bajada de dicha señal. Posteriormente La señal del encoder es procesada lógi-
camente por un microcontrolador, y transformada en una señal analógica por medio de un
1.3 Identificación y caracterización de las Plantas 9
Si la salida del sistema es posición, el microcontrolador contara cada uno de los pasos del
encoder para definir la posición del motor, debido a que el encoder no tiene un punto de
referencia para definir la posición inicial, el sistema cuenta con un sensor, el cual cada vez
que pasa por un punto determinado (0 grados) reinicia la posición y obtiene un punto de
referencia para su medición.
Debido a que el DAC entrega valores de voltaje entre 0 v y 5 v, se utiliza una etapa de
acondicionamiento de señal que transforma dicho rango de voltajes a uno entre -10 v y 10
v. Posterior al acondicionamiento mencionado anteriormente, se encuentra un circuito de
protección el cual esta conformado por un seguidor de potencia en configuración push pull
que entrega el voltaje de salida a través de un circuito serie conformado por un contacto
normalmente cerrado de un relevo y la bobina de baja impedancia del mismo relevo. En caso
de un corto circuito en la salida, la corriente se incrementa y el relevo se activa, aislando la
señal de salida del exterior. Para retornar el sistema a su estado inicial se debe desenclavar
el relevo.
Con los conceptos anteriores claros y definidos podemos proceder a realizar la caracterización
para hallar un modelo matemático que represente a estos sistemas dinámicos.
Disponibilidad de un laboratorio dotado con los equipos necesarios para realizar las
pruebas correspondientes.
Equipos de laboratorio en buen estado, dado que esto ayuda a la reducir el margen de
error en los resultados y de esta manera lograr un modelo mucho más aproximado a lo
ideal.
1 Funcionamiento de los sistemas dinámicos, identificación y
10 caracterización de las Plantas
Realizar el número necesario de pruebas que sean pertinentes para lograr ası́ conseguir
un mejor modelo.
Los resultados finales de las pruebas son los mostrados en la Tabla 1-1. La Figura 1-6 y
Figura 1-7 muestran los datos linealizados para la caracterización de una señal con respuesta
al escalón de 5.8 V y 7 V respectivamente.
Para hallar los parámetros que conforman la función de transferencia, los cuales son, τ
constante de tiempo de la planta y k la ganancia de planta; se deben realizar las pruebas
correspondientes en el laboratorio a la planta de velocidad. Estas pruebas constan de apli-
car una señal de tipo escalón en la entrada de la planta, para luego observar y analizar la
respuesta en el tiempo generada en la salida de la planta.
A los datos obtenidos en dichas pruebas se les realiza una linealización logarı́tmica, con
el propósito de encontrar los valores de k y τ . Para éste propósito se realiza el siguiente
procedimiento:
y(∞)
k= . (1-7)
a
t y(t)
− = LN 1− . (1-8)
τ a·k
De esta manera con los datos obtenidos en laboratorio como y(t) y k se transforma
las respuesta en el tiempo en un recta con pendiente − τ1 , que corresponde al polo del
sistema de primer orden.
Los resultados finales de las pruebas son los mostrados en la Tabla 1-2. La Figura 1-8 y
Figura 1-9 muestran los datos linealizados para la caracterización de una señal con respuesta
al escalón de 9 V y -10 V respectivamente.
0,61949 18,1047
G(s) = 0,034217s+1
, y su equivalente es G(s) = s+29,2249
.
Como se observa en la Figura 2-1 la estructura de adquisición y envió de datos esta dividida
en 3 partes, el acondicionamiento de la señal de entrada, el acondicionamiento de la señal
de salida, y el sistema embebido.
Limitaciones:
La placa Intel galileo no se utilizó para la implementación debido a las razones que presen-
taremos a continuación:
La tarjeta de desarrollo está más orientada a ser un pequeño computador con manejo
de sistema operativo Linux, que un microcontrolador para su implementación en más
bajo nivel. La simulación de un entorno de desarrollo arduino no ofrece las mismas
prestaciones reales de un arduino, ya que no permite utilizar algunas de sus librerı́as,
y no es posible su programación a más bajo nivel con registros que controlen los
periféricos. Para ello es necesario utilizar comandos en consola como los utilizados en
sistemas operativos Linux.
Como el programa que se querı́a ejecutar en la Intel galileo se corre bajo un sistema
operativo Linux liviano, el tiempo de espera para que el programa se ejecutará de-
moraba aproximadamente 40 segundos, mientras el sistema operativo se iniciaba, esto
causaba un impacto negativo en la ejecución del programa.
Freescale FDRMK64F
Posteriormente se utilizó en el microcontrolador de Freescale el FDRMK64F [10], microcon-
trolador con el cual se realizó la implementación definitiva, uno de las principales razones
por las cuales se utilizo es por su integración con señales analógicas, ya que cuenta con un
pin DAC y un puerto con pines que pueden configurarse como conversores ADC.
Otra de las ventajas ofrecidas por las cuales fue seleccionado este sistema embebido es el
modulo Ethernet que permite que el microcontrolador pueda conectarse a una red local o a
18 2 Adquisición de datos y Acondicionamiento de señal
La ventaja del IDE es su facilidad para programar pines, módulos de interrupciones o subru-
tinas de tiempo especı́ficas, de manera que no existe la necesidad de acceder directamente
a los registros de configuración del microcontrolador, Al igual que los comandos utilizados
por un ARDUINO. Otra de las ventajas de este IDE es el soporte que ofrece en lı́nea, y
la gran cantidad librerı́as y foros de ayuda dentro de una comunidad soportada por ARM.
mbed hace un especial énfasis en integraciones a través de internet o comúnmente llamado
IoT (Internet of things).
Consideraciones de implementación
En la Tabla: 2-1 se muestra las posibles pruebas a las cuales puede acceder el usuario
dependiendo de la planta. Los códigos de todos los programas implementados en el micro-
controlador se encuentran en la sección 6.
20 2 Adquisición de datos y Acondicionamiento de señal
Programa principal
El bloque de programa principal se ejecuta luego de la configuración inicial del microcontro-
lador. Éste programa se ejecuta en un bucle a la espera de la elección de una de las pruebas
ya preestablecidas. Para la selección de alguna de las pruebas el programa recibe un char
enviado a través del puerto serial, y según la letra correspondiente al char se realizará la
respectiva prueba.
del escalón de forma serial, dicho dato se coloca en la salida digital del microcontrolador de
forma permanente, ya que éste es un escalón y su valor de salida no varı́a.
Por último se envı́a un string concatenado con los siguientes valores separados por
comas: Tiempo de la muestra, Referencia del Escalón, señal con la respuesta al escalón
de la planta, identificador.
22 2 Adquisición de datos y Acondicionamiento de señal
las muestras de la señal seno en el intervalo correcto para que cumplan con la frecuencia
requerida.
número identificador, que tiene como objetivo determinar que numero de muestra pertenece
cada dato enviado.
Cuando la subrutina ingresa por última vez y ya ha llenado las 300 posiciones de los 3 vecto-
res, el programa a través de un ciclo “for” envı́a un string cada 100 ms que es la concatenación
de los valores de cada uno de los vectores, y lo hace de la siguiente manera y separado por
comas (” %f, %f, %f, %d”); donde el primer %f es un float que contiene el tiempo de la mues-
tra desde el inicio la prueba, el siguiente %f es un float que contiene la señal enviada por el
microcontrolador, en este caso la señal seno enviada desde una tabla, el tercer %f contiene la
señal muestreada de la salida de la planta, es decir la respuesta de la planta, y por último se
concatena el %d, el cual es el número identificador que tiene como objetivo determinar que
número de muestra pertenece cada dato enviado.
La subrutina del controlador on-off se ejecuta luego de recibir un char ‘c’ en el menú principal,
al ejecutarse se reciben 2 parámetros que se encuentran dentro del string para la configuración
del controlador on-off, el primero de esos parámetros es la señal de referencia del controlador,
el segundo parámetro es la histéresis. La histéresis es la ventana de voltaje en la cual oscila
la salida de la planta, con valor medio en la referencia como se muestra en la Figura 2-4.
2.1 Adquisición y Envió de datos 25
El tiempo de muestreo para la planta de Temperatura para hacer el control on-off en esta
prueba es de 2 s, y el tiempo de muestreo para la planta de velocidad es de 0.3 ms, los rangos
de parámetros configurables para este controlador se muestran en la Tabla 2-4.
Para la planta de temperatura al igual que en los anteriores casos, los datos de entrada y
salida de la planta son tomados y enviados cada vez que el programa entra en la subrutina de
interrupción, estos datos son concatenados junto con la variable de tiempo y el identificador
de la muestra.
Esta subrutina se ejecuta cada 0.3 ms, la lógica de ejecución se muestra en la Figura 2-6, a
diferencia de la planta de temperatura la lógica del programa se extiende ya que los valores
de referencia pueden ser tanto positivos como negativos.
2.1 Adquisición y Envió de datos 27
Para la planta de velocidad al igual que en las pruebas anteriores, se acumulan los datos en
vectores de voltaje de entrada, voltaje de salida, tiempo, y el identificador, para luego ser
direccionados y enviados de manera concatenada en un string mediante un ciclo “for”.
muestreo utilizado para la subrutina de interrupción, debido a que se requieren tomar más
muestras para la visualización de la señal, el tiempo de muestreo base para la planta de
velocidad es de 1 ms y el tiempo de muestreo base para la planta de temperatura es de 5 s,
los tiempos de muestreo configurables por el usuario deben ser múltiplos enteros del tiempo
de muestreo base.
b0 Z 0 + b1 Z −1 + b2 Z −2 + b3 Z −3
C(z) = . (2-2)
a0 Z 0 + a1 Z −1 + a2 Z −2 + a3 Z −3
Primero se lee la señal proveniente de la planta por puerto adc del microcontrolador
y luego almacena su valor en un vector de 300 posiciones y decrementa el contador
asociado al submuestreo.
2.2 Acondicionamiento de señal 29
Si no se han completado los vectores que guardan las variables de tiempo e identifi-
cador, se obtiene las variables de tiempo e identificador en la muestra actual, y son
almacenados en sus correspondientes vectores, al igual que la señal de referencia.
Si el contador asociado al submuestreo coincide con el múltiplo de tiempo de muestreo
base, se ejecuta la acción de control digital correspondiente con la implementación de
la ecuación de diferencias.
Si el programa ha entrado a la subrutina 300 veces y por lo tanto se han llenado todos
los vectores, el programa procede a enviar todos los datos de cada una de las mues-
tras almacenadas en los vectores mediante un ciclo “for”, en este ciclo se direccionan
cada una de las muestras, se concatenan y se envı́an cada 100 ms. las variables son:
Identificador, tiempo de muestreo, señal de entrada y señal de salida.
Dado que se adquirieron unas fuentes de 12 V y 3 A, las cuales fueron conectadas en serie
de tal forma que proporcionaran una alimentación de tensión de ±13 V. Se debe aclarar que
los OP-AMP que se utilizan en esta etapa son los de referencia lM358 [11].
En la Figura 2-7 se muestra la relación salida módulo DAC vs entrada planta de velocidad.
Lo que nos muestra la Figura 2-7 se interpreta ası́: para una tensión de salida de módulo
DAC del sistema embebido de 0 V, en la entrada de la planta de velocidad se presenta un
voltaje de -12 V, ası́ mismo, para una tensión de salida del módulo DAC de 3.3 V, en la
entrada de la planta de velocidad se presenta un voltaje de 12 V.
Para resolver la ecuación de la recta pendiente genera por la relación de voltajes del bloque
de acondicionamiento, se utilizan los conceptos y procedimientos proporcionados en [12] [13].
El circuito necesario para resolver la ecuación generada por la recta pendiente, es el amplifi-
cador multientrada universal o mejor conocido como sumador - restador que se muestra en
la Figura 2-9.
Como se trata de un amplificador operacional con una entrada inversora y una entrada no
inversora, donde la entrada inversora no es dependiente de ninguna variable, por cual se in-
terpreta con un nivel de voltaje fijo en esta entrada. La condición que hay que cumplir según
[12] es A+ = A− + 1, donde A+ , es la suma de todos los pesos en la entrada no inversora
del amplificador operacional, y A− , es la suma de todos los pesos en la entrada inversora del
amplificador operacional. En la Figura 2-10 se muestra como debe ser el circuito acondicio-
nador con amplificador operacional.
Para calcular los valores de las resistencias del circuito se realiza el siguiente procedimiento:
Las posibles resistencias comerciales que cumplen con Rf = 7,2727R1 , son: Rf = 12KΩ, y
R1 = 3,3KΩ||3,3KΩ = 1,65KΩ.
Debido a que en la entrada inversora se necesita una tensión fija de 12 V, estos se obtendrán
utilizando la fuente de alimentación positiva VCC del amplificador operacional, es decir:
12V
12V = A · 13V → A = 13V
→ A = 0,923,
El circuito final se muestra en la Figura 2-11, el cual cumple con el balanceo de pesos y la
ecuación Vo = 7,2727Vi − 12.
Lo que nos muestra la Figura 2-13 se interpreta ası́: para una tensión de salida de la planta
de velocidad de -10 V, en la salida de acondicionamiento 1 se presenta un voltaje de 0 V,
ası́ mismo, para una tensión de salida de la planta de velocidad de 10 V, en la salida de
acondicionamiento 1 se presenta un voltaje de 10 V.
Figura 2-13: Relación Voltaje de salida planta de velocidad vs voltaje de salida acondicio-
namiento 1.
Las posibles resistencias comerciales que cumplen con RF = 0,5R1 , son RF = 10KΩ, y
R1 = 20KΩ.
Debido a que en una de las entradas no inversoras se necesita de una tensión fija de 10
V, estos se obtendrán utilizando la fuente de alimentación positiva VCC , del amplificador
operacional, es decir:
5v
5v = A · 13v → A = 13v
→ A = 0,3846.
El circuito final se muestra en la Figura 2-14, el cual cumple con el balanceo de pesos y la
ecuación Vo = 0,5V0−A1 + 5.
2.2 Acondicionamiento de señal 35
Los criterios para el diseño del filtro pasa bajo activo fueron los siguientes:
Por último, se diseña el tercer sub-bloque de la Figura 2-12, el cual debe cumplir con un
rango de voltaje en la salida de 0 V a 3.3 V. Lo primero que hay que analizar son los voltajes
VOH , y VOL , de los amplificadores operacionales. En las pruebas realizadas en laboratorio,
los 10v de entrada del primer sub-bloque de acondicionamiento, genera en la salida 11.5 V,
y los -10 V de entrada generan 1.5 V en la salida. El filtro activo no altera de ninguna forma
36 2 Adquisición de datos y Acondicionamiento de señal
con esta relación encontrada debido a que se diseñó con una ganancia de 0dB, por lo que en
la salida del filtro se encuentra exactamente el rango de voltaje de 1.5 V a 11.5 V, entonces
la tarea de este último sub-bloque es reducir este rango de voltaje a uno que se encuentre
entre 0 V a 3.3 V.
Lo primero que se observa es que el VOL , del amplificador operacional está en 1.5 V, entonces
lo que se propone para que este lı́mite inferior sea aproximadamente de 0 V, es colocar en
serie el número suficiente de diodos de silicio (los cuales teóricamente tienen un voltaje de
polarización directa de 0.7 V) para reducir el nivel de voltaje de 1.5 V a un valor cercano a
0 V. El número de diodos seleccionados es 3. La referencia del diodo es 1N4001.
En la Figura 2-18 se muestra la relación salida módulo DAC vs entrada planta de tempera-
tura.
Lo que muestra la Figura 2-18 se interpreta ası́: para una tensión de salida de módulo DAC
del sistema embebido de 0 V, en la entrada de la planta de temperatura se presenta un vol-
taje de 0 V, ası́ mismo, para una tensión de salida del módulo DAC de 3.3 V, en la entrada
de la planta de velocidad se presenta un voltaje de 12 V.
Las posibles resistencias comerciales que se aproximan para cumplir con RF = 2,6364R1 ,
son R1 = 6,8KΩ, y RF = 18KΩ.
El circuito final se muestra en la Figura 2-20, el cual cumple con el balanceo de pesos y la
ecuación Vo = 3, 6364Vi .
En este punto hay que aclarar que desde el sistema embebido salen dos señales, una salida
analógica, la cual proporciona el módulo DAC que se dirige al amplificador no inversor, en
donde su salida tiene como función alimentar al bombillo de la planta de temperatura. Por
otro lado, se encuentra una salida digital, la cual activa un transistor configurado en modo
de corte y saturación que al ser alimentado por VCC , su salida es aproximadamente de 12 V
(1 V se pierde en el colector-emisor del transistor).
Lo primero que se realiza según la Figura 2-22, es el filtro activo pasa bajo. Para efectos
prácticos se utiliza el software FilterPro para diseñar el filtro pasa bajo activo. Los criterios
para el diseño del filtro pasa bajo activo fueron los siguientes:
Figura 2-23: Filtro pasa bajo activo, bloque de acondicionamiento planta de Ttemperatura.
Por último, se diseña el segundo sub-bloque de la Figura 2-22, el cual debe tener un rango
de voltaje en la salida de 0 V a 3.3 V. Lo primero que se analiza son los voltajes VOH , y VOL ,
del amplificador operacional utilizado en el filtro activo. Lo que hay que tener en cuenta, es
que en simulación los 12 V de entrada al primer sub-bloque de acondicionamiento, genera en
su salida los 11.5 V, por lo que el rango de voltaje es de 0 V a 11.5 V, entonces la tarea de es-
te último sub-bloque es reducir este rango de voltaje a uno que se encuentre entre 0 V a 3.3 V.
0,713
0,287R2 + 0,287R1 = R2 → R1 = R
0,287 2
→ R1 = 2,48R2
Los posibles valores comerciales para las resistencias son: R1 = 82KΩ y R2 = 33KΩ.
Figura 2-25: Circuito total del bloque de acondicionamiento de entrada y salida de las
plantas de Velocidad Y Temperatura.
En la Figura 2-26 se muestra la PCB (placa de circuito impreso), que se diseñó con cada uno
de los componentes que se usaron en los circuitos de acondicionamiento, el diseño se realizó
de tal manera que se ocupara el menor espacio posible y ası́ quedara con las dimensiones
apropiadas para su implementación fı́sica. En la Figura 2-27 se muestra el circuito en formato
3D.
42 2 Adquisición de datos y Acondicionamiento de señal
Figura 2-26: Circuito PCB del bloque de acondicionamiento de entrada y salida de las
plantas de Velocidad Y Temperatura.
2.2 Acondicionamiento de señal 43
La idea de esta estructura mas compacta fue descartada ya que se encontró una limitación
de conexión dentro de la Universidad Distrital , lugar donde se desarrolla el proyecto de
investigación y se implementa el laboratorio Remoto.
local, el servidor web alojado en internet y el computador del usuario final desde donde se
configuran las pruebas.
Por un lado la planta de temperatura envı́a y recibe señales de voltaje en rangos entre –10
V y 10 V. La planta de velocidad envı́a señales de voltaje entre 0v y 10v. Por otro lado el
microcontrolador tiene rangos de voltaje de entada y salida entre 0v a 3.3v para el módulo
ADC y DAC. Como los rangos de las señales de salida y entrada a las plantas son distintos a
los de el microcontrolador, estas señales deben ser acondicionadas a través de amplificadores
operacionales configurados para cumplir con los respectivos rangos de funcionamiento. La
conexión entre estos elementos se muestra en la Figura 2-1, se explica con mas profundidad
en el Capitulo 2 Adquisición de datos y Acondicionamiento de Señal.
El servidor local es el elemento que envı́a los datos de programación de pruebas al micro-
controlador, que son configurados por el usuario desde el computador cliente, estos datos
pueden contener información de la prueba a realizar, o los parámetros de la prueba escogida,
la cuales pueden ser: amplitudes, frecuencias, tasas de muestreo, ventanas de histeresis o
coeficientes de un controlador.
microcontrolador envı́a y recibe los datos del servidor local, dependiendo de la planta o las
pruebas a realizar.
Otro de las ideas, fue establecer una conexión que proporcionará el menor cambio posible en
la respuesta de la planta debido a su conexión remota, Es decir que el tiempo de envió de
datos no afectara de manera alguna a la constante de tiempo de los sistemas. Por esta razón
el trabajo se orientó a entender de qué manera se enviaban los datos a través de internet y
cuál era su tiempo aproximado de duración.
Como se indica en [15] [16] la capa de transporte del modelo TCP/IP, el envı́o de paquetes
de información en internet, utiliza principalmente 2 tipos de protocolos, el protocolo TCP
que es orientado a la conexión y el UDP que es no orientado a la conexión. En el protocolo
TCP debido a que es orientado a la conexión, se garantiza que el paquete de datos llega a
su destino, esto significa que antes del envió de los datos se establece una conexión entre
transmisor y receptor de información, de manera que si hay perdida en el envió de paquetes,
existirá una confirmación de fallo y se procederá a el reenvió de la datos perdidos.
El protocolo UDP permite el envı́o de datagramas a través de la red sin que exista una co-
nexión previamente establecida, ya que el propio paquete o datagrama contiene información
suficiente para su direccionamiento. En el protocolo UDP no hay confirmación, ni control de
flujo, por lo cual, los paquetes pueden llegar antes o después de otros, tampoco se conoce si
han llegado correctamente, debido a que no hay confirmación de entrega o recepción.
En la Figura 3-3 se muestra como en una petición polling el usuario debe hacer una solicitud
cada vez que necesita actualizar los datos en su navegador y estos no son actualizados en
tiempo real de acuerdo a su llegada al servidor web principal, en comparación, los Websoc-
kets solo realizan una petición inicial para establecer una conexión con el servidor principal,
3.3 Protocolos de Comunicación de Internet, Websockets y PubNub 49
al establecer esta conexión, el canal queda abierto y el envió de datos no requiere una pe-
tición, de esta manera la actualización de los datos en el navegador se realizan en tiempo real.
3.3.1. PubNub
En el sentido contrario del flujo de datos, el usuario al ingresar los parámetros de configu-
ración de las pruebas de la planta en la página web, envı́a estos parámetros a través de la
llave de publicación de un canal Z. El programa en Python del computador local recibe esta
información con la llave de suscripción del canal z, para luego enviarla de manera serial al
microcontrolador.
Este proceso de comunicación se basa en dos ventanas disponibles en la pagina de inicio, una
de registro y otra de ingreso. Esta pagina principal se encuentra contenida en el servidor de
la aplicación web, en donde también se encuentran dos plantillas php, una para realizar la
consulta de usuarios registrados, y la otra para realizar ingresos de datos de nuevos usua-
rios. Estas plantillas contienen sentencias SQL que permitan hacer conexión la base de datos
mySQL, la cual es una herramienta proporcionada por el servidor web.
Para el ingreso a una sesión de la planta de velocidad o temperatura, el usuario ingresa los
datos de autenticación en el formulario, si la consulta resulta valida para la prueba especifi-
cada, se permitirá el ingreso a la estación remota, de lo contrario se rechazara la petición.
Capı́tulo 4
Interface Gráfica de Usuario
Cabe aclarar que existe una variedad de software y plataformas de desarrollo web, tales como
.NET de Microsoft donde se utilizarı́a C# como lenguaje de programación para realizar la
aplicación web, también se encuentra NETBEANS de código abierto, en donde se utilizarı́a
como lenguaje de programación JAVA.
Lenguajes de
Programación Ventajas Desventajas
Para la Web
Sencillo que permite describir hiper-
Lenguaje estático.
texto.
La interpretación de cada navegador
Texto presentado de forma estructura-
puede ser diferente (aunque en los últi-
da y agradable.
mos años se ha estado mejorando).
No necesita de grandes conocimien-
Guarda muchas etiquetas que pueden
to cuando se cuenta con un editor de
HTML páginas web.
convertirse en basura y dificultan la co-
rrección.
Archivos pequeños.
El diseño es más lento.
Despliegue rápido.
Las Etiquetas son muy limitas (aunque
Lenguaje de fácil aprendizaje. hoy en dı́a con la versión HTML5 ya
ha dejado de ser una desventaja).
Lo admiten todos los exploradores.
Los script tienen capacidades limita- Código visible por cualquier usurario.
JavaScript das, por razones de seguridad. El código debe descargarse completa-
El código JavaScript se ejecuta en el mente.
cliente.
Mayor velocidad.
Mayor seguridad.
Multiplataforma.
Orientado a objetos.
Portable.
4.2 Desarrollo de la pagina web 55
Para este proyecto se adquirió un servicio gratuito de servidor web y dominio web en el sitio
000webhost.com, en donde se ofrecen los servicios anteriormente mencionados, y también
servicios de phpmyadmin junto con MySQL, los cuales son importantes para el registro de
datos de nuevos usuarios, e inicio de sesión de usuarios ya registrados en la base de datos.
El nombre de dominio que se le dio a la página web fue estacionremota.net76.net. Se debe
comentar que el dominio o identificador .net76.net es debido a que es un servicio gratuito y
era uno de los pocos dominios que estaban disponibles en éste sitio web.
Para el desarrollo de la página web se hizo necesario utilizar el lenguaje de marcas de hiper-
texto en su quinta revisión llamado HTML5, aunque en el mundo del diseño y desarrollo web
también es conocido como el lenguaje de etiquetas. La estructura mı́nima que debe llevar un
documento HTML5 se muestra en Figura 4-1. En la construcción del código para realizar la
plantilla web principal o de inicio.
Las plantillas web para la planta de temperatura y velocidad, fueron realizadas con códigos
elaborados en HTML5, CSS y JavaScritp [23], además se encontró una librerı́a de widgest
de código abierto llamada WEBIX, la cual fue de gran ayuda en cuanto a la estructura que
debı́a tomar la apariencia visual de estas plantillas, ya que dispone de muchas etiquetas
predefinidas, la ventaja principal es que su código es fácil de entender y existen una gran
variedad de herramientas y ejemplos disponibles en [24].
56 4 Interface Gráfica de Usuario
En las plantillas diseñas para la conexión con la base de datos, se usó el lenguaje de código
abierto PHP, ya que este permite realizar conexiones a diferentes tipos de servidores de bases
de datos SQL, para nuestro caso MySQL [25] [26]. Además es un código de fácil entendimien-
to y no requiere de un conocimiento extenso en éste tipo de código para realizar conexiones
a bases de datos.
Lo anterior significa, que dentro del archivo .PHP se encuentran una diversidad de lenguajes
como JavaScript, HTML y CSS, que se relacionan entre sı́ para dar forma interna y externa
a la página web.
Básicamente la página web está compuesta por cinco plantillas web, las cuales cumplen
con las funciones principales de la página. Estas plantillas se encuentran en la sección de
ANEXOS y a continuación de hace una breve descripción de cada una de ellas:
de velocidad, donde puede efectuar cuatro diferentes pruebas dentro del tiempo de
sesión que le corresponda. Se encuentra la prueba de Respuesta al Escalón, Respuesta
en Frecuencia, Control ON-OFF y Control Digital. La descripción de cada uno de las
partes de esta plantilla como menús y gráficos para cada prueba se encuentra disponible
en la siguiente sección. Debido a la velocidad de respuesta en el tiempo de la planta de
velocidad los datos que se reciben en la plantilla no son en tiempo real, lo que sucede
es que los datos son almacenados en una tabla en el microcontrolador y éste luego de
haber obtenido cierta cantidad de datos los envia por la web.
Para la obtención de la información de forma tabular, se incluye una tabla que muestra en
cuatro columnas el número de datos recibidos, el tiempo de la muestra en segundos, el voltaje
de la señal de entrada, y el voltaje de la señal de salida. Ésta tabla puede ser exportada como
archivo Excel (.xlsx), por medio de un botón disponible en la página, gracias a esto el usuario
podrá disponer de la información para luego realizar un análisis más detallado de la prueba
que esté realizando. En la Figura 4-3 se muestra como se dispone la tabla.
mente la información se envı́a pulsando el botón ”Enviar”, que junto a una función asociada
en la plantilla, realiza la conexión con el servidor PUBNUB. En la Figura 4-4 se muestra a
grandes rasgos los menús disponibles.
está el selector de tensión offset que dispone de una variación de 2 V a 5 V con pasos de 0.1
V. Por ultimo está el selector de Frecuencia, con una variación de 0.2 mHz a 90 mHz con
pasos de 0.1 mHz, esta es la frecuencia con la que saldrá la señal seno. Al igual que en la
prueba anterior, se dispone de un botón de ”Enviar”. En la Figura 4-6 se observa el menú
de Respuesta en Frecuencia.
para ingresar los coeficientes del controlador, estas cajas solo permiten caracteres numéricos,
si se ingresa otro carácter la caja tomara un color rojo indicando que no es permitido el uso
de ese carácter. Se dispone también de un botón de ”Enviar”.En la Figura 4-8 se observa
el menú de prueba de Control Digital.
Por ultimo se encuentra la Activación de Ventilador, que dispone de un botón para activar
el ventilador cuando se haya terminado alguna de las pruebas y se requiera realizar una nueva.
Control Digital: voltaje de referencia entre un rango de -10 V a 10 V con pasos de 0.1
V. Tiempo de muestreo entre un rango de 1 ms a 10 ms con pasos de 1 ms.
Cuadro de texto para ingreso de Código: en este campo solo es posible ingresar carac-
teres de tipo numérico, si ingresa un carácter diferente al dar clic en el botón Inicio,
saldrá un mensaje alertando el error.
Cuadro de texto para ingreso de Clave: en este campo es posible ingresar cualquier tipo
de carácter, como recomendación se le aconseja al usuario que al momento de hacer el
registro sea cauteloso con la clave y la guarde de manera segura.
4.3 Funcionalidades principales de la página web 63
Menú desplegable para selección de Planta: este menú dispone de las opciones de planta
de Temperatura y Velocidad.
Botón de Inicio: este botón cumple con la función de direccionar hacia la plantilla web
de temperatura o velocidad dependiendo de los datos ingresados en los cuadros de
texto y el menú desplegable. Si existe un error mostrará un mensaje dependiendo del
motivo, también se mostrará mensaje si el usuario está ingresando en un horario que
no le corresponde o si aún no está registrado.
Botón de Registrarse: este botón cumple con la función de cambiar de ventana para que
los usuarios nuevos puedan realizar su correspondiente registro de sesión de laboratorio.
Se encuentra en la parte inferior de la ventana de inicio de sesión.
Cuadro de texto para ingreso de Código: en este campo solo es posible ingresar carac-
teres de tipo numérico, si ingresa un carácter diferente al dar clic en el botón Inicio,
saldrá un mensaje alertando del error.
Cuadro de texto para ingreso de Clave: en este campo es posible ingresar cualquier tipo
de carácter, como recomendación se le aconseja al usuario que al momento de hacer
el registro sea cauteloso con la clave y la guarde de manera segura. La restricción se
encuentra en que la clave debe tener un número mı́nimo de cinco caracteres y como
máximo diez.
64 4 Interface Gráfica de Usuario
Cuadro de texto para Confirmar Clave: tiene las mismas caracteristicas del anterior
cuadro de texto, se usa para realizar la segura confirmación de la clave a guardar.
Menú Calendario para seleccionar Fechas: éste menú tiene la opción de mostrar la fecha
actual y poder seleccionar la fecha en que se quiera realizar el registro de la sesión de
laboratorio. Es un menú sencillo y muy fácil de usar.
Menú Selector Numérico para seleccionar Hora: éste menú tiene la opción de seleccionar
la hora la cual el usuario desea registrar su sesión de laboratorio, en la selección de la
hora solo se pueden escoger horas pares (2, 4, 6, etc.), lo que significa que solo están
disponibles tanto para la planta de temperatura como para la de velocidad sesiones
de dos horas, pero se debe aclarar que un mismo usuario puede disponer de hasta un
número máximo de tres sesiones, por lo que si el usuario realiza un registro de tres
sesiones seguidas dispondrá de seis horas en total sesión. Si el usuario intenta realizar
un número mayor de tres sesiones, al dar clic en el botón de Registrarse, la ventana
mostrará un mensaje indicando que no está permitido.
Menú desplegable para selección de Planta: este menú dispone de las opciones de planta
de Temperatura y Velocidad.
Botón de Registrarse: este botón cumple con la función realizar el correspondiente
registro de la información ingresada por el nuevo usuario. En el caso que existe un
error en alguno de los campos de registro, se presentarán mensajes de alerta indicando
el error. Si no se encuentra ningún error se mostrará un mensaje indicando que el
registro se realizó con éxito y se direccionará la página hacia la ventana de inicio de
sesión.
Botón de Inicio Sesión: este botón cumple con la función de cambiar de ventana para
que los usuarios ya registrados puedan realizar su correspondiente inicio de sesión de
laboratorio. Se encuentra en la parte inferior de la ventana de inicio de sesión.
Ya habiendo realizado una descripción de los elementos que componen la plantilla de Re-
gistro e Inicio de Sesión, se debe aclarar que se hizo uso de un sistema de gestión de bases
de datos llamado MySQL, esto con el propósito de guardar la información de los usuarios
registrados y realizar la gestión apropiada en el acceso a las plantas.
Esta sección se divide en tres partes, una donde se muestran los resultados de la respuesta al
escalón de la planta de velocidad de forma presencial, la siguiente se muestran los resultados
de la estación remota y por ultimo se comparan los resultados obtenidos de estas dos formas.
5.1 Resultados Planta de Velocidad 67
Resultados Presenciales
Debido a que las pruebas realizadas para caracterizar el sistema de forma directa se hicieron
en base a la respuesta al escalón, los resultados de dicha prueba se encuentran en la 1.3.2
Caracterización de la planta de velocidad del Capitulo 1 Funcionamiento de los sistemas
dinámicos e identificación de las Plantas.
Los resultados obtenidos son los que se muestran en la Tabla 5-1, y en las Figuras 5-1 y
5-2.
Comparación
En la Tabla 5-2 y Figuras 5-3, 5-4, 5-5 se muestran los resultados obtenidos en la prueba
de respuesta a escalón de la planta de velocidad tanto en la estación remota como en la
planta directa, se comparan los parámetros de constante de tiempo y ganancia del sistema
y se coloca un porcentaje de error entre los resultados.
.
5.1 Resultados Planta de Velocidad 69
Figura 5-5: Comparación respuesta al escalón de -10 V estación remota vs planta presencial.
70 5 Resultados
Para esta prueba se realizó un barrido de frecuencias donde se pudó construir un diagrama
de bode aproximado, tanto para la planta presencial como para la remota. En las Tablas
5-3 y 5-4 se muestran los datos de magnitud y fase obtenidos en los resultados dados por
la respuesta en frecuencia de la planta de forma remota y presencia. En la Figura 5-6 se
muestra el diagrama de bode de las respuestas en frecuencia generadas por la planta de
velocidad de forma presencial y remota.
Figura 5-6: Diagrama de Bode de magnitud para la planta de velocidad de forma presencial
y remota.
Para la prueba de controlador ON-OFF al igual que en las anteriores se obtuvieron resulta-
dos de manera presencial y remota, para posteriormente realizar también su correspondiente
comparación. Los parámetros de medición de la prueba son la señal de referencia e histéresis.
En la Tabla 5-5 se muestra los resultados obtenidos en la prueba de control ON-OFF para la
planta de velocidad tanto de manera presencial y remota. Se obtuvo el valor de la histérisis
obtenida para ambas maneras, y se calculó el error con base en la referencia establecida en
los controladores diseñados la cual es de 400 mV de histérisis.
En la Figura 5-7 se muestran las señales respuesta y referencia que se obtuvieron en las
pruebas de forma presencial y remota en la planta de velocidad con el controlador ON-OFF,
en la Tabla 5-6 se muestran los datos de tiempo de levantamiento obtenido para ambos casos
y con voltajes de referencia de 5 V y 7 V.
72 5 Resultados
(a) Respuesta control ON-OFF remota. (b) Respuesta control ON-OFF presencial.
Para el diseño del controlador digital bajo los anteriores criterios anunciados se hizo necesa-
rio seguir el procedimiento de diseño encontrado en el Capitulo 8 Digital Controller Design
del libro [21].
2,11618 − 1,5093z −1
C(z) = (5-1)
1 − z −1
Se implementó el controlador PI digital para voltajes de referencia de 5 V y 7 V.
5.1 Resultados Planta de Velocidad 73
Los resultados obtenidos son los que se muestran en la Tabla 5-8 y en las Figuras 5-10,
5-11, 5-12.
Comparación
En la Tabla 5-9 y Figura 5-13 se muestran los resultados obtenidos en la prueba de respuesta
a escalón de la planta de temperatura tanto en la estación remota como en la planta directa,
se comparan los parámetros de constante de tiempo y ganancia del sistema y se coloca un
porcentaje de error entre los resultados.
Para la prueba de controlador ON-OFF al igual que en las anteriores se obtuvieron resulta-
dos de manera presencial y remota, para posteriormente realizar también su correspondiente
comparación. Los parámetros de medición de la prueba son la señal de referencia e histéresis.
.
5.2 Resultados Planta de Temperatura 77
Para el diseño del controlador digital bajo los anteriores criterios anunciados se hizo necesa-
rio seguir el procedimiento de diseño encontrado en el Capitulo 8 Digital Controller Design
del libro [21].
2,3032 − 1,8408z −1
C(z) = (5-2)
1 − z −1
Para la parámetro de k o ganancia del sistema, se obtuvó un promedio de 0,626 para las
pruebas de respuesta al escalón entre -10 V a 10 V de forma remota, en cuanto a la forma
presencial se obtuvó un promedio de 0,61949, lo que nos muestra un error de 1,05 % en
cuanto a la similitud de éste parámetro para las dos formas de prueba.
Luego de observar los margenes de error obtenidos en los parámetros de constante de tiempo
y ganancia del sistema, se establece que al realizar las pruebas de forma remota (en la esta-
ción remota) no se tendrán diferencias considerables respecto a las pruebas que se puedan
80 5 Resultados
Para la prueba del controlador digital, en donde se establecieron previamente unos criterios
de diseño para un controlador PI que fijaban parámetros como el tiempo de establecimiento,
error de estado estacionario y sobrepaso máximo. En cuanto a los resultados obtenidos en
tiempo de establecimiento, fueron muy cercanos al criterio establecido de ts = 0,1153s tanto
la estación remota como para la planta presencial, en donde se obtuvieron tiempos entre
los 0,112s y 0,123s para el caso remoto, y entre 0,1092s y 0,1545s para el caso presencial.
Por otro lado, el criterio de diseño de sobrepaso máximo no se cumplió debido a que los
resultados obtenidos tanto en la estación remota como la planta presencial estuvieron ale-
jados al valor establecido, pero cercanos entre sı́; esto puede deberse al efecto producto del
cero introducido por el controlador PI digital. En cuanto al parámetro de error de estado
estacionario no fué necesario establecer una comparación debido a que el controlador PI ga-
rantiza para todos los casos un error igual a cero, y esto se evidencia en la Figuras 5-8 y 5-9.
vas, ya que el resultado promedio entre la estación remota y la planta presencial estuvieron
entre 0,0031 y 0,0036. Por otro lado, para las pruebas realizadas de forma remota se obtu-
vieron ganancias entre 0,7776 y 0,7581, y para las de forma presencial entre 0,68103448 y
0,68181818, esta diferencia entre las ganancias puede ser ocasionado a que las pruebas rea-
lizadas de forma remota cubrieron un mayor tiempo de prueba que las realizadas de forma
presencial, ya que el dispositivo de medición para esta prueba presencial no alcanzó a tomar
valores en donde el sistema se establecı́a, como si lo puedo hacer la estación remota.
En la prueba de controlador ON-OFF no se realizó una comparación bajo los mismos valores
de configuración de parámetros como voltaje de referencia y ventana de histéresis. En las
pruebas realizadas de forma presencial se configuró una ventana de histéresis de 200 mV
con señales de referencia de 5 V y 7 V, en donde la histéresis obtenida en la practica fué
de 200 mV y 160 mV respectivamente. En la prueba realizada de forma remota se configuró
una ventana de histéresis de 500 mV con señal de referencia de 7.5 V, donde la histéresis
obtenida fué de 540 mV resultando ası́ un margen de error del 8 %. Debido a que no se
realizaron pruebas del controlador bajo una misma referencia en el caso presencial y remota
no se puede establecer una comparación del parámetro de tiempo de levantamiento.
Para la prueba del controlador digital, para la cual se establecieron previamente unos cri-
terios de diseño para un controlador PI digital que fijaban parámetros como el tiempo de
establecimiento, error de estado estacionario y sobrepaso máximo. En cuanto a los resultados
obtenidos en tiempo de establecimiento, fueron aceptables con respecto al criterio estableci-
do de ts = 888,88s tanto la estación remota como para la planta presencial, ya que fueron
tiempos inferiores a éste. Los tiempos de establecimiento para voltajes de referencia de 6 v
y 7 V fueron 830s y 711s para el caso remoto, y de 805s y 721s para el caso presencial. Por
otro lado, el criterio de diseño de sobrepaso máximo se cumplió debido a que los resultados
obtenidos tanto en la estación remota como la planta presencial estuvieron por debajo del
valor establecido en el criterio de diseño, para la estación remota con voltajes de referencia
de 6 V y 7 V los sobrepasos máximos fueron de 1,73 % y 1,6 % respectivamente, y para el
caso de la planta presencial fueron de 2,7 % y 0,5 %. En cuanto al parámetro de error de
estado estacionario no fué necesario establecer una comparación debido a que el controlador
PI garantiza para todos los casos un error igual a cero, y esto se evidencia en la Figuras 5-16
y 5-17.
Capı́tulo 6
Conclusiones, Recomendaciones y Trabajos
Futuros
Aunque el proyecto de la estación remota es cien por ciento funcional, éste puede ser mejo-
rado en su arquitectura eliminando el computador que tiene como función crear un puente
entre el microcontrolador y la red de internet, de manera en que el microcontrolador se co-
necte de forma directa a internet, esto es posible si el proyecto es implementado en lugares
donde el acceso a red de internet sea forma directa y no a través de servidores proxy.
amplié el numero y tipos de sistemas dinámicos que se puedan manejar de forma remota,
tales como sistemas de péndulo invertido, lumı́nicos, hidráulicos, etc.
Anexos
T i c k e r tiempo ;
Ticker muestreo ;
Ticker onoff ;
Ticker c d i g i t a l ;
S e r i a l pc (USBTX, USBRX ) ;
AnalogIn adc ( A0 ) ;
AnalogOut dac (DAC0 OUT ) ;
D i g i t a l O u t v e n t i l a d o r ( PTB20 ) ;
const f l o a t j = 1 2 8 ;
f l o a t s e n o [ ( i n t ) j ]=
{0.5 ,0.525 ,0.549 ,0.574 ,0.598 ,0.622 ,0.646 ,0.67 ,0.693 ,0.715 ,0.737 ,0.759 ,0.78 ,
0.8 ,0.819 ,0.838 ,0.856 ,0.873 ,0.889 ,0.904 ,0.918 ,0.931 ,0.943 ,0.954 ,0.964 ,
0.972 ,0.98 ,0.986 ,0.991 ,0.995 ,0.998 ,1 ,1 ,0.999 ,0.997 ,0.994 ,0.989 ,0.983 ,0.976 ,
0.968 ,0.959 ,0.949 ,0.937 ,0.925 ,0.911 ,0.896 ,0.881 ,0.864 ,0.847 ,0.829 ,0.81 ,
0.79 ,0.769 ,0.748 ,0.726 ,0.704 ,0.681 ,0.658 ,0.634 ,0.61 ,0.586 ,0.562 ,0.537 ,
0.512 ,0.488 ,0.463 ,0.438 ,0.414 ,0.39 ,0.366 ,0.342 ,0.319 ,0.296 ,0.274 ,0.252 ,
0.231 ,0.21 ,0.19 ,0.171 ,0.153 ,0.136 ,0.119 ,0.104 ,0.089 ,0.075 ,0.063 ,0.051 ,
0.041 ,0.032 ,0.024 ,0.017 ,0.011 ,0.006 ,0.003 ,0.001 ,0 ,0 ,0.002 ,0.005 ,0.009 ,
0.014 ,0.02 ,0.028 ,0.036 ,0.046 ,0.057 ,0.069 ,0.082 ,0.096 ,0.111 ,0.127 ,0.144 ,
0.162 ,0.181 ,0.2 ,0.22 ,0.241 ,0.263 ,0.285 ,0.307 ,0.33 ,0.354 ,0.378 ,0.402 ,0.426 ,
0.451 ,0.475 ,0.5};
f l o a t e n t r a d a , s a l i d a s e n o , d a t o d a c , f r e c u e n c i a , tempor ,
amplitudpp , o f f s e t , h i s t e r e s i s , r e f e r e n c i a , V e s c a l o n ;
i n t v a r o n o f f , c o n t a d o r , Tmuestreo , c o n t a d o r d e s c e , i d e n t i f i c a d o r ;
i n t i =0;
char v a r i n i c i a l ;
void r e c i b i r A D C ( ) { e n t r a d a = ( adc . r e a d ( ) ∗ 1 2 . 1 7 2 f ) ; }
void m u e s t r e o e s c a l o n ( ) {
tiempoT=tiempoT +5;
i d e n t i f i c a d o r=i d e n t i f i c a d o r +1;
recibirADC ( ) ;
pc . p r i n t f ( ” %f , %f , %f , %d” , tiempoT , Vescalon , entrada , i d e n t i f i c a d o r ) ; }
void c o n o n o f f ( ) {
recibirADC ( ) ;
i f ( r e f e r e n c i a >0){
i f ( v a r o n o f f ==1){
i f ( e n t r a d a <( r e f e r e n c i a +( h i s t e r e s i s / 2 ) ) ) {
v a r o n o f f =1;
enviarDAC ( 1 2 ) ; }
else {
v a r o n o f f =0;
enviarDAC ( 0 ) ;
}}
e l s e { i f ( e n t r a d a >( r e f e r e n c i a −( h i s t e r e s i s / 2 ) ) ) {
v a r o n o f f =0;
enviarDAC ( 0 ) ;
}
e l s e { v a r o n o f f =1;
enviarDAC ( 1 2 ) ;
}}}
else {
enviarDAC ( 0 ) ;
}
tiempoT=tiempoT +2.0 f ;
i d e n t i f i c a d o r=i d e n t i f i c a d o r +1;
pc . p r i n t f ( ” %f , %f , %f , %d” , tiempoT , r e f e r e n c i a , e n t r a d a , i d e n t i f i c a d o r ) ;
}
void c o n d i g i t a l ( ) {
c o n t a d o r d e s c e=c o n t a d o r d e s c e −1;
recibirADC ( ) ;
i f ( c o n t a d o r d e s c e ==0){
c o n t a d o r d e s c e=Tmuestreo ; }
i f ( c o n t a d o r d e s c e==Tmuestreo ) {
E[ 0 ] = r e f e r e n c i a −e n t r a d a ;
C [ 0 ] = ( ( ( E [ 0 ] ∗ N[ 0 ] ) + ( E [ 1 ] ∗ N[ 1 ] ) + ( E [ 2 ] ∗ N[ 2 ] ) +
(E [ 3 ] ∗ N[ 3 ] ) − (C [ 1 ] ∗ D[ 1 ] ) − (C [ 2 ] ∗ D[ 2 ] ) − (C [ 3 ] ∗ D [ 3 ] ) ) / D [ 0 ] ) ;
enviarDAC (C [ 0 ] ) ;
E[ 3 ] =E [ 2 ] ;
E[ 2 ] =E [ 1 ] ;
E[ 1 ] =E [ 0 ] ;
C[ 3 ] =C [ 2 ] ;
C[ 2 ] =C [ 1 ] ;
C[ 1 ] =C [ 0 ] ;
}
tiempoT=tiempoT +5.0 f ;
i d e n t i f i c a d o r=i d e n t i f i c a d o r +1;
pc . p r i n t f ( ” %f , %f , %f , %d” , tiempoT , r e f e r e n c i a , e n t r a d a , i d e n t i f i c a d o r ) ; }
void r e s p u e s t a e s c a l o n ( ) {
pc . s c a n f ( ” %f \0 ” , &V e s c a l o n ) ;
enviarDAC ( V e s c a l o n ) ;
m u e s t r e o . a t t a c h (& m u e s t r e o e s c a l o n , 5.0 f );}
void r e s p u e s t a f r e c u e n c i a ( ) {
pc . s c a n f ( ” %f , %f , % f \0 ” , &litudpp ,& o f f s e t ,& f r e c u e n c i a ) ;
tempor =1/( f r e c u e n c i a ∗ 1 2 8 . 0 f ) ;
t i e m p o . a t t a c h (& temseno , tempor ) ; }
void c o n t r o l a d o r o n o f f ( ) {
pc . s c a n f ( ” %f , % f \0 ” , &r e f e r e n c i a ,& h i s t e r e s i s ) ;
o n o f f . a t t a c h (& c o n o n o f f , 2 . 0 f ) ; }
void c o n t r o l d i g i t a l (){
E[ 3 ] = 0 ;
E[ 2 ] = 0 ;
E[ 1 ] = 0 ;
C[ 3 ] = 0 ;
C[ 2 ] = 0 ;
C[ 1 ] = 0 ;
pc . s c a n f ( ” %f , %d, %f , %f , %f , %f , %f , %f , %f , % f \0 ” ,& r e f e r e n c i a ,& Tmuestreo ,
&N[ 0 ] , &N[ 1 ] , &N[ 2 ] , &N[ 3 ] , &D[ 0 ] , &D[ 1 ] , &D[ 2 ] , &D [ 3 ] ) ;
Tmuestreo=Tmuestreo / 5 ;
c o n t a d o r d e s c e=Tmuestreo +1;
c d i g i t a l . a t t a c h (& c o n d i g i t a l , 5 . 0 0 0 f ) ; }
void v e n t i l a r ( ) {
v e n t i l a d o r =1;
V e s c a l o n =0;
r e f e r e n c i a =0;
enviarDAC ( 1 1 ) ; }
void r e i n i c i a r t o d o ( ) {
enviarDAC ( 0 ) ;
86 ANEXOS
tiempoT =0;
v a r o n o f f =1;
s a l i d a s e n o =0.0 f ;
i d e n t i f i c a d o r =0;
v e n t i l a d o r =0;
muestreo . detach ( ) ;
c d i g i t a l . detach ( ) ;
o n o f f . detach ( ) ;
tiempo . detach ( ) ; }
i n t main ( ) {
reiniciartodo ();
while ( 1 ) {
switch ( pc . g e t c ( ) ) {
case ( ’ a ’ ) :
reiniciartodo ();
respuestaescalon ();
break ;
case ( ’ b ’ ) :
reiniciartodo ();
respuestafrecuencia ();
break ;
case ( ’ c ’ ) :
reiniciartodo ();
controladoronoff ();
break ;
case ( ’ d ’ ) :
reiniciartodo ();
controldigital ();
break ;
case ( ’ e ’ ) :
ventilar ();
break ;
case ( ’ f ’ ) :
reiniciartodo ();
break ;
}}}
f l o a t Vi [ 3 0 0 ] ;
f l o a t Vo [ 3 0 0 ] ;
f l o a t tiempoV [ 3 0 0 ] ;
f l o a t tiempoSeno [ 3 0 0 ] ;
f l o a t D[ 4 ] = { 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 } ;
f l o a t N[ 4 ] = { 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 } ;
float E[4]={0.0 ,0.0 ,0.0 ,0.0};
float C[ 4 ] = { 0 . 0 , 0 . 0 , 0 . 0 , 0 . 0 } ;
f l o a t e n t r a d a , s a l i d a s e n o , d a t o d a c , f r e c u e n c i a , tempor , amplitudpp , offset ,
h i s t e r e s i s , r e f e r e n c i a , V e s c a l o n , Tmuestreo ;
int varonoff , contadordesce , contador , contadorpeque , numeroentero ;
i n t i =0;
i n t k =0;
void m u e s t r e o e s c a l o n ( ) {
recibirADC ( ) ;
i f ( c o n t a d o r <300){
tiempoV [ c o n t a d o r ]= c o n t a d o r ∗ 0 . 0 0 1 2 f ;
Vi [ c o n t a d o r ]= V e s c a l o n ;
Vo [ c o n t a d o r ]= e n t r a d a ;
c o n t a d o r=c o n t a d o r +1;}
else { muestreo . detach ( ) ;
c o n t a d o r =0;
enviarDAC ( 0 ) ;
f o r ( i =0; i <300; i ++){
pc . p r i n t f ( ” %f , %f , %f , %d\n” , tiempoV [ i ] , Vi [ i ] , Vo [ i ] , i ) ;
wait ( 0 . 1 ) ; }
}}
void temseno ( ) {
k=k +1;
i f ( k==128){k =0;}
s a l i d a s e n o =(( s e n o [ k ] ∗ a m p l i t u d p p ) −( a m p l i t u d p p /2))+ o f f s e t ;
enviarDAC ( s a l i d a s e n o ) ;
recibirADC ( ) ;
i f ( c o n t a d o r <300)
{ t i e m p o S e n o [ c o n t a d o r ]= c o n t a d o r ∗ tempor ;
Vi [ c o n t a d o r ]= s a l i d a s e n o ;
Vo [ c o n t a d o r ]= e n t r a d a ;
c o n t a d o r=c o n t a d o r +1;}
else {
tiempo . detach ( ) ;
c o n t a d o r =0;
enviarDAC ( 0 ) ;
f o r ( i =0; i <300; i ++){
pc . p r i n t f ( ” %f , %f , %f , %d\n” , t i e m p o S e n o [ i ] , Vi [ i ] , Vo [ i ] , i ) ;
wait ( 0 . 1 ) ; } } }
void c o n o n o f f ( ) {
recibirADC ( ) ;
i f ( r e f e r e n c i a >0){
i f ( v a r o n o f f ==1){
i f ( e n t r a d a <( r e f e r e n c i a +( h i s t e r e s i s / 2 ) ) ) {
v a r o n o f f =1;
enviarDAC ( 1 2 ) ; }
e l s e { v a r o n o f f =0;
enviarDAC ( 0 ) ; } }
e l s e { i f ( e n t r a d a >( r e f e r e n c i a −( h i s t e r e s i s / 3 ) ) ) {
v a r o n o f f =0;
enviarDAC ( 0 ) ; }
e l s e { v a r o n o f f =1;
enviarDAC ( 1 2 ) ; } } }
e l s e { i f ( v a r o n o f f ==1){
i f ( e n t r a d a >( r e f e r e n c i a −( h i s t e r e s i s / 2 ) ) ) {
v a r o n o f f =1;
enviarDAC ( − 1 2 ) ; }
e l s e { v a r o n o f f =0;
enviarDAC ( 0 ) ; } }
e l s e { i f ( e n t r a d a <( r e f e r e n c i a +( h i s t e r e s i s / 3 ) ) ) {
v a r o n o f f =0;
enviarDAC ( 0 ) ; }
e l s e { v a r o n o f f =1;
enviarDAC ( − 1 2 ) ; } } }
c o n t a d o r p e q u e=c o n t a d o r p e q u e +1;
i f ( c o n t a d o r p e q u e ==4){
c o n t a d o r p e q u e =0;
i f ( c o n t a d o r <300){
tiempoV [ c o n t a d o r ]= c o n t a d o r ∗ 0 . 0 0 1 2 f ;
Vi [ c o n t a d o r ]= r e f e r e n c i a ;
Vo [ c o n t a d o r ]= e n t r a d a ;
c o n t a d o r=c o n t a d o r +1;}
else {
o n o f f . detach ( ) ;
c o n t a d o r =0;
enviarDAC ( 0 ) ;
f o r ( i =0; i <300; i ++){
pc . p r i n t f ( ” %f , %f , %f , %d\n” , tiempoV [ i ] , Vi [ i ] , Vo [ i ] , i );
wait ( 0 . 1 ) ; } } } }
void c o n d i g i t a l ( ) {
c o n t a d o r d e s c e=c o n t a d o r d e s c e −1;
recibirADC ( ) ;
88 ANEXOS
i f ( c o n t a d o r d e s c e ==0){
c o n t a d o r d e s c e=n u m e r o e n t e r o ; }
i f ( c o n t a d o r <300){
tiempoV [ c o n t a d o r ]= c o n t a d o r ∗ 0 . 0 0 1 f ;
Vi [ c o n t a d o r ]= r e f e r e n c i a ;
Vo [ c o n t a d o r ]= e n t r a d a ;
c o n t a d o r=c o n t a d o r +1;
i f ( c o n t a d o r d e s c e==n u m e r o e n t e r o ) {
E[ 0 ] = r e f e r e n c i a −e n t r a d a ;
C [ 0 ] = ( ( ( E [ 0 ] ∗ N[ 0 ] ) + ( E [ 1 ] ∗ N[ 1 ] ) + ( E [ 2 ] ∗ N[ 2 ] ) + ( E [ 3 ] ∗ N[ 3 ] ) −
(C [ 1 ] ∗ D[ 1 ] ) − (C [ 2 ] ∗ D[ 2 ] ) − (C [ 3 ] ∗ D [ 3 ] ) ) / D [ 0 ] ) ;
enviarDAC (C [ 0 ] ) ;
E[ 3 ] =E [ 2 ] ;
E[ 2 ] =E [ 1 ] ;
E[ 1 ] =E [ 0 ] ;
C[ 3 ] =C [ 2 ] ;
C[ 2 ] =C [ 1 ] ;
C[ 1 ] =C [ 0 ] ;
}}
else {
c d i g i t a l . detach ( ) ;
c o n t a d o r =0;
enviarDAC ( 0 ) ;
E[ 3 ] = 0 ;
E[ 2 ] = 0 ;
E[ 1 ] = 0 ;
C[ 3 ] = 0 ;
C[ 2 ] = 0 ;
C[ 1 ] = 0 ;
f o r ( i =0; i <300; i ++){
pc . p r i n t f ( ” %f , %f , %f , %d\n” , tiempoV [ i ] , Vi [ i ] , Vo [ i ] , i ) ; w a i t ( 0 . 1 ) ; }
}}
void r e s p u e s t a e s c a l o n ( ) {
pc . s c a n f ( ” %f \0 ” , &V e s c a l o n ) ;
enviarDAC ( V e s c a l o n ) ;
m u e s t r e o . a t t a c h (& m u e s t r e o e s c a l o n , 0.0012 f );}
void r e s p u e s t a f r e c u e n c i a ( ) {
pc . s c a n f ( ” %f , %f , % f \0 ” , &litudpp ,& o f f s e t ,& f r e c u e n c i a ) ;
tempor =1/( f r e c u e n c i a ∗ 1 2 8 . 0 f ) ;
t i e m p o . a t t a c h (& temseno , tempor ) ; }
void c o n t r o l a d o r o n o f f ( ) {
pc . s c a n f ( ” %f , % f \0 ” , &r e f e r e n c i a ,& h i s t e r e s i s ) ;
o n o f f . a t t a c h (& c o n o n o f f , 0 . 0 0 0 3 f ) ;
}
void c o n t r o l d i g i t a l (){
pc . s c a n f ( ” %f , %f , %f , %f , %f , %f , %f , %f , %f , % f \0 ” ,& r e f e r e n c i a ,
&Tmuestreo ,&N[ 0 ] , &N[ 1 ] , &N[ 2 ] , &N[ 3 ] , &D[ 0 ] , &D[ 1 ] , &D[ 2 ] , &D [ 3 ] ) ;
n u m e r o e n t e r o=Tmuestreo / 0 . 0 0 1 f ;
c o n t a d o r d e s c e=n u m e r o e n t e r o +1;
c d i g i t a l . a t t a c h (& c o n d i g i t a l , 0 . 0 0 1 f ) ;
}
void r e i n i c i a r t o d o ( ) {
muestreo . detach ( ) ;
tiempo . detach ( ) ;
c d i g i t a l . detach ( ) ;
o n o f f . detach ( ) ;
enviarDAC ( 0 ) ;
c o n t a d o r =0;
c o n t a d o r p e q u e =0;
s a l i d a s e n o =0.0 f ;
v a r o n o f f =1;
k =0;
}
i n t main ( ) {
reiniciartodo ();
while ( 1 ) {
switch ( pc . g e t c ( ) ) {
case ( ’ a ’ ) :
reiniciartodo ();
respuestaescalon ();
break ;
case ( ’ b ’ ) :
reiniciartodo ();
respuestafrecuencia ();
break ;
case ( ’ c ’ ) :
ANEXOS 89
reiniciartodo ();
controladoronoff ();
break ;
case ( ’ d ’ ) :
reiniciartodo ();
controldigital ();
break ;
}}}
s e r = s e r i a l . S e r i a l ( ’ com3 ’ , 9 6 0 0 , t i m e o u t =1)
def c a l l b a c k ( e n t r a n t e , c h a n n e l ) :
print ( e n t r a n t e )
e n t r a d a=s t r ( e n t r a n t e )
i f ( e n t r a d a==” a ” ) or ( e n t r a d a==”b” ) or ( e n t r a d a==” c ” ) or ( e n t r a d a==”d” ) or ( e n t r a d a==” e ” ) :
s e r . w r i t e l i n e s ( entrada )
else :
s e r . w r i t e l i n e s ( e n t r a d a+” \0 ” )
def c o n n e c t ( e n t r a n t e ) :
p r i n t ( ”CONNECTED” )
def r e c o n n e c t ( e n t r a n t e ) :
p r i n t ( ”RECONNECTED” )
def d i s c o n n e c t ( e n t r a n t e ) :
p r i n t ( ”DISCONNECTED” )
while 1 :
m e s s a g e =s e r . r e a d l i n e ( )
i f m e s s a g e != ’ ’ :
# p r i n t ( message )
p r i n t pubnub2 . p u b l i s h ( c h a n n e l 2 , message )
def c a l l b a c k ( e n t r a n t e , c h a n n e l ) :
print ( e n t r a n t e )
90 ANEXOS
e n t r a d a=s t r ( e n t r a n t e )
i f ( e n t r a d a==” a ” ) or ( e n t r a d a==”b” ) or ( e n t r a d a==” c ” ) or ( e n t r a d a==”d” ) or
( e n t r a d a==” e ” ) or ( e n t r a d a==” f ” ) :
s e r . w r i t e l i n e s ( entrada )
else :
s e r . w r i t e l i n e s ( e n t r a d a+” \0 ” )
def c o n n e c t ( e n t r a n t e ) :
p r i n t ( ”CONNECTED” )
def r e c o n n e c t ( e n t r a n t e ) :
p r i n t ( ”RECONNECTED” )
def d i s c o n n e c t ( e n t r a n t e ) :
p r i n t ( ”DISCONNECTED” )
while 1 :
m e s s a g e =s e r . r e a d l i n e ( )
i f m e s s a g e != ’ ’ :
# p r i n t ( message )
p r i n t pubnub2 . p u b l i s h ( c h a n n e l 2 , message )
<p>
< l a b e l >P l a n t a </ l a b e l >
<br>
< s e l e c t name=” s e s i o n P l a n t a ” s t y l e=” w i d t h : 4 4 0 px ”>
<o p t i o n v a l u e=” Temperatura ”>Temperatura </o p t i o n >
<o p t i o n v a l u e=” V e l o c i d a d ”>V e l o c i d a d </o p t i o n >
</ s e l e c t >
</p>
<p c l a s s=” l o g i n b u t t o n ”>
<i n p u t t y p e=” s u b m i t ” v a l u e=” I n i c i o ” />
</p>
<p c l a s s=” c h a n g e l i n k ”>
R e g i s t r a tu a d i c i o n a l !
<a h r e f=”#t o r e g i s t e r ” c l a s s=” t o r e g i s t e r ”>R e s g i s t r a r s e </a>
</p>
</form>
</d i v>
</p>
<p c l a s s=” s i g n i n b u t t o n ”>
<i n p u t t y p e=” s u b m i t ” name=” s u b m i t ” v a l u e=” R e g i s t r a r s e ”/>
</p>
<p c l a s s=” c h a n g e l i n k ”>
D e s e a s i n g r e s a r a l L a b o r a t o r i o Remoto ?
<a h r e f=”#t o l o g i n ” c l a s s=” t o r e g i s t e r ”> I n i c i o S e s i o n </a>
</p>
</form>
</d i v>
</d i v>
</d i v>
</ s e c t i o n >
</d i v>
</body>
</html>
Listing 6.6: Codigo para registro de usuarios nuevos en base de datos registro.php”
<?php
// c o n e x i o n con l a b a s e d e d a t o s y e l s e r v i d o r
$ l i n k = m y s q l c o n n e c t ( ” mysql2 . 0 0 0 webhost . com” ,
” a1831340 pablo ” , ” pablo2015 ” )
o r d i e ( ”<h2> No s e e n c u e n t r a e l s e r v i d o r </h2>” ) ;
$db = m y s q l s e l e c t d b ( ” a 1 8 3 1 3 4 0 r e m o t a ” , $ l i n k ) o r die ( ”<h2> E r r o r de
92 ANEXOS
c o n e x i o n </h2>” ) ;
// o b t e n e r l o s v a l o r e s d e l f o r m u l a r i o
$ c o d i g o = $ POST [ ’ u s u a r i o C o d i g o ’ ] ;
$ c o n t r a s e n a = $ POST [ ’ u s u a r i o C o n t r a s e n a ’ ] ;
$ c o n C o n t r a s e n a = $ POST [ ’ u s u a r i o C o n f C o n t r a s e n a ’ ] ;
$ f e c h a = $ POST [ ’ u s u a r i o F e c h a ’ ] ;
$ h o r a = $ POST [ ’ u s u a r i o H o r a ’ ] ;
$ p l a n t a = $ POST [ ’ u s u a r i o P l a n t a ’ ] ;
$ c o n t a d o r 3 = m y s q l q u e r y ( ”SELECT ∗ FROM R e g i s t r o WHERE ( Codigo =
’ $codigo ’) ” , $link )
o r d i e ( ”<h2> E r r o r de r e c e p c i e d a t o s </h2>” ) ;
$ n o f i l a s 3 = mysql num rows ( $ c o n t a d o r 3 ) ;
// s e c o n f i r m a q u e numero d e r e g i s t r o s p o r c o d i g o no s e a mayor a 3
i f ( $ n o f i l a s 3 >=3){
e c h o ’< s c r i p t l a n g u a g e =” j a v a s c r i p t ”>
a l e r t ( ” Excede e l no de r e g i s t r o s
p e r m i t i d o s ” ) ; window . h i s t o r y . back ( ) ; < / s c r i p t > ’ ; }
else {
// s e confirma contrasena
i f ( $ c o n t r a s e n a != $ c o n C o n t r a s e n a ) {
e c h o ’< s c r i p t l a n g u a g e =” j a v a s c r i p t ”> a l e r t ( ” Las c o n t r a s e n o
c o i n c i d e n ” ) ; window . h i s t o r y . back ( ) ; < / s c r i p t > ’ ;
}
else {
// i n g r e s a r l a i n f o r m a c i o n a l a t a b l a
$ c o n t a d o r = m y s q l q u e r y ( ”SELECT ∗ FROM R e g i s t r o WHERE ( Fecha =
’ $ f e c h a ’ AND Hora = ’ $ h o r a ’ AND P l a n t a = ’ $ p l a n t a ’ ) ” , $ l i n k )
o r d i e ( ”<h2> E r r o r de r e c e p c i e d a t o s </h2>” ) ;
$ n o f i l a s = mysql num rows ( $ c o n t a d o r ) ;
i f ( $ c o d i g o != ” ” && $ n o f i l a s ==0){
m y s q l q u e r y ( ”INSERT INTO R e g i s t r o VALUES
( ’ ’ , ’ $codigo ’ , ’ $contrasena ’ , ’ $ f e c h a ’ , ’ $hora ’ , ’ $planta ’ ) ” , $ l i n k )
o r d i e ( ”<h2> E r r o r de e n v i o de d a t o s </h2>” ) ;
e c h o ’< s c r i p t l a n g u a g e =” j a v a s c r i p t ”> a l e r t ( ” R e g i s t r o R e a l i z a d o c o n t o ” ) ;
window . l o c a t i o n =”h t t p : / / e s t a c i o n r e m o t a . n e t 7 6 . n e t /”; </ s c r i p t > ’ ;
}
e l s e { e c h o ’< s c r i p t l a n g u a g e =” j a v a s c r i p t ”> a l e r t ( ” La h o r a que s o l i c i t a no e s t a
disponible ”);
window . h i s t o r y . back ( ) ; < / s c r i p t > ’ ; }}}
mysql close ( $link );
?> <?php
// c o n e x i o n con l a b a s e d e d a t o s y e l s e r v i d o r
$ l i n k = m y s q l c o n n e c t ( ” mysql2 . 0 0 0 webhost . com” ,
” a 1 8 3 1 3 4 0 p a b l o ” , ” p a b l o 2 0 1 5 ” ) o r d i e ( ”<h2> No s e e n c u e n t r a e l s e r v i d o r
</h2>” ) ;
$db = m y s q l s e l e c t d b ( ” a 1 8 3 1 3 4 0 r e m o t a ” , $ l i n k ) o r d i e ( ”<h2> E r r o r de
c o n e x i o n </h2>” ) ;
// o b t e n e r l o s v a l o r e s d e l f o r m u l a r i o
$ c o d i g o = $ POST [ ’ u s u a r i o C o d i g o ’ ] ;
$ c o n t r a s e n a = $ POST [ ’ u s u a r i o C o n t r a s e n a ’ ] ;
$ c o n C o n t r a s e n a = $ POST [ ’ u s u a r i o C o n f C o n t r a s e n a ’ ] ;
$ f e c h a = $ POST [ ’ u s u a r i o F e c h a ’ ] ;
$ h o r a = $ POST [ ’ u s u a r i o H o r a ’ ] ;
$ p l a n t a = $ POST [ ’ u s u a r i o P l a n t a ’ ] ;
// s e c o n f i r m a q u e numero d e r e g i s t r o s p o r c o d i g o no s e a mayor a 3
i f ( $ n o f i l a s 3 >=3){
e c h o ’< s c r i p t l a n g u a g e =” j a v a s c r i p t ”>
a l e r t ( ” Excede e l no de r e g i s t r o s
p e r m i t i d o s ” ) ; window . h i s t o r y . back ( ) ; < / s c r i p t > ’ ;
}
else {
// s e c o n f i r m a c o n t r a s e a
i f ( $ c o n t r a s e n a != $ c o n C o n t r a s e n a ) {
e c h o ’< s c r i p t l a n g u a g e =” j a v a s c r i p t ”> a l e r t ( ” Las c o n t r a s e n o
c o i n c i d e n ” ) ; window . h i s t o r y . back ( ) ; < / s c r i p t > ’ ;
}
ANEXOS 93
else {
// i n g r e s a r l a i n f o r m a c i o n a l a t a b l a
$ c o n t a d o r = m y s q l q u e r y ( ”SELECT ∗ FROM R e g i s t r o WHERE
( Fecha = ’ $ f e c h a ’ AND Hora = ’ $ h o r a ’ AND P l a n t a = ’ $ p l a n t a ’ ) ” , $ l i n k ) o r die
( ”<h2> E r r o r de r e c e p c i e d a t o s </h2>” ) ;
$ n o f i l a s = mysql num rows ( $ c o n t a d o r ) ;
i f ( $ c o d i g o != ” ” && $ n o f i l a s ==0){
e l s e { e c h o ’< s c r i p t l a n g u a g e =” j a v a s c r i p t ”>
a l e r t ( ” La h o r a que s o l i c i t a no e s t a d i s p o n i b l e ” ) ;
window . h i s t o r y . back ( ) ; < / s c r i p t > ’ ; }}}
mysql close ( $link );
?>
Listing 6.7: Codigo para inicio de sesión de usuarios registrados en base de datos ”sesion.php”
<?php
$ l i n k = m y s q l c o n n e c t ( ” mysql2 . 0 0 0 webhost . com” ,
” a 1 8 3 1 3 4 0 p a b l o ” , ” p a b l o 2 0 1 5 ” ) o r d i e ( ”<h2> No s e e n c u e n t r a e l s e r v i d o r
</h2>” ) ;
$db = m y s q l s e l e c t d b ( ” a 1 8 3 1 3 4 0 r e m o t a ” , $ l i n k ) o r d i e ( ”<h2> E r r o r de
c o n e x i o n </h2>” ) ;
// o b t e n e r l o s v a l o r e s d e l f o r m u l a r i o
$ c o d i g o = $ POST [ ’ username ’ ] ;
$ c o n t r a s e n a = $ POST [ ’ p a s s w o r d ’ ] ;
$ p l a n t a = $ POST [ ’ s e s i o n P l a n t a ’ ] ;
$ f e c h a = d a t e ( ’Y−m−d H : i : s ’ ) ;
$ n u e v a f e c h a = s t r t o t i m e ( ’−1 hour ’ , s t r t o t i m e ( $fecha ) ) ;
$ h o r a A c t u a l F= d a t e ( ’H : i ’ , $ n u e v a f e c h a ) ;
$ f e c h a a c t u a l= d a t e ( ’Y−m−d ’ , $ n u e v a f e c h a ) ;
// c o n s u l t a s d e t a b l a
$ c o n t a d o r = m y s q l q u e r y ( ”SELECT ∗ FROM R e g i s t r o WHERE ( Codigo =
’ $ c o d i g o ’ AND C o n t r a s e n a = ’ $ c o n t r a s e n a ’ AND P l a n t a = ’ $ p l a n t a ’ ) ” , $ l i n k ) o r
d i e ( ”<h2> E r r o r de r e c e p c i o n de d a t o s </h2>” ) ;
$ n u m e r o f i l a s = mysql num rows ( $ c o n t a d o r ) ;
// c o n s u l t a Hora
$ s q l h o r a = ”SELECT Hora FROM R e g i s t r o WHERE
( Codigo = ’ $ c o d i g o ’ AND C o n t r a s e n a = ’ $ c o n t r a s e n a ’ AND P l a n t a =
’ $planta ’) ” ;
$ c o n s u l t a H o r a = m y s q l q u e r y ( $ s q l h o r a , $ l i n k ) o r d i e ( ”<h2> E r r o r de
r e c e p c i o n de d a t o s </h2>” ) ;
$ h o r a 1 1= l i s t ( $ h o r a 1 ) = m y s q l f e t c h r o w ( $ c o n s u l t a H o r a ) ;
$ h o r a 2 2= l i s t ( $ h o r a 1 ) = m y s q l f e t c h r o w ( $ c o n s u l t a H o r a ) ;
$ h o r a 3 3= l i s t ( $ h o r a 1 ) = m y s q l f e t c h r o w ( $ c o n s u l t a H o r a ) ;
// c o n s u l t a F e c h a
$ s q l f e c h a = ”SELECT Fecha FROM R e g i s t r o WHERE
( Codigo = ’ $ c o d i g o ’ AND C o n t r a s e n a = ’ $ c o n t r a s e n a ’ AND P l a n t a =
’ $planta ’) ” ;
$ c o n s u l t a F e c h a = m y s q l q u e r y ( $ s q l f e c h a , $ l i n k ) o r d i e ( ”<h2> E r r o r de
r e c e p c i o n de d a t o s </h2>” ) ;
$ f e c h a 1 1= l i s t ( $ f e c h a 1 ) = m y s q l f e t c h r o w ( $ c o n s u l t a F e c h a ) ;
$ f e c h a 2 2= l i s t ( $ f e c h a 1 ) = m y s q l f e t c h r o w ( $ c o n s u l t a F e c h a ) ;
$ f e c h a 3 3= l i s t ( $ f e c h a 1 ) = m y s q l f e t c h r o w ( $ c o n s u l t a F e c h a ) ;
// c o n s u l t a P l a n t a
$ s q l p l a n t a = ”SELECT p l a n t a FROM R e g i s t r o WHERE
( Codigo = ’ $ c o d i g o ’ AND C o n t r a s e n a = ’ $ c o n t r a s e n a ’ AND P l a n t a =
’ $planta ’) ” ;
$ c o n s u l t a P l a n t a = m y s q l q u e r y ( $ s q l p l a n t a , $ l i n k ) o r d i e ( ”<h2> E r r o r de
r e c e p c i o n de d a t o s </h2>” ) ;
$ p l a n t a 1 1= l i s t ( $ p l a n t a 1 ) = m y s q l f e t c h r o w ( $ c o n s u l t a P l a n t a ) ;
$ p l a n t a 2 2= l i s t ( $ p l a n t a 1 ) = m y s q l f e t c h r o w ( $ c o n s u l t a P l a n t a ) ;
$ p l a n t a 3 3= l i s t ( $ p l a n t a 1 ) = m y s q l f e t c h r o w ( $ c o n s u l t a P l a n t a ) ;
if ( $ n u m e r o f i l a s != 0 ) {
94 ANEXOS
switch ( $ n u m e r o f i l a s ) {
case 1 :
$ r=s t r t o t i m e ( $ h o r a 1 1 [ 0 ] ) ;
$ c o n s u l t a H o r a F F=d a t e ( ’H : i ’ , $ r ) ;
$ e n d t i m e = s t r t o t i m e ( ”+119 m i n u t e s ” , s t r t o t i m e ( $ h o r a 1 1 [ 0 ] ) ) ;
$ h o r a 1 2 0 m i n=d a t e ( ’H : i ’ , $ e n d t i m e ) ;
i f ( $ p l a n t a 1 1 [ 0 ] ==” Temperatura ” ) {
m y s q l q u e r y ( ”DELETE FROM R e g i s t r o WHERE Fecha < ’ $ f e c h a 1 1 [ 0 ] ’ ” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
m y s q l q u e r y ( ”UPDATE S e s i o n SET NumeroSesion=1 WHERE ID=1” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : Temperatura . php ’ ) ; }
else {
m y s q l q u e r y ( ”DELETE FROM R e g i s t r o WHERE Fecha < ’ $ f e c h a 1 1 [ 0 ] ’ ” , $ l i n k ) o r
d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : V e l o c i d a d . php ’ ) ; }}
else {
e c h o ’< s c r i p t l a n g u a g e =” j a v a s c r i p t ”> a l e r t ( ” No s e e n c u e n t r a en l a h o r a de
s e s i o n r e g i s t r a d a ” ) ; window . h i s t o r y . back ( ) ; < / s c r i p t > ’ ; }
break ;
case 2 :
$ r=s t r t o t i m e ( $ h o r a 1 1 [ 0 ] ) ;
$ c o n s u l t a H o r a F F=d a t e ( ’H : i ’ , $ r ) ;
$ e n d t i m e = s t r t o t i m e ( ”+120 m i n u t e s ” , s t r t o t i m e ( $ h o r a 1 1 [ 0 ] ) ) ;
$ h o r a 1 2 0 m i n=d a t e ( ’H : i ’ , $ e n d t i m e ) ;
$endtimeF = s t r t o t i m e ( ”+119 m i n u t e s ” , s t r t o t i m e ( $ h o r a 1 1 [ 0 ] ) ) ;
$ h o r a 1 1 9 m i n=d a t e ( ’H : i ’ , $endtimeF ) ;
i f ( $ p l a n t a 1 1 [ 0 ] ==” Temperatura ” ) {
m y s q l q u e r y ( ”DELETE FROM R e g i s t r o WHERE Fecha < ’ $ f e c h a 1 1 [ 0 ] ’ ” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
$ c o n t a d o r 1 = m y s q l q u e r y ( ”SELECT ∗ FROM R e g i s t r o WHERE
( Codigo = ’ $ c o d i g o ’ AND C o n t r a s e n a = ’ $ c o n t r a s e n a ’ AND P l a n t a =
’ $ p l a n t a ’ AND Fecha =’ $ f e c h a 1 1 [ 0 ] ’ AND Hora = ’ $ h o r a 1 2 0 m i n ’ ) ” , $ l i n k )
o r d i e ( ”<h2> E r r o r de r e c e p c i o n de d a t o s </h2>” ) ;
$ n u m e r o f i l a s 1 = mysql num rows ( $ c o n t a d o r 1 ) ;
i f ( $ n u m e r o f i l a s 1 == 0 ) {
m y s q l q u e r y ( ”UPDATE S e s i o n SET NumeroSesion=1 WHERE ID=1” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : Temperatura . php ’ ) ; }
else {
m y s q l q u e r y ( ”UPDATE S e s i o n SET NumeroSesion=2 WHERE ID=1” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : Temperatura . php ’ ) ; }}
else {
m y s q l q u e r y ( ”DELETE FROM R e g i s t r o WHERE Fecha < ’ $ f e c h a 1 1 [ 0 ] ’ ” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : V e l o c i d a d . php ’ ) ; }}
else {
$ r=s t r t o t i m e ( $ h o r a 2 2 [ 0 ] ) ;
$ c o n s u l t a H o r a F F=d a t e ( ’H : i ’ , $ r ) ;
$ e n d t i m e = s t r t o t i m e ( ”+120 m i n u t e s ” , s t r t o t i m e ( $ h o r a 2 2 [ 0 ] ) ) ;
$ h o r a 1 2 0 m i n=d a t e ( ’H : i ’ , $ e n d t i m e ) ;
$endtimeF = s t r t o t i m e ( ”+119 m i n u t e s ” , s t r t o t i m e ( $ h o r a 2 2 [ 0 ] ) ) ;
$ h o r a 1 1 9 m i n=d a t e ( ’H : i ’ , $endtimeF ) ;
i f ( $ p l a n t a 2 2 [ 0 ] ==” Temperatura ” ) {
i f ( $ n u m e r o f i l a s 1 == 0 ) {
m y s q l q u e r y ( ”UPDATE S e s i o n SET NumeroSesion=1 WHERE ID=1” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : Temperatura . php ’ ) ; }
else {
m y s q l q u e r y ( ”UPDATE S e s i o n SET NumeroSesion=2 WHERE ID=1” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : Temperatura . php ’ ) ; }}
else {
m y s q l q u e r y ( ”DELETE FROM R e g i s t r o WHERE Fecha < ’ $ f e c h a 2 2 [ 0 ] ’ ” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : V e l o c i d a d . php ’ ) ;
}}
else {
e c h o ’< s c r i p t l a n g u a g e =” j a v a s c r i p t ”> a l e r t ( ” No s e e n c u e n t r a en l a h o r a de
s e s i o n r e g i s t r a d a ” ) ; window . h i s t o r y . back ( ) ; < / s c r i p t > ’ ;
}}
break ;
case 3 :
$ r=s t r t o t i m e ( $ h o r a 1 1 [ 0 ] ) ;
$ c o n s u l t a H o r a F F=d a t e ( ’H : i ’ , $ r ) ;
$ e n d t i m e = s t r t o t i m e ( ”+120 m i n u t e s ” , s t r t o t i m e ( $ h o r a 1 1 [ 0 ] ) ) ;
$ h o r a 1 2 0 m i n=d a t e ( ’H : i ’ , $ e n d t i m e ) ;
$endtimeF = s t r t o t i m e ( ”+119 m i n u t e s ” , s t r t o t i m e ( $ h o r a 1 1 [ 0 ] ) ) ;
$ h o r a 1 1 9 m i n=d a t e ( ’H : i ’ , $endtimeF ) ;
$ e n d t i m e 2 = s t r t o t i m e ( ”+240 m i n u t e s ” , s t r t o t i m e ( $ h o r a 1 1 [ 0 ] ) ) ;
$ h o r a 2 4 0 m i n=d a t e ( ’H : i ’ , $ e n d t i m e 2 ) ;
i f ( $ p l a n t a 1 1 [ 0 ] ==” Temperatura ” ) {
i f ( $ n u m e r o f i l a s 2 == 0 ) {
m y s q l q u e r y ( ”UPDATE S e s i o n SET NumeroSesion=2 WHERE ID=1” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : Temperatura . php ’ ) ; }
else {
m y s q l q u e r y ( ”UPDATE S e s i o n SET NumeroSesion=3 WHERE ID=1” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : Temperatura . php ’ ) ; }}}
else {
m y s q l q u e r y ( ”DELETE FROM R e g i s t r o WHERE Fecha < ’ $ f e c h a 1 1 [ 0 ] ’ ” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : V e l o c i d a d . php ’ ) ; }}
else {
$ r=s t r t o t i m e ( $ h o r a 2 2 [ 0 ] ) ;
$ c o n s u l t a H o r a F F=d a t e ( ’H : i ’ , $ r ) ;
$ e n d t i m e = s t r t o t i m e ( ”+120 m i n u t e s ” , s t r t o t i m e ( $ h o r a 2 2 [ 0 ] ) ) ;
$ h o r a 1 2 0 m i n=d a t e ( ’H : i ’ , $ e n d t i m e ) ;
$endtimeF = s t r t o t i m e ( ”+119 m i n u t e s ” , s t r t o t i m e ( $ h o r a 2 2 [ 0 ] ) ) ;
$ h o r a 1 1 9 m i n=d a t e ( ’H : i ’ , $endtimeF ) ;
$ e n d t i m e 2 = s t r t o t i m e ( ”+240 m i n u t e s ” , s t r t o t i m e ( $ h o r a 2 2 [ 0 ] ) ) ;
$ h o r a 2 4 0 m i n=d a t e ( ’H : i ’ , $ e n d t i m e 2 ) ;
i f ( $ p l a n t a 2 2 [ 0 ] ==” Temperatura ” ) {
m y s q l q u e r y ( ”DELETE FROM R e g i s t r o WHERE Fecha < ’ $ f e c h a 2 2 [ 0 ] ’ ” , $ l i n k )
if ( $ n u m e r o f i l a s 1 == 0 ) {
if ( $ n u m e r o f i l a s 2 == 0 ) {
m y s q l q u e r y ( ”UPDATE S e s i o n SET NumeroSesion=2 WHERE ID=1” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : Temperatura . php ’ ) ; }
else {
m y s q l q u e r y ( ”UPDATE S e s i o n SET NumeroSesion=3 WHERE ID=1” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : Temperatura . php ’ ) ; }}}
else {
m y s q l q u e r y ( ”DELETE FROM R e g i s t r o WHERE Fecha < ’ $ f e c h a 2 2 [ 0 ] ’ ” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : V e l o c i d a d . php ’ ) ; }}
else {
$ r=s t r t o t i m e ( $ h o r a 3 3 [ 0 ] ) ;
$ c o n s u l t a H o r a F F=d a t e ( ’H : i ’ , $ r ) ;
$ e n d t i m e = s t r t o t i m e ( ”+120 m i n u t e s ” , s t r t o t i m e ( $ h o r a 3 3 [ 0 ] ) ) ;
$ h o r a 1 2 0 m i n=d a t e ( ’H : i ’ , $ e n d t i m e ) ;
$endtimeF = s t r t o t i m e ( ”+119 m i n u t e s ” , s t r t o t i m e ( $ h o r a 3 3 [ 0 ] ) ) ;
$ h o r a 1 1 9 m i n=d a t e ( ’H : i ’ , $endtimeF ) ;
$ e n d t i m e 2 = s t r t o t i m e ( ”+240 m i n u t e s ” , s t r t o t i m e ( $ h o r a 3 3 [ 0 ] ) ) ;
$ h o r a 2 4 0 m i n=d a t e ( ’H : i ’ , $ e n d t i m e 2 ) ;
i f ( $ p l a n t a 3 3 [ 0 ] ==” Temperatura ” ) {
if ( $ n u m e r o f i l a s 1 == 0 ) {
i f ( $ n u m e r o f i l a s 2 == 0 ) {
m y s q l q u e r y ( ”UPDATE S e s i o n SET NumeroSesion=2 WHERE ID=1” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : Temperatura . php ’ ) ; }
else {
m y s q l q u e r y ( ”UPDATE S e s i o n SET NumeroSesion=3 WHERE ID=1” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : Temperatura . php ’ ) ; }}}
else {
m y s q l q u e r y ( ”DELETE FROM R e g i s t r o WHERE Fecha < ’ $ f e c h a 3 3 [ 0 ] ’ ” , $ l i n k )
o r d i e ( ”<h2> E r r o r en l a ELIMINACION de d a t o s </h2>” ) ;
h e a d e r ( ’ L o c a t i o n : V e l o c i d a d . php ’ ) ; }}
else {
e c h o ’< s c r i p t l a n g u a g e =” j a v a s c r i p t ”> a l e r t ( ” No s e e n c u e n t r a en l a h o r a de
ANEXOS 97
else {
e c h o ’< s c r i p t l a n g u a g e =” j a v a s c r i p t ”> a l e r t ( ” No Hay r e g i s t r o de e s t a
i n f o r m a c i o n ” ) ; window . h i s t o r y . back ( ) ; < / s c r i p t > ’ ; }
mysql close ( $link );
?>
// c o n s u l t a Hora
$ s q l = ”SELECT NumeroSesion FROM S e s i o n WHERE ID=1” ;
$ c o n s u l t a = m y s q l q u e r y ( $ s q l , $ l i n k ) o r d i e ( ”<h2> E r r o r de r e c e p c i o n de
d a t o s </h2>” ) ;
$ c o n s u l t a 1 1= l i s t ( $ c o n s u l t a 1 ) = m y s q l f e t c h r o w ( $ c o n s u l t a ) ;
?>
<!DOCTYPE HTML>
<html>
<head>
</head>
<body o n l o a d=” r e l o j i l l o ( ) ”>
. header {
background−c o l o r : #ADADAD;
color : #f f f f f f ;}
. titulo{
background−c o l o r : #ADADAD;
c o l o r : #EEEEEE ;
f o n t −w e i g h t : b o l d ;
f o n t −s i z e : 260 %;
f o n t −s t y l e : o b l i q u e ;
f o n t −v a r i a n t : s m a l l −c a p s ;
display : block ;
float : l e f t ;
l e t t e r −s p a c i n g : 2 px ;
t e x t −shadow : 8 px 4 px 8 px #000000;
}
. cuerpo {
background−c o l o r : #ADADAD;
c o l o r : #EEEEEE ;
f o n t −s t y l e : o b l i q u e ;
f o n t −w e i g h t : b o l d ;
t e x t −a l i g n : j u s t i f y ;
position : relative ;
float : l e f t ;
98 ANEXOS
l e t t e r −s p a c i n g : 0 . 5 px ;
b o r d e r : 1 px s o l i d #FFFFFF ;
b o r d e r −bottom−r i g h t −r a d i u s : 3em ;
}
</ s t y l e >
<s t y l e >
. my style . webix hcell {
t e x t −a l i g n : c e n t e r ;
background :#009966;
c o l o r : white ;
f o n t −w e i g h t : b o l d ;
}
. m y s t y l e . webix column {
t e x t −a l i g n : c e n t e r ;
f o n t −s t y l e : i t a l i c ;
b a c k g r o u n d :#ddFFdd ;
}
. m y s t y l e . webix column > div {
b o r d e r −c o l o r :#ddd ;
}
</ s t y l e >
l o g i n = [ { c o l s : [ { v i e w : ” t e x t ” , h e i g h t : 3 0 , t y p e : ’ p a s s w o r d ’ , v a l u e : ’ 123 p a s s ’ ,
l a b e l : ” Clave : ” , labelWidth : 8 0 } ,
{ view : ” button ” , h e i g h t : 3 0 , width : 8 0 , a l i g n : ” c e n t e r ” , v a l u e : ” Login ” ,
t y p e : ” form ” , c l i c k : ” $$ ( ’ win3 ’ ) . c l o s e ( ) ; ” } ] } ] ;
escalonT =
[ { rows : [ { v i e w : ” f i e l d s e t ” , l a b e l : ” R e f e r e n c i a ” , body : { i d : ” e s c a l T ” , v i e w : ” s l i d e r ” , va
l u e : 5 , s t e p : 0 . 1 , min : 0 , max : 1 0 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ; v a r s t r 1
= j . toFixed ( 1 ) ; return s t r 1+” v ” ; } } } ,
{ view : ” button ” , h e i g h t : 3 0 , width : 8 0 , a l i g n : ” c e n t e r ” , v a l u e : ” Enviar ” ,
t y p e : ” form ” , c l i c k : enviarET } ] } ] ;
f r e c u e n c i a T =[{ rows : [ { v i e w : ” f i e l d s e t ” , l a b e l : ” V o l t a j e p i c o a
p i c o ” , body : { i d : ”VppT” , v i e w : ” s l i d e r ” , v a l u e : 5 , s t e p : 0 . 1 , min : 0 , max : 1 0 ,
t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ; v a r s t r 1 = j . t o F i x e d ( 1 ) ; return s t r 1+”
v” ; } } } ,
{ v i e w : ” f i e l d s e t ” , l a b e l : ” O f f s e t ” , body : { i d : ” o f f T ” , v i e w : ” s l i d e r ” , l a b e l W i d t h : 1 0 0 , v
a l u e : 3 . 5 , s t e p : 0 . 1 , min : 2 , max : 5 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ; v a r
s t r 1 = j . toFixed ( 1 ) ; return s t r 1+” v ” ; } } } ,
{ view : ” f i e l d s e t ” , l a b e l : ” F r e c u e n c i a
( Hz ) ” , body : { i d : ” f r e c T ” , v i e w : ” s l i d e r ” , l a b e l W i d t h : 1 0 0 , v a l u e : 0 . 0 0 1 , s t e p : 0 . 0 0 0 1
, min : 0 . 0 0 0 2 , max : 0 . 0 0 9 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ; v a r s t r 1 =
j . toFixed ( 4 ) ; return s t r 1+” Hz” ; } } } ,
controlonoffT
=[{ rows : [ { v i e w : ” f i e l d s e t ” , l a b e l : ” R e f e r e n c i a ” , body : { i d : ” r e f T ” , v i e w : ” s l i d e r ” , v a l
ue : 5 , s t e p : 0 . 1 , min : 0 , max : 1 0 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ; v a r s t r 1
= j . toFixed ( 1 ) ; return s t r 1+” v ” ; } } } ,
{ v i e w : ” f i e l d s e t ” , l a b e l : ” H i s t e r e s i s ” , body : { i d : ”hT” , v i e w : ” s l i d e r ” , l a b e l W i d t h : 1 0 0 ,
v a l u e : 2 , s t e p : 0 . 1 , min : 0 . 1 , max : 4 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ; v a r
s t r 1 = j . toFixed ( 1 ) ; return s t r 1+” v ” ; } } } ,
controldigitalT
=[{ rows : [ { v i e w : ” f i e l d s e t ” , l a b e l : ” R e f e r e n c i a ” , body : { i d : ” refDT ” , v i e w : ” s l i d e r ” ,
v a l u e : 5 , s t e p : 0 . 1 , min : 0 , max : 1 0 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ;
var s t r 1 = j . toFixed ( 1 ) ; return s t r 1+” v ” ; } } } ,
{ v i e w : ” f i e l d s e t ” , l a b e l : ” Tiempo de
M u e s t r e o ” , body : { i d : ” tiempoDT ” , v i e w : ” s l i d e r ” , v a l u e : 6 5 , s t e p : 1 , min : 3 0 , max :
1 0 0 , t i t l e : webix . t e m p l a t e ( ”#v a l u e# v ” ) } } ,
{ v i e w : ” f i e l d s e t ” , l a b e l : ” C o n t r o l a d o r ” , body : { v i e w : ” c a r o u s e l ” , w i d t h : 2 5 0 ,
h e i g h t : 5 0 , c o l s : [ { c s s : ” image ” , t e m p l a t e : img ,
d a t a : { s r c : ” imgs / c o n t r o l a d o r . j p g ” } } ] ,
navigation :{ items : f a l s e , type : ” s i d e ” , buttons : f a l s e }}} ,
{ i d : ”a1T” , v i e w : ” t e x t ” ,
v a l u e : ’ 0 ’ , v a l i d a t e : webix . r u l e s . isNumber , name : ”a1T” , on : { ’ onChange ’ : f u n c t i o n
( newv , o l d v ) { t h i s . v a l i d a t e ( ) ; } } } ,
{ i d : ”a2T” , v i e w : ” t e x t ” ,
v a l u e : ’ 0 ’ , v a l i d a t e : webix . r u l e s . isNumber , name : ”a2T” , on : { ’ onChange ’ : f u n c t i o n
( newv , o l d v ) { t h i s . v a l i d a t e ( ) ; } } } ,
{ i d : ”a3T” , v i e w : ” t e x t ” ,
v a l u e : ’ 0 ’ , v a l i d a t e : webix . r u l e s . isNumber , name : ”a3T” , on : { ’ onChange ’ : f u n c t i o n
( newv , o l d v ) { t h i s . v a l i d a t e ( ) ; } } } ] } ] } } ,
{ v i e w : ” f i e l d s e t ” , body : { c o l s : [ { v i e w : ” b u t t o n ” , l a b e l : ” D e t e n e r Prueba ” ,
type : ” danger ” , c l i c k : d e t e n e r } ,{ view : ” button ” , l a b e l : ” Borrar
Datos ” , c l i c k : r e f r e s c a r } ] }
}]}];
},
{ v a l u e : ”#Vo#” ,
i t e m : { b o r d e r C o l o r : ”#0101DF” , c o l o r :
”# f f f f f f ” , t y p e : ” o ” , r a d i u s : 0 , borderWidth : 1 } ,
l i n e : { c o l o r : ”#0101DF” , w i d t h : 3 } ,
t o o l t i p : { t e m p l a t e : ”#Tiempo# , #Vo#” }
}
] , id : ” tabla2 ” ,
data : [ ]
}]
},
{ i d : ”<span c l a s s =’ w e b i x i c o n f a −t a b l e ’></span>Tabla ” ,
rows : [ { v i e w : ” d a t a t a b l e ” , columns : [
{ i d : ” rank ” , header : ”” , c s s : ” rank ” , width : 5 0 } ,
{ i d : ” Tiempo ” , h e a d e r : ” Tiempo ( s ) ” , w i d t h : 3 1 0 } ,
{ i d : ” Vi ” , header : ” Voltaje de Entrada ( v ) ” , w i d t h : 3 1 0 } ,
{ i d : ”Vo” , h e a d e r : ” V o l t a j e de S a l i d a ( v ) ” , w i d t h : 3 1 0 }
],
a u t o w i d t h : f a l s e , i d : ” t a b l a ” , s e l e c t : ” row ” , c s s : ” m y s t y l e ” ,
data : [ ] ,
},
{ c o l s : [ { view : ” segmented ” , o p t i o n s : [ ”” ] } ,
{ v i e w : ” b u t t o n ” , t y p e : ” i c o n B u t t o n ” , i c o n : ” c l o u d −download ” , l a b e l : ” E x p o r t a r
Excel ” , width : 1 5 0 , c l i c k : e x p o r t a r e x c e l } ,
{ view : ” segmented ” , o p t i o n s : [ ”” ] } ] } } ] ;
colum1 =[{ v i e w : ” s c r o l l v i e w ” , i d : ” v e r s e s ” , s c r o l l : ” y ” ,
body : { rows : [ { v i e w : ” t a b v i e w ” , a n i m a t e : t r u e , c e l l s : menu1 } ] } } ] ;
p i e p a g p r i n c i p a l =[
{ c s s : ” header ” } ,
{ c s s : ” header ” , view : ” c a r o u s e l ” , h e i g h t : 1 5 2 , width : 4 7 8 , i d : ” c a r o u s e l 1 ” ,
s c r o l l S p e e d : ” 500ms” ,
animate : { type : ” f l i p ” , subtype : ” v e r t i c a l ” } ,
navigation :{ items : f a l s e , type : ” s i d e ” , buttons : true } ,
c o l s : [ { t e m p l a t e : img , d a t a : { s r c : ” imgs / i m a g e 0 0 1 . j p g ” } } , { t e m p l a t e : img , d a t a : {
s r c : ” imgs / i m a g e 0 0 2 . j p g ” } } ] } ,
{ c s s : ” header ” } ] ;
p a g i n a p r i n c i p a l =[
{ c o l s : [ { c s s : ” h e a d e r ” , t e m p l a t e : img , d a t a : { s r c : ” imgs / i m a g e 0 0 3 . j p g ” } , w i d t h : 3 6
3} ,
{ rows : [ { v i e w : ” l a b e l ” , l a b e l : ” P l a n t a de Temperatura ” ,
align : ” center ” , css : ” t i t u l o ” , height :100} ,
{ height :212 ,
t e m p l a t e : ” html−>my box ” , c s s : ” c u e r p o ” , w i d t h : 9 0 5 } , { c s s : ” h e a d e r ” }
]} ,
{ c s s : ” header ”}
]} ,
{ cols : piepagprincipal }];
<!−− f u n c i o n e s p a r a e n v i a r d a t o s −−>
f u n c t i o n d e t e n e r ( ) { PUBNUB demo . p u b l i s h ( { c h a n n e l : ’ p a b l o ’ , m e s s a g e :
” f ” });}
f u n c t i o n v e n t i l a c i o n ( ) { PUBNUB demo . p u b l i s h ( { c h a n n e l : ’ p a b l o ’ , m e s s a g e :
”e” });}
ANEXOS 101
+ ” , ”+ $$ ( ”b0T” ) . g e t V a l u e ( ) + ” , ”+ $$ ( ”b1T” ) . g e t V a l u e ( ) + ” , ”+
$$ ( ”b2T” ) . g e t V a l u e ( ) + ” , ”+ $$ ( ”b3T” ) . g e t V a l u e ( )
+ ” , ”+ $$ ( ”a0T” ) . g e t V a l u e ( ) + ” , ”+ $$ ( ”a1T” ) . g e t V a l u e ( ) + ” , ”+
$$ ( ”a2T” ) . g e t V a l u e ( ) + ” , ”+ $$ ( ”a3T” ) . g e t V a l u e ( )
});
}
<!−− f u n c i o n e s de r e c i b i r d a t o s −−>
function cerrarsesion (){
refrescar ();
window . l o c a t i o n=” h t t p : / /www. e s t a c i o n r e m o t a . n e t 7 6 . n e t / ” ;
}
f u n c t i o n img ( o b j ) { return ’<img s r c =” ’+o b j . s r c+ ’ ” c l a s s =” c o n t e n t ”
o n d r a g s t a r t =” r e t u r n f a l s e ”/> ’ }
f u n c t i o n NumeroAceptable ( v a l u e ) { i f ( v a l u e >−1000){ i f ( v a l u e <1000){ return
v a l u e }}}
function r e f r e s c a r (){
$$ ( ” t a b l a ” ) . c l e a r A l l ( ) ;
$$ ( ” t a b l a 2 ” ) . c l e a r A l l ( ) ;
}
<!−− f u n c i o n e s de e x p o r t a r d a t o s −−>
function exportarexcel (){
$$ ( ” t a b l a ” ) . e x p o r t T o E x c e l ( ) }
function r e l o j i l l o (){
f e c h a = new Date ( )
h o r a = f e c h a . g e t H o u r s ()+ ” : ”+f e c h a . g e t M i n u t e s ()+ ” : ”+f e c h a . g e t S e c o n d s ( )
setTimeout ( ’ r e l o j i l l o ( ) ’ ,1000)
v a r i a b l e j s=v a r i a b l e j s −1;
i f ( v a r i a b l e j s ==0){
cerrarsesion ();}}
i f ( v a r i a b l e j s ==1){
a l e r t ( ” F a l t a n 10 Minutos p a r a c e r r a r s e s i o n , Por f a v o r g u a r d a r archivo
Excel ” ) ;
}}}
</ s c r i p t >
< s c r i p t s r c=” h t t p s : / / cdn . pubnub . com/ pubnub−dev . j s ”></ s c r i p t >
< s c r i p t t y p e=” t e x t / j a v a s c r i p t ”>
PUBNUB demo1 . s u b s c r i b e ( {
channel : ’ emilio ’ ,
m e s s a g e : f u n c t i o n (m) {
v a r d a t o s= m. s p l i t ( ” , ” ) ;
$$ ( ” t a b l a ” ) . add ( { r a n k : d a t o s [ 3 ] , Tiempo :
d a t o s [ 0 ] , Vi : d a t o s [ 1 ] , Vo : d a t o s [ 2 ] } )
$$ ( ” t a b l a 2 ” ) . add ( { r a n k : d a t o s [ 3 ] , Tiempo :
d a t o s [ 0 ] , Vi : d a t o s [ 1 ] , Vo : d a t o s [ 2 ] } ) } } ) ;
</ s c r i p t >
</body>
</html>
</head>
<body o n l o a d=” r e l o j i l l o ( ) ”>
l e t t e r −s p a c i n g : 0 . 5 px ;
b o r d e r : 1 px s o l i d #FFFFFF ;
b o r d e r −bottom−r i g h t −r a d i u s : 3em ;
}
</ s t y l e >
<s t y l e >
. my style . webix hcell {
t e x t −a l i g n : c e n t e r ;
background :#009966;
c o l o r : white ;
f o n t −w e i g h t : b o l d ;
}
. m y s t y l e . webix column {
t e x t −a l i g n : c e n t e r ;
f o n t −s t y l e : i t a l i c ;
b a c k g r o u n d :#ddFFdd ;
}
. m y s t y l e . webix column > div {
b o r d e r −c o l o r :#ddd ;
}
</ s t y l e >
< s c r i p t t y p e=” t e x t / j a v a s c r i p t ” c h a r s e t=” u t f −8”>
l o g i n = [ { c o l s : [ { v i e w : ” t e x t ” , h e i g h t : 3 0 , t y p e : ’ p a s s w o r d ’ , v a l u e : ’ 123 p a s s ’ ,
l a b e l : ” Clave : ” , labelWidth : 8 0 } ,
{ view : ” button ” , h e i g h t : 3 0 , width : 8 0 , a l i g n : ” c e n t e r ” , v a l u e : ” Login ” ,
t y p e : ” form ” , c l i c k : ” $$ ( ’ win3 ’ ) . c l o s e ( ) ; ” } ] } ] ;
escalonV =
[ { rows : [ { v i e w : ” f i e l d s e t ” , l a b e l : ” R e f e r e n c i a ” , body : { i d : ” e s c a l V ” , v i e w : ” s l i d e r ” , va
l u e : 0 , s t e p : 0 . 1 , min : −10 , max : 1 0 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ; v a r
s t r 1 = j . toFixed ( 1 ) ; return s t r 1+” v ” ; } } } ,
{ view : ” button ” , h e i g h t : 3 0 , width : 8 0 , a l i g n : ” c e n t e r ” , v a l u e : ” Enviar ” ,
t y p e : ” form ” , c l i c k : enviarEV } ] } ] ;
f r e c u e n c i a V =[{ rows : [ { v i e w : ” f i e l d s e t ” , l a b e l : ” V o l t a j e p i c o a
p i c o ” , body : { i d : ”VppV” , v i e w : ” s l i d e r ” , l a b e l W i d t h : 1 0 0 , v a l u e : 1 0 , s t e p : 0 . 1 ,
min : 0 , max : 2 0 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ; v a r s t r 1 =
j . toFixed ( 1 ) ; return s t r 1+” v ” ; } } } ,
{ v i e w : ” f i e l d s e t ” , l a b e l : ” O f f s e t ” , body : { i d : ” o f f V ” , v i e w : ” s l i d e r ” , l a b e l W i d t h : 1 0 0 , v
a l u e : 0 , s t e p : 0 . 1 , min : − 8 . 0 , max : 8 . 0 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ;
var s t r 1 = j . toFixed ( 1 ) ; return s t r 1+” v ” ; } } } ,
{ view : ” f i e l d s e t ” , l a b e l : ” F r e c u e n c i a
( Hz ) ” , body : { i d : ” f r e c V ” , v i e w : ” s l i d e r ” , l a b e l W i d t h : 1 0 0 , v a l u e : 1 , s t e p : 0 . 1 ,
min : 0 . 1 , max : 4 0 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ; v a r s t r 1 =
j . toFixed ( 1 ) ; return s t r 1+” Hz” ; } } } ,
{ view : ” button ” , h e i g h t : 3 0 , width : 8 0 , a l i g n : ” c e n t e r ” , v a l u e : ” Enviar ” ,
t y p e : ” form ” , c l i c k : enviarFV } ] } ] ;
controlonoffV
=[{ rows : [ { v i e w : ” f i e l d s e t ” , l a b e l : ” R e f e r e n c i a ” , body : { i d : ” r e f V ” , v i e w : ” s l i d e r ” , l a b
e l W i d t h : 1 0 0 , v a l u e : 0 , s t e p : 0 . 1 , min : −10 , max : 1 0 , t i t l e : f u n c t i o n ( o b j ) { v a r
j=o b j . v a l u e ; v a r s t r 1 = j . t o F i x e d ( 1 ) ; return s t r 1+” v ” ; } } } ,
{ v i e w : ” f i e l d s e t ” , l a b e l : ” H i s t e r e s i s ” , body : { i d : ”hV” , v i e w : ” s l i d e r ” , l a b e l W i d t h : 1 0 0 ,
v a l u e : 2 , s t e p : 0 . 1 , min : 0 . 1 , max : 4 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ; v a r
s t r 1 = j . toFixed ( 1 ) ; return s t r 1+” v ” ; } } } ,
{ view : ” button ” , h e i g h t : 3 0 , width : 8 0 , a l i g n : ” c e n t e r ” , v a l u e : ” Enviar ” ,
t y p e : ” form ” , c l i c k : enviarOV } ] } ] ;
controldigitalV
=[{ rows : [ { v i e w : ” f i e l d s e t ” , l a b e l : ” R e f e r e n c i a ” , body : { i d : ” refDV ” , v i e w : ” s l i d e r ” ,
v a l u e : 0 , s t e p : 0 . 1 , min : −10 , max : 1 0 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ;
var s t r 1 = j . toFixed ( 1 ) ; return s t r 1+” v ” ; } } } ,
{ v i e w : ” f i e l d s e t ” , l a b e l : ” Tiempo de
M u e s t r e o ” , body : { i d : ” tiempoDV ” , v i e w : ” s l i d e r ” , v a l u e : 0 . 0 0 5 , s t e p : 0 . 0 0 1 ,
min : 0 . 0 0 1 , max : 0 . 0 1 , t i t l e : f u n c t i o n ( o b j ) { v a r j=o b j . v a l u e ; v a r s t r 1 =
j . toFixed ( 3 ) ; return s t r 1+” s ” ; } } } ,
{ v i e w : ” f i e l d s e t ” , l a b e l : ” C o n t r o l a d o r ” , body : { v i e w : ” c a r o u s e l ” , w i d t h : 2 5 0 ,
h e i g h t : 5 0 , c o l s : [ { c s s : ” image ” , t e m p l a t e : img ,
d a t a : { s r c : ” imgs / c o n t r o l a d o r . j p g ” } } ] ,
navigation :{ items : f a l s e , type : ” s i d e ” , buttons : f a l s e }}} ,
{ i d : ”b1V” , v i e w : ” t e x t ” ,
v a l u e : ’ 0 ’ , v a l i d a t e : webix . r u l e s . isNumber , name : ”b1V” , on : { ’ onChange ’ : f u n c t i o n
( newv , o l d v ) { t h i s . v a l i d a t e ( ) ; } } } ,
{ i d : ”b2V” , v i e w : ” t e x t ” ,
v a l u e : ’ 0 ’ , v a l i d a t e : webix . r u l e s . isNumber , name : ”b2V” , on : { ’ onChange ’ : f u n c t i o n
( newv , o l d v ) { t h i s . v a l i d a t e ( ) ; } } } ,
{ i d : ”b3V” , v i e w : ” t e x t ” ,
v a l u e : ’ 0 ’ , v a l i d a t e : webix . r u l e s . isNumber , name : ”b3V” , on : { ’ onChange ’ : f u n c t i o n
( newv , o l d v ) { t h i s . v a l i d a t e ( ) ; } } } ] } ] } } ,
menu1= [ { i d : ” V e l o c i d a d ” , h e a d e r : ”<span c l a s s =’ w e b i x i c o n f a −r e f r e s h
f a −s p i n ’></span> V e l o c i d a d ” , rows : [ { v i e w : ” l a b e l ” , l a b e l : ”<span
c l a s s =’ w e b i x i c o n f a −c o g f a −s p i n ’></span>
S e l e c c i o n e Prueba a R e a l i z a r ” , inputWidth : 1 0 0 , a l i g n : ” c e n t e r ” } ,
{ view : ” a c c o r d i o n ” , multi : f a l s e ,
{ i d : ”<span c l a s s =’ w e b i x i c o n f a −t a b l e ’></span>Tabla ” ,
rows : [ { v i e w : ” d a t a t a b l e ” , columns : [
{ i d : ” rank ” , header : ”” , c s s : ” rank ” , width : 5 0 } ,
{ i d : ” Tiempo ” , h e a d e r : ” Tiempo ( s ) ” , w i d t h : 3 1 0 } ,
{ i d : ” Vi ” , header : ” Voltaje de Entrada ( v ) ” , w i d t h : 3 1 0 } ,
ANEXOS 105
{ i d : ”Vo” , h e a d e r : ” V o l t a j e de S a l i d a ( v ) ” , w i d t h : 3 1 0 }
],
a u t o w i d t h : f a l s e , i d : ” t a b l a ” , s e l e c t : ” row ” , c s s : ” m y s t y l e ” ,
data : [ ] ,
},
{ c o l s : [ { view : ” segmented ” , o p t i o n s : [ ”” ] } ,
{ v i e w : ” b u t t o n ” , t y p e : ” i c o n B u t t o n ” , i c o n : ” c l o u d −download ” , l a b e l : ” E x p o r t a r
Excel ” , width : 1 5 0 , c l i c k : e x p o r t a r e x c e l } ,
{ view : ” segmented ” , o p t i o n s : [ ”” ] }
]}
]}
];
colum1 =[ { v i e w : ” s c r o l l v i e w ” , i d : ” v e r s e s ” , s c r o l l : ” y ” ,
body : { rows : [ { v i e w : ” t a b v i e w ” , a n i m a t e : t r u e , c e l l s : menu1 } ] } } ] ;
p i e p a g p r i n c i p a l =[
{ c s s : ” header ” } ,
{ c s s : ” header ” , view : ” c a r o u s e l ” , h e i g h t : 1 5 2 , width : 4 7 8 , i d : ” c a r o u s e l 1 ” ,
s c r o l l S p e e d : ” 500ms” ,
animate : { type : ” f l i p ” , subtype : ” v e r t i c a l ” } ,
navigation :{ items : f a l s e , type : ” s i d e ” , buttons : true } ,
c o l s : [ { t e m p l a t e : img , d a t a : { s r c : ” imgs / i m a g e 0 0 1 . j p g ” } } , { t e m p l a t e : img , d a t a : {
s r c : ” imgs / i m a g e 0 0 2 . j p g ” } } ] } ,
{ c s s : ” header ” } ] ;
p a g i n a p r i n c i p a l =[
{ c o l s : [ { c s s : ” h e a d e r ” , t e m p l a t e : img , d a t a : { s r c : ” imgs / i m a g e 0 0 4 . j p g ” } , w i d t h : 3 6
3} ,
{ rows : [ { v i e w : ” l a b e l ” , l a b e l : ” P l a n t a de V e l o c i d a d ” ,
align : ” center ” , css : ” t i t u l o ” , height :100} ,
{ height :212 ,
t e m p l a t e : ” html−>my box ” , c s s : ” c u e r p o ” , w i d t h : 9 0 5 } , { c s s : ” h e a d e r ” }
]} ,
{ c s s : ” header ”}
]} ,
{ cols : piepagprincipal }];
{ c o l s : [ { view : ” t o o l b a r ” ,
paddingY : 2 , c o l s : [ { t y p e : ” h e a d e r ” , b o r d e r l e s s : t r u e , t e m p l a t e : ” E s t a c i o n
Remota” , w i d t h : 1 1 6 1 } ,
{ view : ” button ” , v a l u e : ” C e r r a r S e s i o n ” , width : 1 0 5 ,
align : ” right ” , click : cerrarsesion }]}]} ,
{ c o l s : [ { w i d t h : 3 3 0 , rows : colum1 } ,
{ v i e w : ” t a b v i e w ” , a n i m a t e : t r u e , c e l l s : menu2 } ] } ,
]
}
});
PUBNUB demo . p u b l i s h ( { c h a n n e l : ’ v e l o c i d a d 1 ’ , m e s s a g e :
$$ ( ”VppV” ) . g e t V a l u e ( ) + ” , ”+ $$ ( ” o f f V ” ) . g e t V a l u e ()+ ” , ”+
$$ ( ” f r e c V ” ) . g e t V a l u e ( ) });
}
$$ ( ” r e f V ” ) . g e t V a l u e ( ) + ” , ”+ $$ ( ”hV” ) . g e t V a l u e ( ) });
}
m e s s a g e : $$ ( ” refDV ” ) . g e t V a l u e ( ) + ” , ”+ $$ ( ” tiempoDV ” ) . g e t V a l u e ( )
+ ” , ”+ $$ ( ”b0V” ) . g e t V a l u e ( ) + ” , ”+ $$ ( ”b1V” ) . g e t V a l u e ( ) + ” , ”+
$$ ( ”b2V” ) . g e t V a l u e ( ) + ” , ”+ $$ ( ”b3V” ) . g e t V a l u e ( )
+ ” , ”+ $$ ( ”a0V” ) . g e t V a l u e ( ) + ” , ”+ $$ ( ”a1V” ) . g e t V a l u e ( ) + ” , ”+
$$ ( ”a2V” ) . g e t V a l u e ( ) + ” , ”+ $$ ( ”a3V” ) . g e t V a l u e ( )
});
}
<!−− f u n c i o n e s de r e c i b i r d a t o s −−>
function cerrarsesion (){
refrescar ();
window . l o c a t i o n=” h t t p : / /www. e s t a c i o n r e m o t a . n e t 7 6 . n e t / ” ;
}
f u n c t i o n img ( o b j ) { return ’<img s r c =” ’+o b j . s r c+ ’ ” c l a s s =” c o n t e n t ”
o n d r a g s t a r t =” r e t u r n f a l s e ”/> ’ }
f u n c t i o n NumeroAceptable ( v a l u e ) { i f ( v a l u e >−1000){ i f ( v a l u e <1000){ return
v a l u e }}}
function r e f r e s c a r (){
$$ ( ” t a b l a ” ) . c l e a r A l l ( ) ;
$$ ( ” t a b l a 2 ” ) . c l e a r A l l ( ) ;
}
<!−− f u n c i o n e s de e x p o r t a r d a t o s −−>
function exportarexcel (){
$$ ( ” t a b l a ” ) . e x p o r t T o E x c e l ( )
function r e l o j i l l o (){
f e c h a = new Date ( )
h o r a = f e c h a . g e t H o u r s ()+ ” : ”+f e c h a . g e t M i n u t e s ()+ ” : ”+f e c h a . g e t S e c o n d s ( )
setTimeout ( ’ r e l o j i l l o ( ) ’ ,1000)
i f ( h o r a==” 0 : 0 : 0 ” | | h o r a==” 2 : 0 : 0 ” | | h o r a==” 4 : 0 : 0 ” | | h o r a==” 6 : 0 : 0 ” | |
h o r a==” 8 : 0 : 0 ” | | h o r a==” 1 0 : 0 : 0 ” | | h o r a==” 1 2 : 0 : 0 ” | | h o r a==” 1 4 : 0 : 0 ” | |
h o r a==” 1 6 : 0 : 0 ” | | h o r a==” 1 8 : 0 : 0 ” | | h o r a==” 2 0 : 0 : 0 ” | | h o r a==” 2 2 : 0 : 0 ” ) {
cerrarsesion ();}
i f ( h o r a==” 1 : 5 0 : 0 ” | | h o r a==” 3 : 5 0 : 0 ” | | h o r a==” 5 : 5 0 : 0 ” | | h o r a==” 7 : 5 0 : 0 ”
| | h o r a==” 9 : 5 0 : 0 ” | | h o r a==” 1 1 : 5 0 : 0 ” | | h o r a==” 1 3 : 5 0 : 0 ” | |
h o r a==” 1 5 : 5 0 : 0 ” | | h o r a==” 1 7 : 5 0 : 0 ” | | h o r a==” 1 9 : 5 0 : 0 ” | |
h o r a==” 2 1 : 5 0 : 0 ” | | h o r a==” 2 3 : 5 0 : 0 ” ) {
PUBNUB demo1 . s u b s c r i b e ( {
channel : ’ velocidad2 ’ ,
m e s s a g e : f u n c t i o n (m) {
v a r d a t o s= m. s p l i t ( ” , ” ) ;
$$ ( ” t a b l a ” ) . add ( { r a n k : d a t o s [ 3 ] , Tiempo :
d a t o s [ 0 ] , Vi : d a t o s [ 1 ] , Vo : d a t o s [ 2 ] } )
$$ ( ” t a b l a 2 ” ) . add ( { r a n k : d a t o s [ 3 ] , Tiempo :
d a t o s [ 0 ] , Vi : d a t o s [ 1 ] , Vo : d a t o s [ 2 ] } )
}});
</ s c r i p t >
</body>
</html>
Bibliografı́a
[1] Diana Marcela Ovalle Martı́nez, Joel Mateo Moreno, Luis Francisco Combita Proyecto de
Investigación: “Diseño e implementación de plantas básicas para la enseñanza de conceptos
de control en ingenierı́a”. Grupo de investigación IDEAS, Universidad Distrital Francisco
José de Caldas. Facultad de Ingenierı́a. Bogotá, abril 2013.
[2] Luigi Atzori, Antonio Iera y Giacomo Morabito, “The Internet of Things: A survey”.
Octubre, 2010.
[3] Jayavardhana Gubbi, Rajkumar Buyya, Slaven Marusic y Marimuthu Palaniswami, “In-
ternet of Things (IoT): A vision, architectural elements, and future directions”. Septiem-
bre, 2013.
[5] Texas Instruments, “Datasheet LM35 Precision Centigrade Temperature Sensors ”. 2015
En lı́nea. Available: http:www.ti.comlitdssymlinklm35.pdf.
[7] Charles Close, “Modeling and Analysis of Dynamic Systems”. Jhon Wiley y Sons INC.
1995.
[9] Intel Communities, Sampling Rate of the Analog Inputs, En lı́nea. Available:
https://communities.intel.com/thread/48109start=0&tstart=0.
[16] F. Halsall, “Computer Networking and the internet”. Editorial Pearson, 2005.
[21] Charles L. Phillips y H. Troy Nagle, “Digital Control System Analysis and Design”.
Editorial Prentice Hall, 1995.
[22] Maestro de la web, Los diferentes lenguajes de programación para la web, En lı́nea. Avai-
lable: http://www.maestrosdelweb.com/los-diferentes-lenguajes-de-programacion-para-la-
web/
[23] J. D. Gauchat, “El gran libro de HTML5, CSS3 y JavaScript”. Editorial Marcombo,
2012.
[25] Helma Spona, “Programación de bases de datos con MySQL y PHP ”. Editorial Mar-
combo, 2008.
[26] Ángel Cobo, Patricia Gómez, Daniel Pérez y Rocio Rocha, “MySQL y PHP: Tecnologı́as
para el desarrollo de aplicaciones web”. Editorial Marcombo, 2008.
[34] S. Sitnikov, A. Borisov, B. Kruk y N. Popov, “Remote Access Laboratory for Analog
and Digital Electronic Course, EUROCON - International Conference on Computer as a
Tool (EUROCON), Conference LISBON, pp. 1-4, 2011.
[37] F. Scriptore, J. Guerra, D. Laperuta y R. Mikami, “Web system for managing a remote
access laboratory: a tool for a computer networks disciplines, Remote Engineering and
Virtual Instrumentation (REV), 11th International Conference on, pp. 35-40, 2014.