Professional Documents
Culture Documents
NCLEO ANZOTEGUI
ESCUELA DE INGENIERA Y CIENCIAS APLICADAS
DEPARTAMENTO DE ELECTRICIDAD
Realizado Por:
CESAR JESS BRITO BOLVAR
C.I. 19.675.148
UNIVERSIDAD DE ORIENTE
NCLEO ANZOTEGUI
ESCUELA DE INGENIERA Y CIENCIAS APLICADAS
DEPARTAMENTO DE ELECTRICIDAD
ASESOR:
_____________________
Ing. Danilo Navarro
UNIVERSIDAD DE ORIENTE
NCLEO ANZOTEGUI
ESCUELA DE INGENIERA Y CIENCIAS APLICADAS
DEPARTAMENTO DE ELECTRICIDAD
_______________________
Ing. Verena Mercado
Jurado Principal
_______________________
Ing. Luis Parraguez
Jurado Principal
RESOLUCIN
con
el
consentimiento
del
Consejo
de
Ncleo
iv
DEDICATORIA
AGRADECIMIENTOS
vi
RESUMEN
la
verificacin
y validacin
de la
metodologa
se
utiliz
vii
NDICE
RESOLUCIN ............................................................................................... IV
DEDICATORIA ............................................................................................... V
AGRADECIMIENTOS ................................................................................... VI
RESUMEN .................................................................................................... VII
NDICE ......................................................................................................... VIII
LISTA DE FIGURAS ................................................................................... XIII
LISTA DE TABLAS ..................................................................................... XV
CAPITULO1: INTRODUCCIN.................................................................... 16
1.1 PLANTEAMIENTO DEL PROBLEMA................................................. 16
1.2. JUSTIFICACIN Y ALCANCE. ......................................................... 18
1.3.
OBJETIVOS. .................................................................................. 18
viii
xi
xii
LISTA DE FIGURAS
xiii
xiv
LISTA DE TABLAS
xv
16
CAPITULO1: INTRODUCCIN
En este trabajo de investigacin se describe el diseo y desarrollo de
un sistema de adquisicin, supervisin y control, el cual est enfocado en ser
una alternativa econmica y libre a la hora de probar sensores, actuadores,
monitorear plantas pilotos e incluso aplicarles control. El sistema se basa en
la comunicacin entre un hardware de adquisicin (Tarjeta de adquisicin de
datos)
electrnico
hardware
esta
compuesto
principalmente
de
un
1.1
17
18
1.3.
OBJETIVOS.
19
de
gama
media-alta
como
tarjetas
de
adquisicin de datos.
20
21
En
esta
tapa
se
estudiaran
las
hojas
de
datos
de
los
22
dar a
23
24
25
2.1.1.1.2. PC + Software
26
Por otro lado, este software puede comunicarse directamente con los
dispositivos externos (proceso) o bien
27
2.1.4. Microcontroladores.
Un
microcontrolador
es
un
circuito
integrado
que
incorpora
28
29
compactas,
pero
la
vez
potentes.
Dedicados
30
2.1.4. Arduino
para
facilitar
el
uso
de
la
electrnica
en
proyectos
31
Arduino
Microcontrolador
Digital
I/O
Entradas
Analogicas
Flash
PWM
SRAM
EEPROM
Clock
Speed
Interfaz
USB
Memory
UNO
ATmega328
14
32KB
2KB
1KB
Decimila
ATmega168
14
16KB
1KB
512 bytes
1KB/2K
B
512bytes/1K
B
Duemilanov
e
ATmega168/328P
14
16KB/32K
B
Mega
ATmega1280
54
16
14
128KB
8KB
4KB
Mega2560
ATmega2560
54
16
15
256KB
8KB
4KB
Nano
ATmega168/328
14
128KB
8KB
4KB
16
MHz
16
MHz
16
MHz
16
MHz
16
MHz
16
MHz
ATmega8U
2
FTDI
FTDI
FTDI
ATmega8U
2
FTDI
2.1.5. Pingino.
datos
del
exterior
travs
de sensores o
32
bsicamente enviar datos digitales sobre una lnea de bit en bit, existen
varias maneras de hacerlo y el proceso de compresin entre el transmisor y
el receptor puede variar. Esto da lugar a diversas normas y mtodos de
comunicacin serie que son conocidos como protocolos. (Hoffman, P. 2006).
33
Existen tres versiones del protocolo (1.0, 1.1 y 2.0). A diferencia de las
anteriores, la ltima versin (2.0) soporta tasas de transferencia de altas
velocidades, comparables (o incluso superiores) a la de un disco duro o
almacenamiento magntico, lo cual ha permitido ampliar el uso del USB a
aplicaciones de video y almacenamiento (discos duros externos). Una de las
razones a la cual se atribuye su gran popularidad es que todas las versiones
del protocolo son compatibles hacia atrs. Es decir, que cualquier dispositivo
2.0 puede ser conectado a un dispositivo 1.0,
velocidad del ms lento.
aunque funcionar la
34
TIPO
Baja velocidad (low speed)
VELOCIDAD
183 Kbytes/s (1.5Mbit/s)
2.1.7.1. Topologa
35
2.1.7.2. Funcionamiento.
Los
dispositivos
tienen
asociados
unos
canales
lgicos
dispositivo puede enviar datos sin la solicitud previa explcita del host
controlador.
36
ser
reutilizados
entre
varias
interfaces
distintas
configuraciones.
37
Las seales USB son transmitidas en un par trenzado (cuyos hilos son
denominados D+ y D-) utilizando sealizacin diferencial half-duplex
minimizando el ruido electromagntico en tramos largos. El diseo elctrico
permite un largo mximo de 5 metros (sin precisar un repetidor intermedio).
Existen dos tipos de conectores estndar y mini. Los estndar son los
que tpicamente encontramos en un computador y vienen en dos tipos: A y B.
El tipo A es el que es chato y se encuentra del lado del host controlador,
mientras que el tipo B es el cuadrado y se encuentra del lado del dispositivo.
Todos los cables son machos, mientras que los enchufes (ya sea en la
computadora o los dispositivos) son hembra. No existen intercambiadores de
gnero puesto que las conexiones cclicas no estn permitidas en un bus
USB. Los conectores mini siguen la misma poltica que los estndar pero son
utilizados para dispositivos pequeos como Palm y celulares. Los pines de
un cable USB son los siguientes:
Tabla 2.0.3 Pines del bus USB
Pin
Color
Funcin
1 Rojo
BUS(4.4 - 5.25 V)
2 Blanco
D3 Verde
D+
4
Tierra
En corto con pin 4 en conector Mini5
A, utilizado para USB On-The-Go
38
39
2.1.7.5. Potencia
40
41
Cdigo
0x00
0x01
0x03
0x07
0x08
0x09
0x0A
0x0E
0xE0
0xFF
Clase
Reservado. Usado en el descriptor de dispositivo para indicar que
la clase est identificada en l (o los) descriptores de interfaz.
Dispositivo de audio. Por ejemplo; tarjetas de sonidos
Dispositivo de interfaz humana (HID). Por ejemplo: mouses,
teclados, joystick.
Impresoras
Dispositivo de almacenamiento masivo. Por ejemplo: discos
duros, lectores de memoria, cmaras digitales, reproductores
MP3.
Hubs
Dispositivo de comunicacin (CDC por sus siglas en ingls). Por
ejemplo: mdems, tarjetas de red.
Dispositivo de video. Por ejemplo: webcams
Controladores inalmbricos. Por ejemplo: adaptadores Bluetooth.
Reservado. Usado para indicar que el dispositivo tiene un driver
personalizado propio que no pertenece a ninguna clase.
42
digitales y mixtos. Con una librera que supera los 6000 modelos de
componentes, abac todo el proceso de diseo de cualquier proyecto
electrnico.
43
44
45
46
47
48
2.1.12. Python
49
2.1.13. wxPython
50
2.1.14. PyUSB
PyUSB
tiene
como
objetivo
proporcionar
2.1.15. PySerial
Lenguaje: Ingls.
51
2.1.16. Matplolib
52
2.1.17. Sqlite3
El mdulo del sqlite3 fue escrito por Gerhard Hring. Proporciona una
interfaz de SQL compatible con la especificacin de DB-API 2.0 descrito por
PEP 249
53
Termino
Definicin
SQL
Consulta
Cursos
Resultados
Registro
Transaccion
SQLite
NULL
INTEGER
REAL
TEXT
Python
None
54
para
aplicaciones
especficas,
dependiendo
de
las
requeran
de
aplicaciones
adicionales,
las
cuales
fueron
55
56
Nombre
Ignition
Stantor
Proview
Argos
NI
LabVIEW
Tipo
LICENCIA
GPL
LICENCIA
LIBRE
LICENCIA
Compaia
Inductive
Automation
Stantor
Mandator and
SSAB Oxelosund
CINTAL
National
Instruments
Sitio
inductive
automation.com
stantor.free.fr
proview.se
cintal.com.ve
ni.com
Pais
USA
Francia
Suiza
Venezuela
EE.UU
Estado
Ao
ACTIVO
2010
ACTIVO
2010
ACTIVO
2010
ACTIVO
2009
ACTIVO
2012
Lenguaje
Java
C, C++
C, C++ y algo de
Java
C++ / Fltk
S.O.
Linux, Windows,
Mac
Linux Fedora,
Ubuntu and
Mandriva
Linux
Linux
Windows
(Linux,
Mandriva,
RedHat,
SUSE), Mac
OS
Multilenguaje
Si
Si
Si
No
Si
Web HMI
Si
Si
Si
Si
Si
Scripts
Si
Si
Si
Si
Si
Archivado
Si
Si
Si
Si
Si
Tendencia a
avance
Si
Si
Si
Si
Si
Control
Si
Si
Si
Si y Alarmas
Si
Protocolos
OPC UA
Modbus, TCP/IP
Proibus, OPC
Modbus,
TCP/IP
CanBus,
DeviceNet,
Ethernet,
Fieldbus,
Modbus,
Profibus,
Usb/Serial.
Dispositivos
OPC UA
K8000/K8055/K8061/
Arduino, X10 CM11A
ABB, Siemens,
Inor, entre otros.
PLCs
ADQ,
Arduino,
PLCs
57
3.4.1. 1. Propsito.
58
Ejemplos acadmicos.
59
60
Instrumento
(Instrument):
Un
dispositivo
usado
directa
61
Variable
del
proceso
(Process
variable):
Cualquier
variable
62
63
T 103
103
TIC
Identificacin funcional
IC
10-PAH-5A
10
Prefijo opcional
Sufijo opcional
64
Los
trminos
modificadores
alto,
bajo,
medio
intermedio
Primera Letra
Medida o inicio de variables
Letras Subsiguientes
Modificador
Lectura de
Salida o
Funcin
Pasiva
Anlisis
Alarma
Quemador, Combustin
Opcin de
usuario
Opcin de usuario
Control
Opcin de usuario
Voltaje
Flujo
Opcin de usuario
Mano
Corriente Elctrica
Potencia
Funcin de
Salida
Modificador
Opcin de
usuario
Opcin de
usuario
Diferencial
Sensor
(Elemento
Primario)
Radio
(Fraccin)
Vidrio,
Dispositivo de
Visualizacin
Alto
Indicador
Escaneo
65
Primera Letra
Letras Subsiguientes
Lectura de
Salida o
Funcin
Pasiva
Funcin de
Salida
Modificador
Opcin de usuario
Momentneo
Opcin de usuario
Opcin de
usuario
Opcin de usuario
Oficio,
Restriccin
Presin, Vacio
Punto de
Prueba de
conexin
Cantidad
Radiacin
Velocidad, Frecuencia
Temperatura
Multivariable
Peso, Fuerza
No Clasificado
Eje X
Eje Y
Rel,
Conversor,
calculo
Posicin, Dimensin
Eje Z
Actuador,
Elemento final
de Control no
clasificado
Modificador
Medio,
Intermedio
Opcin de
usuario
Opcin de
usuario
Integrado,
Totalizador
Registro
Seguridad
Conmutador
Transmisin
Multifuncin
Multifuncin
Multifuncin
Vlvula,
Amortiguador
Pozo
No Clasificado
No
Clasificado
No Clasificado
66
3.5.2. Color.
67
Color
Significado
Genrico
Negro
Fondo
Elemento
Asociado
a)Parada
Rojo
Emergencia
b)Alarma de alta
prioridad c)Cerrado
d)Apagado(Off)
Amarillo
Alerta
a) Condicin fuera de
lo normal.
b) Alarma de
prioridad media.
a) Operacin Normal
Verde
Seguro
b) Inicio
c) Abierto
Celeste
Azul
Morado
Esttico y significante
No es esencial
Radiacin
a) Equipo de Proceso
en servicio b)
Etiquetas Principales
a) Equipo de Proceso
en espera
b) Tags, etiquetas,
etc.
a) Alarmas de
Radiacin
b) Valores
Cuestionables
a) Medidas e
informaciones de
estado
Blanco
Datos Dinmicos
b) Mensajes del
sistema
c) Tendencias
d) Pasos
secuenciales activos
68
69
70
71
continuacin
se
presentan
las
principales
caractersticas
72
73
de
un
programador
para
incluir
nuevas
funciones
74
En
la
segunda
interfaz
(pc-hardware),
los
datos
son
75
76
77
como se
78
//OUTPUT
/************************************Lazo************************************/
void loop() {
while (Serial.available()>0) { // Mientras haya datos entrantes
for (int i=0; i<10; i++) { // Para cada elemento de la matriz del bfer
buff[i]=buff[i+1]; // Toma el valor del elemento siguiente
}
buff[10]=Serial.read(); // Colocar los datos de entrada en el ltimo
//elemento
switch (buff[10]){
case 'Opcin':
Accin;
break;
} // Fin switch
} // Fin Bucle While
} //Fin Void Loop()
79
80
81
82
4.2.
HARDWARE
DE
ADQUISICIN
UTILIZANDO
MICROCONTROLADDOR PIC Y
COMPILADOR C18 DE
MPLAB IDE.
En este subcaptulo desarrollara una estructura, para utilizar los
micrcontroladores como dispositivos de adquisicin, conectable a pc. Como
se mencion anteriormente la comunicacin ser a travs del puerto USB,
adems en este se podr habilitar entradas y salidas digitales y analgicas,
para ello microchip proporciona un conjunto de libreras, una librera es una
coleccin de funciones agrupadas por referencia y facilidad de llamada.
Para otorgar comunicacin USB
83
a)
b)
c)
84
que proporciona
Microchip Application Libraries, este ejemplo y fue copiado junto con otras
libreras de microchip, ya que algunas sern modificadas, segn las
necesidades de este proyecto.
85
86
87
USBDeviceTasks();
#endif
ProcessIO(); // Funcin de tareas y comunicacin USB.
}//end while
}//end main
void UserInit(void)
{
}
void ProcessIO(void)
{
if((USBDeviceState < CONFIGURED_STATE)||(USBSuspendControl==1))
return;
if(!USBHandleBusy(USBGenericOutHandle))
//Check if the endpoint has received any data from the host.
{
switch(OUTPacket[0])
//Data arrived, check what kind of command might be in the packet of data.
{
case 0x80:
Accion; // Generalmente esta accin es activar una salida
//digital.
break;
case 0x81:
Dato0=Valor
INPacket[0]=Dato0
88
if(!USBHandleBusy(USBGenericInHandle))
{
USBGenericInHandle = USBGenWrite(USBGEN_EP_NUM,(BYTE*)
&INPacket,USBGEN_EP_SIZE);
}
break;
}
USBGenericOutHandle = USBGenRead (USBGEN_EP_NUM,(BYTE*)
&OUTPacket,USBGEN_EP_SIZE);
}
}//end ProcessIO
//-------------------------USB Callback Functions-----------------------En este segmento como el mismo nombre lo indica, se declararn las
funciones USB Callback. La modificacin de la estructura diseada de este
rengln es totalmente opcional.
// Fin de Estructura
Para entender mejor la estructura, se adapt para que cumpla con las
caractersticas de la tabla 4.9. Se colocara solo las partes de la estructura
que se deben modificar, como lo son el apartado de los includes, los fuses, la
funcin void UserInit(void) y void ProcessIO(void) el cdigo completo se
puede apreciar en el anexo n1xx.
89
Microcontrolador
18f4550
Digitales
Entrada
Analgicas
Salida
6
13
Digitales
PWM
Crystal
4Mhz
Comunicacin
USB
//------------------------------Includes---------------------------------------#include "USB/usb.h
#include "HardwareProfile.h"
#include "USB/usb_function_generic.h"
#include <p18cxxx.h>
#include <portb.h>
#include <pwm.h>
#include <timers.h>
#include <adc.h>
#include <delays.h>
//---------------------------------Fuses---------------------------------------#pragma config PLLDIV = 1
#pragma config CPUDIV = OSC1_PLL2
#pragma config USBDIV = 2
#pragma config FOSC
#pragma config FCMEN
#pragma config IESO
= HSPLL_HS
= OFF
= OFF
= OFF
= ON
90
=3
= OFF
= 32768
= ON
= OFF
= OFF
= OFF
= OFF
= OFF
= OFF
= OFF
= OFF
= OFF
= OFF
= OFF
= OFF
= OFF
91
||
defined(__18F4550)\||
defined(__18F2453)
defined(__18F2458)
||
||defined(__18F4553)
#pragma udata USB_VARIABLES=0x500
#elif defined(__18F4450) || defined(__18F2450)
#pragma udata USB_VARIABLES=0x480
#else
#pragma udata
#endif
unsigned char OUTPacket[64];
unsigned char INPacket[64];
#pragma udata
int anlg1=0;
int anlg2=0;
unsigned int ch0;
unsigned int ch1;
unsigned int ch2;
unsigned int ch3;
unsigned int ch4;
unsigned int ch5;
unsigned int ch6;
unsigned int ch7;
unsigned int ch8;
unsigned int ch9;
unsigned int ch10;
unsigned int ch11;
||
defined(__18F4558)
92
93
94
95
ConvertADC();
while(BusyADC()==1){}
ch0=ReadADC();
SetChanADC(ADC_CH1);
// Esperar que la conversin este completa canal 1
ConvertADC();
while(BusyADC()==1){}
ch1=ReadADC();
SetChanADC(ADC_CH2);
// Esperar que la conversin este completa canal 2
ConvertADC();
while(BusyADC()==1){}
ch2=ReadADC();
SetChanADC(ADC_CH3);
// Esperar que la conversin este completa canal 3
ConvertADC();
while(BusyADC()==1){}
ch3=ReadADC();
SetChanADC(ADC_CH4);
// Esperar que la conversin este completa canal 4
ConvertADC();
while(BusyADC()==1){}
ch4=ReadADC();
96
SetChanADC(ADC_CH5);
// Esperar que la conversin este completa canal 5
ConvertADC();
while(BusyADC()==1){}
ch5=ReadADC();
SetChanADC(ADC_CH6);
// Esperar que la conversin este completa canal 6
ConvertADC();
while(BusyADC()==1){}
ch6=ReadADC();
SetChanADC(ADC_CH7);
// Esperar que la conversin este completa canal 7
ConvertADC();
while(BusyADC()==1){}
ch7=ReadADC();
SetChanADC(ADC_CH8);
// Esperar que la conversin este completa canal 8
ConvertADC();
while(BusyADC()==1){}
ch8=ReadADC();
SetChanADC(ADC_CH9);
// Esperar que la conversin este completa canal 9
ConvertADC();
while(BusyADC()==1){}
97
ch9=ReadADC();
SetChanADC(ADC_CH10);
// Esperar que la conversin este completa canal 10
ConvertADC();
while(BusyADC()==1){}
ch10=ReadADC();
SetChanADC(ADC_CH11);
//Esperar que la conversin este completa canal 11
ConvertADC();
while(BusyADC()==1){}
ch11=ReadADC();
SetChanADC(ADC_CH12);
//Esperar que la conversin este completa canal 12
ConvertADC();
while(BusyADC()==1){}
ch12=ReadADC();
INPacket[1] = ch0; //Asignar Valor analog A0
INPacket[2] = ch1; //Asignar Valor analog A1
INPacket[3] = ch2; //Asignar Valor analog A2
INPacket[4] = ch3; //Asignar Valor analog A3
INPacket[5] = ch4; //Asignar Valor analog A4
INPacket[6] = ch5; //Asignar Valor analog A5
INPacket[7] = ch6; //Asignar Valor analog A6
INPacket[8] = ch7; //Asignar Valor analog A7
98
if(!USBHandleBusy(USBGenericInHandle))
{
USBGenericInHandle = USBGenWrite(USBGEN_EP_NUM,(BYTE*)
&INPacket,USBGEN_EP_SIZE);
/**Se envia los datos contenidos en el array INPacket[] sobre el
endpoint USBGEN_EP_NUM.**/
}
break;
}
USBGenericOutHandle = USBGenRead (USBGEN_EP_NUM,(BYTE*)
&OUTPacket,USBGEN_EP_SIZE);
99
100
101
102
que partes de los cdigos deben ser modificadas para ser compatibles con
las otras placas de adquisicin (Placa Pingino y Placa Pic 18f2550/4550)
tienen como formato-fuente color verde olivo y cursiva, esto cambios estn
regidos por el tipo de protocolos de comunicacin que las placas incorporan.
5.2.1 HMI_UDO.py
103
104
boxsizer.Add(self.boton, flag=wx.LEFT|wx.TOP|wx.EXPAND,
border=5)
boxsizer.Add(self.boton2, flag=wx.LEFT|wx.TOP|wx.EXPAND,
border=5)
boxsizer.Add (self.boton3, flag=wx.LEFT|wx.TOP|wx.BORDER|
wx.EXPAND, border=5)
self.FotoUdo=wx.StaticBitmap(panel)
self.FotoUdo.SetBitmap(wx.Bitmap('udo.PNG'))
hbox1.Add(boxsizer,0,wx.ALL,10)
hbox1.Add( self.FotoUdo, 0, wx.ALL, 10)
panel.SetSizer(hbox1)
self.boton.Bind(wx.EVT_BUTTON, self.onGraficasEntradas)
self.boton2.Bind(wx.EVT_BUTTON, self.onProcesoVirtual)
self.boton3.Bind(wx.EVT_BUTTON, self.onMandoManual)
# Definicin de las funciones de los eventos de los botones de
#invocacin de frames secundarios.
def onGraficasEntradas(self, event):
frame = HmiUdoDemo(self)
frame.Show()
105
5.2.2 Proceso_Virtual.py
est formado
106
import Serial_Conect as SC
#-------------------------------------------------------------------------------------------------import Base_Datos as BD
#Definicin clase frame ProcesosVirtualDemo
class ProcesoVirtualUdoDemo(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self,
None,
-1,
'Proceso
Virtual',
wx.DefaultPosition,
size=(750, 530), style=wx.DEFAULT_FRAME_STYLE |
wx.NO_FULL_REPAINT_ON_RESIZE)
# Evento para que la interfaz grfica ProcesoVirtual se actualice cada
#90mseg.
self.redraw_timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.on_redraw_timer, self.redraw_timer)
self.redraw_timer.Start(90)
panel=wx.Panel(self, wx.ID_ANY)
sizer=wx.BoxSizer(wx.VERTICAL)
self.PlantaHmi=OHC.DrawWindow(panel, -1)
sizer.Add(self.PlantaHmi, 1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT,
border=5)
panel.SetSizer(sizer)
# Definicion de la funcin que esta enlazada con el evento
#wx.EVT_TIMER, se aaden las actualizacin de base de
# datos y animacin del proceso.
107
108
5.2.3. Obj_Comando.py
grfica
del
proceso
monitorear.
Los
comandos
AnimacionText
Sintaxis
AnimacionText (x, y, sensor, color, unidad), donde
109
AnimacionCorteRectangular
Sintaxis
110
Ej:
AnimacionCorteRectangualr(59, 205, 51, 10, a1, '#30E2FF')
TuberiaHorizontal
Sintaxis
tuberiaHorizontal(x, y, ancho, largo,color), donde:
111
Ej:
tuberiaHorizontal(80, 80, 18, 160, '#ffec00')
TuberiaVertical
Ej:
tuberiaVertical(50, 60, 18, 160,'#ffec00')
112
MdVerticalIzq
Este pequeo algoritmo crea una cinta mtrica en la ventana de
proceso virtual, la escala puede ser variada.
Sintaxis
MdVerticalIzq(self, dc, x, y, l, color), donde:
x: posicin en el eje de las x.
y: posicin en el eje de las y.
l: longitud. l=el valor deseado +1
color: color de la cinta.
Ej
MdVerticalIzq( 30, 60, 121, #7700A0)
113
MdVerticalDch
Este pequeo algoritmo crea una cinta mtrica en la ventana de
proceso virtual, la escala puede ser variada.
Sintaxis
MdVerticalIzq(self, dc, x, y, l, color), donde:
x: posicin en el eje de las x.
y: posicin en el eje de las y.
l: longitud. l=el valor deseado +1
color: color de la cinta.
Ej
MdVerticalIzq( 80, 100, 101, #07DF00)
MdHorizontalInf
Este pequeo algoritmo crea una cinta mtrica en la ventana de
proceso virtual, la escala puede ser variada.
Sintaxis
MdHorizontalInf (self, dc, x, y, l, color), donde:
x: posicin en el eje de las x.
y: posicin en el eje de las y.
114
MdHorizontalSup
Este pequeo algoritmo crea una cinta mtrica en la ventana de
proceso virtual, la escala puede ser variada.
Sintaxis
MdHorizontalSup (self, dc, x, y, l, color), donde:
x: posicin en el eje de las x.
y: posicin en el eje de las y.
l: longitud. l=el valor deseado +1
color: color de la cinta.
Ej
MdHorizontalSup( 50, 180, 201, #060089)
115
Imagen
Psudocodigo encargado de agregar una imagen al la ventana de
virtualizacion.
Sintaxis:
116
117
dc.SelectObject(self._Buffer)
self.Draw(dc, a, b, c, d, e, f)
del dc
self.Refresh()
self.Update()
class DrawWindow(BufferedWindow):
def __init__(self, parent, ID):
BufferedWindow.__init__(self, parent, ID)
def Draw(self, dc, a1, a2, a3, a4, a5,a6):
def AnimacionText(x, y, sensor, color, Unidad):
font = wx.Font(18, wx.ROMAN,wx.NORMAL, wx.NORMAL)
dc.SetTextForeground('#008d84')
dc.SetFont(font)
dc.DrawText(str(sensor), x, y)
dc.DrawText(Unidad, x, y)
def AnimacionCorteRectangualr(x, y, Ancho, AltInicial , ec, color):
dc.SetPen(wx.Pen(color, 1))
dc.SetBrush(wx.Brush(color, wx.SOLID))
DeltaY=y-ec
DeltaAlto=AltInicial+ec
dc.DrawRectangle(x, DeltaY, Ancho, DeltaAlto)
def tuberiaHorizontal(x, y, ancho, largo):
dc.GradientFillLinear((x, y,largo, ancho/2), color, '#000000',
wx.NORTH)
118
119
dc.SetFont(font)
dc.DrawText(str(i), 21+x, -i+y+l-5)
elif not (i % 10):
dc.DrawLine(10+x, i+y, 18+x, i+y)
elif not (i % 2): dc.DrawLine(10+x, i+y, 14+x, i+y)
def MdHorizontalInf(self, dc, x, y, l, s, color):
for i in range(RW):
if not (i % 20):
dc.DrawLine(i+x, 0+y, i+x, 10+y)
w, h = dc.GetTextExtent(str(i))
font = wx.Font(6, wx.ROMAN,wx.NORMAL, wx.NORMAL)
dc.SetTextForeground(color)
dc.SetFont(font)
dc.DrawText(str(i), i+x-w/2, 11+y)
elif not (i % 10):
dc.DrawLine(i+x, 0+y, i+x, 8+y)
elif not (i % 2): dc.DrawLine(i+x, 0+y, i+x, 4+y)
def MdHorizontalSup(self, dc, x, y, l, s, color):
for i in range(RW):
if not (i % 20):
dc.DrawLine(i+x, 10+y, i+x, 20+y)
w, h = dc.GetTextExtent(str(i))
font = wx.Font(6, wx.ROMAN,wx.NORMAL, wx.NORMAL)
dc.SetTextForeground(color)
120
dc.SetFont(font)
dc.DrawText(str(i), i+x-w/2, y)
elif not (i % 10):
dc.DrawLine(i+x, 12+y, i+x, 20+y)
elif not (i % 2): dc.DrawLine(i+x, 16+y, i+x, 20+y)
121
dc.SetPen(wx.Pen('#545454', 4))
dc.SetBrush(wx.Brush('#545454', wx.TRANSPARENT))
dc.DrawRectangle(50, 235, 250, 80)
tuberiaHorizontal(105, 67, 18, 140)
tuberiaVertical(179, 231, 18, 50)
tuberiaVertical(259, 99, 18, 100)
tuberiaVertical(277, 232, 18, 50)
Imagen(259,154, 'ImagenesHMI/BombaUp.png')
AnimacionCorteRectangualr(51, 236, 248, 78, -a1/6.6, '#30E2FF')
AnimacionCorteRectangualr(59, 205, 51, 10, a1/3.0725, ' #30E2FF')
Imagen(720, 370, 'ImagenesHMI/Tanque2.png')
Imagen(80, 440, 'ImagenesHMI/tanque3.png')
Imagen(363, 320, 'ImagenesHMI/ValvulaManual1.png')
tuberiaHorizontal(184, 335, 15, 180)
Imagen(490,236, 'ImagenesHMI/CalentadoTuberia.png')
tuberiaHorizontal(395, 335, 15, 100)
Imagen(150,364, 'ImagenesHMI/BombaUp.png')
Imagen(151,335, 'ImagenesHMI/codo1.png')
Imagen(630,334, 'ImagenesHMI/codo2.png')
tuberiaVertical(647, 366, 15, 79)
Imagen(647,445, 'ImagenesHMI/codo3.png')
tuberiaHorizontal(680, 462, 15, 40)
dc.EndDrawing()
122
5.2.4. Graficar_Proceso.py
123
124
self.axes.set_axis_bgcolor('black')
self.axes.set_title('Entradas Analogicas', size=12)
pylab.setp(self.axes.get_xticklabels(), fontsize=8)
pylab.setp(self.axes.get_yticklabels(), fontsize=8)
#------------------------------------------------------------------------------------------------self.plot_data = self.axes.plot(
self.data,
linewidth=1,
color=(1, 1, 0),
)[0]
self.plotAvg = self.axes.plot(
self.avgData,
linewidth=1,
color=(0, 0, 1),
)[0]
self.plot_data2 = self.axes.plot(
self.data2,
linewidth=1,
color=(0.5, 0.5, 0.5),
)[0]
self.plot_data3 = self.axes.plot(
self.data3,
linewidth=1,
color=(0.8, 0.8, 0.8),
125
)[0]
self.plot_data4 = self.axes.plot(
self.data4,
linewidth=1,
color=(0.0, 0.5019607843137255, 0.0),
)[0]
self.plot_data5 = self.axes.plot(
self.data5,
linewidth=1,
color=(1.0, 0.0, 1.0),
)[0]
#--------------------------------------------------------------------------------------------------def draw_plot(self):
xmax = len(self.data) if len(self.data) > 50 else 50
xmin = xmax - 50
ymin = round(min(self.data), 0) - 1
ymax = round(max(self.data), 0) + 1
self.axes.set_xbound(lower=xmin, upper=xmax)
self.axes.set_ybound(lower=ymin, upper=ymax)
self.axes.grid(True, color='gray')
self.plot_data.set_xdata(np.arange(len(self.data)))
self.plot_data.set_ydata(np.array(self.data))
126
self.plotAvg.set_xdata(np.arange(len(self.avgData)))
self.plotAvg.set_ydata(np.array(self.avgData))
self.plot_data2.set_xdata(np.arange(len(self.data2)))
self.plot_data2.set_ydata(np.array(self.data2))
self.plot_data3.set_xdata(np.arange(len(self.data3)))
self.plot_data3.set_ydata(np.array(self.data3))
self.plot_data4.set_xdata(np.arange(len(self.data4)))
self.plot_data4.set_ydata(np.array(self.data4))
self.plot_data5.set_xdata(np.arange(len(self.data5)))
self.plot_data5.set_ydata(np.array(self.data5))
self.canvas.draw()
def on_redraw_timer(self, event):
#--------------------------------------------------------------------------------------------------datosentradas=SC.read()
byteread=SC.readarduino(datosentradas)
self.data.append(byteread[0][0])
self.avgData.append(byteread[0][1])
self.data2.append(byteread[0][2])
self.data3.append(byteread[0][3])
self.data4.append(byteread[0][4])
self.data5.append(byteread[0][5])
#------------------------------------------------------------------------------------------------self.draw_plot()
127
5.2.5. Mando_Proceso.py
import wx
#-------------------------------------------------------------------------------------------------import Serial_Conect as SC
#-------------------------------------------------------------------------------------------------class MandoManualUdoDemo(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, None, -1, 'Mando Manual',
wx.DefaultPosition,size=(340, 400),
style=wx.DEFAULT_FRAME_STYLE |
wx.NO_FULL_REPAINT_ON_RESIZE)
self.redraw_timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.on_redraw_timer, self.redraw_timer)
self.redraw_timer.Start(90)
panel=wx.Panel(self, wx.ID_ANY)
128
129
wx.SL_LABELS )
self.slider3 = wx.Slider(panel, 100, 0, 0, 255, size=(250, -1),
style=wx.SL_HORIZONTAL | wx.SL_AUTOTICKS |
wx.SL_LABELS )
self.lbl = wx.StaticText(panel,-1,"PWM1")
self.lbl2 = wx.StaticText(panel,-1,"PWM2")
self.lbl3 = wx.StaticText(panel,-1,"PWM3")
boxsizer1.Add(self.slider1,-1,wx.CENTER,1)
boxsizer1.Add(self.lbl,-1,wx.CENTER,1)
boxsizer1.Add(self.slider2,-1,wx.CENTER,1)
boxsizer1.Add(self.lbl2,-1,wx.CENTER,1)
boxsizer1.Add(self.slider3,-1,wx.CENTER,1)
boxsizer1.Add(self.lbl3,-1,wx.CENTER,1)
vbox.Add(boxsizer, 0, wx.CENTER, 5)
vbox.Add(boxsizer1, 0, wx.CENTER, 5)
panel.SetSizer(vbox)
def outanlg1(self, valor1):
SC.writeAnalog(valor1, 'R')
def outanlg2(self, valor2):
SC.writeAnalog(valor2, 'G')
def outanlg3(self, valor3):
SC.writeAnalog(valor3, 'B')
130
5.2.6. Base_Datos.py.
131
def leer_registros():
con = sq3.connect(db)
cur = con.cursor()
cur.execute("SELECT * FROM datosplanta1")
registros=cur.fetchall()
cur.close()
con.close()
#Definicin de funcin escribir_registro, est regida por la cantidad de
#variable que el usuario quiera almacenar en este caso 6 entradas
#analgicas, 5 digitales, 4 salidas analgicas, 3 pwm, fecha y tiempo
#la cantidad de atributos de esta funcin deben coincidir con el
#numero de slot de registro del archivo .db.
def escribir_registro(anlg1, anlg2, anlg3, anlg4, anlg5, anlg6, dg1, dg2,
dg3, dg4, dg5, od1, od2, od3, od4, oa1, oa2, oa3,
fecha, tiempo):
con = sq3.connect(db)
cur = con.cursor()
#matriz de asignacin de datos de planta.
matr=(anlg1, anlg2, anlg3, anlg4, anlg5, anlg6, dg1, dg2, dg3, dg4,
dg5, od1, od2, od3, od4, oa1, oa2, oa3, fecha, tiempo)
#Insertando datos de variables dentro de la base de datos,
#recordando que los nombres deben de coincidir con el nombre de
132
133
f.write('%s\t' % od2)
f.write('%s\t' % od3)
f.write('%s\t' % od4)
f.write('%f\t' % oa1)
f.write('%f\t' % oa2)
f.write('%f\t' % oa3)
f.write('%s\t' % fecha)
f.write('%f\n' % tiempo)
#cerrando archivo texto
f.close()
5.2.7. Serial_Conect.py
import serial
import time
from datetime import datetime
#ser=serial.Serial(port, velocidad)
134
ser=serial.Serial('COM3', 9600)
time.sleep(1)
def desconectar():
ser.close()
def is_number(s):
try:
int(s)
return True
except ValueError:
return False
def readarduino(newdata):
iterations = newdata.count(',')
i=1
itergrid=[-1]
datagrid=[]
while i <= iterations:
newcomma=newdata.find(',',itergrid[i-1]+1)
itergrid.append(newcomma)
databit=newdata[itergrid[i-1]+1:itergrid[i]]
if is_number(databit)==True:
databit=int(databit)
datagrid.append(databit)
i+=1
databit=newdata[itergrid[i-1]+1:]
if is_number(databit)==True:
135
databit=int(databit)
datagrid.append(databit)
return datagrid, datetime.now(), time.clock()
def read():
ser.write("a".encode('ascii'))
return ser.readline()
def writeAnalog(valor, caracter):
ser.write(str(valor).rjust(3,'0'))
return ser.write(caracter.encode('ascii'))
def write(caracter):
return ser.write(caracter.encode('ascii'))
En la figura
newdata= read(), es
136
5.2.8. USB_Pic_Conect.py
#!/usr/bin/python
import sys, usb
from datetime import datetime
import time
IdVendedor=0xXXXX
IdProducto=0xXXXX
busses = usb.busses() # enumerate busses
for bus in busses:
devices = bus.devices
for dev in devices:
if dev.idVendor==IdVendedor and dev.idProduct==IdProducto
dev = dev
137
conf = dev.configurations[0]
intf = conf.interfaces[0][0]
endpoints = []
handle = dev.open()
handle.detachKernelDriver(0)
handle.detachKernelDriver(1)
handle.setConfiguration(conf)
handle.claimInterface(intf)
handle.setAltInterface(intf)
A diferencia del puerto serie los datos enviados por el dispositivo por
puerto USB, ya viene organizados y separados en un array. En la figura 5.3
se ven estos datos.
138
5.2.9. CrearBaseDatos.py
Este Script tiene como funcin principal crear un archivo .db, para
luego ser utilizada por el script Base_Datos.py.
5.2.9.1. Cdigo Fuente
import sqlite3
conn=sqlite3.connect('BasesDeDatosPlantaPrueba.db')
c=conn.cursor()
c.execute('''CREATE TABLE PlantaPrueba(anlg1 int, anlg2 int, anlg3 int,
anlg4 int, anlg5 int, anlg6, dg1 int, dg2 int, dg3 int, dg4 int,
dg5 int, od1 int, od2 int, od3 int, od4 int, oa1 int, oa2 int,
oa3 int, fecha TEXT, tiempo TEXT)''')
conn.commit()
c.close()
139
140
Paso 6. Si se desea aadir las grficas de las variables del proceso con
respecto al tiempo, utilizar el script Graficas_Proceso.py
141
142
143
144
145
Pruebas
Planta P1
Digitales
Analgicas
Digitales
PWM
10
13
10
6
Microcontrolador
Entrada
Salida
Crystal
Comunicacin
18f2550
Digitales
Analgicas
Digitales
PWM
4Mhz
USB
6
6
5
2
Microcontrolador
Entrada
Salida
Crystal
Comunicacin
18f4550
Digitales
Analgicas
Digitales
PWM
20Mhz
USB
6
13
8
2
146
puede apreciar en la figura 6.5 y 6.6 como quedan los slot de registro del
archivo .db. Para almacenar en archivo txt solo se debe crear un archivo txt
con el nombre de su preferencia.
consecutiva en los apndices 8-12 para el pic 18f2550 y los apndices 1317 los correspondientes al pic 18f4550. En las figuras 6.7 y 6.8 se observa
las hmi resultantes de la modificacin del script Virtual_Proceso.py y
Obj_Comando.py, en las imgenes 6.9 y 6.10 las grficas de las variables
obtenidas
del
proceso,
resultado
de
la
modificacin
del
script
147
148
149
150
151
152
153
154
155
156
(6.1)
157
158
159
Planta FM51
Digitales
Analgicas
Pruebas
Digitales
PWM
0
5
1
1
Arduino UNO
Digitales
Entrada
Analgicas
Digitales
Salida
PWM
Comunicacin
Serie
0
5
1
1
160
161
162
163
164
Conclusin
165
166
167
Bibliografa
168
APENDICE
169
170
171
PINGINO
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
ANEXOS
215
216
217
218
219