Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
DISEÑO E IMPLEMENTACIÓN DE UN SISTEMA DE MONITOREO Y
CONTROL AUTOMÁTICO (EMBEBIDO) CON COMUNICACIÓN VIA ETHERNET
BAJO EL PROTOCOLO TCP/IP
RONALD FEDRICK LINERO PINTO
JORGE DANIEL MUÑOZ GALVIS
CORPORACIÓN UNIVERSITARIA RAFAEL NÚÑEZ
PROGRAMA DE INGENIERIA DE SISTEMAS
AREA DE AUTOMATIZACIÓN INDUSTRIAL
CARTAGENA DE INDIAS D.T. Y C.
2005
DISEÑO E IMPLEMENTACIÓN DE UN SISTEMA DE MONITOREO Y
CONTROL AUTOMÁTICO (EMBEBIDO) CON COMUNICACIÓN VIA ETHERNET
BAJO EL PROTOCOLO TCP/IP
RONALD FEDRICK LINERO PINTO
JORGE DANIEL MUÑOZ GALVIS
Monografía para optar al título de Ingeniero de Sistemas
Director
Ing. Luís Fernando Murillo Fernández
Ingeniero Eléctrico Especializado en Informática Industrial
CORPORACIÓN UNIVERSITARIA RAFAEL NÚÑEZ
PROGRAMA DE INGENIERIA DE SISTEMAS
AREA DE AUTOMATIZACIÓN INDUSTRIAL
CARTAGENA DE INDIAS D.T. Y C.
2005
Nota de aceptación:
________________________________
________________________________
________________________________
________________________________
___________________________
Firma del presidente del jurado
___________________________
Firma del jurado
___________________________
Firma del jurado
Cartagena de Indias D.T. Y C, 8 de abril de 2005
A Dios por la vida, salud y sabiduría que me ha
dado en el logro de esta meta, a mi madre linda
Sara Pinto Cuesta por todo el esfuerzo y apoyo
que me ha brindado para ser de mí una persona
educada y hacer posible el triunfo que obtengo
hoy, a mi hijo y a Lorena por comprenderme y
por darme su amor, a mis hermanos Luís y Yerlis,
mi abuelita, mi tío Luís, Pedro Guzmán, la Sra.
Piedad y Consuelo por su apoyo incondicional en
todo momento y a todas las demás personas que
contribuyeron con mi crecimiento personal e
intelectual..
RONALD FEDRICK LINERO PINTO
RONALD FEDRICK LINERO PINTO
A Dios por darme la voluntad, la fortaleza y la
salud diaria, sin él jamás habría terminado, a
mis padres Jorge y Andrea, que con su apoyo y
sus oraciones persistentes incentivaron mi
espíritu a seguir en esta ardua tarea, a mis
hermanos Leonard, Deysi, y Andrea Carolina
por su gran interés demostrado en todo momento.
Además expreso mis más sinceros
agradecimientos a los docentes que creyeron en
mí, orientándome adecuadamente para la
consecución de este logro personal, y a todos mis
compañeros y demás familiares que
contribuyeron con esta causa directa e
indirectamente...
JORGE DANIEL MUÑOZ GALVIS
AGRADECIMIENTOS
Los autores expresan su sincero agradecimiento a:
Dios, nuestro padre celestial por habernos iluminado en los momentos más felices
y difíciles de nuestras vidas y por este triunfo que obtenemos hoy día.
A nuestros padres, por el apoyo incondicional que nos han brindado durante todo
el transcurso de esta profesión.
Ing. Luís Fernando Murillo Fernández, director de este trabajo de grado, por su
valiosa orientación y dedicación en cada una de las etapas de desarrollo del
proyecto.
Ing. Juan Pablo Paz, docente del programa de Ingeniería de Sistemas de la
CURN y asesor del proyecto, por compartir sus conocimientos y guiarnos en la
consecución del proyecto.
Ing. Juan Contreras Montes, docente del programa de Ingeniería de Sistemas de
la CURN y asesor del proyecto, por su orientación y colaboración desde un
principio en el desarrollo de este proyecto.
Ing. Maria Claudia Bonfante, coordinadora del programa de Ingeniería de
Sistemas de la CURN por su apoyo incondicional.
Ing. Lisbeth Urueta, docente del programa de Ingeniería de Sistemas de la CURN,
por los conocimientos y asesoría proporcionada en el área de la Ingeniería de
Software.
CONTENIDO
pág.
INTRODUCCIÓN 23 EL PROBLEMA Y OBJETIVOS DE LA INVESTIGACION 24 ANTECEDENTES DEL PROBLEMA 24 PLANTEAMIENTO DEL PROBLEMA 26 JUSTIFICACION DEL PROBLEMA 27 OBJETIVOS DE LA INVESTIGACION 28
OBJETIVO GENERAL 28
OBJETIVOS ESPECIFICOS 28 METAS DE LA INVESTIGACION 29 1. SISTEMAS DE CONTROL DIGITAL 30 1.1 SISTEMAS DE CONTROL 30 1.1.1 Clasificación de los sistemas de control. 31 1.1.2 Acciones de control. 33 1.1.3 Control proporcional integrativo derivativo. 34 1.2 CONTROLADORES ANÁLOGOS 35 1.3 CONTROLADORES DIGITALES 36 1.3.1 Diagrama de bloque de un controlador digital. 38 1.3.2 Módulo de control digital Rabbit. 39 1.3.3 Implementación del algoritmo de control PID digital. 41
2. REDES DE COMUNICACIÓN INDUSTRIALES 43 2.1 NIVELES EN UNA RED INDUSTRIAL 44 2.1.1 Nivel de gestión. 44 2.1.2 Nivel de control. 44 2.1.3 Nivel de campo y proceso. 44 2.1.4 Nivel de E/S. 44 2.2 TIPOS DE REDES INDUSTRIALES 45 2.2.1 Bus de campo. 45 2.2.1.1 Buses de campo reconocidos. 47 2.2.2 Redes LAN industriales. 48 2.2.2.1 Protocolo de automatización de manufactura (MAP). 48 2.2.2.2 Ethernet. 48 2.3 GENERALIDADES DE LA RED ETHERNET 49 2.3.1 Especificaciones Ethernet IEEE 802.3 a 10 Mbps. 50 2.3.2 Especificaciones Ethernet IEEE 802.3 a 100 Mbps. 51 2.3.3 Direcciones Ethernet. 51 2.4 PROTOCOLO TCP/IP 52 2.4.1 Arquitectura de protocolos TCP/IP. 52 2.4.2 Familia de protocolos TCP/IP. 54 2.4.3 Protocolos de la capa de aplicación. 54 2.4.4 Protocolos de la capa de transporte. 56 2.4.5 Protocolo de la capa internet. 57 2.4.6 Protocolo de la capa acceso a la red. 60
3. IMPLEMENTACIÓN DE PROTOCOLOS TCP/IP 61 3.1 PROTOCOLO HTTP 61 3.2 PROTOCOLO SMTP 72 3.3 PROTOCOLO TELNET 75 3.4 PROTOCOLO UDP 84 3.4.1Servidor UDP. 84 3.4.2 Cliente UDP. 88 3.5 SERVICIO DNS 92 4. ANALISIS Y DISEÑO DEL SISTEMA DE MONITOREO Y CONTROL 94 4.1 GENERALIDADES DEL SISTEMA 94 4.2 ANÁLISIS ESTRUCTURADO DEL SISTEMA 96 4.3 DICCIONARIO DE DATOS 101 4.3.1 Procesos. 101 4.3.2 Flujo de datos. 102 4.4 DISEÑO DE LA INTERFAZ DE MONITOREO SCAM WEB 105 4.4.1 Diseño arquitectónico. 105 4.4.2 Diseño de plantillas de la interfaz de usuario. 106 4.4.3 Diseño de entrada de datos. 108 4.4.4 Diseño de controles. 111 4.4.5 Diseño de salida. 112 4.5 DISEÑO APLICACIÓN DE ALMACENAMIENTO SCAM SERVER 114 4.5.1 Diseño de módulos. 114 4.5.2 Diseño de la base de datos. 114
5. PRUEBAS E IMPLEMENTACIÓN DEL SISTEMA 116 5.1 ASPECTOS METODOLÓGICOS 116 5.2 PRUEBAS DEL SISTEMA 119 5.2.1 Prueba de recuperación. 119 5.2.2 Prueba de seguridad. 120 5.2.3 Prueba de resistencia. 120 5.2.4 Prueba de rendimiento. 121 5.3 IMPLEMENTACIÓN DEL SISTEMA 121 5.3.1 Descripción de la plataforma. 121 6. CONCLUSIONES 123 7. RECOMENDACIONES 124 BIBLIOGRAFIA 125 ANEXOS 127
LISTA DE TABLAS
pág.
Tabla 1. Valores de configuración predefinidos de TCPCONFIG 63
Tabla 2. Tabla Variables de la base de datos SCAM 115
Tabla 3. Especificaciones Físicas RCM2200 131
Tabla 4. Configuración de pines del conector J5 135
Tabla 5. Configuración de pines del conector J4 136
Tabla 6. Configuración de red del RCM2200 en conexión directa 137
Tabla 7. Configuración de red Inalámbrica 139
Tabla 8. Comandos Ctrl del teclado 144
Tabla 9. Comandos Inicio del teclado 145
Tabla 10. Comandos Fin del teclado 145
Tabla 11. Familia de microcontroladores de Microchip 205
Tabla 12. Nomenclatura de la familia de microcontroladores de Microchip 206
Tabla 13. Rango de voltaje de los microcontroladores 206
Tabla 14. Familia del PIC 16Fxxx 207
Tabla 15. Selección del banco mediante el direccionamiento indirecto 219
Tabla 16. Selección del banco mediante el direccionamiento directo 219
Tabla 17. Archivo de registros del PIC 16F87X 222
Tabla 18. Asignación de los bits CHS2:0 del registro de control ADCON0 225
Tabla 19. Configuración de los pines del PIC según el valor de <PCFG3 - 0 > 227
LISTA DE FIGURAS
pág.
Figura 1. Elementos de un sistema de control 31
Figura 2. Diagrama de bloque de un sistema de lazo abierto 32
Figura 3. Sistema de control de nivel de líquido 33
Figura 4. Diagrama de bloque de un sistema de control de nivel liquido 33
Figura 5. Esquema simplificado del controlador PID análogo 36
Figura 6. Esquema general de un controlador digital 37
Figura 7. Diagrama de bloques de un sistema de control digital 39
Figura 8. Modulo de control Rabbit RCM 2200 40
Figura 9. Niveles en una red industrial 45
Figura 10. Capas del protocolo TCP/IP 53
Figura 11. Estructura de los protocolos de la familia TCP/IP 54
Figura 12. Esquema de una dirección IP 59
Figura 13. Autenticación Digest para ingresar a una página Web 71
Figura 14. Autenticación básica 71
Figura 15. Ventana Ejecutar de Windows XP 83
Figura 16. Ventana de salida de texto de Dynamic C 83
Figura 17. Diseño arquitectónico de la aplicación SCAM Web 105
Figura 18. Plantilla pagina inicio de sesión 106
Figura 19. Plantilla pagina principal 106
Figura 20. Plantilla paginas de configuración parámetros PID y usuarios 107
Figura 21. Plantilla pagina de ayuda 107
Figura 22. Plantilla para mensajes de alarma o error de ingreso de datos 108
Figura 23. Diseño de entrada de los datos nombre de usuario y contraseña 109
Figura 24. Diseño de entrada de datos gestión de usuario 110
Figura 25. Diseño de entrada de datos parámetros del controlador PID 111
Figura 26. Mensaje de error de introducción de datos 112
Figura 27. Mensaje de error indicando que un campo es obligatorio 112
Figura 28. Salida del valor del variable controlada 113
Figura 29. Salida de un mensaje de error 113
Figura 30. Módulos de la interfaz SCAM Server 114
Figura 31. Plataforma del sistema SCAM 122
Figura 32. Vista posterior y anterior del módulo Rabbit RCM2200 130
Figura 33. Subsistemas del módulo RCM2200 132
Figura 34. Configuración de los pines del microprocesador Rabbit 2000 133
Figura 35. Pines de E/S del módulo RCM2200 134
Figura 36. Configuración del RCM2200 en una Red LAN Ethernet 138
Figura 37. Entorno de desarrollo de Dynamic C 142
Figura 38. Menú principal de Dynamic C 145
Figura 39. Menú archivo de Dynamic C 146
Figura 40. Menú edición de Dynamic C 148
Figura 41. Menú compilar de Dynamic C 150
Figura 42. Mensaje de la BIOS 152
Figura 43. Menú ejecutar de Dynamic C 152
Figura 44. Menú opciones de Dynamic C 154
Figura 45. Caja de dialogo opciones de proyecto de Dynamic C 155
Figura 46. Selección del módulo Rabbit 157
Figura 47. Menú de ayuda de Dynamic C 158
Figura 48. Ventana de descripción de funciones de Dynamic C 159
Figura 49. Barra de direcciones navegador Web 163
Figura 50. Botón inicio de Windows XP 164
Figura 51. Acceso a SCAM Web a través de la ventana ejecutar 164
Figura 52. Iniciando SCAM Server 165
Figura 53. Página inicio de sesión de SCAM Web 166
Figura 54. Mensaje de error del campo nombre de usuario 166
Figura 55. Mensaje de verificación nombre de usuario y/o contraseña 167
Figura 56. Página principal de SCAM 167
Figura 57. Ventana de autenticación páginas Configuración PID y usuarios 168
Figura 58. Ventana de parámetros del controlador PID 169
Figura 59. Mensaje de error del campo valor de referencia (setpoint) 169
Figura 60. Mensaje valor de referencia (setpoint) es requerido 170
Figura 61. Ventana de configuración de usuarios 171
Figura 62. Campo de nueva contraseña es requerido 171
Figura 63. Mensaje de error de contraseñas inconsistentes 172
Figura 64. Mensaje de error del campo correo electrónico 172
Figura 65. Página de ayuda de SCAM Web 172
Figura 66. Pantalla principal de SCAM Server 173
Figura 67. Menú Operación 174
Figura 68. Pantalla históricos de variables 174
Figura 69. Pantalla de configuración de parámetros de variable 175
Figura 70. Pantalla Acerca de SCAM Server 175
Figura 71. Esquema Interno del PIC16F877/874 209
Figura 72. Esquema de pines del PIC16F877/874 210
Figura 73. Ciclo de instrucción de PC 211
Figura 74. Configuración de bits del registro STATUS 212
Figura 75. Operación con el archivo de registros orientada a bytes 213
Figura 76. Operación con el archivo de registros orientada a bits 213
Figura 77. Formato general 213
Figura 78. Formato para CALL y GOTO 213
Figura 79. Organización de la memoria de programa 214
Figura 80. Registro contador de programa 215
Figura 81. Actualización del registro PCH a través del registro PCLATH 216
Figura 82. Actualización del registro PCH a través del registro PCLATH 216
Figura 83. Asignación del contenido del registro PC a la pila 216
Figura 84. Asignación del contenido de la pila al registro PC 217
Figura 85. Direccionamiento directo e indirecto de la memoria de datos. 220
Figura 86. Asignación de los bits del registro de control ADCON0 224
Figura 87. Asignación de los bits ADCS1:0 del registro de control ADCON0 224
Figura 88. Asignación de los bits del registro de control ADCON1 225
Figura 89. Alineación izquierda y derecha del resultado digital de 10 bits 226
Figura 90. Estructura interna del convertidor análogo digital 228
Figura 91. Conexiones al bus I2C 232
Figura 92. Condiciones de inicio y parada de I2C 233
Figura 93. Bit de reconocimiento ACK 234
Figura 94. Formato de transmisión de datos de I2C 234
Figura 95. Conexiones de SDA y SCL de Rabbit 2000 y el PIC 16f877 235
Figura 96. Bits del registro SSPSTAT 238
Figura 97. Bits del registro SSPCON 239
Figura 98. Bits del registro SSPCON2 240
LISTA DE DIAGRAMAS
pág.
Diagrama 1. Diagrama de flujo del algoritmo PID Digital 41
Diagrama 2. DFD de contexto del sistema SCAM 96
Diagrama 3. DFD Nivel 1 del sistema SCAM 98
Diagrama 4. DFD Nivel 2 que refina el proceso de interactuar con operador 99
Diagrama 5. DFD Nivel 2 que refina el proceso de configuración parámetros
sistema 99
Diagrama 6. DFD Nivel 2 que refina el proceso de control de variables 100
Diagrama 7. DFD Nivel 3 que refina el proceso de iteración algoritmo de control
PID 100
LISTA DE ANEXOS
pág.
Anexo A. Manual de usuario del módulo Rabbit RCM2200 128
Anexo B. Manual de usuario de Dynamic C v8.1 140
Anexo C. Manual de usuario del sistema SCAM v1.0 160
Anexo D. Manual del sistema 177
Anexo E. Funcionamiento del PIC 16F877 204
Anexo F. Funcionamiento del bus I2C en el módulo Rabbit y PIC 16F877 229
Anexo G. RabbitCore RCM2200 Getting Started manual
Anexo H. Póster de referencia del procesador Rabbit 2000
Anexo I. Licencia del Software Dynamic C v. 8.1
GLOSARIO
A/D: acrónimo de Análogo/Digital.
ACTUADOR: es un dispositivo de potencia que produce la entrada para la planta,
de acuerdo con la señal de control, de tal forma que la señal de salida se aproxime
a la señal de entrada de referencia. Un actuador o accionador, puede ser un
motor o una válvula neumática, un motor hidráulico o uno eléctrico.
CANAL: medio de transmisión por el que viajan las señales portadoras de datos o
información.
CGI: acrónimo de Interfaz de Pasarela Común.
CMOS: acrónimo de Semiconductor de Óxido Metálico Complementario. Tipo
específico de tecnología de semiconductor que requiere muy poca energía.
CONTROL: significa medir el valor de la variable controlada del sistema, y aplicar
al sistema la variable manipulada para corregir o limitar la desviación del valor
medido, respecto al valor deseado.
CONTROL AUTOMÁTICO: es el mantenimiento de un valor deseado dentro de
una cantidad o condición, midiendo el valor existente, comparándolo con el valor
deseado, y utilizando la diferencia para proceder a reducirla.
CONTROLADOR: es el dispositivo hardware mediante el cual se lleva a cabo la
acción de control de regulación de energía suministrada al sistema.
CONTROL PID: es un controlador que con base en el error del sistema calcula la
acción del control que se deba tomar, esta compuesto de tres partes que son:
Una acción proporcional, una acción integral y una acción derivativa.
DATAGRAMAS: paquete o unidad de información que incluye información de
entrega relevante, como la dirección de destino, que se envía a través de una red
de conmutación de paquetes.
DNS: sistema de nombres de dominio. Base de datos jerárquica y distribuida que
contiene asignaciones de nombres de dominio DNS para varios tipos de datos,
como direcciones IP. DNS permite la búsqueda de equipos y servicios mediante
nombres descriptivos.
E/S: acrónimo de Entrada y Salida
ERROR: diferencia algebraica entre el valor leído o transmitido por el instrumento
y el valor real de la variable medida.
FTP: acrónimo de Protocolo de Transferencia de Archivos. Miembro del conjunto
de protocolos TCP/IP que se utiliza para copiar archivos entre dos equipos en
Internet. Ambos equipos deben admitir sus funciones FTP correspondientes: uno
debe ser un cliente FTP y el otro un servidor FTP.
HTTP: acrónimo de Protocolo de Transferencia de Hipertexto. Utilizado para
transferir información en Internet o una Intranet. Una dirección HTTP tiene el
siguiente formato: http://www.microsoft.com.
PAQUETE DE DATOS: unidad de información que se transmite de una vez entre
dos dispositivos de una red de computadores.
PIC: acrónimo de Controlador de Interface Periférico.
PLANTAS: unidad física o edificio en que se realizan los procesos de producción
industriales. Puede ser una parte de un equipo, tal vez un conjunto de las partes
de una maquina que funcionan juntas, el propósito de la cual es ejecutar una
operación particular.
PROCESOS: es una operación voluntaria o artificial progresivamente continua,
que consiste en una serie de acciones controladas o movimientos dirigidos
sistemáticamente hacia determinado resultado o fin.
PROTOCOLO: conjunto de normas y convenciones para enviar información a
través de una red.
PUNTO DE CONSIGNA: variable de entrada en el controlador que fija el valor
deseado de la variable controlada.
SISTEMAS: es una combinación de componentes que actúan conjuntamente y
cumplen determinado objetivo. El termino sistema hay que interpretarlo como
referido a sistemas físicos, biológicos y otros.
SENSOR: instrumento o sistema, capaz de percibir una señal, ya sea mecánica,
acústica, luminosa, calorífica, eléctrica o electrónica.
SMTP: acrónimo de Protocolo Simple de Transferencia de Correo. Miembro del
conjunto de protocolos TCP/IP que controla el intercambio de correo electrónico
entre agentes de transferencia de mensajes.
TCP: acrónimo de Protocolo de Control de Transmisión.
TCP/IP: acrónimo de Protocolo de Control de Transmisión/Protocolo de Internet.
Conjunto de protocolos de red muy utilizados en Internet que permiten la
comunicación entre redes interconectadas formadas por equipos con distintas
arquitecturas de hardware y sistemas operativos.
TELNET: protocolo de emulación de terminal muy utilizado en Internet para iniciar
sesión en equipos de red. Telnet hace referencia también a la aplicación que
utiliza el protocolo Telnet para los usuarios que inician sesión desde ubicaciones
remotas.
TFTP: acrónimo de protocolo trivial de transferencia de archivos. Protocolo
utilizado para descargar los archivos iniciales necesarios para comenzar el
proceso de instalación.
UDP: acrónimo de Protocolo de Datagramas de Usuario. Complemento de TCP
que ofrece un servicio de datagramas sin conexión que no garantiza la entrega o
la secuencia correcta de los paquetes entregados (de forma similar a IP).
UTP: acrónimo de par trenzado sin apantallar (Unshielded Twister Pair). Medio de
transmisión (cable) que se usa en las redes de área local.
VARIABLE CONTROLADA: es la cantidad o condición que se mide y controla,
esta es la señal de salida del sistema. Dentro del bucle de control es la variable
que se capta a través del transmisor y que origina una señal de realimentación.
VARIABLE MANIPULADA: es la cantidad o condición modificada por el
controlador, a fin de afectar la variable controlada.
RESUMEN
En este documento se presenta detalladamente las etapas de análisis, diseño e
implementación de un sistema integrado para la supervisión y control de procesos
industriales con comunicación vía Ethernet SCAM, basado en un módulo de
control digital RCM2200 que permite hacer control a bajo costo en un pequeño
microprocesador Rabbit 2000, y comunicación con dispositivos Rabbit/Z-World y
computadores en una red Ethernet bajo el protocolo TCP/IP.
Se da a conocer el soporte teórico del proyecto, relacionado a los sistemas de
control digital y las redes de comunicación industrial, haciendo mayor énfasis en la
red de comunicación Ethernet y el protocolo TCP/IP.
Palabras claves: control PID, ethernet, módulo de control digital, protocolo, Rabbit,
red, sistema, TCP/IP.
23
INTRODUCCIÓN
Hoy en día, muchos de los procesos de producción de las fábricas, están ligados a
sistemas que controlan cada una de las fases de producción de forma autónoma,
los cuales permiten minimizar costos y aumentar la eficiencia de estos procesos.
El inconveniente de estos sistemas de control es su elevado costo de
implementación para las pequeñas y medianas empresas del sector industrial.
Siendo una necesidad creciente para estas empresas se diseñó e implementó un
sistema como “SCAM” que permite hacer control y/o monitoreo de procesos
industriales a bajo costo y brinda conectividad a otros sistemas a través de redes
ethernet, gracias a que utiliza un módulo de control embebido RCM 2200 basado
en un microprocesador Rabbit 2000.
Este módulo se caracteriza por poseer canales de entradas y salidas digitales y
un canal de entrada análoga adoptada por medio de un conversor A/D, para la
conexión de los elementos de medición y control; además tiene un puerto de
comunicación serial (para la programación del módulo), y un puerto Ethernet para
la comunicación del sistema con otros dispositivos en una red. La programación
del modulo de control se realizó utilizando el entorno de desarrollo de Z-World
denominado Dynamic C, siendo éste un compilador basado en el lenguaje de
programación C ANSI, para uso especifico de la familia de microprocesadores
Rabbit 2000 y 3000.
Por otro lado, el sistema SCAM determina una alternativa factible para las
empresas de nuestra región, que busquen una solución integral para el control y
supervisión de procesos.
24
EL PROBLEMA Y OBJETIVOS DE LA INVESTIGACIÓN
ANTECEDENTES DEL PROBLEMA
En la actualidad el programa de Ingeniería de Sistemas de la Corporación
Universitaria Rafael Núñez CURN, ha realizado varias investigaciones en el área
de Automatización Industrial, principalmente en sistemas de control y monitoreo
con comunicación vía serial RS-232, como: la implementación de un sistema de
control de nivel de líquidos, controlador PID para regulación de un
servomecanismo de posición y un software para monitoreo de análisis en tiempo
real de la prensa multiuso digital del laboratorio de suelos del programa de
Ingeniería Civil de la CURN.
Igualmente en instituciones de educación superior en la ciudad como la
Universidad Tecnológica de Bolívar, Universidad Antonio Nariño, SENA Industrial,
Escuela Naval Almirante Padilla, etc. han realizado proyectos de sistemas de
control de temperatura, nivel de líquidos, entre otros, pero no se tiene información
acerca del desarrollo de sistemas de control embebidos con comunicación vía red
Ethernet, en Cartagena y en la región de la costa Caribe.
En el ámbito nacional se han realizado investigaciones relacionadas con sistemas
de control embebido con comunicación a una red, pero no se tiene evidencia del
uso de los microprocesadores Rabbit o Z-World en la implementación de estos,
entre las que cabe mencionar:
“Ajuste de controladores PID para sistemas de control en red”, realizada por
un estudiante de la Maestría en Ingeniería con énfasis en Automática de la
Universidad del Valle.
25
“Diseño e Implementación de un sistema de Control Distribuido para el
laboratorio de Automática de la Universidad del Valle”, ejecutado por
estudiantes de Ingeniería Electrónica de la Universidad del Valle.
“Sistema de Adquisición de Datos con PIC y PLD para un sistema
embebido", estudiante de Ingeniería Electrónica de la Universidad del Valle.
“Desarrollo de un controlador difuso para sistemas embebido utilizando
lenguaje C”, realizado en la Universidad de Antioquia
26
PLANTEAMIENTO DEL PROBLEMA
Actualmente la mediana y pequeña empresa del sector industrial de la ciudad de
Cartagena, tienen que recurrir a grandes inversiones en equipos de control y
medición para poder controlar sus respectivos procesos de producción y/o control
de calidad, con el fin de estar en un nivel de competitividad alto, la cual permita a
éstas competir con calidad en el mercado nacional e internacional por razones de
la globalización económica.
Sin embargo, muchas de estas PYMES (Pequeñas y Medianas empresas) no
poseen el capital económico ni la infraestructura tecnológica suficiente que
demanda implantar un sistema de control moderno y eficiente. Debido a esto, los
procesos son controlados casi por completo de manera manual, basándose en el
conocimiento y experiencia del personal. A pesar de que los resultados obtenidos
del proceso de control manual son relativamente buenos, la falta de monitoreo y
automatización del proceso impide minimizar costos y aumentar la calidad del
producto final, siendo estos dos argumentos factores primordiales para ser
competitivos en los mercados.
27
JUSTIFICACIÓN DE LA INVESTIGACIÓN
La problemática planteada anteriormente, evidencia la necesidad de desarrollar un
sistema de control automático y monitoreo de bajo costo en implementación,
embebido en una tarjeta con microprocesador de última generación y con
comunicación a una Red Ethernet (Intranet Corporativa), la cual a pesar de no
tener las mismas prestaciones que ofrecen los dispositivos de control que se
venden en el mercado, permite suplir las necesidades básicas de automatización y
monitoreo de los procesos de producción de estas PYMES, sin la necesidad de
acudir a grandes inversiones en equipos de elevado costo y con la ventaja de
utilizar una infraestructura de comunicación vía Ethernet, siendo ésta la mas
ampliamente utilizada en el sector empresarial en el campo de la ofimática y de
muy recientemente uso en la industria con un crecimiento vertiginoso debido a su
fácil implementación y configuración.
De igual forma, se determinó que el sistema de monitoreo y control automático
con comunicación vía Ethernet, se proyecta como una herramienta tecnológica
gestora de nuevos conocimientos, aplicando la Ingeniería de Sistemas al campo
de la Automatización Industrial, que es una de las áreas de profundización e
investigación que se promueve en el programa de Ingeniería de Sistemas de la
CURN. Además este proyecto, servirá de base a nuevas investigaciones
tecnológicas propiciadas por estudiantes y personas comprometidas con el
desarrollo de esta línea de investigación.
28
OBJETIVOS DE LA INVESTIGACIÓN
OBJETIVO GENERAL
El objetivo principal del proyecto es el diseño e implementación de una
herramienta hardware software para el control y supervisión de variables de un
proceso empleando un controlador PID digital, y con conectividad a una red
Ethernet, a fin de transmitir los datos obtenidos en la ejecución del sistema.
OBJETIVOS ESPECÍFICOS
Implementar un controlador PID embebido en el módulo de control
RabbitCore RCM2200.
Desarrollar la interfaz de monitoreo que permita la configuración de
parámetros en el módulo de control digital y la captura de dato(s)
provenientes de éste.
Documentar el uso de los protocolos de comunicación de la familia de
protocolos TCP/IP como son HTTP, SMTP, TELNET, el protocolo de
transporte UDP y el servicio DNS a través de ejemplos prácticos aplicados
al módulo de control RCM2200.
Implementar una librería de funciones que permita configurar los
parámetros de configuración de red (IP, Mascara de Red, Puerta de Enlace,
entre otros) y funciones básicas para los protocolos de comunicación
descritos anteriormente.
29
META DE LA INVESTIGACIÓN
Realizar un sistema de control y monitoreo con comunicación a una red Ethernet
que sea factible económica y técnicamente implementarlo a largo plazo en las
empresas del sector industrial a nivel local y regional, debido a que sus costos de
ejecución son mínimos en comparación con otros sistemas desarrollados por
multinacionales del sector que implican elevados costos en equipamiento de
desarrollo, medición y control.
30
1. SISTEMAS DE CONTROL DIGITAL
En el desarrollo del sistema de control automático del proyecto se empleó un
módulo de control digital basado en un microprocesador Rabbit1 2000 de última
generación, que mediante la implementación del algoritmo de control PID
embebido en la memoria de éste, permite hacer control directo y avanzado a un
proceso. Por tal motivo en este capitulo se describe las características principales
de un controlador digital, haciendo primeramente una introducción a los sistemas
de control y controladores análogos.
1.1 SISTEMAS DE CONTROL
Los procesos industriales a controlar pueden dividirse ampliamente en dos
categorías: procesos continuos y procesos por eventos. En ambos tipos, deben
mantenerse en general las variables (presión, caudal, nivel, temperatura, etc.), ya
sea en un valor deseado fijo, o en un valor variable con el tiempo de acuerdo con
una relación predeterminada, o bien guardando una relación determinada con otra
variable.
El sistema de control que permite regular estas variables puede definirse como
aquel que compara el valor de la variable o condición a controlar con un valor
deseado (punto de consigna o referencia) y toma una acción de corrección de
acuerdo con la desviación existente sin intervención humana (automáticamente).
Por consiguiente, para la comparación de estos dos valores y correspondiente
corrección sean posibles, se debe incluir en un sistema de control una unidad de
medida, una unidad de control, un elemento final de control (actuador) y el propio
1 Vea Anexo A “Manual de usuario del módulo Rabbit RCM2200”
31
proceso a controlar. Este conjunto de unidades forman un bucle o lazo que recibe
el nombre de lazo de control.
Figura 1. Elementos de un sistema de control
1.1.1 Clasificación de los sistemas de control. Los sistemas de control se
clasifican en sistemas de control de lazo abierto y de lazo cerrado. La distinción la
determina la acción de control, que activa al sistema para producir la salida.
Igualmente, estos sistemas de control pueden ser neumáticos, análogos y digitales
o discretos, siendo este último el de mayor trascendencia tecnológica en
aplicaciones informáticas de uso industrial recientemente.
Sistema de control de lazo abierto. Es aquel en el cual la acción de
control es independiente de la salida. Los sistemas de control a lazo
abierto tienen dos rasgos sobresalientes:
o La habilidad que éstos tienen para ejecutar una acción con exactitud
está determinada por su calibración. Calibrar significa establecer o
+
Valor de consigna
Suministro
-
Variable controlada
Proceso
Medición
Control
Actuador final
32
restablecer una relación entre la entrada y la salida con el fin de obtener
del sistema la exactitud deseada.
o Estos sistemas no tienen el problema de la inestabilidad, que presentan
los de lazo cerrado.
Un esquema de este sistema se muestra en la siguiente figura.
Figura 2. Diagrama de bloque de un sistema de lazo abierto
Sistema de control de lazo cerrado. Es aquel en donde la acción de
control es en cierto modo dependiente de la salida. Los sistemas de control
de lazo cerrado se llaman comúnmente sistemas de control por
realimentación (o retroacción).
Un sistema de control de nivel líquido es un ejemplo claro de un sistema de
lazo cerrado, debido a que aquí el controlador automático regula el nivel
del líquido comparando el nivel efectivo (real) con el deseado, y corrigiendo
cualquier error por medio del ajuste de la apertura de la válvula neumática.
Esto se puede ver claramente en la figura 3 y 4.
Controlador Indicador o registrador
Valor
deseado
Punto de
consigna
Elemento primario de medida
Proceso
33
Figura 3. Sistema de control de nivel de líquido
Figura 4. Diagrama de bloque de un sistema de control de nivel liquido
1.1.2 Acciones de control. La forma como el controlador automático produce la
señal de control, se denomina acción de control. En controladores industriales es
muy común encontrar los siguientes seis tipos de acción básica de control, según
lo manifestado por Katsuhiko Ogata en el libro Ingeniería de Control Moderna2
2 KATSUHIKO, Ogata. Ingeniería de Control Moderna. Madrid : Prentice Hall, 1999. p. 194 - 203
Señal de control
Controlador Válvula neumática
Deposito de Agua
Flotador
Nivel
deseado Nivel
real
Corrección
Controlador
Flujo de
entrada
Válvula
neumática
34
Control de dos posiciones o de encendido-apagado (On/Off).
Control proporcional.
Control integral.
Control proporcional e integral.
Control proporcional y derivativo.
Control proporcional integrativo derivativo.
En la implementación del controlador automático del proyecto se empleó el control
proporcional integrativo derivativo PID, para realizar las acciones correctivas al
proceso que se este controlando, dado que es eficaz si se emplea de manera
adecuada, posee una estructura simple y se adapta muy bien a numerosos tipos
de procesos.
1.1.3 Control proporcional integrativo derivativo. Es la combinación de los
efectos de acción proporcional, integral y derivativa. Esta combinación tiene las
ventajas de cada una de las tres acciones de control individuales. La ecuación
matemática general para ésta acción de control es:
t
dipdt
tdeTdtteTteKtu
0
)()()()(
Donde:
u(t) es la señal de salida del controlador o acción correctora de control.
e(t) es la señal de error siendo la diferencia entre el valor de referencia y el valor
de la variable controlada. e(t) = referencia – variable controlada.
Kp es la ganancia proporcional.
Ti es el tiempo integral.
Td es el tiempo derivativo.
35
1.2 CONTROLADORES ANÁLOGOS
Los controladores análogos actuales utilizados para obtener los diversos tipos de
control mencionados anteriormente hacen uso del amplificador operacional. Éste
es un dispositivo amplificador de la diferencia de sus dos entradas, con una alta
ganancia, una impedancia de entrada muy alta y una baja impedancia de salida, el
cual mediante la conexión de componentes electrónicos adecuados dispuestos en
forma de realimentación positiva o negativa, constituye el corazón de estos
controladores. Necesita sólo una corriente de entrada del orden de los 0.5 nA
(0.5*10-9 A) para dar lugar a un cambio total de la señal de salida (un valor
próximo a la corriente de alimentación).
La mayor parte de los amplificadores operacionales son amplificadores
diferenciales que, en esencia disponen de tres terminales, dos en la entrada y uno
de salida. Una señal de entrada aplicada al terminal denominado “no inversor”
hará que la salida cambie en la misma dirección: el símbolo aplicado es +Ve. Una
variación de señal en la otra entrada hará que la señal de salida cambie en
dirección inversa. Este segundo terminal se denomina “inversor” y se representa
por el símbolo -Ve.
Un ejemplo de la utilización del amplificador operacional es un controlador PID
análogo, que consiste en un módulo proporcional más integral, donde se fija la
ganancia o banda proporcional, se amplifica la desviación entre la variable de
proceso y el punto de consigna, se fija el valor del punto de consigna y se
selecciona la acción directa o la inversa del controlador, y un módulo de acción
derivada modificada. En la figura 5 puede verse un esquema simplificado del
controlador PID análogo.
36
Figura 5. Esquema simplificado del controlador PID análogo
1.3 CONTROLADORES DIGITALES
El controlador digital se basa para su funcionamiento de uno o más
microprocesadores, el cual permite realizar operaciones de cálculo complejas a
una alta velocidad de procesamiento, apoyándose en dispositivos como la
memoria RAM o Flash para poder almacenar datos y comunicarse con periféricos
a través de canales de señales o buses: bus de datos, de direcciones y el bus de
control. En la figura 6 puede verse el esquema general de un controlador digital.
37
Existen controladores digitales individuales, en particular para procesos continuos
(en línea) y por eventos (por lote), que llevan a cabo control multifunción3, actúan
como instrumentos reguladores (para variables como la presión, el caudal, el nivel,
la temperatura, etc.), con control lógico y control secuencial, efectúan operaciones
aritméticas, monitorizan entradas y salidas, y tienen capacidad gráfica con
representación de balance de materia. Este tipo de controladores permite incluso
la creación de software para definir todas las situaciones y secuencias de la
operación, como es el caso del módulo de control digital Rabbit 2200 empleado
en este proyecto.
Figura 6. Esquema general de un controlador digital
3 CREUS SOLÉ, Antonio. Instrumentación industrial. 6 ed. Bogotá : Alfaomega, 2001. p. 571
38
Los controladores digitales permiten el ajuste de sus acciones de control ante las
perturbaciones periódicas del proceso. Por este motivo pueden trabajar con varios
algoritmos de control como por el ejemplo el P, PI, PID.
Entre las funciones más relevantes de un controlador digital se encuentran:
a) Leer las variables de entradas analógicas o digitales.
Selección Control
BU
S
Microcontrolador analógico
A D
Analógico / Digital
Selección de control
Microcontrolador
Digital
Registro de almacenamiento
Selección de control
Datos
Salida Digital Microcontrolador
Digital
Selección Control
Salida
Analógica D
A
Registro de almacenamiento
Datos
Teclado Conversión
serie-paralelo
Selección Control
Digital / Analógico
Monitor
Unidad de control
A.L.U
Reloj
Microprocesador
ROM
RAM
Memoria
En
tra
das
an
álo
gas
En
tra
das
dig
ita
les
39
b) Comparar las señales leídas con los puntos de consigna e introducir la
señal de error en el algoritmo de control correspondiente.
c) Enviar las señales de salidas a través de los actuadores de control del
proceso.
1.3.1 Diagrama de bloque de un controlador digital. En la figura 7 se muestra
un diagrama de bloques de un sistema de control digital, que se compone de un
sensor, el convertidor A/D, el controlador o procesador digital, un convertidor D/A
y la planta o proceso a controlar. En este caso el controlador digital incluye el
detector de error y el control discreto del sistema. También se observa que la
señal de referencia r(t) es una señal digital.
La señal del sensor y(t) es convertida a digital continuamente por medio del
conversor A/D para ser retroalimentada al controlador digital. Luego la señal digital
y’(t) es comparada con la señal de entrada de referencia r(t). La señal de error
e(t)=r(t) - y’(t) se introduce en el algoritmo de control del controlador digital, el
cual maneja o trata la señal e(t) de la manera deseable para producir la señal de
control u(t). Ésta señal por medio del convertidor D/A se convierte a una señal
continua (análoga) u’(t), que se alimenta al proceso.
Figura 7. Diagrama de bloques de un sistema de control digital
40
1.3.2 Módulo de control digital Rabbit. Como se mencionó al principio del
capitulo, para el desarrollo del sistema de control automático y monitoreo se
empleó un módulo de control digital RCM2200 con procesador Rabbit 2000 a 8
bits. Implementándose en éste el algoritmo de control PID digital a través del
entorno de desarrollo de Z-World denominado Dynamic C v.8.1. Las
especificaciones de hardware y de configuración del módulo se detallan
ampliamente en el anexo A de este documento.
Como el módulo Rabbit RCM2200 trabaja únicamente entradas y salidas
digitales, y el sistema requiere de entradas análogas, se vio la necesidad de
implementar un conversor análogo/digital que digitalice la señal proveniente de un
sensor análogo. Como solución a este inconveniente, se utilizó un
microcontrolador PIC 16F877 que además de tener conversión de señales
análogas a digitales, posee comunicación serial para interconectarlo al módulo
RCM2200. La comunicación de estos dos dispositivos se estableció mediante el
protocolo serial I2C. La configuración del conversor A/D en el microcontrolador se
presenta en el Anexo E y la comunicación I2C en el anexo F respectivamente.
Controlador Digital
Conversor D/A
Planta o Proceso
Conversor A/D
y(t)
u’(t)
y’(t)
u(t)
Monitoreo
Sensor
r(t) Variable
controlada
41
Este módulo a la vez permitió crear el software de monitoreo del proceso a
controlar, hallándose embebido en la memoria Flash de éste. Por tal razón el
software admite visualizar el valor de la variable controlada y configurar los
parámetros del algoritmo de control PID directamente.
Además, el software tiene la ventaja de ejecutarse desde cualquier computador
siempre y cuando se esté conectado al módulo Rabbit RCM2200 a través de una
red ethernet. Esto es debido a que el módulo posee un puerto ethernet integrado
con conector RJ-45 y soporta el protocolo de comunicación TCP/IP, pudiendo de
esta manera desarrollar aplicaciones basadas en los protocolos que conforman
TCP/IP como por ejemplo HTTP, TELNET, SMTP, TCP, UDP, entre otros. En el
capitulo 3 se describe la manera de implementar estos protocolos en el módulo,
siendo esta una de sus características mas relevantes.
Figura 8. Módulo de control Rabbit RCM2200
42
1.3.3 Implementación del algoritmo de control PID digital. El algoritmo PID
utilizado para realizar la acción de regulación de la variable a controlar en el
proceso, se representa de forma gráfica por medio del siguiente diagrama de flujo.
Diagrama 1. Diagrama de flujo del algoritmo PID Digital
Inicio
error=0, error_ant =0, derror=0, sumerror=0
setpoint, kp, ti, td
error = setpoint – var_proceso
sumerror = sumerror + error
derror = error - error_ant
U = (kp error) + (ti sumerror) + ( td derror)
Envía señal de control al actuador
error_ant = error
var_proceso = sensor
43
En base al diagrama de flujo anterior, se muestra a continuación la codificación
correspondiente del algoritmo de control PID implementado en el módulo de
control digital Rabbit RCM 2200.
Primero se define la estructura de datos PID que almacenará los valores de los
respectivos parámetros de este algoritmo.
typedef struct{
float setpoint; // Valor de referencia
float kp; // Costante Proporcional
float ti; // Costante Integral
float td; // Costante Derivativa
float error_ant; // Error[-1]
float SumError; // Suma de Error
} PID;
PID sPID;
La función principal de este algoritmo es Iteración_PID(), que ejecuta iteraciones
sucesivas indefinidamente para realizar la acción correctiva de la variable que se
está leyendo a través del sensor.
float Iteracion_PID(float var_proceso)
{ float dError, Error, U_PID ;
Error = sPID.setpoint - var_proceso ; / /cálculo del error
sPID.SumError += Error; // sumatoria del error para la fase de integración
dError = Error - sPID.error_ant; /* diferencia de los errores para la fase derivativa*/
// Cálculo de la señal de control U
U_PID = ((sPID.kp * Error) + (sPID.ti * sPID.SumError) + (sPID.td * dError));
sPID.error_ant = Error;
return U_PID ;
} //cierra función
44
2. REDES DE COMUNICACIÓN INDUSTRIALES
En las empresas coexisten una serie de equipos y dispositivos dedicados al
control de una máquina o una parte cerrada de un proceso. Entre estos
dispositivos están los autómatas programables, controladores digitales o análogos,
variadores de velocidad, computadoras de diseño y gestión, sensores, actuadores,
etc., los cuales muchas veces se encuentran aislados entre sí, formando “islas”
automatizadas.
El desarrollo de las redes industriales ha establecido una forma de unir todos
estos dispositivos, aumentando el rendimiento y proporcionando nuevas
posibilidades de comunicación. Las ventajas que se aportan con una red industrial
son, entre otras, las siguientes:
Visualización y supervisión de todo el proceso productivo.
Toma de datos del proceso más rápida o instantánea.
Mejora del rendimiento general de todo el proceso.
Posibilidad de intercambio de datos entre sectores del proceso y entre
departamentos.
Programación y configuración a distancia de los dispositivos de control, sin
necesidad de estar a pie de fábrica.
45
2.1 NIVELES EN UNA RED INDUSTRIAL
En una red industrial coexistirán equipos y dispositivos de todo tipo, los cuales
suelen agruparse jerárquicamente para establecer conexiones lo más adecuadas
a cada área. De esta forma se definen cuatro niveles básicos dentro de una red
industrial.
2.1.1 Nivel de gestión. Es el nivel más elevado y se encarga de integrar los
niveles siguientes en una estructura de fábrica, e incluso de múltiples factorías.
Las máquinas aquí conectadas suelen ser estaciones de trabajo que hacen de
puente entre el proceso productivo y el área de gestión, en el cual se supervisan
las ventas, inventarios, procesos de producción y/o control de calidad, etc. Se
emplea una red de tipo LAN (Red de Área Local) o WAN (Red de Área Extensa).
2.1.2 Nivel de control. Se encarga de enlazar y dirigir las distintas zonas de
trabajo. A este nivel se sitúan los autómatas de gama alta y los ordenadores
dedicados a diseño, control de calidad, programación, etc. Se suele emplear una
red de tipo LAN.
2.1.3 Nivel de campo y proceso. Se encarga de la integración de pequeños
automatismos (autómatas compactos, multiplexores de E/S, controladores PID,
etc.) dentro de subredes o "islas". En el nivel más alto de estas redes se suelen
encontrar uno o varios autómatas modulares de gama alta, actuando como
maestros de la red o maestros flotantes. En este nivel se emplean los buses de
campo.
2.1.4 Nivel de E/S. Es el nivel más próximo al proceso. Aquí están los sensores y
actuadores, encargados de manejar el proceso productivo y tomar las medidas
necesarias para la correcta automatización y supervisión.
46
Figura 9. Niveles en una red industrial
Esta estructura citada no es universal, habrá casos en los que conste de un
número mayor o menor de niveles, dependiendo del tamaño del proceso y la
propia industria.
2.2 TIPOS DE REDES INDUSTRIALES
En las redes de comunicación industriales se manejan tres tipos de red4, que
pueden ir desde un grado de complejidad bajo a uno más alto, entre los cuales
están el bus de campo, las redes LAN y las redes WAN respectivamente.
2.2.1 Bus de campo. El bus de campo constituye el nivel de red más simple y
próximo al proceso dentro de la estructura de comunicaciones industriales, y se
4 BALCELLS, Joseph y ROMERAL, José Luís. Autómatas programables. Madrid : Alfaomega,
1998. p. 296 - 327.
47
encarga de la integración de pequeños automatismos en las llamadas “islas” que
controlan distintas zonas de un proceso. Está basada en procesadores simples y
utiliza un protocolo mínimo para gestionar el enlace entre ellos. Los buses de
campo más recientes permiten la comunicación con buses jerárquicamente
superiores y más potentes.
La característica básica para que una red de comunicación pueda denominarse
propiamente bus de campo es que permita intercambiar órdenes y datos entre
productos de un mismo o de distintos fabricantes a través de un protocolo
reconocido por cada uno de los nodos.
En un bus de campo se engloban las siguientes partes:
Estándares de comunicación: cubren los niveles físico, de enlace y de
aplicación establecidos en el modelo OSI (Sistemas de Interconexión
Abiertos).
Conexiones físicas: en general, las especificaciones de un determinado bus
admiten más de un tipo de conexión física. Las más comunes son bus
semidúplex (comunicación en banda base tipo RS-485), RS-422 y
conexiones en bucle de corriente.
Protocolo de acceso al medio (MAC) y de enlace (LLC): consiste en la
definición de una serie de funciones y servicios de la red mediante códigos
de operación estándar.
Nivel de aplicación: es dirigido al usuario y la aplicación suele ser propia de
cada fabricante, apoyándose en las funciones estándar antes mencionadas
para crear programas de gestión y presentación, permitiendo a lo sumo la
programación en un lenguaje estándar.
48
2.2.1.1 Buses de campo reconocidos. Hay diversos buses según fabricantes y
agrupaciones de fabricantes, siendo los más empleados en la industria los
siguientes:
MODBUS MODICON. Marca registrada de GOULD INC. Define un
protocolo de comunicación de topología maestro-esclavo. Muchas de las
marcas de equipos industriales del mercado ofrecen productos compatibles
con este bus o módulos que enlazan una red propia de nivel superior con
este estándar. Su principal inconveniente reside en la falta de
reconocimiento explicito por parte de alguna normal internacional.
BITBUS. Marca registrada por Intel. De bajo coste y altas prestaciones en
velocidad. Intel cedió a dominio público el estándar, por lo que se considera
un estándar abierto. Está reconocido por la normativa IEE 1118. Se trata de
un bus síncrono, cuyo protocolo se gestiona completamente mediante el
microcontrolador 8044, un ASIC basado en la arquitectura de la familia
8051 dotado de una USART y con las funciones de protocolo integradas en
ROM.
PROFIBUS. Impulsado principalmente por los fabricantes alemanes. El
protocolo es un subjuego de MINIMAP, utilizado en redes de más altas
prestaciones. A pesar de ser un estándar abierto, es uno de los pocos que
concretan bastante el nivel de aplicación y está progresando rápidamente
con el apoyo de marcas importantes del sector y bajo la norma DIN 19.245
S-BUS. No es un bus de campo propiamente dicho, sino un sistema
multiplexor/demultiplexor que permite la conexión de E/S remotas (digitales
y/o analógicas) a través de dos pares trenzados. Ha sido adoptado por
fabricantes europeos de autómatas y periféricos de entrada/salida.
49
2.2.2 Redes LAN industriales. A nivel de esta red se puede decir que los
estándares más conocidos y de uso más extendido son básicamente dos, MAP y
ETHERNET.
2.2.2.1 Protocolo de automatización de manufactura (MAP). Nació como un
producto especialmente diseñado para el entorno industrial, lo que hace que sea
de mayor éxito en LAN industriales. Fué impulsado por General Motors y
normalizado por el IEEE (Instituto de Ingeniero Electrónicos y Electricistas). No
actúa a nivel de bus de campo, pero establece pasarelas hacia estos buses
mediante terminales. También permite integración en redes WAN.
2.2.2.2 Ethernet. Esta red se basa en una topología en bus o estrella. Ethernet
es una red diseñada por Xerox Corporation, para poder compartir una serie de
recursos en su centro de investigación. En la década de los 80 se convirtió en un
estándar para los niveles físico, enlace y red de numerosas redes locales en el
campo de la ofimática. El propósito inicial de la red era el de poner a disposición
de múltiples usuarios una serie de recursos costosos como discos duros,
impresoras de calidad, plotters, etc., de forma que pudiera ser compartidos por
todos ellos como si estuvieran directamente conectados a su terminal. Hoy día se
utiliza en las redes de comunicación industriales proporcionando las siguientes
prestaciones más relevantes:
Compatibilidad con el modelo OSI y el protocolo TCP/IP.
Simplicidad. La gestión de la red no debe aumentar la complejidad de uso
por parte del usuario.
Bajo costo y fácil mantenimiento.
50
Agilidad de direccionamiento. La red permite la comunicación punto a
punto, los mensajes de un punto a otros (Multicast) y los mensajes de
difusión, es decir, de un punto a todos los demás (Broadcast).
Equidad y fiabilidad. No existe ninguna prioridad entre las distintas
estaciones y, además, la avería o desconexión de una estación no
interfiere en el funcionamiento de la red.
Alta velocidad. La velocidad prevista en la norma básica es de 10 Mbps
(Mega bits por segundo) aunque actualmente con la Ethernet de alta
velocidad (Fast Ethernet), se logra alcanzar transmisiones de datos a 100
Mbps a bajo costo.
2.2.3 Red WAN. Este nivel es el más próximo al área de gestión y se encarga de
integrar las redes LAN industriales de una ó múltiples fábricas con instalaciones
dispersas. Esta red hace uso de redes, generalmente públicas, de propósito
general, capaces de transmitir datos, voz, etc.
2.3 GENERALIDADES DE LA RED ETHERNET
La red Ethernet basada en la norma IEEE 802.3 define un modelo de red de área
local utilizando la técnica de control de acceso al medio más ampliamente usada
para topologías en bus/árbol y en estrella, la cual es la CSMA/CD (Detección de
Portadora con Acceso Múltiple y Detección de Colisiones), cuyo principio de
funcionamiento consiste en que un computador para transmitir, debe detectar la
presencia de una señal portadora y, si existe, comienza la transmisión. Si dos
estaciones empiezan a transmitir al mismo tiempo, se produce una colisión, y
ambas deben repetir la transmisión, para lo cual esperan un tiempo aleatorio antes
de proceder, evitando de este modo una nueva colisión, ya que ambas no
escogerán el mismo tiempo de espera.
51
Los nodos de esta red están conectados por tarjetas de red unidas ya sea,
mediante cable coaxial (en sus dos variedades, grueso y fino), por cable de par
trenzado con clavija tipo RJ-45, y las más avanzadas mediante fibra óptica,
basándose en las especificaciones IEEE 802.3 a 10 y 100 Mbps.
2.3.1 Especificaciones Ethernet IEEE 802.3 a 10 Mbps. Este es el estándar
Ethernet original que permite la transmisión en banda base a 10 Mbps en
diferentes medios de transmisión, dependiendo de la topología de red
implementada. De esta manera el comité IEEE ha desarrollado una notación
concisa con el fin de distinguir las diversas implementaciones que se encuentran
disponibles, la cual es:
<razón de datos en Mbps><método de señalización><máxima longitud del
segmento en centenas de metros>
Las implementaciones definidas son:
10BASE5. Especificación original Ethernet que utiliza un cable coaxial
grueso de 50 ohmios para el transporte de las señales en una topología de
red bus. Tiene una longitud máxima de segmento de 500 metros con la
posibilidad de conectar hasta 100 nodos en cada segmento.
10BASE2. Esta especificación utiliza un cable coaxial delgado de 50
ohmios y de menos costo que 10BASE5. Tiene un límite de distancia
máxima de 185 metros por segmento, soportando hasta 30 nodos. Las
conexiones se hacen mediante conectores en T en una topología de bus.
10BASE-T. Utiliza cable de par trenzado no apantallado (UTP) para
producir transmisiones de hasta 10 Mbps en una topología de red en
estrella. Las estaciones se conectan a un concentrador o HUB central
mediante un enlace punto a punto, que consta generalmente de dos pares
trenzados, uno par para transmitir datos y el otro para recibirlos. Debido a
52
la alta velocidad y pobre calidad de la transmisión de este cable, la longitud
de un enlace se encuentra limitada a 100 metros. Actualmente es la
especificación más usada en las redes de área local, dado su flexibilidad y
facilidad de implementación.
10BASE-F. Esta especificación se refiere a los estándares 10BASE-FB
(núcleo), 10BASE-FL (enlace) y 10BASE-FP (pasivo) para Ethernet a través
de cableado de fibra óptica en topología estrella.
2.3.2 Especificaciones IEEE 802.3 a 100 Mbps (Ethernet de alta Velocidad).
Ethernet a alta velocidad se refiere a un conjunto de especificaciones
desarrolladas por el comité IEEE 802.3 con el fin de proporcionar una red
compatible con Ethernet, preservando los formatos de los paquetes y las
interfaces, y funcionando a 100 Mbps. La designación global para estas
normalizaciones es 100BASE-T. Al igual que la Ethernet original ésta emplea
como medios de transmisión el cable de par trenzado no apantallado (UTP) y
apantallado (STP) categoría 5, y la fibra óptica, en una topología de red en
estrella.
Muy recientemente, se han presentado las denominadas Gigabit Ethernet, que
alcanzan velocidades de hasta 1 Gbps (Gigabit por segundo), se trata del estándar
IEEE 802.3z.
2.3.3 Direcciones Ethernet. Todas las interfaces Ethernet (dispositivos o tarjetas
de red) tienen una única dirección de 48 bits (6 bytes) que es proporcionada por el
fabricante de la misma. Estas direcciones son conocidas también como
direcciones MAC (Control de Acceso al Medio). Las direcciones MAC son
escritas como una secuencia de seis números hexadecimal de dos dígitos cada
uno, separado por dos puntos, por ejemplo, 00:90:20:33:00:A3. Esto los distingue
de las direcciones IP, que son escritas con números decimales punteados.
53
2.4 PROTOCOLO TCP/IP
El protocolo TCP/IP que significa protocolo de control de transmisión/protocolo de
Internet, es un conjunto de protocolos independientes del medio físico usados para
la transmisión y/o control de datos en Internet o subredes, los cuales permiten que
diferentes tipos de computadoras se comuniquen a través de redes heterogéneas.
TCP/IP es la arquitectura más adoptada para la interconexión de sistemas abiertos
actualmente, ya que hace posible la comunicación entre dos computadores, desde
cualquier parte del mundo, mientras que OSI se ha convertido en el modelo
estándar para clasificar las funciones de comunicación5. TCP/IP es compatible con
cualquier sistema operativo y con cualquier tipo de hardware, proporcionando una
abstracción total del medio.
2.4.1 Arquitectura de protocolos TCP/IP. A diferencia del modelo OSI, no existe
un modelo oficial de referencia para el protocolo TCP/IP según William Stallings6.
Sin embargo, éste caracteriza el conjunto de protocolos TCP/IP como si tuviera
cinco capas, estas capas son:
Capa de aplicación. Proporciona una comunicación entre procesos o
aplicaciones en computadores distintos.
Capa de transporte. Proporciona un servicio de transferencia de datos
extremo a extremo. Esta capa puede incluir mecanismos de seguridad.
Oculta los detalles de la red, o redes, subyacente a la capa de aplicación.
5 STALLINGS, William. Comunicaciones y redes de computadores. 5 ed. Madrid : Prentice Hall,
1999. p. 17. 6 Ibíd., p. 17 – 18, 519.
54
Capa internet. Relacionada con el encaminamiento de los datos del
computador origen al destino a través de una o más redes conectadas por
dispositivos de encaminamiento (Routers).
Capa de acceso a la red. Es responsable del intercambio de datos entre el
sistema final y la red a la cual se está conectando. El emisor debe
proporcionar a la red la dirección de destino, de tal manera que la red
pueda encaminar los datos hasta el destino apropiado.
Capa física. Define las características del medio de transmisión, la tasa de
señalización y el esquema de codificación de las señales.
Figura 10. Capas del protocolo TCP/IP
Cada capa en el conjunto de protocolos TCP/IP interacciona con sus capas
inmediatas adyacentes. En el origen (emisor), la capa de aplicación hace uso de
los servicios de la capa de transporte y pasa los datos a esa capa. Una relación
similar existe entre las capas de transporte e internet y en la interfaz de la capa
internet con la de acceso a la red. En el destino (receptor), cada capa entrega los
datos a la capa superior siguiente. Esto se ve claramente en la figura 10.
5 Aplicación
4 Transporte
3 Internet
2 Acceso a red
1 Física
5 Aplicación
4 Transporte
3 Internet
2 Acceso a red
1 Física
Origen Destino
55
2.4.2 Familia de protocolos TCP/IP. El protocolo TCP/IP esta compuesto por un
conjunto de protocolos independientes los cuales interactúan entre si con el
objetivo de establecer una comunicación segura entre dos computadores, un
cliente y un servidor. En la figura 11 se muestra la organización de algunos de los
protocolos de la familia TCP/IP de acuerdo a la capa a la que pertenecen.
Figura 11. Estructura de los protocolos de la familia TCP/IP
2.4.3 Protocolos de la capa de aplicación. Los protocolos de esta capa,
permiten que un usuario establezca comunicación de una forma transparente con
otras aplicaciones o procesos en otro computador. Estos protocolos son:
FTP. Protocolo de Transferencia de Archivos que se utiliza en Internet y
otras redes para transmitir archivos entre servidores o entre un usuario y un
servidor. El protocolo asegura que el archivo se transmite sin errores, para
TCP UDP
FTP HTTP SMTP TELNET
MIME
TFTP
ARP, RARP
5
4
3
ICMP
DNS
Medio físico (ETHERNET)
PING
2
1
IP
56
lo que dispone de un sistema de corrección basado en un control de
redundancia de datos y, en su caso, de la capacidad de retomar la
descarga en el punto en que falló la conexión o el envío o la recepción de
datos. El sistema que almacena archivos que se pueden solicitar por FTP
se denomina servidor de FTP. Los programas que son capaces de acceder
a servidores FTP y descargar archivos de ellos y, en su caso, enviar otros
al servidor, se denominan clientes FTP. Por defecto el protocolo FTP
establece comunicación por el puerto lógico 20 o 21.
HTTP. El Protocolo de Transferencia de Hipertexto, es el protocolo base
para transferir información en el World Wide Web. HTTP es un protocolo
cliente-servidor orientado a transacciones. El uso más común de HTTP es
entre un cliente (navegador) Web y un servidor Web. Para proporcionar
seguridad, HTTP hace uso de TCP. Sin embargo, HTTP es un protocolo
“sin estados”: cada transacción se trata independientemente. Por
consiguiente, una implementación típica creará una conexión nueva entre el
cliente y el servidor con cada transacción y después la cerrará tan pronto
como se complete ésta. Por defecto el protocolo HTTP recibe las
peticiones y envía las correspondientes respuestas por el puerto lógico 80.
SMTP. El Protocolo Simple de Transferencia de Correo, hace referencia al
protocolo más utilizado en Internet para el envío de mensajes de correo
electrónico. Los programas gestores de correo electrónico y los servidores
de Internet (o de una intranet corporativa) lo utilizan como un tipo de
protocolo TCP/IP que define el modo de envío y cuál es el agente
encargado de gestionar la entrega, que inicialmente almacenará y
posteriormente remitirá el mensaje al o a los destinatarios.
En sus inicios, el protocolo SMTP trabajaba sólo con texto en formato ASCII
(texto plano), pero posteriormente se le han añadido posibilidades de
57
encriptación, como el formato MIME (Ampliación para correo internet
multiobjetivo), muy extendido, que lo dotan de capacidad para gestionar
elementos multimedia, gráficos y otros elementos, como archivos adjuntos
al propio texto. El número de puerto predefinido por el que se establece
comunicación con el servidor de correos SMTP es el 25.
TELNET. El protocolo TELNET facilita la posibilidad de conexión remota,
mediante la cual el usuario de un computador se conecta a una terminal
remota a través de una red y trabaja como si estuviera conectado
directamente a ese terminal. TELNET está implementado en dos módulos:
un cliente TELNET interactúa con el módulo de E/S de terminal para
comunicarse con el terminal local. Éste convierte las características del
terminal real en una normalización de red y viceversa. El servidor TELNET
interactúa con una aplicación, actuando como un sustituto del gestor de
terminal para que el terminal remoto aparezca como local en la aplicación.
El protocolo TELNET establece comunicación por el número de puerto 23.
DNS. El Sistema de Nombre de Dominio es una base de datos distribuida
de nombre de dominio y direcciones IP ligadas a estos nombres. Un
nombre de dominio es simplemente una cadena de caracteres alfanumérica
separada en los segmentos por puntos, que representa un lugar específico
y único en el "espacio de nombre de dominio”. Cada nombre DNS consta
de dos partes. La primera identifica al nodo dentro de una subred y la
segunda a la subred, y se llama dominio. El puerto predefinido para el
servicio DNS es el 53.
2.4.4 Protocolos de la capa de transporte. Los protocolos de esta capa regulan
el flujo de información para garantizar la conectividad de extremo a extremo entre
aplicaciones de computadores de manera confiable y precisa. Estos son:
58
TCP. El Protocolo de Control de Transmisión es un protocolo orientado a
conexión, es decir, diseñado para realizar comunicaciones seguras entre
procesos paritarios (usuarios TCP) en redes seguras e inseguras así como
a través de un conjunto de redes interconectadas. TCP es un protocolo
adecuado para interactuar contra el protocolo IP en la capa de internet. La
seguridad del protocolo TCP lo convierte en idóneo para la transmisión de
datos por sesiones, para aplicaciones cliente -servidor y para servicios
críticos, como el correo electrónico.
Los puntos de acceso al servicio en la capa de transporte en TCP/IP se
llaman socket o conectores TCP/IP, siendo útiles en la programación de
aplicaciones de red. Las primitivas (funciones, estructura de datos, etc.) de
la capa de transporte en TCP/IP permiten crear sockets, asociar nombres
ASCII a sockets previamente creados, establecer y liberar conexiones,
enviar y recibir mensajes a través de los sockets, etc. Estos sockets TCP se
emplearon en la implementación de los protocolos HTTP, TELNET y SMTP
en el módulo Rabbit,…Véase los numerales 3.1, 3.2 y 3.3…
UDP. El Protocolo de Datagramas de Usuarios proporciona un servicio no
orientado a conexión para los procedimientos de la capa de aplicación, es
decir, permite la transmisión de mensajes sin necesidad de establecer
ninguna conexión y, por tanto, sin garantía de entrega. Actúa simplemente
como una interface entre los procesos de los usuarios de la red y el
protocolo IP. Se utiliza en transmisiones rápidas que no necesitan
seguridad en la transmisión.
2.4.5 Protocolo de la capa internet. En este nivel de TCP/IP existe solamente el
protocolo Internet IP, independiente de la aplicación que solicita servicios de red o
del protocolo de transporte que se utiliza. La función de la capa internet es
averiguar cómo encaminar paquetes o tramas de información a su destino final, lo
59
que se consigue mediante el protocolo IP. Para hacer esto posible, cada
dispositivo en la red necesita una dirección IP que lo identifique de forma única.
IP. El protocolo internet es parte de la familia de protocolos TCP/IP y es el
protocolo más usado de interconexión entre redes7. IP no es orientado a
conexión, por tanto, carece de seguridad en la entrega de paquetes.
Cuando una comunicación que utiliza el protocolo IP para transferir los
paquetes de datos necesita seguridad, ésta debe ser proporcionada por el
protocolo TCP de la capa de transporte, que se encargará de los
mecanismos de verificación de entrega y de la comprobación de errores.
Este protocolo es usado por los de la capa de transporte para encaminar los
datos a su destino, siendo ésta su última misión, por lo que no se preocupa
de la integridad de la información que contienen los paquetes. Para poder
direccionar los datagramas, IP introduce una nueva cabecera de longitud
variable en los mismos, formada de una parte fija de 160 bits (20 bytes) y
de un resto variable, que contienen los diferentes datos necesarios para
poder enrutar los paquetes, como la longitud de la cabecera internet, la
longitud total del datagrama, un número de identificación, tipo de protocolo
al que pertenece el datagrama (TCP o UDP), tiempo de vida, campo de
comprobación (checksum), dirección de origen, dirección de destino, datos,
etc.
Direcciones IP. Una dirección IP especifica un número de 32 bits (4 bytes)
expresado en forma decimal en cuatro grupos de tres dígitos separados por
puntos. Cada número entre los puntos estará entre 0 y 255 que
corresponde a 8 dígitos binarios (00000000 a 11111111). Como IP es un
protocolo pensado para la interconexión de subredes, cada dirección IP
7 STALLINGS, Op.cit., p. 540.
60
consta de un identificador de red y un identificador de host dentro de la
misma, como se ve en la figura 12.
Figura 12. Esquema de una dirección IP
A la hora de asignar direcciones IP a una red se considera el tamaño y las
necesidades de ésta, por lo que se distinguen 3 tipos de redes.
o Redes de clase A. Son aquellas redes que precisan un gran número
de direcciones IP, debido al número de host que comprenden. A este
tipo de redes se les asigna un rango de direcciones IP identificado
por el primer grupo de 3 dígitos (primer octeto de la IP), de tal forma
que disponen de los otros 3 grupos siguientes para asignar
direcciones a host. Su primer byte tiene un valor comprendido entre 1
y 126, es decir, hay 126 subredes posibles de tipo A y cada una de
ellas puede contener16.777.214 hosts distintos.
o Redes de clase B. A este tipo de redes se les asigna un rango de
direcciones IP identificado por los dos primeros grupos de 3 dígitos
(primer y segundo octetos de la IP), de tal forma que disponen de los
otros 2 grupos siguientes para asignar direcciones a hosts. Sus dos
primeros bytes deben estar entre 128.1 y 191.254, por lo que el
número de direcciones resultante es de 65.534.
192. 8 . 3 . 101
red dominio
subred estación
61
o Redes de clase C. A este tipo de redes se les asigna un rango de
direcciones IP identificado por los tres primeros grupos de 3 dígitos,
de tal forma que disponen de un sólo grupo para asignar direcciones
a hosts. Sus 3 primeros bytes deben estar comprendidos entre
192.1.1 y 223.254.254. Es posible codificar 2.097.151 subredes
distintas de 254 hosts distintos cada una.
2.4.6 Protocolo de la capa acceso a la red. Como TCP/IP no especifica
claramente un protocolo de nivel de enlace de datos, eran necesarios unos
mecanismos para traducir las direcciones IP a direcciones que entendieran el
software de capa de enlace de datos por sobre el que corre TCP/IP y para
controlar posibles errores a nivel de subred.
ARP. Como el protocolo IP utiliza un sistema de direccionamiento que no
tiene nada que ver con las direcciones MAC de las LAN, hay que arbitrar un
mecanismo de asignación de direcciones IP (lógicas) a direcciones MAC
(físicas) propias del nivel de enlace. De esto se encarga el protocolo de
resolución de direcciones ARP8, que funciona del siguiente modo: cuando
un host quiere transmitir un paquete IP, necesita averiguar la dirección MAC
del host destinatario, cuya dirección es la dirección de destino del campo
<< dirección de destino>> del paquete IP. Para ello genera un paquete de
petición ARP que difunde por toda la red. Todos los nodos de la red
detectan este paquete y solo aquel host que tiene la dirección IP
encapsulada en el paquete ARP contesta con otro paquete ARP de
respuesta con su dirección MAC. De este modo, el host emisor relaciona
dirección IP y MAC, guardando estos datos en memoria para su uso en
transmisiones posteriores.
8 ABAD, Alfredo y MADRID, Mariano. Redes de área local. Madrid : McGraw Hill, 1997. p. 131.
62
3. IMPLEMENTACIÓN DE LOS PROTOCOLOS TCP/IP
El objetivo de este capitulo es documentar el empleo de los protocolos de
comunicación de la familia TCP/IP como son HTTP, SMTP, TELNET, el protocolo
de transporte UDP y el servicio DNS, a través de ejemplos prácticos
implementados al módulo Rabbit RCM2200. Sirviendo para mostrar la
aplicabilidad de los conceptos teóricos de los protocolos TCP/IP vistos en el
capitulo anterior.
Sin embargo, se recomienda que antes de compilarse y ejecutarse cualquier
programa ejemplo, se deba establecer la respectiva configuración de
comunicación del software Dynamic C con el módulo de control RCM2200, para
así transferir el programa a este módulo. La configuración realizada fue la
siguiente: En el menú Opciones (Options) de Dynamic C se escoge Opciones de
proyecto (Proyect Options) y luego la pestaña Comunicaciones
(Communications), activándose la opción Usar conexión serial (Use Serial
Connection) debido a que se trabaja con un cable de programación serial,
dejando los valores por defectos como se muestra en la figura 45 del Anexo B
“Manual De Usuario De Dynamic C”
3.1 PROTOCOLO HTTP
El Protocolo de Transferencia de Hipertexto HTTP, permite configurar el módulo
Rabbit RCM2200 como un servidor Web, para que reciba peticiones desde un
navegador Web (cliente) en una intranet corporativa o de internet, y responda con
el recurso solicitado, es decir, páginas Web en las que el usuario puede visualizar
y configurar variables parametrizables de un proceso en ejecución. Esta
63
configuración como servidor HTTP se utilizó en la implementación del sistema de
monitoreo y control automático SCAM.
A continuación se hace mención a la configuración del servidor HTTP en el
módulo Rabbit mediante el siguiente ejemplo a describir “Autenticacion_usuario.c”.
Éste programa se refiere básicamente a los modos de autenticación de usuarios
para acceder las páginas del servidor Web, por medio de la validación de usuarios
predefinidos.
El programa proporciona tres usuarios, donde los nombres de usuario son:
"Admin", "Ingenieria", y "Operario", y las contraseñas son "Ronald", "Jorge", e
"Invit" respectivamente. Cada uno de los tres usuarios puede ser valido y no valido
oprimiendo en el teclado la opción 1, 2, 3. Pueden emplearse dos modos de
autenticación de usuario, la autenticación básica y la autenticación digest, las
cuales permiten el soporte de múltiples usuarios, esto se puede configurar en el
programa presionando las teclas 'b' , 'd', o 'n' para no utilizar los modos de
autenticación descritos.
Inicialmente en el código de la aplicación se debe fijar la configuración de red9 del
módulo Rabbit RCM2200, debido a que ésta trabajará como un servidor Web.
Para esto el usuario puede asignar valores de configuración de red (IP, mascara
de red, etc.) acorde a su red Ethernet ó puede establecer una configuración
predefinida, a través de la librería TCP_CONFIG.LIB de Dynamic C, utilizando el
macro TCPCONFIG. Los valores que toma TCPCONFIG pueden variar hasta 6,
donde cada uno de estos representa un tipo de configuración diferente, como se
muestra en el tabla 1.
9 Véase sección A.3 del Anexo A
64
Tabla 1. Valores de configuración predefinidos de TCPCONFIG
TCPCONFIG ETHERNET PPP DHCP DESCRIPCIÓN
1
SI
NO
NO
Representa una configuración de
red estática para el módulo Rabbit
en una red Ethernet
2
NO
SI
NO
Permite que el módulo Rabbit
establezca una comunicación serial
por el puerto serial C bajo el
protocolo PPP (protocolo punto a
punto)
3
SI
NO
SI
Establece una configuración de red
dinámica en una red Ethernet
utilizando el protocolo DHCP
4 SI SI NO Admite la configuración 1 y la 2
sobre el puerto serial C.
5
SI
NO
SI
Presenta la misma configuración de
la opción 3, con la excepción de
que el usuario pueda configurar los
parámetros de conexión al
servidor DHCP de su organización.
6
SI
NO
NO
Permite realizar una configuración
de red Ethernet en tiempo de
ejecución en el módulo Rabbit.
65
/***********************************************************************************************
HTTP / Autenticacion_usuario.c
**********************************************************************************************/
#define TCPCONFIG 1
#define HTTP_MAXBUFFER 512
Se incluye el macro HTTP_MAXBUFFER, que permite que el servidor Web
soporte el recibo y transferencia de información a través de las rutinas CGI, el cual
asigna en la memoria un espacio en bytes máximo para almacenar cada línea de
cabecera recibida del cliente Web.
Ahora se debe especificar el tipo de autenticación a utilizar, estableciendo la
autenticación Digest a 1, para activarla a través del macro siguiente.
#define USE_HTTP_DIGEST_AUTHENTICATION 1
El siguiente macro permite la asignación de múltiples usuarios a un recurso
particular, por ejemplo una página Web, definiendo cuantos usuarios pueden
asociarse con la página Web.
#define SSPEC_USERSPERRESOURCE 3
Ahora se deshabilita el código que soporta la estructura http_flashspec[ ], esto es,
por que se utilizarán las funciones de la librería ZSERVER.LIB.
#define HTTP_NO_FLASHSPEC
La siguiente directiva del compilador, le informa a éste como encargase de
controlar el área de memoria predefinida para las funciones. La opción xmem,
hace que todas las funciones C no declaradas como la raíz vayan a la memoria
extendida
66
#memmap xmem
Se incluyen las librerías principales de gestión de red de TCP/IP con la librería
dcrtcp.lib y la del servidor HTTP respectivamente.
#use "dcrtcp.lib"
#use "http.lib"
Se debe incluir todos los archivos de la aplicación Web, tales como, páginas Web,
imágenes etc. en la memoria flash del módulo RCM2200, esto a través de la
directiva #ximport “ubicación del archivo”, como se muestra:
#ximport "C:/SCAM/paginas/principal.shtml" principal_shtml
#ximport "C:/SCAM/paginas/principal_image.shtml" princimage_shtml
#ximport "C:/SCAM/paginas/principal_text.shtml" princtext_shtml
//Imagenes
#ximport "C:/SCAM/paginas/logo_scan.PNG" logo_scan_PNG
#ximport "C:/SCAM/paginas/butpid.PNG" butpid_PNG
#ximport "C:/SCAM/paginas/butusuario.PNG" butusuario_PNG
#ximport "C:/SCAM/paginas/butayuda.PNG" butayuda_PNG
#ximport "C:/SCAM/paginas/chipbkgrnd.gif" chipbkgrnd_gif
La estructura HttpType10 le da al servidor HTTP indicaciones sobre como manejar
peticiones entrantes. Ésta asocia una extensión de archivo con un tipo MIME
(Ampliación de Correo Internet Multiuso) y una función que se ocupa del tipo del
MIME. El servidor compara la extensión de la petición entrante con la lista de
extensiones definidas en el arreglo http_types y retorna el segundo campo como el
tipo de campo contenido.
10
Véase sección D.1.2 del Anexo D “Manual del Sistema”
67
const HttpType http_types[] =
{
{ ".shtml", "text/html", NULL},
{ ".html", "text/html", NULL},
{ ".PNG", "image/PNG", NULL},
{ ".gif", "image/gif", NULL}
};
Una vez terminada la configuración del servidor, se empieza con la función
principal main(), donde se declararán las variables y se ejecutan las funciones del
servidor HTTP.
void main(void)
{
int user1; int user2; int user3; int user1_enabled;
int user2_enabled; int user3_enabled; int pag1; int pag2;
int ch;
printf("Presione '1', '2', ó '3' para desactivar/activar a los tres usuarios.\n");
printf("Presione 'b', 'd', ó 'n' para fijar la autenticación básica, digest, ó ninguna.\n\n");
sock_init(); // La función sock_init inicializa la conexión TCP/IP.
http_init(); // La función http_init inicializa el servidor Web.
http_setauthentication(HTTP_DIGEST_AUTH);
printf("Usando la autenticación digest \n");
HTTP_DIGEST_AUTH es el tipo de autenticación predefinido cuando la
autenticación digest se ha habilitado, así que esta línea no es estrictamente
necesaria. Los otros posibles valores son HTTP_BASIC_AUTH y
HTTP_NO_AUTH.
68
Las líneas de código siguientes agregan a tres usuarios mediante la función
sauth_adduser(“nombre usuario”, ”contraseña”, “nombre de servidor valido” ). Se
usa las variable userx_enabled para guardar rastro de los usuarios que están
habilitados actualmente.
user1_enabled = 1;
user2_enabled = 1;
user3_enabled = 1;
user1 = sauth_adduser("Admin", "Ronald", SERVER_HTTP);
user2 = sauth_adduser("Ingenieria", "Jorge", SERVER_HTTP);
user3 = sauth_adduser("Operario", "Invit", SERVER_HTTP);
La siguiente línea agrega un archivo a la lista de objetos del servidor, en este caso
el objeto es una página Web, a través de la función sspec_addxmemfile( ).
pag1 = sspec_addxmemfile("/", principal_shtml, SERVER_HTTP);
Se agrega cada usuario a la lista de usuario que tiene acceso a la entrada
especificada, en este caso una página Web
sspec_adduser(pag1, user1);
sspec_adduser(pag1, user2);
sspec_adduser(pag1, user3);
La siguiente función fija el campo realm de una estructura ServerSpec (es una
estructura que contiene una lista de objetos que serán trasferidos por el servidor)
para propósitos de autenticación de HTTP.
sspec_setrealm(pag1, "Admin");
69
Nuevamente se agregan otros archivos a la lista de objetos del servidor,
asignándose estos recursos a los usuarios creados.
pag2 = sspec_addxmemfile("principal.shtml", principal_shtml, SERVER_HTTP);
sspec_adduser(pag2, user1);
sspec_adduser(pag2, user2);
sspec_adduser(pag2, user3);
sspec_setrealm(pag2, "Admin");
sspec_addxmemfile("logo_scan.PNG", logo_scan_PNG, SERVER_HTTP);
sspec_addxmemfile("butpid.PNG", butpid_PNG, SERVER_HTTP);
sspec_addxmemfile("butusuario.PNG", butusuario_PNG, SERVER_HTTP);
sspec_addxmemfile("butayuda.PNG", butayuda_PNG , SERVER_HTTP);
sspec_addxmemfile("chipbkgrnd.gif", chipbkgrnd_gif, SERVER_HTTP);
La función tcp_reserveport hace que el servidor Web ignore las peticiones cuando
no hay un socket disponible. Esto permite al servidor ocuparse de múltiples
peticiones fácilmente aun cuando se asignen pocos sockets.
tcp_reserveport(80);
El siguiente bloque de código realiza varias tareas, la primera es que espera que
el usuario presione el teclado y acorde a este valor, poder saber cual es el usuario
que se esta conectando con la aplicación y asignarle recursos.
De acuerdo con la tecla presionada, esto es validado para cada uno de los tres
usuarios permitidos. Como se mencionó anteriormente la función sspec_adduser
agrega un usuario a un recurso particular y la función sspec_removeuser elimina
a los usuarios asignados a ese recurso particular.
while (1) {
if (kbhit()) {
70
ch = getchar();
switch (ch) {
case '1':
user1_enabled = !user1_enabled;
if (user1_enabled) {
sspec_adduser(pag1, user1);
sspec_adduser(pag2, user1);
printf("Usuario 1 activo\n");
}
else { sspec_removeuser(pag1, user1);
sspec_removeuser(pag2, user1);
printf("Usuario 1 inactivo \n");
} break;
Los dos casos siguientes hacen la misma validación como en el caso anterior,
siendo específica para cada uno de los usuarios restantes.
case '2':
user2_enabled = !user2_enabled;
if (user2_enabled) {
….. }
else {
….. }
break;
case '3':
user3_enabled = !user3_enabled;
if (user3_enabled) {
…. }
else {
…. }
break;
71
Ahora en el siguiente código se puede observar los diferentes tipos de
autenticación que los usuarios pueden digitar desde la aplicación. La función
http_setauthentication() permite definir el tipo de autenticación, ya que, recibe
como parámetro a estos niveles de autenticación (HTTP_NO_AUTH,
HTTP_BASIC_AUTH, ó HTTP_DIGEST_AUTH).
case 'b':
http_setauthentication(HTTP_BASIC_AUTH);
printf("Usando autenticación básica \n");
break;
case 'd':
http_setauthentication(HTTP_DIGEST_AUTH);
printf("Usando autenticación Digest \n");
break;
case 'n':
http_setauthentication(HTTP_NO_AUTH);
printf("No usa autenticación \n");
break;
}
}
http_handler();
} // Llave que cierra while infinito
} //fin de main
La función http_handler() necesita ser llamada para manejar el servidor HTTP
activo a fin de recibir peticiones desde un navegador en cualquier momento.
A continuación se muestra la interfaz correspondiente al código descrito
anteriormente. Se puede apreciar cual es el usuario que se conectó y la ventana
de inicio de sesión para validar el nombre de usuario y contraseña, y así poder
asignar los recursos al mismo.
72
Figura 13. Autenticación digest para ingresar a una página Web
En la Autenticación básica se envía el nombre de usuario y contraseña en texto
claro, mientras que en la Digest, estos datos se envían de forma cifrada
criptográficamente. Con la no autenticación se accede a la página Web sin ningún
método de acceso.
Figura 14. Autenticación básica
73
3.2 PROTOCOLO SMTP
El protocolo SMTP se puede emplear en el módulo Rabbit, para enviar mensajes
de advertencia al correo electrónico del operador/usuario de un sistema dedicado
que se basa en este módulo, con el propósito de indicar sobre alguna anormalidad
en el sistema.
SMTP es el protocolo estándar para transferir correo entre computadores. Dada
su importancia se implementará con un pequeño ejemplo la funcionalidad de éste
en el módulo de control RCM2200.
El siguiente programa SMTP.c configura el módulo Rabbit para enviar un correo
electrónico a una dirección de correo específica que se encuentra predefinida en
el programa. Para esto primero se debe definir un nombre de dominio al módulo,
el cual lo identificará ante un servidor de correo.
/***********************************************************************************************
SMTP /smtp.c
74
**********************************************************************************************/
#class auto
#define TCPCONFIG 1
Se establece la forma cómo se almacenarán las variables, en este caso es auto
donde se ubican a nivel local en una pila en la memoria todas las variables.
Ahora se escriben los siguientes macros para configurar las direcciones de correo
del remitente y destinatario, al igual que el asunto y cuerpo del mensaje a enviar.
Los valores de los macros deben cambiarse acorde a la referencia que el usuario
utilizará.
#define DE "[email protected]"
#define PARA "[email protected]"
#define ASUNTO "ya obtuviste la noticia!"
#define CUERPO "Visita el portal web Rabbit Semiconductor .\r\n" \
"Allí usted encontrará las últimas noticias sobre Dynamic C."
Se define el macro SMTP_SERVER el cual informa a la librería DCRTCP.LIB
donde se encuentra el servidor de correo destino. Este servidor de correo debe
configurarse para recibir el correo desde módulo Rabbit. Este valor puede ser el
nombre o la dirección de IP
#define SMTP_SERVER “curn.edu.co” / /192.168.0.6
El macro SMTP_DOMAIN indica el nombre de dominio del módulo Rabbit. Este
valor puede ser el nombre o la dirección de IP. En este caso el nombre de
dominio de correo es: rabbit2200.org.co
#define SMTP_DOMAIN “rabbit2200.org.co” // "controlador.midominio.com"
75
El macro siguiente registra la comunicación entre el servidor de correo y el
módulo Rabbit.
#define SMTP_VERBOSE
Nuevamente se utilizan la directiva que se encarga de controlar el área de
memoria predefinida para las funciones, al igual que, la librería principal dcrtcp.lib
y la de soporte del protocolo SMTP.
#memmap xmem
#use dcrtcp.lib
#use smtp.lib
Luego de realizar la configuración previa de SMTP se escribe el código principal,
donde están las funciones que realizan el envío del mensaje
void main()
{
sock_init(); // se inicializa un socket para la conexión con el servidor de correo
La siguiente función inicia el envío del mensaje, la cual recibe como parámetros
los macros predefinidos anteriormente,
smtp_sendmail(DE, PARA, ASUNTO, CUERPO);
La función smtp_mailtick(), realiza un llamado repetido de la misma función
verificando que el mensaje se haya enviado completamente. Donde los valores de
retorno son: SMTP_PEDING, el cual indica que aun no se ha enviado el mensaje,
SMTP_SENT indicando que el mensaje se ha enviado, entre otros valores.
Partiendo de dichos valores cuando la comparación no se cumpla continuará con
la siguiente línea de código.
76
while(smtp_mailtick()==SMTP_PENDING)
continue;
La siguiente condición indica que la función smtp_status() verifica el estado del
mensaje si no se ha enviado (SMTP_PENDING), si ya se envió
(SMTP_SUCCES), si esta fuera del tiempo del envío (SMTP_TIME) ó si recibe
una respuesta no valida del servidor SMTP (SMTP_UNEXPECTED). De acuerdo
con estos valores de retorno se emitirá un mensaje.
if(smtp_status()==SMTP_SUCCESS)
printf("Mensaje enviado\n");
else
printf("Error enviando mensaje \n");
} // fin de main
3.3 PROTOCOLO TELNET El protocolo TELNET se podría emplear en el módulo Rabbit para enviarle
órdenes o datos a éste desde una terminal remota conectada a la red Ethernet,
como por ejemplo, enviar una orden para establecer una nueva dirección IP o
máscara de red con el objetivo de poder asignar la configuración de red del
módulo en tiempo de ejecución.
El siguiente es un ejemplo en el cual un servidor TELNET escucha por el puerto
lógico 23 una conexión entrante, para recibir datos desde un cliente TELNET
remoto.
Específicamente el ejemplo consiste en recibir una conexión, prepararle una
entrada y almacenar los datos dentro del búfer.
77
Inicialmente se realiza la configuración del servidor Telnet
/***********************************************************************************************
TELNET /telnet.c
**********************************************************************************************/
#class auto
#define TCPCONFIG 1
El macro INPUT_COOKED prepara la entrada de datos, define el código de
control Telnet indispensables para activar un código de compilación para el
funcionamiento del programa.
#define INPUT_COOKED
#memmap xmem
#use "dcrtcp.lib" // se incluye la librería principal TCPIP
A continuación se muestra el código correspondiente a la parte de la interfaz de
usuario. La siguiente es una función que recibe datos de entrada desde el búfer.
Como parámetros recibe un puntero de tipo caracter al búfer buf y un entero len
que representa el número de datos de entrada. Cuando esta función retorna, el
búfer es borrado. Si se desea conservar estos datos, deberían ser copiados en
una variable diferente de buf antes de ingresar a la función.
void receive_data(char *buf, int len)
{ auto int i;
for(i=0;i<len; i++)
printf("%c",buf[i]); //imprime los caracteres por pantalla
}
int init_recv(int port);
void recv_tick(void);
78
void main()
{
sock_init() ;//Se inicializa el socket para la conexión con el equipo remoto .
/* Escuchando el puerto */
if(init_recv(23) !=0) {
printf("Error en init_recv – No puede escuchar (conectarse)
al puerto \n");
exit(0);
}
while(1) {
recv_tick();
}
}
El macro MAX_BUFLEN indica el tamaño máximo del búfer en bytes. La
estructura de datos denominada telnet_recv, se encarga de manipular una serie
de variables indispensables para el estado de la conexión entre el cliente y el
servidor Telnet y el almacenamiento del búfer recibido. Los campos de la
estructura pueden observarse a continuación.
#define MAX_BUFLEN 256
typedef struct {
tcp_Socket sock; //asignación del socket TCP
tcp_Socket *s;
int lport; //Puerto local de escucha
int estado; //estado del socket
char buf[MAX_BUFLEN]; //buffer para almecenar datos
char cmdbuf[10];
} telnet_recv;
Ahora se crea la variable tr_state que es un tipo de dato de la estructura
telnet_recv:
79
telnet_recv tr_state;
En la siguiente instrucción se crea un puntero constante state de tipo telnet_recv,
el cual apunta al contenido de la variable antes declarada tr_state. La palabra
reservada const declara una valor que es almacenado en la memoria flash, es un
tipo de calificador que puede ser usado en cualquier tipo de datos específico, tanto
estático como global (carácter, entero o tipo estructura).
const telnet_recv *const state = &tr_state;
Se declaran los macros indispensables para la función de inicialización del socket.
#define STATE_INIT 0
#define STATE_STEADY 1
La función init_recv utiliza la estructura antes declarada para iniciar la conexión,
entonces se debe recurrir a que el puerto sea reconocido. Esta función recibe
como único parámetro el número del puerto de escucha.
int init_recv(int puertoloc)
{
state->s = &state->sock;
state->lport = puertoloc;
Las sentencias anteriores son apuntadores a las variables que almacena el estado
del socket y el número de puerto de escucha, (recuerde que el socket es un
espacio en memoria que guarda el estado de la conexión entre el cliente y el
servidor, y por lo tanto requiere el número del puerto que se manipula para lograr
dicha conexión).
80
tcp_listen() llama a la librería dcrtcp.lib que entra en sesión para que un puerto
particular sea aceptado. Esta retorna 1 para aceptar el puerto ó 0 si existe un
error.
tcp_listen(state->s, puertoloc, 0, 0, NULL, 0);
state->estado = STATE_INIT;
return 0;
} // fin función init_recv()
La siguiente instrucción activa el código de compilación que se encuentra entre su
dominio, esta empieza con #ifdef nombre y termina #endif, pero para poder
utilizar el nombre debe ser declarado con anterioridad con la directiva #define
nombre
#ifdef INPUT_COOKED
La función cook_cmd() emplea una función para escribir el número de bytes en el
socket TCP a enviarse por la red.
void cook_cmd(void)
{
auto int len;
len = 3;
La función sock_fastwrite() escribe tantos bytes posibles al socket y retorna el
número de bytes o -1 si existe algún error, se utiliza sólo para sockets TCP y
UDP. El primer parámetro de la función es el socket donde se escribirán los bytes,
el segundo son los bytes que se van a escribir en el socket y el tercero el número
máximo de bytes que se escribirán en el socket.
while(len > 0) {
len -= sock_fastwrite(state->s, state->cmdbuf + 3 - len, len);
81
}
} // fin función cook_cmd()
La función cook_input() prepara la entrada de los datos, recibe el tamaño de los
bytes, los manipula y los almacena en el búfer de estado, y retorna el nuevo
tamaño de los bytes almacenados en el búfer:
int cook_input(int len)
{ auto int newlen, i;
newlen = len;
for(i=0; i<(len-2); i++) {
if(state->buf[i] == 255) {
/* código de control */
Antes de escribir los bytes en el búfer debe verificarse que éstos no excedan el
tamaño predefinido del búfer que es de 256.
switch(state->buf[i + 1] ) {
case 251:
case 252: {
sprintf(state->cmdbuf, "%c%c%c",255, 254, state->buf[i + 2]);
cook_cmd();
La función memcpy() copia los bytes en la memoria, toma el número de bytes del
segundo parámetro y los asigna al primer parámetro tomando como número
máximo de bytes a escribir el valor numérico del tercer parámetro y retorna los n
bytes escritos en el primer parámetro.
memcpy(state->buf + i, state->buf + i + 3, len - (i + 3));
newlen -= 3;
break;
}
82
case 253:
case 254:
sprintf(state->cmdbuf, "%c%c%c",255, 252, state->buf[i + 2]);
cook_cmd();
memcpy(state->buf + i, state->buf + i + 3, len - (i + 3));
newlen -= 3;
break;
case 255:
break;
default:
/* comando desconocido */
memcpy(state->buf + i, state->buf + i + 2, len - (i + 2));
newlen -= 2;
break;
}
}
}
return newlen;
}// fin función cook_input()
#endif
void recv_tick(void)
{ auto int retval;
La siguiente función se encarga de procesar el paquete recibido y verificar el
estado de la conexión del socket, el cual recibe como parámetro un puntero al
estado del socket.
tcp_tick(state->s);
83
El siguiente switch verifica a través de los macros state_init ó state_steady el
estado de la conexión del socket.
switch(state->estado) {
case STATE_INIT:
La función sock_established() retorna verdadero si se establece la conexión del
socket, el valor retornado es uno (1).
if(sock_established(state->s)) {
printf("Conexión establecida.\n");
state->estado = STATE_STEADY;
}
break;
En caso de que el estado del socket sea igual al valor del macro STATE_STEADY
se verifica nuevamente el estado de la conexión con la función sock_established(),
para saber si se perdió la conexión. Si ocurre esto se trata de reestablecer la
comunicación a través de la función init_recv(), la cual recibe como parámetro el
puerto de escucha 23 definido en el campo lport de la estructura telnet_recv.
case STATE_STEADY:
if(!sock_established(state->s)) {
printf("Conexión perdida.\n\n");
init_recv(state->lport);
break;
}
La siguiente función sock_fastread() lee los bytes posibles del socket y retorna el
número de bytes leídos ó -1 si existe algún error, se utiliza sólo para sockets TCP
y UDP. El primer parámetro de la función es el socket donde se leerán los bytes, el
84
segundo son los bytes que se van a leer en el socket y el tercero es el número
máximo de bytes que se leerán en el socket.
retval = sock_fastread(state->s, state->buf, MAX_BUFLEN);
if(retval != 0) {
/* Se obtienen los datos en la variable retval*/
#ifdef INPUT_COOKED
retval = cook_input(retval);
#endif
receive_data(state->buf, retval);
/* Se entregan los datos de usuario */
} //fin if
break;
default:
/* No debe llegar aquí */
/* reestablece el control */
exit(-1);
} /cierra switch/
} // //fin funcion recv_tick(void)
Después de haber implementado el código de la aplicación Telnet, se compila y se
ejecuta en el módulo de control. Luego en la ventana Ejecutar el comando Telnet
es ejecutado indicando la dirección IP del host remoto al que se va conectar, como
se muestra en la figura.
Figura 15. Ventana Ejecutar de Windows XP
85
Al establecer la conexión TELNET con el equipo remoto, que en el caso es el
módulo Rabbit, se imprime en la ventana de salida de texto de Dynamic C, el
mensaje de “Conexión Establecida” sí se logra la conexión, de lo contrario se
mostrará el mensaje “Conexión Perdida”. Por consiguiente, en la consola de
TELNET que es abierta al ejecutar éste comando, se escribe el texto u orden que
aparecerá en esta misma ventana.
Figura 16. Ventana de salida de texto de Dynamic C
3.4 PROTOCOLO UDP
El Protocolo de Datagramas de Usuario es un protocolo de la capa de transporte
TCP/IP alternativo del protocolo TCP, el cual se puede emplear para la difusión
de mensajes desde el módulo Rabbit a los demás equipos conectados a la red, es
decir, un Broadcast, como en el caso del servicio DNS, que difunde un mensaje a
toda la red preguntando por el nombre de un host particular.
3.4.1 Servidor UDP. En el ejemplo a describir a continuación se establece una
conexión con socket UDP, dónde esta vez el módulo Rabbit trabaja como un
servidor UDP y recibe un paquete de información desde un cliente determinado.
/***********************************************************************************************
UDP /udp_srv.c
**********************************************************************************************/
#class auto
#define TCPCONFIG 1
86
Se define el búfer que almacenará el número máximo de conexiones desde un
cliente remoto, a través del siguiente macro.
#define MAX_UDP_SOCKET_BUFFERS 1
Ahora se define el puerto local que se utilizará para el envío de paquetes desde el
cliente, es decir, se debe especificar en el servidor que puerto local se utilizará
para el recibo de paquetes, donde únicamente se recibirán paquetes desde este
puerto.
#define LOCAL_PORT 1234
El siguiente macro especifica una dirección IP remota. Colocando el valor del
macro a cero (0) se indica que cualquier cliente se puede conectar al servidor,
determinando que el primer cliente que se conecte completará la conexión con su
dirección IP, número del puerto y, el socket local se limitará sólo a ese host. De lo
contrario si se especifican como se muestra todo a "255", se recibirá toda la
transmisión de todos los clientes en lugar de los paquetes enviados por un sólo
cliente. Con esto se termina la configuración del servidor.
#define REMOTE_IP "0"
// #define REMOTE_IP "255.255.255.255"
#memmap xmem
#use dcrtcp.lib // librería principal de TCPIP
Se inicializa un socket tipo UDP para la transmisión de datagramas de usuario el
cual permitirá establecer la conexión cliente – servidor.
udp_Socket sock;
87
La siguiente función retorna valores enteros acorde a la recepción de paquetes o
no por parte del servidor, retorna 0 (cero) si no recibe el paquete de lo contrario
retorna el valor 1.
int receive_packet(void)
{
static char buf[128]; /*Se inicializa una variable arreglo estática buf de 128 caracteres*/
#GLOBAL_INIT
{
memset(buf, 0, sizeof(buf));
}
El macro GLOBAL_INIT realiza una inicialización global de la función memset( ),
con el objetivo de que el bloque de código que se encuentra encerrado en las
llaves ({ }) se inicialice automáticamente una vez se ejecute el programa, donde
dicha función se encarga de fijar el arreglo buf a cero.
La siguiente instrucción utiliza la función udp_recv( ), que permite la recepción de
datagramas de usuarios a través de un socket UDP. El primer parámetro de la
función es el socket UDP donde se recibirá el datagrama, el segundo es el búfer
donde se almacenará el datagrama UDP, el tercero es el tamaño del búfer.
if (-1 == udp_recv(&sock, buf, sizeof(buf))) {
/* retorna paquete no leído. */
return 0;
}
printf("Recibido -> %s\n",buf);
return 1;
}
88
Esta función tiene tres valores de retorno que son mayor igual que cero (>=0)
cuando el paquete es recibido, menos uno (-1) cuando el datagrama se está
esperando, menor que menos uno (< -1) cuando existe la posibilidad de error en la
transmisión. Si el búfer buf no es lo suficientemente grande para el datagrama,
entonces éste será truncado, y el resto será eliminado.
Ahora en el main se inicializa la conexión con la sentencia sock_init().
void main()
{
sock_init();
/*printf("Abriendo socket UDP \n");*/
La función udp_open() abre un socket UDP en el puerto local dado
(LOCAL_PORT). Si la dirección IP remota es especificada (REMOTE_IP),
entonces se aceptarán sólo datagramas UDP de ese host. Si REMOTE_IP es
cero, el primer datagrama recibido en el puerto local completará la conexión, para
que sólo el host y el puerto remoto puedan consecuentemente enviar datagramas
a este socket. Los datagramas no se pueden enviar hasta que la conexión esté
completa. Si REMOTE_IP es -1 entonces, todos los hosts remotos pueden enviar
datagramas a este socket. Todos los datagramas salientes se enviarán a la
dirección de transmisión en el puerto especificado.
El primer parámetro de esta función es el socket, el segundo es el puerto local
(LOCAL_PORT) adónde serán enviados los datagramas, el tercer parámetro es la
dirección IP remota aceptable (REMOTE_IP), el cuarto es puerto remoto aceptable
(REMOTE_PORT), si se coloca a cero (0) establece conexión con el primer host
que envíe un datagrama, el quinto es el llamado a la función manejador de datos
(datahandler) cuando los datos son recibidos ó NULO para localizar los datos
recibidos por el búfer del socket.
89
La función como tal retorna dos tipos de valores: diferente cero ( !0 ) si el socket
esta abierto correctamente ó cero ( 0 ) si hay error abriendo el socket.
if(!udp_open(&sock, LOCAL_PORT, resolve(REMOTE_IP), 0, NULL)) {
printf("udp_open fracasado!\n"); // falla abriendo el socket udp
exit(0);
}
La función tcp_tick() se encarga de procesar el paquete recibido y verificar el
estado de la conexión del socket. Luego se hace el llamado infinitas veces a la
función recibir paquete receive_packet(), declarada antes del main().
for(;;) {
tcp_tick(NULL);
receive_packet();
} } //fin de main()
3.4.2 Cliente UDP. El programa udp_cli.c es el opuesto del programa anterior
udp_srv.c, donde ahora el módulo Rabbit está configurado como un cliente UDP.
El programa se refiere al envío de datagramas de usuario mediante paquetes,
desde un cliente a un servidor remoto dentro de una subred local.
/***********************************************************************************************
UDP /udp_srv.c
**********************************************************************************************/
#class auto
#define TCPCONFIG 1
Se define el número máximo de sockets búfer que serán asignados por el socket
UDP, aquí solo se necesitara un socket UDP.
90
#define MAX_UDP_SOCKET_BUFFERS 1
#define HEARTBEAT_RATE 4 // valor de la tasa de envió de paquetes en segundos
El macro LOCAL_PORT permite definir el puerto local UDP desde donde se
iniciará la transmisión del paquete.
.
#define LOCAL_PORT 1234
#define REMOTE_IP "10.10.6.177" //se define la dirección IP remota:
Se escribe el macro para determinar el puerto de destino.
#define REMOTE_PORT 1234 // se debe escribir un valor real
#memmap xmem
#use "dcrtcp.lib" // librería principal de TCPIP
udp_Socket sock ; // socket UDP para establecer la conexión con el servidor:
La siguiente función es la que permite enviar paquetes al servidor remoto,
retornando el valor de 1 si se establece el envío.
int send_packet(void)
{ // se declaran variables fundamentales para la función:
static long sequence;
auto char buf[128];
auto int length, retval;
A través del macro GLOBAL_INIT la variable sequence se inicializa en cero
siempre que se haga el llamado a la función.
#GLOBAL_INIT
{ sequence = 0; }
91
Se llena el paquete con datos importantes (una secuencia de números), la
instrucción sprintf da formato a los caracteres digitados por el usuario
almacenados en el búfer, devolviendo un número de caracteres escritos.
sequence++;
sprintf(buf, "SEQ=%ld", sequence);
length = strlen(buf) + 1;
Ahora se envía el paquete, a través de la función udp_send( ), la cual transmite el
datagrama al socket UDP. Los parámetros de la función son el socket UDP en el
que se envía el datagrama, el búfer donde se almacena el datagrama y el tamaño
del datagrama.
Dicha función tiene unos valores de retorno, si el valor es mayor igual que cero
(>=0), entonces el número de bytes han sido enviado, pero si el valor es menos
uno (-1) ha ocurrido una falla. Este valor de retorno es almacenado en la variable
entera retval, para así poder establecer una serie de comparaciones y emitir
mensajes acorde a este valor.
retval = udp_send(&sock, buf, length);
if (retval < 0) {
printf("Error enviando datagrama! Cerrando y volviendo a abrir el
Socket..\n");
if (sequence == 1) {
printf(" (La petición inicial ARP puede no haber terminado)\n");
}
sock_close(&sock); // esta instrucción cierra el socket:
La siguiente función abre un socket UDP en un puerto local dado, al igual que en
ejemplo anterior udp_srv.c, pero con la diferencia que el cuarto parámetro es un
macro con la dirección de un puerto remoto, esto significa que al abrir el socket se
92
debe especificar tanto el puerto local para enviar los datagramas como el puerto
remoto que recibirá dichos datagramas.
if(!udp_open(&sock, LOCAL_PORT, resolve(REMOTE_IP),
REMOTE_PORT, NULL)) {
printf("Falla de udp_open\n");
exit(0); }
}//fin de if retval
tcp_tick(NULL); /* procesa el paquete rápidamente y verificar el estado de la conexión
del socket.*/
return 1; // valor de retorno de la función send_paket( ).
} //ciera send_paket()
void main()
{ // Ahora en el main se inicializa el socket para la conexión con el servidor
sock_init();
printf("Abriendo el socket UDP \n");
if(!udp_open(&sock,LOCAL_PORT,resolve(REMOTE_IP), REMOTE_PORT, NULL))
{ printf(" Falla abriendo el socket UDP!\n");
exit(0);
}
Se inicia un ciclo infinito para mantener el estado de la conexión del socket a
través de la función tcp_tick
for(;;) {
tcp_tick(NULL);
costate {
waitfor(IntervalSec(HEARTBEAT_RATE));
waitfor(send_packet());
}
93
} //cierra ciclo for
} //cierra main
La estructura costate proporciona varias sentencias que representan para este
caso, los estados que puede tomar la transmisión de un paquete entre el cliente y
el servidor. La sentencia (waitfor) identifica un punto de suspensión pendiente o un
retraso.
Para la primera sentencia se hace el llamado a la función intervalsec( ), la cual
tiene el objetivo de proporcionar un retraso periódico basado en el tiempo de la
llamada anterior del waitfor, aquí se dará un retraso de 4 segundos, ya que, el
valor del macro HEARTBEAT_RATE es 4. En la segunda sentencia, de igual
modo se presentará un retraso en el envío del paquete, dado que el parámetro de
la función waitfor es la función send_packet().
3.5 SERVICIO DNS
El programa a describir es un ejemplo que permite establecer conexión a un
servidor DNS en una red LAN Ethernet con el objetivo buscar un nombre de un
host particular.
Inicialmente se establece el macro para la configuración de red utilizando la
configuración TCP/IP predefinida y la directiva que se en carga de controlar el
área de memoria predefinida para las funciones como en los ejemplos anteriores.
/***********************************************************************************************
DNS /dns.c
**********************************************************************************************/
#define TCPCONFIG 1 .
#memmap xmem
#use dcrtcp.lib
94
Se incluye la librería principal TCP/IP la cual hace el llamado a la librería de
funciones dns.lib, entre otras,
En el programa principal se declaran las variables que se utilizarán para
almacenar la dirección IP del nombre de dominio que será buscado.
void main()
{ longword ip;
char buffer[20];
sock_init(); // se inicializa la conexión
La función resolve( ), convierte una cadena de texto que contiene cualquier
dirección IP decimal punteada o un nombre de host a su correspondiente dirección
IP binaria. La cual retorna cero (0) si no resuelve el nombre de host, de lo contrario
devuelve diferente de cero (!0), es decir, la dirección IP encontrada. Si la función
recibe como parámetro una dirección IP punteada esta retornará la misma
dirección IP en su formato binario.
ip = resolve("www.curn.edu.co");
if(ip==0)
printf("no encontró www.curn.edu.co \n");
else
printf("%s esta es la dirección IP de www.curn.edu.co.\n",
inet_ntoa(buffer,ip));
} //cierra main
Luego de retornarse la dirección IP en formato binario se almacena en la variable
de tipo cadena ip, que sirve como uno de los parámetros de la función inet_ntoa(),
la cual convierte una dirección IP binaria a su formato decimal punteado, es decir,
cuatro (4) números decimales cada uno con valor que va de 0 a 255 separados
95
por punto "." , almacenándose este valor en el arreglo buffer que se declaró al
inicio del programa.
4. ANALISIS Y DISEÑO DEL SISTEMA DE MONITOREO Y CONTROL
4.1 GENERALIDADES DEL SISTEMA
En el proceso de recopilación de información relacionada a este proyecto y la
investigación correspondiente a los módulos de control embebidos Rabbit, surgió
la necesidad de diseñar e implementar un sistema integrado para la supervisión y
control de procesos industriales con comunicación vía red Ethernet SCAM.
Este sistema debe permitir monitorear, configurar y registrar información de la
variable controlada de un determinado proceso de control y, que a la vez sea de
bajo costo y de fácil implementación para las empresas del sector industrial local.
Teniendo en cuenta estos requerimientos, se optó por realizar dos aplicaciones:
una en formato Web para la interfaz de monitoreo y configuración del sistema,
aprovechando la funcionalidad que nos ofrece el módulo Rabbit de configurarse
como un servidor HTTP. La segunda es una aplicación de escritorio para
almacenar en una base de datos información de la variable controlada.
96
Las aplicaciones Web disminuyen los costos de implementación, mantenimiento y
manejo de recursos de sistema en una organización, debido a que fácilmente se
ejecutan en cualquier sistema operativo que tenga un navegador Web (Internet
Explorer, Netscape, otros) con conexión a una red LAN ethernet o a Internet.
Esta aplicación Web llamada SCAM Web, consiste en monitorear la(s) variable(s)
de un proceso automatizado, en este caso el monitoreo de temperatura y
configurar los parámetros del controlador PID digital, introduciendo los valores de
Kp (constante proporcional), Ti (tiempo integrativo), Td (tiempo derivativo),
Frecuencia de Muestreo y Valor de Referencia (Setpoint) de temperatura desde el
teclado, para así afectar el valor de la variable controlada. La lectura de esta
variable, es proporcionada al módulo de control Rabbit RCM2200 mediante un
sensor de señal análoga. Esta señal análoga es convertida a señal digital
mediante un conversor A/D, para así entregar un valor adecuado que el módulo
pueda procesar, ya que éste solo tiene entradas y salidas digitales. Luego de que
se compare el valor de entrada de la variable controlada con el valor de referencia
introducido y se realice el respectivo cálculo de error, se visualiza el nuevo valor
de la variable controlada en la aplicación Web.
Por otro lado, el procesamiento de las órdenes del operador/usuario desde la
aplicación Web se realiza por medio de CGI (interfaz de pasarela común) que es
una rutina que se ejecuta en tiempo real en un servidor Web o HTTP en respuesta
a una solicitud de un navegador Web (cliente). Cuando esto sucede el servidor
Web (Rabbit RCM2200) ejecuta una rutina programada especifica que recibirá los
datos que envía el operador/usuario para luego procesarlos en forma de variables
y responder con el recurso solicitado si es necesario.
Para llevar a cabo las etapas del proceso de software se utilizó el modelo lineal
secuencial como estrategia de desarrollo de software, en el cual se busca un
97
desarrollo de software de manera lineal, dando como resultado final la culminación
de un sistema completo. Esto es debido a que la naturaleza del sistema ameritó
emplear un modelo de proceso de ingeniería de software que comprendiera las
etapas de análisis, diseño, codificación, prueba y depuración para el sistema a
desarrollar.
Por consiguiente, para el análisis del sistema se apoyo del método de análisis
estructurado a fin de determinar los requerimientos funcionales de éste. En la
etapa de diseño se plasmó los requerimientos identificados durante la fase de
análisis, a través de bosquejos que representan el formato o pantalla que se
espera que aparezca cuando el sistema esté terminado. En la codificación se
utilizó el paradigma de programación estructurada (convencional) para desarrollar
el software, ya que éste es el empleado en la programación del módulo de control
Rabbit RCM2200.
4.2 ANÁLISIS ESTRUCTURADO DEL SISTEMA
Para el análisis de requerimientos y/o especificaciones del sistema desarrollado,
se empleó el análisis estructurado como método de modelado clásico, el cual
utiliza símbolos gráficos y diccionarios de datos para modelar un sistema nuevo o
existente. En la actividad de análisis de este sistema se aplicó las notaciones
ampliadas por Ward y Mellor11 para el análisis de flujo de datos en sistemas de
control o de tiempo real.
Diagrama 2. DFD de contexto del sistema SCAM
11 PRESSMAN, Rogers. Ingeniería del software: Un enfoque práctico. 5 ed. Madrid: McGraw Hill, 2002. p. 207 – 214.
98
El diagrama de contexto anterior es la representación a alto nivel del sistema de
control y monitoreo SCAM, en la cual elementos externos (fuentes) afectan con
sus entradas de alguna manera el proceso de software. Los elementos que hacen
parte de este modelo contextual son los siguientes:
Panel de Control. Este elemento externo, permite al usuario/operador
interactuar directamente con el sistema a través del teclado y el ratón del
equipo de computo, es decir, le proporciona a éste la posibilidad de digitar y
enviar datos y ordenes respectivamente al sistema de monitoreo y control.
Sensores. Son los elementos o dispositivos que perciben las señales
eléctricas, luminosas, mecánicas, etc. de las variables que se están
controlando en el sistema, para luego convertirlas en variables adecuadas
que se compararán con los valores de entrada de referencia de dichas
variables.
99
Monitor del panel de control. Es el dispositivo hardware del equipo de
cómputo que visualiza toda la información relacionada a la(s) variable(s)
que se controla(n), los parámetros de configuración del controlador PID,
etc., la cual es producida en la ejecución y operación del sistema.
Alarma. Mecanismo de prevención que indica al usuario/operador del
sistema posibles anormalidades, ya sea en algún proceso de control de
variable(s). Se presenta en forma de mensajes al correo electrónico del
operador/usuario o mensajes por pantalla.
Planta. Es la unidad física en la que se realiza el proceso control.
El siguiente diagrama de nivel 1 describe los respectivos procesos que son
ejecutados en el sistema de control y monitoreo. El operador/usuario
inicialmente interactúa con la interfaz de monitoreo SCAM Web para poder
ejercer la tarea de supervisión y operación del sistema o especificar los
parámetros de configuración del algoritmo de control PID que reside en la
memoria del módulo de control digital. Este módulo lee la señal proveniente
del sensor y la convierte en una señal adecuada para poderla interpretar y así
de esta manera realizar la acción de control de la variable de entrada al
sistema.
Diagrama 3. DFD Nivel 1 del sistema SCAM
100
Diagrama 4. DFD Nivel 2 que refina el proceso de interactuar con operador
101
Diagrama 5. DFD Nivel 2 que refina el proceso de configuración parámetros
sistema
Diagrama 6. DFD Nivel 2 que refina el proceso de control de variables
102
Diagrama 7. DFD Nivel 3 que refina el proceso de iteración algoritmo de control
PID
4.3 DICCIONARIO DE DATOS
103
4.3.1 Procesos. Descripción de los procesos de primer nivel.
PROCESO 1. Interactuar con operador
DESCRIPCIÓN Proceso por el cual el usuario/operador se pone en contacto con el software a través del teclado y ratón, para dar inicio al proceso de monitorización y operación de la planta o proceso.
ENTRADA Datos de operador
SALIDA Orden de inicialización Petición de configuración
PROCESO 2. Configurar parámetros sistema
DESCRIPCIÓN Permite al usuario/operador establecer parámetros de configuración de: gestión de usuarios, Valor(es) de referencia de la(s) variable(s) a controlar, constantes Kp, Ti, Td y Frecuencia de muestreo.
ENTRADA Petición de configuración
SALIDA Datos de configuración
PROCESO 3.Supervisión y operación sistema
DESCRIPCIÓN Permite visualizar el estado de la(s) variable(s) que se controla en el sistema de control, a través de valores reales proporcionados en cada instante por el módulo de control.
ENTRADA Orden de inicialización Estado de variable(s)
SALIDA Información a visualizar
104
PROCESO 4. Enviar parámetros al controlador vía red
DESCRIPCIÓN Los datos que han sido introducidos en el proceso de configuración de parámetros del sistema, son enviados a través de la red Ethernet al módulo de control RCM2200, el cual se encuentra conectado a un punto de red, para así ajustar o modificar los parámetros preestablecidos en este módulo.
ENTRADA Datos de configuración
SALIDA Ajuste de parámetros
PROCESO 5. Control de variable
DESCRIPCIÓN En este proceso se lee continuamente las señales que son enviadas por los distintos sensores, es decir los valores de las variables que se están controlando, que a su vez se comparan con los valores de referencia de dichas variables, para así emitir señales correctivas y de alarma al sistema en general.
ENTRADA Señale(s) de sensor(es) Ajuste de parámetros
SALIDA Estado de variable(s) Tipo de alarma Señal de control
4.3.2 Flujo de datos. Descripción de los flujos de datos de primer nivel.
NOMBRE DEL FLUJO DE DATOS Datos de operador/usuario
DESCRIPCIÓN Representa los datos de inicio de sesión como cuenta de usuario y contraseña
PROVENIENTE DE LA FUENTE Panel de control
PARA EL PROCESO Interactuar con operador
NOMBRE DEL FLUJO DE DATOS Señal de sensor
DESCRIPCIÓN Impulsos eléctricos que son enviados a un módulo de conversión de datos análogo/digital
PROVENIENTE DE LA FUENTE Sensor
PARA EL PROCESO Control de variable
105
NOMBRE DEL FLUJO DE DATOS Petición de configuración
DESCRIPCIÓN Permite que el operador/usuario asigne y/o modifique parámetros de referencia en el sistema, para el control de los diferentes eventos que han sido preestablecidos en éste.
PROVENIENTE DEL PROCESO Interactuar con operador
PARA EL PROCESO Configurar parámetros sistema
NOMBRE DEL FLUJO DE DATOS Orden de inicialización
DESCRIPCIÓN Orden que se le da al sistema de monitoreo para que inicialice el proceso de supervisión y operación.
PROVENIENTE DEL PROCESO Interactuar con operador
PARA EL PROCESO Supervisión y operación sistema
NOMBRE DEL FLUJO DE DATOS Estado de variable
DESCRIPCIÓN Indica el valor que toma la variable controlada en un instante de tiempo determinado. Este valor es enviado desde el módulo de control RCM2200 a la aplicación Web a través de la red Ethernet
PROVENIENTE DEL PROCESO Control de variable
PARA EL PROCESO Supervisión y operación sistema
NOMBRE DEL FLUJO DE DATOS Información a visualizar
DESCRIPCIÓN Conjunto de datos reales procesados desde el módulo de control o resultado de la configuración de parámetros del controlador con el fin de que el operador/usuario los observe de una manera clara y detallada.
PROVENIENTE DEL PROCESO Supervisión y operación sistema
PARA EL DESTINO Monitor panel de control
106
NOMBRE DEL FLUJO DE DATOS Tipo de alarma
DESCRIPCIÓN Representa un nivel de prioridad de la alarma cuando suceden anomalías en el normal desempeño del sistema de monitoreo y control. Se presenta en forma de mensajes al correo electrónico del operador/usuario o mensajes por pantalla.
PROVENIENTE DEL PROCESO Control de variable
PARA EL DESTINO Alarma
NOMBRE DEL FLUJO DE DATO Datos de configuración
DESCRIPCIÓN Representa cada uno de los datos parámetrizados en el sistema, como punto de ajuste de la variable a controlar, valores Kp, Ti, Td, frecuencia de muestreo, y datos de gestión de usuario.
PROVENIENTE DEL PROCESO Configuración parámetros sistema
PARA EL PROCESO Enviar parámetros al controlador vía red
NOMBRE DEL FLUJO DE DATO Ajuste de parámetros
DESCRIPCIÓN Son los datos que han sido introducidos previamente en el proceso de configuración del sistema, los cuales modificaran los valores de las variables preestablecidas en el módulo de control, como son Kp, Ti, Td, Ts, setpoint, etc
PROVENIENTE DEL PROCESO Enviar parámetros al controlador vía red
PARA EL PROCESO Control de variable
NOMBRE DEL FLUJO DE DATO Registro de variable
DESCRIPCIÓN Representa la información de la variable controlada que se registra en la base de datos, como lo es nombre de variable, valor, unidad, estado, hora y fecha de almacenamiento.
PROVENIENTE DEL PROCESO Control de variable
PARA EL ALMACEN Bases de Datos SCAM
107
4.4 DISEÑO DE LA INTERFAZ DE MONITOREO SCAM WEB
4.4.1 Diseño arquitectónico. Para el diseño de la aplicación Web se empleó la
notación de estructura jerárquica12 que es la arquitectura de aplicaciones Web
más común.
Figura 17. Diseño arquitectónico de la aplicación SCAM Web
12
PRESSMAN, Op.cit., p. 529
108
4.4.2 Diseño de plantillas de la interfaz de usuario. En el diseño de la interfaz
de usuario (pantallas) de una aplicación se comienza por reconocer que ésta está
compuesta por diferentes áreas. Por consiguiente en el diseño de la interfaz de
usuario de la aplicación SCAM Web, se elaboró una serie de plantillas que
esbozan como quedarán definidas las diferentes áreas de esta interfaz.
La plantilla de la página de inicio de la aplicación SCAM Web, consta de tres
zonas o áreas, las cuales son mostradas en la siguiente figura.
109
Figura 18. Plantilla página inicio de sesión
Área de Logotipo
Área de Contenido
Área de inicio de Sesión
En la plantilla de la página principal, también se encuentra establecida un área de
logotipo que es común para las demás, una de vínculo que son los enlaces a las
otras páginas de la aplicación y un área de supervisión respectivamente, como se
observa a continuación.
Figura 19. Plantilla página principal
Área de Logotipo
Área de Vínculos
Área de Supervisión
Para las páginas de configuración de parámetros PID y configuración de usuarios,
se tomó como base la misma plantilla, ya que ambas le proporcionan al
usuario/operador configurar parámetros en el sistema.
Figura 20. Plantilla páginas de configuración parámetros PID y de usuarios
110
El diseño de la plantilla de la página de ayuda, incluye un área de contenido en
donde se visualizará la información que solicita el usuario/operador sobre el
manejo de la aplicación Web e información pertinente de los desarrolladores de
ésta. Además contiene un área de vínculos como en las anteriores.
Figura 21. Plantilla página de ayuda
Por último, se diseño la
plantilla para mostrar los
mensajes de alarma o error
de ingreso de datos, para así
indicarle al usuario/operador que se presenta una anormalidad en el sistema.
Figura 22. Plantilla para mensajes de alarma o error de ingreso de datos
Área de Logotipo
Área de Vínculos
Área de Configuración
Área de
Vínculos
Área de contenido
111
4.4.3 Diseño de entrada de datos. El diseño de entrada se basa en el desarrollo
de especificaciones y procedimientos para la preparación de los datos que se
ingresarán en el sistema; de forma que puedan ser utilizables para el
procesamiento de información valiosa para el usuario. En el diseño de entrada de
datos de la aplicación SCAM Web, se tuvo presente el tipo de datos que se
ingresa en los respectivos formularios de captura de datos, para así aplicar
procedimientos como la validación de datos, es decir si la entrada tiene un formato
sólo numérico, texto o alfanumérico.
Para la entrada de los datos de identificación nombre de usuario y contraseña en
la página de inicio de sesión, se empleó cajas de texto básicas (Textbox) como se
muestra en la figura 23. Se consideró que estos datos pueden ser alfanuméricos y
con un tamaño máximo de veinte cinco (25) caracteres por campo, para una
mayor seguridad en el acceso al sistema. Además el campo contraseña es
definido como dato confidencial o privado, en donde el texto introducido se
sustituye por viñetas para ocultar éste a otras personas que pueden estar
mirándolo. Sin embargo las contraseñas que se envían al servidor Web mediante
campos de contraseña no están cifradas.
Figura 23. Diseño de entrada de los datos nombre de usuario y contraseña
Área de titulo
Área de mensaje
112
Igualmente, para los datos de configuración de usuario se emplea el mismo diseño
de entrada, cajas de texto para los datos de modificación de contraseña y correo
electrónico en formato alfanumérico, y una caja de selección para indicar el tipo
de usuario al que se le cambiarán los parámetros anteriores, como se muestra en
la figura 24.
Figura 24. Diseño de entrada de datos gestión de usuario
Datos Proporcionado por
el operador/usuario
113
En la siguiente figura se observa el área de configuración de los parámetros del
controlador PID. Aquí se introducen los valores de tipo numérico de las variables
valor de referencia de la variable controlada, Kp, Ti, Td y frecuencia de muestreo,
en cajas de texto para ser enviadas a través de la red Ethernet a la memoria del
módulo de control RCM2200, para así dar inicio o restaurar el proceso de control
automático.
Figura 25. Diseño de entrada de datos parámetros del controlador PID
Datos Proporcionado por
el operador/usuario
114
4.4.4 Diseño de controles. En esta aplicación, se han diseñado controles de
validación en la entrada de datos, con el fin de presentar mensajes de error y
advertencias al usuario/operador cuando éste introduce datos erróneos o se
contiene de ingresar datos en campos obligatorios.
En los campos de entrada nombre de usuario y contraseña se validó que estos
dos sean obligatorios para poder ingresar a la página principal de la aplicación.
Del mismo modo se validaron los campos de los parámetros de entrada del
controlador PID como obligatorios y solo números, para comprobar que los
campos contengan solamente caracteres numéricos; en caso contrario se
visualiza en pantalla un mensaje de error, como se muestra en las figura 26.
Figura 26. Mensaje de error de introducción de datos
Datos Proporcionado por
el operador/usuario
115
Figura 27. Mensaje de error indicando que un campo es obligatorio
En el campo correo electrónico de la página configuración de usuarios, se
comprueba por ejemplo, si la dirección de correo ingresada contiene un símbolo
arroba @.
4.4.5 Diseño de salida. En la aplicación SCAM Web las salidas del sistema
pueden ser: mensajes de alarma o error de ingreso de datos para informarle al
usuario/operador de cualquier anormalidad en el normal funcionamiento del
sistema de control y monitoreo, o la salida por pantalla del valor actual y valor de
referencia de la variable que se está controlando, en este caso la temperatura.
116
Figura 28. Salida del valor del variable controlada
Figura 29. Salida de un mensaje de error
4.5 DISEÑO DE LA APLICACIÓN DE ALMACENAMIENTO SCAM SERVER
Datos Proporcionados por
el sistema
117
La funcionalidad básica de SCAM Server es almacenar en una base de datos los
valores y estados de la variable controlada enviadas desde el módulo de control
RCM2200 a través de la red.
4.5.1 Diseño de módulos. La aplicación SCAM Server es un módulo del sistema
integrado SCAM, que a la vez esta constituido por los siguientes módulos.
Figura 30. Módulos de la interfaz SCAM Server
4.5.2 Diseño de la base de datos. La base de datos del sistema SCAM está
conformada por una tabla que almacena información de la variable controlada en
el módulo de control Rabbit RCM2200. Esta información permitirá crear históricos
de la variable, a fin de proporcionarle al usuario/operador del sistema la manera en
que se comporta ésta en un cualquier lapso de tiempo. La tabla llamada Variables
se compone de los campos nombre de la variable, valor, unidad, estado, hora y
fecha en que se tomo la lectura de la variable.
SCAM Server
Archivo Configuración Operación Ayuda
Salir C. Parámetros Iniciar escucha
Desconectar
Históricos
Acerca de
118
Tabla 2. Tabla Variables de la base de datos SCAM
Variable Valor Unidad Estado Hora Fecha
Texto Numérico Texto Texto Formato
corto
Formato
corto
5. PUEBAS E IMPLEMENTACIÓN DEL SISTEMA
119
5.1 ASPECTOS METODOLÓGICOS
En la realización de este proyecto de automatización de procesos industriales, se
utilizaron diversas metodologías en cada etapa que abarca el diseño e
implementación del sistema de control automático y monitoreo SCAM, estas
etapas se mencionan a continuación.
Recopilación de información. Inicialmente se realizó una recopilación de
información sobre los diferentes dispositivos de hardware disponibles en el
mercado que se emplean en el control de procesos industriales, de manera
que se ajustara a las necesidades básicas de automatización de las
pequeñas y medianas empresas a nivel local, y que presentara
características como bajo costo de implementación, conectividad con redes
Ethernet, programación a alto o bajo nivel, entre otras. Teniendo en cuenta
estos aspectos se decidió escoger el módulo de control digital Rabbit
RCM2200.
Documentación del dispositivo Rabbit RCM2200. Después de haber
seleccionado y adquirido el dispositivo, se realizó el estudio y
documentación de este sistema con el propósito de conocer su
funcionalidad y características más relevantes. Por ejemplo la forma de
programación, la conexión a redes Ethernet, los protocolos de
comunicación de red que soporta y compatibilidad con otros dispositivos
electrónicos.
Selección del algoritmo de control PID. Una vez conocida las
funcionalidades del módulo Rabbit RCM2200, se realizó un estudio sobre
los diferentes tipos de algoritmos de control que se podrían implementar en
este módulo, observando cual de los algoritmos se ajustaba mejor a las
necesidades del controlador a desarrollar. Finalmente se decidió escoger el
120
algoritmo de control Proporcional Integral Derivativo (PID) básico, dado que
es sencillo, ampliamente utilizado en el control de procesos industriales,
además se adapta muy bien a numerosos tipos de procesos.
Diseño del sistema de control. Luego de seleccionar el algoritmo de
control, se inició el diseño del sistema de control, con el propósito de definir
los principales componentes del software a desarrollar, como la
implementación del algoritmo PID, la interfaz de monitoreo, la interfaz de
almacenamiento de datos y la librería de funciones que permitan configurar
los parámetros de red (IP, Mascara de Red, Puerta de Enlace, entre otros)
y funciones básicas para los protocolos de comunicación.
Diseño y desarrollo de las interfaces de monitoreo y de
almacenamiento. Después de analizar los requerimientos del sistema de
monitoreo, se decidió realizar una aplicación en formato Web que pudiera
aprovechar las características y ventajas que ofrecen este tipo de aplicación
en un contexto empresarial, ya que se ejecutan en cualquier sistema
operativo que tenga un navegador Web con conexión a una red LAN
Ethernet o a Internet. Por consiguiente, para el diseño de la interfaz de
monitoreo se basó en la notación de estructura jerárquica, propia para el
diseño de aplicaciones Web. Luego para convertir este diseño a páginas
Web se utilizó la herramienta de desarrollo Web Macromedia Dreamweaver
MX 2004, que nos permitió desarrollar el código de las páginas en lenguaje
HTML incorporándole eventos JavaScript.
Además, se realizó el diseño y desarrollo de la aplicación de
almacenamiento, encargada de almacenar los valores de la variable
controlada registrados por el módulo de control. Esta aplicación de
escritorio se desarrolló con la herramienta Microsoft Visual Basic 6.0,
acoplándose a una base de datos desarrollada en Microsoft Access
121
mediante el objeto de datos ActiveX ADO. La característica principal de
esta aplicación es que presenta conectividad vía Ethernet con el sistema de
control por medio de la programación de socket's TCP.
Documentación e implementación de los protocolos TCP/IP. En esta
etapa se realizó la documentación de la familia de protocolos de
comunicación TCP/IP que se pueden implementar en el módulo de control
Rabbit RCM2200, siendo los de mayor aplicabilidad HTTP, UDP, SMTP,
TELNET, DNS. La implementación de los protocolos en este módulo
consistió en el desarrollo de programas ejemplos codificados en el entorno
de desarrollo Dynamic C v8.1013, cuyo objetivo primordial fue observar el
funcionamiento de cada programa y el comportamiento del módulo Rabbit
RCM2200 antes éstos.
Desarrollo de la librería de funciones. Esta librería contiene las librerías
de gestión de red del protocolo TCP/IP y funciones básicas de conexión con
otros sistemas empleando este protocolo. Para la escritura del código de la
librería se utilizó el entorno de programación de Dynamic C v8.10, el cual
posee funciones predefinidas propias para la implementación de este tipo
de librerías.
Programación del PIC 16F877. En esta etapa se efectuó la programación
del dispositivo que realiza la conversión de la señal análoga a señal digital,
proveniente del elemento de medición (sensor), antes que llegue al módulo
de control, debido a que éste maneja señales de E/S digital. La
programación del PIC fue realizada en código ensamblador utilizando la
herramienta MPLAB.
13
Vea Anexo B “Manual de usuario de Dynamic C”.
122
Integración del sistema de control y monitoreo. En esta etapa se verificó
el funcionamiento correcto de todo el sistema, integrando todos los
componentes tanto de hardware como de software, realizándose las
pruebas correspondientes. Inicialmente se adaptó el conversor A/D
PIC16F877 al módulo de control comprobándose el funcionamiento
adecuado entre estos dispositivos a través del protocolo I2C. Luego se
ejecutó todo el sistema de control y monitoreo, y la aplicación de
almacenamiento, con la finalidad de confirmar que se realizaran todos los
procesos de comunicación acorde a lo planteado en el diseño.
5.2 PRUEBAS DEL SISTEMA
La prueba del sistema, ésta constituida por una serie de pruebas diferentes cuyo
propósito primordial es ejercitar profundamente el sistema basado en
computadora. Aunque cada prueba tiene un propósito diferente, todas trabajan
para verificar que se han integrado adecuadamente todos los elementos del
sistema y que realizan las funciones apropiadas. A continuación se describirán los
resultados obtenidos en las pruebas que se le hicieron al sistema SCAM.
5.2.1 Prueba de recuperación. Con el propósito de saber que tan tolerante a
fallos es el sistema SCAM, conformado por las aplicaciones SCAM Web y SCAM
Server; se forzó al fallo de ambos, a fin de verificar que la recuperación se lleve a
cabo apropiadamente.
Primeramente, se interrumpió el suministro de energía al módulo de control
Rabbit, con el objetivo de constatar de que éste se recupere sin problemas al
momento del reestablecimiento de la energía, observándose que el módulo Rabbit
inicializa automáticamente el proceso de control; sin embargo la aplicación de
monitoreo SCAM Web debe inicializarse nuevamente de manera manual para
establecer la conexión con el módulo de control. Independientemente a esto, el
123
software SCAM Server continuará a la espera de establecer la comunicación con
el módulo de control cuando se reestablezca la energía. La forma como se
inicializa las aplicaciones SCAM Web y SCAM Server se explica en el anexo C.
El otro caso de prueba, es cuando falla la comunicación en el sistema, ya sea por
desconectar físicamente el cable de red en un punto de red donde está conectado
el módulo Rabbit o por congestión de la red. Se comprobó en este caso, que el
módulo Rabbit continúa realizando normalmente el proceso de control, siendo
interrumpida la comunicación entre las aplicaciones de monitoreo SCAM Web y
SCAM Server, por lo que los datos obtenidos en el proceso de control no serán
transmitidos a estas aplicaciones.
5.2.2 Prueba de seguridad. El sistema SCAM presenta mecanismos de
protección de accesos, a través de la validación de nombres de usuarios y
contraseñas, con el fin de evitar el ingreso al sistema de usuarios no autorizados.
Para confirmar lo anterior se le permitió a varias personas no comprometidas con
el desarrollo de este sistema a que digitaran claves de acceso seguidamente para
romper la barrera de seguridad del sistema, quienes después de varios intentos
fallidos no lograron ingresar al sistema.
5.2.3 Prueba de resistencia. Esta prueba determina la resistencia del sistema
ante situaciones anormales o que demanden recursos en cantidad. Al aplicar esta
prueba al sistema SCAM, se comprobó que el módulo rabbit (servidor Web)
funciona satisfactoriamente cuando recibe múltiples peticiones por parte de los
usuarios de la aplicación SCAM Web, presentando un tiempo de respuesta
considerable a estas peticiones. Igualmente se verificó que al ingresar datos al
sistema con una frecuencia mayor a la normal, las funciones de entrada de datos
respondieron de manera adecuada, sin alterar el normal desempeño del sistema.
124
5.2.4 Prueba de rendimiento. En base a las pruebas de resistencia realizadas
se observó el rendimiento del sistema SCAM en tiempo de ejecución. En este
caso el rendimiento del sistema se evidenció a través de la medición de los
tiempos de respuesta del servidor Web (Rabbit RCM2200). Estos tiempos de
respuesta fueron aproximadamente inferiores a los tres (3) segundos cuando el
tráfico de la red es relativamente bajo. Por lo tanto se puede afirmar que el
rendimiento del sistema es eficiente.
5.4 IMPLEMENTACIÓN DEL SISTEMA
En la implementación del sistema SCAM se utilizaron varios recursos de hardware
y software para lograr la integración y funcionamiento completo de éste, como por
ejemplo, equipos de cómputo con sistema operativo Windows XP y navegador
Web Internet Explorer, el módulo de control y un concentrador o Switch para la
conexión de estos equipos en una red Ethernet de topología estrella.
5.3.1 Descripción de la plataforma. El sistema de control y monitoreo SCAM
está conformado por los siguientes componentes: una aplicación Web de
monitoreo que se puede ejecutar desde cualquier equipo conectado a la red, un
módulo de control Rabbit RCM2200 que a la vez funciona como un servidor Web y
un software que permite el almacenamiento de los datos provenientes del módulo
de control en una base de datos realizada en Microsoft Access 2000, como se
muestra en la figura 31.
Figura 31. Plataforma del sistema SCAM
125
126
6. CONCLUSIONES
Con el desarrollo del sistema de control automático y monitoreo SCAM se observó
que los sistemas de control se pueden optimizar cada vez más gracias al
aprovechamiento de los avances tecnológicos en hardware y a la optimización y
mejoras en el software, consiguiendo una integración de tecnologías y una alta
funcionalidad para la medición y control de variables de procesos industriales.
La utilización del módulo Rabbit RCM2200 en este proyecto permitió enriquecer
los conocimientos relacionados con los sistemas de control embebidos, pues se
tuvo la oportunidad de interactuar con un dispositivo de alta tecnología que
soporta la programación de estrategias de control complejas, además brinda una
gran versatilidad en comunicaciones por la disponibilidad de puerto Ethernet,
siendo esta su mayor ventaja en el desarrollo y la implementación de sistemas de
control y monitoreo de bajo costo.
El desarrollo de SCAM dio como resultado un producto innovador, de gran interés
para las empresas del sector industrial, a razón de, que es una herramienta
eficiente en el monitoreo y control de procesos, y los costos de implementación no
son tan elevados en comparación con otros sistemas similares que ofrece
actualmente el mercado. Además se espera que este sistema sea de gran utilidad
en el laboratorio de automatización industrial de la CURN y se afiance como una
herramienta educativa para los estudiantes y docentes comprometidos con la
búsqueda de nuevos conocimientos en ésta área, tan importante de la ingeniería
de sistemas.
127
7. RECOMENDACIONES
Tras haber finalizado este proyecto, se sugiere las siguientes recomendaciones
con el propósito de realizar futuras mejoras al sistema desarrollado y poder brindar
así una herramienta que ofrezca más capacidades tanto de hardware y software
de las que ofrece esta versión inicial.
Se recomienda que para el desarrollo de futuros sistemas de control
embebidos basados en el módulo Rabbit RCM2200 se realice la expansión
de la memoria flash de éste, ya sea, a través del módulo SF1000 de
Z-World que tiene una capacidad de almacenamiento de 8 MB o con un
chip de memoria accesible en el mercado local; con la finalidad de
implementar programas que requieran mayor recurso de memoria.
Poder implementar nuevas estrategias de control utilizando algoritmos de
control difuso y control adaptativo, con el objetivo de evaluar el desempeño
de éstos con respecto al algoritmo de control PID convencional.
Poder efectuar la integración de varios módulos de control basados en la
familia de microprocesadores Rabbit, con el fin de desarrollar un sistema
completo para el control de varios procesos industriales en una
determinada planta.
Implementar una función al sistema de control que permita almacenar en la
memoria del módulo Rabbit los valores registrados por éste en un lapso de
tiempo determinado mientras no se establezca comunicación con la
aplicación de almacenamiento, con el objetivo de que una vez reestablecida
la comunicación estos datos se envíen a la base de datos.
128
BIBLIOGRAFIA
ABAD, Alfredo y MADRID Mariano. Redes de área local. Madrid : McGraw Hill,
1997. 238 p.
BALCELLS, Joseph y ROMERAL, José Luís. Autómatas programables. Madrid :
Alfaomega, 1998. 439 p.
BERRIO, Tatiana; JEREZ, Emilio y MONTIEL, Jesús. Diseño e implementación
de un sistema de control de nivel liquido. Cartagena, 2002, 140 p. Trabajo de
grado (Ingeniero de Sistemas). Corporación Universitaria Rafael Núñez. Facultad
de Ingeniería de Sistemas. Área de automatización industrial
CREUS SOLÉ, Antonio. Instrumentación industrial. 6 ed. Bogotá : Alfaomega,
2001. 750 p.
GOMÁRIZ CASTRO, Espartacus; BIEL SOLÉ, Domingo y ALCALÁ, José. Teoría
de control : Diseño electrónico. México : Alfaomega, 1999. 392 p.
KATSUHIKO, Ogata. Ingeniería de control Moderna. 3 ed. Madrid : Prentice Hall,
1999. 720 p.
PRESSMAN, Rogers. Ingeniería del software : Un enfoque práctico. 5 ed. Madrid :
McGraw Hill, 2002. 601 p.
SENN A., James. Análisis y diseño de sistemas de información. 2 ed. Bogotá :
McGraw Hill, 1998. 941 p.
STALLINGS, William. Comunicaciones y redes de computadores. 5 ed. Madrid :
Prentice Hall, 1999. 792 p.
129
FUENTES DE INFORMACIÓN ELECTRÓNICAS
Dynamic C user’s manual [en-línea]. Davis (California), 2002. part number:
030424 · 019-0125-A. Actualizado continuamente : texto en ingles. Disponible en
internet: <http://www.rabbitsemiconductor.com/docs/ o
http://www.zworld.com/documentation/docs/manuals >.
Dynamic C TCP/IP user’s manual [en-línea]. Davis (California), 2002. part
number: 030424 · 019-0100-G. Actualizado continuamente : texto en ingles.
Disponible en internet: <http://www.rabbitsemiconductor.com/docs/ o
http://www.zworld.com/documentation/docs/manuals >.
RabbitCore RCM2200 Getting Started manual [en-línea]. Davis (California), 2003.
part number: 019-0096 • 030725-E. Actualizado continuamente : texto en ingles.
Disponible en internet: <http://www.rabbitsemiconductor.com/docs/ o
http://www.zworld.com/documentation/docs/manuals >.
RabbitCore RCM2200 user´s manual [en-línea]. Davis (California), 2003. part
number: 019-0097 • 030731-C. Actualizado continuamente : texto en ingles.
Disponible en internet: <http://www.rabbitsemiconductor.com/docs/ o
http://www.zworld.com/documentation/docs/manuals >.
PIC16F87X Data Sheet 28/40-Pin 8-Bit CMOS FLASH Microcontrollers [en-línea].
USA, 2001. Texto en ingles. Disponible en internet: < http://www.microchip.com>
127
ANEXOS
128
ANEXO A
MANUAL DE USUARIO DEL
MÓDULO RABBIT RCM2200
129
INTRODUCCIÓN
Este anexo explica el funcionamiento básico y las características de hardware del
módulo Rabbit RCM2200, con el propósito de ampliar los conocimientos
relacionados con este dispositivo, el cual fue el objeto de estudio de este proyecto.
130
A.1 CARACTERISTICAS GENERALES DEL MODULO RCM2200
El módulo de control digital Rabbit RCM2200 es un sistema integrado que provee
una plataforma hardware basada en un microprocesador Rabbit 2000, software
Dynamic C para la programación del microprocesador en lenguaje de
programación C y con conectividad Ethernet integrada para la comunicación vía
TCP/IP con otros sistemas, siendo éste diseñado especialmente para el desarrollo
de sistemas de control embebido.
Figura 32. Vista posterior y anterior del módulo Rabbit RCM2200
A.1.1 Características del hardware. El módulo RCM2200 que se observa en la
figura anterior integra cierto número de características importantes para su
funcionamiento, como lo son:
Microprocesador Rabbit 2000 de 22.1 MHz
Memoria flash 256 Kbyte
Memoria RAM estática (SRAM) de 128 Kbyte
Cinco temporizadores de 8 bits y dos de 10 bits
131
Dos conectores que proporcionan 26 líneas E/S paralelas: 16 configurables
para entrada o salida, 7 entradas fijas, y 3 salidas fijas.
8 líneas de datos (D0 – D7).
4 líneas de direcciones (A0 – A3).
Memoria E/S lectura, escritura
Entrada de reestablecimiento externa
Reloj en tiempo real
Supervisor Watchdog (perro guardián)
Circuitos necesarios para reestablecer y administrar la batería de respaldo
del procesador y RAM estática.
Interfaz Ethernet 10Base-T
Puerto Ethernet y dos LED asociados a las señales de control disponible en
el conector J4 de 26 pines.
Puerto de programación serial con conector macho de 10 pines.
A.1.2 Especificaciones físicas y eléctricas. El módulo RCM2200 recibe 5 V+ de
energía eléctrica de una tarjeta externa diseñado por el usuario o de la tarjeta de
prototipado proporcionada en la compra del equipo, la cual se adhiere a ésta a
través de los conectores J4 y J5 explicados posteriormente. El RCM2200 puede
conectarse con todos los tipos de dispositivos digitales CMOS compatibles a
través de la tarjeta de prototipado o de usuario. En la siguiente tabla se describe
las especificaciones básicas de ésta.
Tabla 3. Especificaciones Físicas RCM2200
ESPECIFICACIÓN DATOS
Suministro de poder
4.75 – 5.25 V DC (134 mA a velocidad de reloj de 22.1 MHz )
Tamaño 2.3” x 1.6” x 0.86” (59 mm × 41 mm × 22 mm)
Medioambiente –40°C a 70°C, 5–95% humedad, (NO CONDENSADO)
132
A.2 REFERENCIA DEL HARDWARE
La siguiente figura muestra los subsistemas diseñados del módulo RCM2200
como son los puertos seriales A, B, C, D, E para las entradas y salidas digitales
del modulo, el puerto de programación y el puerto Ethernet, las líneas de datos y
de direccionamiento, las memorias Flash y RAM estática, entre otros.
Figura 33. Subsistemas del módulo RCM2200
A.2.1 Microprocesador Rabbit 2000. Rabbit 2000 es un potente procesador con
bus de datos externo e interno de 8 bits de alto desempeño, que trabaja a una
velocidad de reloj de 22.1 Mhz. Diseñado expresamente para potenciar una nueva
generación de sistemas dedicados. Su extenso conjunto de prestaciones
integradas y su arquitectura glueless (aglutinada) agilizan diseños de hardware, su
conjunto de instrucciones compatibles con C permiten el desarrollo eficiente de
complejas aplicaciones. Para sistemas dedicados, Rabbit 2000 sobrepasa a la
mayoría de los procesadores de 16 Bit y hasta algunos de 32, sin perder la
eficiencia de la arquitectura de 8-bit.
133
Este microprocesador tiene una configuración de 100 pines para establecer
comunicación con periféricos externos. Como se muestra en la siguiente figura.
Figura 34. Configuración de los pines del microprocesador Rabbit 2000
A.2.1 Entradas y salidas digitales. El módulo RCM2200 tiene 26 líneas de E/S
paralelas agrupadas en cinco puertos, los cuales son A, B, C, D, E de ocho (8) bits
cada uno, disponibles en los conectores J4 y J5. Las 16 líneas de E/S
bidireccionales se localizan en los pines PA0 - PA7, PD3 - PD5, y PE0 - PE1, PE4,
134
PE5, y PE7. Estos pines de los conectores J4 y J5 se muestran en la siguiente
figura.
Figura 35. Pines de E/S del módulo RCM2200
A.2.2 Entradas dedicadas. PB0 es una entrada CMOS general cuando en el
Rabbit 2000 no se está usando el Puerto serial B o se esta usando éste en un
modo asincrónico. Otros cuatro CMOS generales solo de entrada están
localizados en PB2 - PB5. Estos pines pueden también usarse para el puerto
esclavo. PB2 y PB3 son el esclavo escritura y el esclavo lectura respectivamente,
mientras PB4 y PB5 sirven como líneas de dirección esclavas en SA0 y SA1, y se
usan para acceder a los registros del esclavo. PC1 y PC3 son solo entradas
CMOS generales. Estos pines pueden en cambio selectivamente habilitarse para
servir como entrada de los datos serie para el puerto serial D y C.
A.2.3 Salidas dedicadas. Uno de los pines CMOS general de solo salida se ubica
en PB7. PB7 también puede usarse con el puerto esclavo como el /SLAVEATTN
output. PC0 y PC2 también son pines de solo salida; PC0 y PC2 puede en cambio
servir como salidas de datos seriales para el puerto serie D y C.
J4 J5
PA5
PB0
PB5
D2
/RES
PB7
GND
D5
PB3
PA3
PA1
PA7
D0
D4
PB2
PA6
PA2
PA0
PA4
PB4
D6
D3
D1
D7
VCC
VBAT
PC3
PE4
/IORD
LNK
PC2
3
GND
A2 A3
TP IN -
PE0
PD4
ACT
PE5
TP IN +
/IOWR
PD5
PD3
TPOUT+ TPOUT-
PC1 PC0
A1
PE1
1
PE7
VCC
A0
135
A.2.4 Puerto Seriales. Hay cuatro puertos seriales designados como puertos
serie los cuales son A, B, C, y D. Todos los cuatro puertos serie puede operar en
un modo asíncrono a la frecuencia de baudio del reloj del sistema dividida por 64.
Un puerto asíncrono puede manejar de 7 o 8 bits de datos. También es soportado
un noveno bit de dirección, dónde un bit adicional es enviado para marcar el
primer byte de un mensaje. El Puerto serie A sólo está disponible en el puerto de
programación, y para que es probablemente inoportuno trabajar con el.
A.2.5 Interfaz de Memoria de E/S. Cuatro de las líneas de dirección (A0 - A3) y
todas las líneas de datos (D0 - D7) están disponibles en el Rabbit 2000. Escritura
E/S (/IOWR) y lectura E/S (/IORD) también están disponible para unir a los
dispositivos externos. Los puertos en el microprocesador Rabbit 2000 usados en
el módulo RCM2200 están configurados, aunque estos valores predefinidos de
fábrica pueden ser reconfigurados. La Tabla 4 y 5 listan la configuración por
defecto y las alternadas para el Rabbit 2000.
Tabla 4. Configuración de pines del conector J5
ca
bece
ra J
5
PIN NOMBRE USO
PREDEFINIDO USO
ALTERNATIVO NOTA
1-8 PA[0 -7] E/S paralela programable
Bytewide
Puerto esclavo de bus de datos ( SD0- SD 7)
9 /RESET Salida restablecida Entrada Restablecida
Esta salida baja puede manejada externa.
10 PB0 Entrada Puerto serial reloj CLKB entrada/salida
11 PB2 Entrada Puerto esclavo escritura /SWR
12 PB3 Entrada Puerto esclavo de lectura /SWR
13 PB4 Entrada SA0 Línea de dirección del
puerto esclavo 14 PB5 Entrada SA1
15 PB7 Salida Línea de atención para puerto esclavo
16 - 23 D[0:7] Entrada/ Salida Bus de datos de Rabbit 2000
24 VBAT
136
25 VCC Entrad de batería de 3 Voltios
26 GND ARXB Entrada
Tabla 5. Configuración de pines del conector J4
Ca
bece
ra J
4
PIN NOMBRE USO
PREDEFINIDO USO
ALTERNATIVO NOTA
1 GND
2 VCC
3 PC0 Salida TXD
4 PC1 Entrada RXD
5 PC2 Salida TXC
6 PC3 Entrada RXC
7 TPOUT- Puerto de transmisión
Ethernet 8 TPOUT+
9 LNK LED indicador de enlace Ethernet
10 PD3 E/S programable Bitwise o paralela
11 PD4 ATXB Salida
12 PD5 ARXB Entrada
13 /IORD Entrada (lectura E/S)
14 /IOWR Salida (escritura E/S)
15 PE0 entrada IO control o INT0A
16 PE1 entrada I1 control o INT1A
17 TPIN- Puerto recepción Ethernet
18 TPIN++
19 PE4 E/S programable Bitwise o paralela
entrada I4 control o INTOB
20 PE5 entrada I5 control o INTOB
21 ACT LED indicador de actividad Ethernet
22 PE7 E/S programable Bitwise o paralela
17 control o puerto esclavo chip seleccionado /SCS
23 - 26 A [3 - 0] Bus de dirección de Rabbit 2000
137
A.2.6 Puerto de Programación. El puerto serial A es el puerto que se usa para el
desarrollo del software bajo Dynamic C. El conector donde se conecta el cable
programación tiene 10 pines etiquetado J1. El puerto de programación se usa para
inicializar el módulo Rabbit RCM2200 en un modo dónde se quiere descargar un
programa al puerto para ejecutarlo. El puerto de programación transmite la
información desde un PC, mientras el programa está depurándose.
A.3 CONFIGURACIÓN DEL MÓDULO RABBIT RCM2200 EN LA RED
Para la configuración del módulo RCM2200 en una red Ethernet se puede realizar
los siguientes tipos de conexiones a describir, ya sea para ejecutar los programas
de ejemplo o para la implementación de sistemas de control y monitoreo con
conectividad a una red bajo el protocolo TCP/IP.
A.3.1 Conexión directa. Es una simple configuración que permite conectar dos
equipos en red mediante un cable UTP cruzado con clavijas RJ-45 que se
conectan directamente al puerto Ethernet del RCM2200 y a la tarjeta de red del
computador de desarrollo respectivamente. Esta conexión permitió efectuar las
pruebas de comunicación que se le realizaron a la tarjeta para probar los
programas de ejemplo de los protocolos TCP/IP.
Luego de establecer la conexión física con el cable cruzado, se configura en
ambos dispositivos la dirección IP de clase C, mascara de subred y puerta de
enlace.
Tabla 6. Configuración de red del RCM2200 en conexión directa
Dispositivo Dirección IP Mascara de red Puerta de enlace
RCM2200 10.10.6.100 255.255.255.0 10.10.6.1
Computador 10.10.6.101 255.255.255.0 10.10.6.1
138
Sin embargo esta configuración de red puede cambiarse de acuerdo al tipo de
configuración manejada por el administrador de la red.
A.3.2 Red LAN en Estrella. En esta conexión se emplea un Concentrador (HUB
o Switch) 10/100 base-T de ocho o más puertos Ethernet para formar así una red
Ethernet local de topología Estrella. La conexión física se realiza enlazando un
cable UTP Nivel 5 estándar al puerto Ethernet del RCM2200 y a uno de los
puertos del Concentrador. Igualmente se hace este procedimiento para conectar
cualquier computador a esta red. En la configuración de los parámetros de red se
utilizó los mismos valores que en la anterior configuración, como se muestra en la
figura 36.
Figura 36. Configuración del RCM2200 en una Red LAN Ethernet
139
A.3.3 Red LAN Inalámbrica. Esta red hace uso de un medio de transmisión no
guiado, es decir, dispositivos que emiten infrarrojos, sistemas de microondas o el
espectro electromagnético, que permiten transferir datos desde 720 kbps (kilobits
por segundo) en un rango de distancias entre 10 y 100 metros a la redonda. Para
implementar esta tipo de red se empleo el dispositivo “Access Point Wireless” al
cual se le conecta físicamente el modulo de control RCM2200, permitiendo
establecer comunicación con computadores en la misma red sin la necesidad de
estar conectados físicamente. En esta conexión se asigno la siguiente
configuración de red.
Tabla 7. Configuración de red Inalámbrica
Dispositivo Dirección IP Mascara de red Puerta de enlace
RCM2200 10.10.6.100 255.255.255.0 10.10.6.1
Access Point Wíreless
10.10.6.102 255.255.255.0 10.10.6.1
Computador 10.10.6.103 255.255.255.0 10.10.6.1
A.3.4 Red WAN. El módulo RCM2200 es capaz de establecer conexión directa a
Internet y a otra red de área extensa, pero debe tenerse un cuidado excepcional
en el uso de la configuración de direcciones IP y toda la programación y desarrollo
de la red relacionada, ya que podría existir conflictos con otros usuarios que
acceden a recursos en los servidores y sistemas clientes. Esta tipo de
configuración no se efectuó, debido a que implica el uso de equipos de red que no
posee actualmente el laboratorio de sistemas de la CURN.
140
ANEXO B
MANUAL DE USUARIO DE
DYNAMIC C v8.1
141
INTRODUCCIÓN
Este anexo presenta información de utilidad para el correcto manejo y
configuración del entorno de desarrollo Dynamic C v8.1
Dynamic C v8.1 es la herramienta software que se utiliza para programar el
módulo de control Rabbit RCM2200 utilizado en el desarrollo de este proyecto,
por tal razón es importante conocer su funcionalidad básica.
Vea Anexo A “Manual de usuario del módulo Rabbit RCM2200”
142
B.1 GENERALIDADES DE DYNAMIC C
Dynamic C es un sistema de desarrollo integrado probado industrialmente, para
escribir software embebido (empotrado) en el uso de controladores Z-World y
otros controladores basados en el microprocesador Rabbit. Este sistema se
fundamenta en el lenguaje de programación C ANSI, con extensiones propias para
el desarrollo de sistemas dedicados. Además, también soporta código
ensamblador o código mezclado de C con ensamblador. Dynamic C opera en un
computador personal bajo Windows 95, 98, NT, ME, aunque la versión 8.1 que se
utilizó en la programación del módulo Rabbit opera en el sistema operativo
Windows 2000 o superior.
Figura 37. Entorno de desarrollo de Dynamic C
143
La figura anterior muestra el entorno de desarrollo integrado de Dynamic C, el cual
permite escribir, compilar, depurar y ejecutar programas en desarrollo o uno de
los ejemplos proporcionados por éste. Este entorno de desarrollo es muy familiar
a los utilizados por la Borland C++ y Dev C++ que son entornos de desarrollo
para el lenguaje de programación C y C++ respectivamente.
Dynamic C se usa para la edición de archivos fuentes, compilación y ejecución de
programas, eligiendo las opciones para estas actividades por medio de menús
desplegables y rutas cortas en el teclado. Existen dos modos: modo de edición y
modo de ejecución (el modo de ejecución también se conoce como modo de
depuración), varias ventanas de depuración pueden verse en modo de ejecución.
Los programas pueden compilarse directamente en el módulo Rabbit designado
para ser depurados, ya sea, en la memoria RAM o en la FLASH. Los programas
también pueden ser compilados en un archivo .bin con o sin un módulo conectado
al computador.
144
Para depurar un programa, el controlador o módulo debe conectarse al PC,
directamente a través de un cable de programación ó indirectamente por medio de
una conexión Ethernet y una tarjeta Rabbitlink. Múltiples instancias de Dynamic
C pueden ejecutarse simultáneamente. Esto significa que múltiples sesiones de
depuración son posibles sobre diferentes puertos seriales. Esto usualmente es
para depuración de tarjetas que están en comunicación entre ellas mismas.
B.2 EDICIÓN EN DYNAMIC C
Un archivo se presenta en una ventana de texto cuando este se abre o se crea.
Más de una ventana de texto puede estar abierta. Si el mismo archivo esta en
múltiples ventanas, cualquier cambio hecho al archivo en una ventana será
reflejado en toda la ventana de texto que muestra el archivo. Dynamic C soporta
ventanas normales de operaciones de edición de texto.
Un ratón puede ser usado para posicionar el cursor de texto, con el fin de
seleccionar texto. El teclado puede usarse también en la realización de estas
mismas operaciones. El texto puede ser desplazado usando las teclas de
dirección, Pág Re (pag up) y Pág Av (pag down) y las teclas Inicio (Home) y Fin
(End).
145
La tecla Ctrl trabaja en conjunto con las teclas de dirección de la siguiente
manera:
Tabla 8. Comandos Ctrl del teclado
Ctrl+Left Mueve el cursor a una palabra previa..
Ctrl+Right Mueve cursor a la siguiente palabra.
Ctrl+Up Mueve la ventana de edición arriba, Mueve el texto abajo una linea. El Cursor no se mueve.
Ctrl+Down Mueve la ventana de edición abajo, el texto se mueve una linea abajo. El Cursor no se mueve.
La tecla Inicio puede usarse sola o con otras teclas.
Tabla 9. Comandos Inicio del teclado
Inicio Mueve al inicio de una línea.
Ctrl+ Inicio Mueve al inicio de un archivo
Shift+ Inicio Selecciona el inicio de un archivo.
Shift+Ctrl+ Inicio Selecciona el inicio de un archivo.
La tecla Fin puede usarse sola o con otras teclas:
Tabla 10. Comandos Fin del teclado
Fin Mueve al final de una línea.
Ctrl+ Fin Mueve al final de un archivo
Shift+ Fin Selecciona el final de una línea
Shift+Ctrl+ Fin Selecciona el final de un archivo.
146
B.3 MENUS DE DYNAMIC C
El menú principal de Dynamic C 8.10 tiene 8 menús, de igual formato a los del
sistema de menús estándar de Windows.
Figura 38. Menú principal de Dynamic C
Un comando disponible puede ser ejecutado desde un menú haciendo click al
menú o por el método abreviado presionando la tecla Alt para activar la barra de
menú, usando las teclas de flecha izquierda y derecha para seleccionar el
respectivo menú, y utilizando las flecha arriba y abajo para seleccionar los
comandos, por ultimo se presiona Enter.
B.3.1 Menú archivo (file). Seleccionando el menú Archivo se visualizarán los
siguientes submenús que le permitirán al usuario crear, abrir, guardar, cerrar e
imprimir un archivo o proyecto.
Figura 39. Menú archivo de Dynamic C
147
Nuevo (New) <Ctrl+N>. Crea un archivo de programa sin titulo en una
nueva ventana. Hace el llamado a la ventana de texto ó al editor de texto. Si
hace clic en cualquier parte de la ventana de texto aparecerá un menú
contextual.
Abrir (Open) < Ctrl+O>. Presenta una caja de dialogo para especificar el
nombre del archivo que se abrirá. Múltiples archivos pueden ser
seleccionados marcándolos con la tecla <Ctrl> haciendo clic izquierdo con
el ratón sobre cada archivo que se desea abrir ó dibujando un rectángulo
sobre los nombres de archivos que se abrirán.
Guardar (Save) <Ctrl+S>. El comando guardar actualiza un archivo
abierto para reflejar los cambios hechos desde la última vez que fue
guardado.
Guardar como (Save as) <Ctrl+S>. Presenta una caja de dialogo para
guardar un archivo bajo un nombre nuevo. Seleccione el nombre del
archivo y el tipo de éste en el campo de nombre de archivo. El archivo será
guardado en una carpeta presentada en el campo Guardar en (Save in).
Guardar todo (Save All) <Shift+Ctrl+S>. Este comando guarda todos los
archivos modificados actualmente abiertos.
Cerrar (Close) <Ctrl+F4>. Cierra la ventana activa del editor. La ventana
activa del editor permite cerrarse también con doble clic en el menú del
148
sistema. Si se intenta cerrar un archivo modificado, Dynamic C preguntará
si desea guardar los cambios.
Proyecto (Project). Permite a un archivo de proyecto ser creado, abierto,
guardado, guardado con un nombre diferente y cerrado.
Configuración de Impresión (Print Setup). Muestra por pantalla la caja
de diálogo Page Setup. Permite establecer la configuración de los
márgenes, orientación de la página, los números de la página, propiedades
del título y pie de páginas del archivo a imprimir.
Vista de impresión (Printer Preview). Muestra por pantalla el archivo que
está en la ventana activa del editor en la ventana Preview Form, muestra el
aspecto del texto que será impreso.
Imprimir (Print). Muestra una caja de diálogo de impresión, la cual
permiten imprimir. Sólo el texto en una ventana de edición puede ser
impreso. Para imprimir el contenido de una ventana de depuración, el texto
debe ser copiado y pegado en la ventana del editor.
Salir (Exit) <Alt+F4>. Cierra Dynamic C después de guardar cualquier
cambio.
B.3.2 Menú edición (edit). El menú edición (edit), permite que el usuario pueda
trabajar fácilmente en el editor de texto, haciendo operaciones como la copia,
cortado y pegado de texto, la búsqueda de texto en el editor, entre otras funciones.
Figura 40. Menú edición de Dynamic C
149
Deshacer (Undo) <Ctrl+Z>. Esta opción deshace los cambios recientes en
la ventana de edición. El comando debe repetirse varias veces para
deshacer múltiples cambios.
Rehacer (Redo) <Shift+Ctrl+Z>. Rehace los cambios recientemente
deshechos. Éste comando solo trabaja inmediatamente después de una o
mas operaciones deshacer (Undo).
Cortar (Cut) <Ctrl+X>. Remueve el texto seleccionado y lo guarda en el
portapapeles.
Copiar (Copy) <Ctrl+C>. Hace una copia del texto seleccionado en un
archivo o en una ventana de depuración. El texto se guarda en el
portapapeles.
Pegar (Paste) <Ctrl+V>. Pega el texto desde el portapapeles en el punto
de inserción actual. No se puede pegar nada en una ventana de
150
depuración. El contenido del portapapeles puede ser pegado en cualquier
parte, repetidamente, ya sea en el mismo archivo o en otro archivo de
recurso ó en documentos de procesamiento palabras.
Insertar plantilla de código (Insert Code Template) <Ctrl+J>. Abre una
lista de plantillas de código en la ubicación actual del cursor. Haciendo clic
sobre una lista de entrada o presionando <Enter> inserta la plantilla
seleccionada en la ubicación actual del cursor en la ventana activa de
edición. Presionando la primera letra de un nombre de una plantilla de
código se selecciona la primera plantilla cuyo nombre inicia con esa letra.
Colocar Marcadores (Toggle Bookmark). Coloca uno de diez marcadores
en la ventana activa del editor
Buscar (Find) <Ctrl+F>. Encuentra el primer caso de texto especificado.
El texto puede especificarse seleccionándolo antes de abrir la caja de
diálogo Buscar (Find) si la opción "Find text at cursor" es activada en la
pestaña Edición (Edit) de Opciones de Entorno (Environment Options). Sólo
la palabra debe ser seleccionada, si más de una palabra se selecciona,
entonces la palabra aparecerá como la entrada de texto a buscar.
Siguiente Búsqueda (Find Next) <Ctrl+F3>. Una vez el texto ha sido
especificado con el comando Buscar (Find) ó Reemplazar (Replace), el
comando Siguiente Búsqueda buscará el siguiente caso del mismo texto,
buscando adelante o atrás, caso sensible o no, como es especificado
anteriormente en la ventana Buscar.
Modo Edición (Edit Mode) <F4>. Cambia al modo de edición desde el
modo de ejecución. Después de una compilación ó ejecución correcta, no
permite cambios en el archivo a menos que se seleccione el modo de
151
edición. Si la compilación falla u ocurre un error en tiempo de ejecución,
Dynamic C regresa al modo de edición.
B.3.3 Menú compilar (compile). Haga clic en el titulo del menú ó presione
<Alt+C> para seleccionar el menú compilar.
Figura 41. Menú compilar de Dynamic C
Compilar (compile) <F5>. Compila un programa y lo carga en el módulo
Rabbit o en un archivo .bin cuando se presione <F5> ó se seleccione
compilar desde el menú compilar. El archivo activo se compilará de acuerdo
con las opciones de compilación actuales. Las opciones de compilación son
fijadas en la caja de dialogo accediendo a la pestaña Compilar (Compiler)
en el menú OPTIONS | PROJECT OPTIONS.
152
Cualquier error en la compilación se activa automáticamente en la ventana
mensajes de compilación. Presione <F1>para obtener mas información de
cualquier mensaje de error que se marca en esta ventana.
Compilar en la Tarjeta (Compile to Target). Se extiende a 3 elecciones:
o Compilar en la memoria flash (Compile to flash).
o Compilar en memoria RAM (Compile to RAM).
o Compilar en la flash y ejecutar en la RAM (Compile to flash, run in
RAM).
Estas opciones sustituyen cualquier opción de configuración en la memoria
BIOS realizada desde la pestaña compilar (compiler) en la selección del
menú OPTIONS | PROJECT OPTIONS.
Compilar en el Archivo .Bin. Compila un programa y escribe la imagen a
un archivo .bin. Hay dos elecciones disponibles con esta opción. Compilar
en memoria flash y Compilar en la flash y ejecutar en la RAM.
La configuración de la tarjeta usada al compilar es determinada en el menú
OPTIONS | PROJECT OPTIONS en la pestaña Compiler La configuración
de la tarjeta predefinida se accede haciendo clic en la ficha TARGETLESS
la cual muestra tres fichas adicionales: archivos RTI (File RTI),
especificación de parámetros (Specify Parameters), selección de tarjeta
(Board selection).
El archivo .bin debe usarse con un dispositivo de programación para
programar múltiples tarjetas ó el Rabbit Field Utility (RFU) "campo de
utilidad de rabbit", puede ser usado para cargarlo en la tarjeta.
153
Resetear Tarjeta/Compilar Bios (Reset Target / Compile Bios) <Ctrl+Y>.
Esta opción recarga el BIOS de la RAM o flash, dependiendo de la elección
hecha bajo la BIOS Memory Setting en la caja de dialogo Compiler desde
el menú OPTIONS | PROJECT OPTIONS. El siguiente mensaje aparecerá
sobre una correcta compilación, cargando el código en la BIOS.
Figura 42. Mensaje de la BIOS
B.3.4 Menú ejecutar (run). A este menú se accede haciendo clic en el titulo o
con <Alt.+R>.
Figura 43. Menú ejecutar de Dynamic C
Ejecutar (Run) <F9>. Inicia la
ejecución del programa desde el punto de ruptura actual (breakpoint). Los
registros son restaurados, incluyendo el estado de interrupción, antes de
154
iniciar la ejecución, sí el programa es compilado y descargado a la tarjeta
en el modo de edición.
Parar (Stop) <Ctrl+Q>. El comando Parar detiene el programa en el punto
actual de ejecución. Normalmente el depurador no puede detenerse dentro
de un código no depurado.
Run w/No Polling <Alt+F9>. Este comando es idéntico al comando
Ejecutar, con una excepción. El PC revisa la tarjeta cada 3 segundos por
defecto para determinar si la tarjeta ha fallado o ha tenido problemas.
Trace Into <F7>. Ejecuta una sentencia C (o una instrucción de lenguaje
ensamblador si la ventana de ensamblador se visualiza) descendiendo en
las funciones.
Step Over <F8>. Ejecuta una sentencia C (o una instrucción de lenguaje
ensamblador si la ventana de ensamblador se visualiza) sin descender en
las funciones.
Source Trace Into <Alt+F7>. Ejecuta una sentencia C descendiendo en
las funciones cuando la ventana de Ensamblador es abierta.
Source Step Over <Alt+F8>. Ejecuta una sentencia C sin descender en
las funciones cuando la ventana de ensamblador es abierta.
Toggle Breakpoint <F2>. Coloca un punto de ruptura en la ubicación
actual del cursor. Los puntos de ruptura flexibles no afectan el estado de
interrupción en el momento que el punto de ruptura es encontrado, mientras
que los puntos de ruptura rígidos si lo hacen.
155
Toggle Hard Breakpoint <Alt+F2>. Coloca un punto de ruptura rígido en
la ubicación actual del cursor. Un punto de ruptura rígido difiere de un
punto de ruptura flexible en que la interrupción es deshabilitada cuando el
un punto de ruptura rígido es alcanzado.
Limpiar todos los puntos de ruptura (Clear All Breakpoints) <Ctrl+A>.
Limpia todos los puntos de ruptura.
Restablecer programa (Reset program) <Ctrl+F2>. Restablece el
programa a su estado inicial. El cursor de ejecución se posiciona al inicio de
la función principal (main), antes de cualquier inicialización global e
inicialización de variables.
El estado inicial incluye sólo el punto de ejecución (contador del programa),
registros de mapeo de memoria, y el puntero de la pila. El comando
restablecer programa no recargará el programa si la ejecución anterior
sobrescribe el segmento del código. Es decir, si el código está corrompido.
Por lo tanto debe recargase el programa a la tarjeta nuevamente.
B.3.5 Menú opciones (options). El menú Opciones se accede haciendo clic en
el titulo o con <Alt.+O>, y permite configurar el entorno de la ventana de edición de
texto y las opciones de configuración del módulo Rabbit 2000.
Figura 44. Menú opciones de Dynamic C
Opciones de Entorno
(Environment Options).
Dynamic C viene con un editor de texto completo incorporado. Puede
156
personalizarse para satisfacer su estilo usando la caja de dialogo Opciones
de entorno. La caja de diálogo tiene etiquetas para varios aspectos del
editor.
Opciones de Proyecto (Proyect Options). Configuración usada por
Dynámic C para comunicarse con la tarjeta designada, y para compilar y
ejecutar los programas, esto a través de la caja de dialogo Opciones de
Proyecto. La caja del diálogo tiene etiquetas para configurar los respectivos
aspectos de comunicación con la tarjeta, el BIOS y el compilador, entre las
que cabe mencionar comunicaciones (Communications), Compilador
(Compiler) y Targetless.
Figura 45. Caja de dialogo opciones de proyecto de Dynamic C
En la
157
pestaña comunicaciones (communications) se presentan dos tipos de
conexión: Conexión vía serial que es definida por defecto para la utilización
del cable de programación y la conexión TCP/IP. La conexión serial
presenta varias opciones de configuración como:
o Tasa en Baudio (Baud Rates) que permite establecer la Tasa de Baudio
de Depuración (Debug Baud Rates) que por defecto es 115200 bps y la
Tasa de Baudio de Transferencia Máxima (Max Download Baud Rate)
que es definida a 460800 bps. Cuando (baud negotiation) es activada,
Dynamic C empezará a seleccionar la tasa de baudio y trabajará con
una de éstas dos tasas mientras que alcance una con que la tarjeta
pueda operar correctamente.
o Puerto serial. Aquí se especifica el puerto COM del computador que es
conectado a la tarjeta Rabbit. Por defecto se emplea COM1.
o Bits de parada (Stop bits). Este número es usado por el controlador
serial. Por defecto es 2.
La pestaña Targetless, tiene tres etiquetas adicionales las cuales son:
o Archivo RTI (File RTI). En donde se puede abrir un archivo de extensión
.rti que contiene información de configuración del módulo Rabbit
designado en Dynamic C.
o Especificar Parámetros (Specify Parameters). Se definen los parámetros
de configuración del módulo Rabbit seleccionado previamente en la
etiqueta selección de tarjeta (Board Selection); por ejemplo el código de
identificación, la versión de CPU, el tamaño de la memoria RAM y
FLASH y la frecuencia base del microprocesador.
158
o Selección de tarjeta (Board Selection). Se indica el modulo Rabbit a
donde se transferirá el programa desarrollado, en este caso es el
RCM2200 de 22Mhz, 128K de RAM estática, 256 de memoria Flash y
versión de microprocesador Rabbit 2000 revisión IQ5T como se muestra
en la figura 46.
Figura 46. Selección del módulo Rabbit
159
B.3.6 Menú ayuda (help). El menú ayuda (help), brinda múltiple soporte al
usuario, gracias a una completa documentación útil para el desarrollador, que se
puede acceder ya sea en línea por la Web o la que es proporcionado por Dynamic
C.
Si el cursor está marcando la posición de una función predefinida en Dynamic C,
entonces se puede obtener la descripción de ésta en una nueva ventana
seleccionando el submenú Función de Búsqueda (Function Lookup) o
presionando <Ctrl+H>. Como muestra la figura 47.
Figura 47. Menú de ayuda de Dynamic C
A continuación la siguiente figura muestra una ventana con la descripción
completa de una determinada función de dynamic C, la cual es resultado de
utilizar la función lookup del menú de ayuda descrito anteriormente.
160
Figura 48. Ventana de descripción de funciones de Dynamic C.
161
ANEXO C
MANUAL DE USUARIO DEL
SISTEMA SCAM v1.0
162
INTRODUCION
A través de este manual se expondrán las diferentes características que
componen la interfaz gráfica de la aplicación SCAM Web y el Servidor SCAM
Server, con el fin de despejarle toda clase de dudas al usuario y darle un mejor
aprovechamiento a las aplicaciones por parte de éste al momento de operarlas.
La aplicación SCAM Web en conjunto con el Servidor SCAM Server conforman un
sistema integrado para el monitoreo, configuración y almacenamiento de
variable(s) de un proceso industrial.
La aplicación SCAM Web son paginas HTML que se encuentran almacenadas en
la memoria del módulo de control Rabbit RCM2200, dado que éste ha sido
configurado como un pequeño servidor Web. Por otro lado, el servidor SCAM
Server es un software de entorno Windows que se instala en un equipo servidor o
un PC conectado en la misma red Ethernet del módulo de control.
Para mayor información relacionada con el módulo de control RCM2200 vea el
Anexo A “Manual de usuario del módulo Rabbit RCM2200”
163
C.1 REQUERIMIENTOS BÁSICOS DEL SISTEMA
Las aplicaciones SCAM Web y SCAM Server necesitarán por los menos la
siguiente configuración de sistema para su óptimo desempeño al momento de
ejecutarlas y operarlas.
C.1.1 Requerimientos mínimos de hardware.
Procesador de 366 Mhz.
Memoria RAM de 128 Mbytes.
10 Mbytes de espacio libre en el Disco Duro.
Hub o Switch Ethernet de ocho (8) puertos con conectores RJ-45.
Tarjeta de Red Ethernet 10/100 Mbps.
Unidad de CD ROM.
C.1.2 Requerimientos de software.
Internet Explorer 4.0 o superior.
Sistema Operativo Microsoft Windows 98 o superior.
164
C.2 ACCESO A LA APLICACIÓN
A continuación se describirá los pasos para acceder a cada una de las
aplicaciones desarrolladas.
C.2.1 Iniciando aplicación SCAM Web. Para que un usuario pueda acceder a
la página de inicio de la aplicación, antes debe verificarse que el módulo Rabbit
RCM2200 este debidamente configurado en la red Ethernet de su organización.
Luego de haber realizado la verificación, el usuario debe abrir el navegador Web
de su PC y digitar la dirección IP del módulo de control Rabbit en la barra de
direcciones, en este caso por ejemplo, se utilizará la predefinida en este módulo
(10.10.6.100), pero esto puede variar acorde a las direcciones IP que se manejan
en su red Ethernet.
Figura 49. Barra de direcciones navegador Web
También se puede acceder a la aplicación a través del botón Inicio de la barra de
inicio de Windows escogiendo la opción ejecutar como muestra la figura 50.
165
Figura 50. Botón inicio de Windows XP
Después se debe escribir la dirección IP del módulo en el campo abrir de la
ventana ejecutar y presionar aceptar, como se observa en la figura.
Figura 51. Acceso a SCAM Web a través de la ventana ejecutar
A través de la acción anterior se accederá a la página de inicio sino ocurre ningún
error de comunicación con el módulo.
166
C.2.2 Iniciando servidor SCAM Server. Después de haber instalado de manera
satisfactoria este software en el equipo indicado como servidor, se procede a su
respectiva ejecución, buscando en los programas instalados del menú Inicio de
Windows, como se observa en la siguiente figura.
Figura 52. Iniciando SCAM Server
C.3 FUNCIONAMIENTO APLICACIÓN SCAM WEB
C.3.1 Página inicio de sesión. La página de inicio de sesión de SCAM Web está
conformada por un marco de título, un marco con la información detallada de la
aplicación y un marco de inicio de sesión, donde se debe escribir los datos
nombre de usuario y contraseña, además un botón enviar para confirmar dichos
campos. Obsérvelo en la siguiente figura.
167
Figura 53. Página inicio de sesión de SCAM Web
Los campos nombre de usuario y contraseña deben estar escritos correctamente
de lo contrario el sistema emitirá un mensaje de error por cada campo
respectivamente, como se observa en la figura 54.
Figura 54. Mensaje de error del campo nombre de usuario
Si el nombre de usuario y/o contraseña escritos no corresponden con los que se
encuentran registrados en el sistema se emitirá un mensaje de verificación de
estos datos, obsérvelo a continuación.
168
Figura 55. Mensaje de verificación nombre de usuario y/o contraseña.
C.3.2 Página principal o de monitoreo. Una vez se haya confirmado
correctamente los datos de usuario se ingresa a la página principal de la
aplicación SCAM Web, la cual se compone de una zona de vínculos y una
ventana de supervisión dónde se toma lectura continuamente de la variable
controlada en este caso temperatura y su valor de referencia, como se observa en
la figura 56.
Figura 56. Página principal de SCAM
169
La zona de vínculos permite abrir otras páginas relacionadas, por ejemplo el
vínculo parámetros PID conlleva a la página de configuración de parámetros PID,
el de usuarios remite a la página de gestión de usuarios y el de ayuda nos guía a
la página de ayuda de la aplicación SCAM Web. Sin embargo antes de ingresar a
las páginas Configuración de Parámetros PID y Configuración de usuarios, el
sistema visualiza una ventana de autenticación, debido a que estas páginas han
sido configuradas para que sólo accedan los usuarios Admin e Ingeniería a la
primera página y el usuario Admin a la segunda respectivamente.
Figura 57. Ventana de autenticación a las paginas Configuración PID y usuarios
C.3.3 Página configuración parámetros PID. En esta pagina, se distinguen los
diferentes campos para la configuración del controlador PID, como son Valor de
Referencia de la variable a controlar, Constante Proporcional (KP), Tiempo
Integrativo (Ti), Tiempo Derivativo (Td) y Frecuencia de muestreo, a fin de
establecer o modificar el funcionamiento del algoritmo PID que se ejecuta en el
módulo de control. Si desea modificar los valores actuales del controlador debe
escribirlos y confirmarlos con el botón enviar, de otro modo, puede limpiar los
campos con el botón reestablecer. La página también permite navegar a otras
páginas dentro de la misma aplicación como a la página principal, ayuda y usuario.
170
Figura 58. Ventana de parámetros del controlador PID
El sistema permite validar tanto la escritura de tipos de valores no
correspondientes a los permitidos como los valores nulos, por lo que éstos deben
ser coherentes con los predefinidos, emitiendo así mensajes de error para cada
campo respectivamente, obsérvelo a continuación.
Figura 59. Mensaje de error del campo valor de referencia (setpoint)
171
Figura 60. Mensaje valor de referencia (setpoint) es requerido
C.3.4 Página configuración de usuarios. La página de gestión de usuarios de la
figura 61, esta compuesta de una ventana para la modificación de la contraseña y
el correo electrónico de los diferentes usuarios del sistema, donde el nivel de
acceso es acorde a su perfil. El sistema sólo acepta a tres tipos de usuarios
predefinidos con su respectiva contraseña. Los usuarios son Admin, Ingeniería y
Operador, con sus contraseñas Ronald, Jorge e Invit respectivamente. La
modificación de la contraseña para cada uno de los usuarios se hace por medio de
los campos nueva contraseña y verifique contraseña con el fin de validar que la
contraseña digitada se ha escrito correctamente. Un campo adicional correo
electrónico es utilizado para poder enviar mensajes del sistema a la dirección de
correo electrónico de un usuario particular. Para la confirmación del cambio de
estos valores se debe oprimir el botón enviar ó si desea limpiar los campos oprima
el botón reestablecer.
172
Figura 61. Ventana de configuración de usuarios
El sistema permite validar los valores de los campos en caso de que uno de ellos
sea nulo ó estos se escriban mal, por medio de una serie de mensajes
correspondientes a cada campo, esto se observa a continuación.
Figura 62. Campo de nueva contraseña es requerido
También se valida que los campos nueva contraseña y verificar contraseña sean
iguales, de lo contrario saldrá el siguiente mensaje.
173
Figura 63. Mensaje de error de contraseñas inconsistentes
Figura 64. Mensaje de error del campo correo electrónico
C.3.5 Página de ayuda. Esta página proporciona información básica del
funcionamiento del sistema SCAM Web. Esta compuesta por una serie de vínculos
a los temas del contenido de la ayuda y a páginas dentro de la misma aplicación.
Figura 65. Página de ayuda de SCAM Web
174
C.4 FUNCIONAMIENTO SERVIDOR SCAM SERVER
El servidor SCAM Server es una aplicación de escritorio desarrollado por los
autores de este proyecto, con la finalidad de recepcionar y almacenar el valor de la
variable controlada que es enviada desde el módulo de control Rabbit, pudiendo
de esta manera generar históricos de la variable en mención. Esta aplicación esta
conformada por las siguientes pantallas a describir:
C.4.1 Pantalla principal. Es la Interfaz donde el usuario tiene acceso a los
menús de la aplicación y en la cual se especifican los parámetros para que ésta
pueda establecer comunicación con el módulo de control a través del protocolo
TCP/IP. Estos parámetros son: puerto de escucha que es el número (entre 1024
y 65535) de puerto local en el que escuchará el servidor y Equipo remoto en
donde se digita la dirección IP o nombre del equipo que se va conectar a éste, en
este caso el módulo de control RCM2200. Lo anterior se observa en la figura 66.
Figura 66. Pantalla principal de SCAM Server
Menú Archivo: el menú Archivo tiene la opción de salir de la aplicación
cuando el usuario lo decida conveniente.
Menú Configuración: este menú permite abrir la ventana de configuración
de parámetros de la variable controlada.
175
Menú Operación: por otro lado, el menú Operación despliega una lista de
opciones que el usuario podrá ejecutar haciendo clic en éstas, por ejemplo
iniciar la escucha, desconectar el servidor del equipo remoto (módulo de
control), y por último visualizar la pantalla de históricos de variable.
Figura 67. Menú Operación
Menú Ayuda: Permite acceder a la pantalla Acerca de
C.4.2 Pantalla históricos. Esta pantalla refleja todos los valores de la variable
controlada que se han registrado en la Base de Datos de la aplicación
continuamente.
Figura 68. Pantalla históricos de variables
176
C.4.3 Pantalla configuración de parámetros. Permite configurar parámetros
para la variable controlada a almacenar, por ejemplo nombre de la variable a
almacenar, unidad física, rango de funcionamiento y rango de valores óptimos.
Figura 69. Pantalla de configuración de parámetros de variable
C.4.4 Pantalla acerca de. Muestra información relacionada acerca de los
desarrolladores de esta aplicación y el mensaje de derechos de autor.
Figura 70. Pantalla Acerca de SCAM Server
177
C.5 RECOMENDACIONES DE LAS APLICACIÓNES
Como diseñadores y desarrolladores de las aplicaciones SCAM Web y SCAM
Server, hacemos las siguientes recomendaciones a los usuarios que las operen,
con el fin de que tengan una mejor interacción y desempeño con éstas.
1. Realizar la respectiva configuración de red de la estación cliente, es decir,
donde se ejecutará la aplicación SCAM Web.
2. Verificar que la conexión del módulo de control Rabbit RCM2200 a la red
Ethernet este instalado y configurado correctamente, al igual que el suministro de
energía de este equipo.
3. Tener instalado un navegador Web como Internet Explorer o Netscape en el
equipo cliente para poder ejecutar la aplicación SCAM Web.
4. Se recomienda que la aplicación SCAM Server se ejecute con anterioridad a la
aplicación SCAM Web a fin de no presentar problemas de comunicación con este
servidor.
5. Tener instalado el motor de base de Microsoft Access 2000 o 2003.
6. Configurar el monitor de su equipo a una resolución de pantalla de 800x600
píxeles, para que las aplicaciones tengan una mejor apariencia.
7. El operador/usuario del sistema debe tener conocimientos básicos acerca de los
controladores PID para evitar un uso ineficiente del sistema.
178
ANEXO D
MANUAL DEL SISTEMA
179
INTRODUCION
El sistema SCAM (Sistema de Control Automático y Monitoreo) ha sido
desarrollado con tecnológica de punta y de fácil acceso para las pequeñas y
medianas empresas del sector industrial local, ya que para su consecución se
empleo un sistema de desarrollo integrado de bajo costo para hacer control
embebido en una pequeña tarjeta que incorpora características de comunicación
avanzadas con otros equipos en una red Ethernet y la herramienta "Macromedia
DreamWeaver MX 2004 "para el desarrollo de la interfaz Web.
La codificación del sistema se dividió en dos fases, en la primera fase se realizó el
código en lenguaje HTML 4.0 concerniente a la interfaz de monitoreo del sistema,
como botones, hipervínculos, cajas de textos, imágenes, etc. que hacen posible
una adecuada interacción con el usuario. Este interfaz es la que se incluye en la
tarjeta, a través de una serie de instrucciones propias de ésta, y es aquí donde se
inicia la segunda fase de desarrollo del código, empleando para tal fin el entorno
de desarrollo Dynamic C versión 8.1 que se basa en el lenguaje de programación
C ANSI. A continuación se describen los procedimientos y funciones de mayor
importancia que conforman el sistema SCAM.
180
D.1 DESCRIPCIÓN DEL CÓDIGO PRINCIPAL DE SCAM
Inicialmente para establecer que el módulo de control Rabbit RCM2200 trabaje
como servidor HTTP y con la funcionalidad de comunicación TCP/IP debe
realizarse una configuración previa por medio de una serie de librerías y macros
predefinidos en el lenguaje.
D.1.1 Descripción de macros y librerías.
#class auto. Macro que indica la clase de almacenamiento de las variables
utilizadas dentro de las funciones.
#define CONFIG_RED 1. Este macro se encuentra definido en la librería
RJTCPIP y establece la configuración de red ethernet del modulo
RCM2200, fijando la dirección IP, máscara de subred, puerta de enlace, etc.
#define HTTP_MAXBUFFER 256. Este macro define el tamaño máximo
del búfer en bytes, donde se almacenarán los datos a transmitir sobre la
red. Por defecto es 256 bytes.
#define TCP_BUF_SIZE 2048. Define el tamaño del búfer TCP, donde se
almacena el estado del socket para la conexión con los clientes.
#define HTTP_MAXSERVERS 4. Define el número máximos de servidores
HTTP escuchando en el puerto lógico 80.
#define MAX_TCP_SOCKET_BUFFERS 4. Determina el número máximo
de sockets TCP con búferes preasignados. El valor predeterminado es
cuatro (4).
181
#define HTTP_NO_FLASHSPEC. Se emplea para desactivar el código que
soporta la estructura http_flashspec[ ], debido, a que se utilizarán las
funciones de la librería ZSERVER.LIB.
#define USE_HTTP_DIGEST_AUTHENTICATION 1. Especifica el tipo de
autenticación a utilizar, se debe establecer el valor de uno (1) para activar la
autenticación Digest, que utiliza una rutina de encriptación.
#define SSPEC_USERSPERRESOURCE 3. Define a tres, como el
número máximo de usuarios que pueden ser asociados a un recurso
particular (página HTML, imágenes, etc).
#define SSPEC_MAXSPEC 19. Fija el número máximo de entradas en el
arreglo global, sever_spec.
#define INPUT_COMPRESSION_BUFFERS 4. Este macro describe el
número de buffer de 4KByte de RAM usado para la descompresión.
#define SSPEC_MAXNAME 25. Asigna a los campos de tipo cadena de
la estructura ServerSpec una longitud máxima de 25 caracteres.
#define SAUTH_MAXNAME 25. Asigna a los campos de tipo cadena de
la estructura ServerAuth una longitud máxima de 25 caracteres.
#define SAUTH_MAXUSERS 3. Asigna el número máximo de usuarios
para una lista de usuarios TCP/IP.
#define REDIRECTHOST IP_STATICA. Este macro almacena la
dirección IP del servidor Web que esta configurada en la librería
RJTCPIP.LIB, a fin de utilizarla para direccionar las paginas en el servidor.
182
#define REDIRECTTO "http://" REDIRECTHOST "/principal.shtml".
Remite al cliente a la pagina principal.shtml cuando la función submit.cgi
realiza la acción correspondiente a la validación de usuario.
#define CONFUSER_REDIRECTTO "http://" REDIRECTHOST
"/Config_usuario.html". Remite al cliente a la pagina Config_usuario.html
cuando la función modif._par_user.cgi es ejecutada en el servidor HTTP.
#define CONFPID_REDIRECTTO "http://" REDIRECTHOST
"/Config_PID.html". Remite al cliente a la pagina Config_PID.html cuando
la función env_paramPID.cgi es ejecutada en el servidor HTTP.
#memmap xmem . Establece un área predefinida en la memoria extendida
para las funciones que se utilizarán. La opción xmem, permite que todas
las funciones no declaradas de Dynamic C vayan a la memoria extendida.
#use "zimport.lib". Incluye la librería zimport.lib para tener soporte de
comprensión de archivos e imágenes en el servidor Web.
#use "rjtcpip.lib". Librería principal que incluye las librerías básicas de
gestión de red, macros predefinidos para la configuración de red y las
funciones de comunicación vía TCPIP.
#use "pid.lib". Librería que contiene las funciones del algoritmo de control
PID.
#ximport y #zimport. Estos macros importan todas las páginas e
imágenes, asignándole la ruta donde se encuentran y el nombre de éstas,
183
con el objetivo de cargarlos en la memoria flash de la tarjeta RCM2200. Por
ejemplo:
#ximport "C:/SCAM/paginas/inicio_sesion.html" inicio_sesion_html
#zimport "C:/SCAM/paginas/inicio1.html" inicio1_html
#zimport "C:/SCAM/paginas/inicio2.html" inicio2_html
#zimport "C:/SCAM/paginas/inicio3.html" inicio3_html
#ximport "C:/SCAM/paginas/principal.shtml" principal_shtml
#ximport "C:/SCAM/paginas/principal_image.shtml" princimage_shtml
#ximport "C:/SCAM/paginas/principal_text.shtml" princtext_shtml
#ximport "C:/SCAM/paginas/Config_PID.html" config_PID_html
#ximport "C:/SCAM/paginas/Config_usuario.html" config_usuario_html
//#zimport "C:/SCAM/paginas/ayuda.html" ayuda_html
//Imagenes
#zimport "C:/SCAM/paginas/logo_scan.PNG" logo_scan_PNG
#ximport "C:/SCAM/paginas/butpid.PNG" butpid_PNG
#ximport "C:/SCAM/paginas/butusuario.PNG" butusuario_PNG
#ximport "C:/SCAM/paginas/butayuda.PNG" butayuda_PNG
D.1.2 Descripción de estructuras de datos.
HttpType. La estructura HttpType de la librería HTTP asocia una extensión
de archivo con un tipo MIME (Ampliación de Correo Internet Multiuso) y una
función que se ocupa del tipo MIME.
typedef struct {
char extension[10];
char type[20];
int (*fptr) (/* HttpState* */);
} HttpType;
El siguiente bloque de código se utilizó para definir los tipos de archivos que
maneja el servidor HTTP en el sistema SCAM por medio del arreglo
http_types[] de tipo HttpType.
184
const HttpType http_types[] =
{
{ ".shtml", "text/html", shtml_handler}, // SSI
{ ".html", "text/html", NULL},
{ ".PNG", "image/PNG", NULL},
{ ".cgi", "", NULL} // CGI
};
FormType. Esta estructura esta compuesta por dos campos de tipo
cadena: name y value, que se emplean para almacenar la pareja
“nombre = valor” de los respectivos campos de los formularios enviados
desde el navegador Web al servidor HTTP. Un ejemplo de esto es la pareja
nombre de usuario = valor y la pareja contraseña = valor de la página inicio
de sesión que se envían al servidor para ser decodificadas, analizadas, y
manejarlas de alguna manera como variables de tipo apropiadas.
typedef struct { char *name; char value [MAX_TAMFORM]; } FORMType; FORMType datoreciv [5];
D.1.3 Descripción de funciones.
FUNCIÒN ANALIZAR_POST.
int analizar_post(HttpState* state)
Descripción: permite decodificar y analizar los datos digitados por el usuario
al ser enviados con el método POST desde el navegador Web. Los datos
ya almacenados en el búfer HTTP se acceden a través de la variable
arreglo datoreciv de tipo FORMType. Los datos recibidos son analizados
185
utilizando funciones propias del lenguaje que verifican el contenido del búfer
para ver su consistencia.
Parámetro State: es un puntero al campo State de la estructura HttpState
en la librería HTTP.LIB
Valor de Retorno:
_1 Si el proceso de análisis de los datos enviados desde el navegador Web
se ha realizado correctamente.
_0 En caso de que no se realice la operación de análisis.
int analizar_post(HttpState* state) { auto int valret; auto int i; valret = sock_aread(&state->s, state->p, (state->content_length < HTTP_MAXBUFFER-1)? (int)state->content_length:HTTP_MAXBUFFER-1); if (valret < 0) { return 1; } state->subsubstate += valret; if (state->subsubstate >= state->content_length) { state->buffer[(int)state->content_length] = '\0'; for(i=0; i<5; i++) { http_scanpost(datoreciv[i].name, state->buffer, datoreciv[i].value, MAX_TAMFORM); } return 1; //Proceso acabado--retornando 1 indicando que ya se realizo } return 0; }//cierra función parse_post
FUNCIÓN SUBMIT.
int submit(HttpState* state)
Descripción: rutina CGI (Interfaz de Pasarela Común) que se ejecuta en el
servidor HTTP cuando se envían los datos de la pagina inicio de sesión a
186
través del el botón enviar (submit). Esta función toma los datos del búfer
previamente analizados en la función analizar_post() e interpreta la
información para ejecutar una acción, en este caso, la validación o rechazo
del usuario que accede la aplicación.
Parámetro State: es un puntero al campo State de la estructura HttpState
en la librería HTTP.LIB
Valor de retorno:
_0 Para que la conexión al servidor HTTP este abierta en todo momento.
int submit(HttpState* state) { static char date[30]; static char buffer[512]; http_date_str(date); if(state->length) { if(state->offset < state->length) {
state->offset += sock_fastwrite(&state->s, state->buffer + (int)state->offset, (int)state->length - (int)state->offset);
} else { state->offset = 0; state->length = 0; } } else { datoreciv[0].name = "nombre_usuario"; //nombres del campo nombre_usuario formulario datoreciv[1].name = "contrasena";//nombres del campo contrasena del formulario /* inicializa el campo value de datoreciv */ datoreciv[0].value[0] = '\0'; datoreciv[1].value[0] = '\0'; state->p = state->buffer; if(analizar_post(state)) { //si es !=0 continua if (sauth_authenticate( datoreciv[0].value, datoreciv[1].value, SERVER_HTTP)>=0){ cgi_redirectto(state,REDIRECTTO); return 0; /*se retorna cero para que la conexión al servidor esta abierta en todo momento*/ }else{ //Aquí se manda un cgi_sendstring mostrando un mensaje de error sprintf(buffer,cadmensa,date,REDIRECTTO); //manda el contenido cadmensaje cgi_sendstring(state,buffer); //se usa para enviar la pagina return 0; } //cierra if de autenticación } //cierra if de parse post } //cierra if } //cierra función submit
187
FUNCIÓN ENVIAR PARAMETROS PID.
int env_paramPID(HttpState* state).
Descripción: La función CGI env_paramPID() se ejecuta al momento de
enviarse los datos de configuración del algoritmo de control PID desde la
página Configuración Parámetros PID. Los datos son almacenados en los
campos de la estructura FORMType, accediéndose a través del arreglo
datoreciv que posee cinco posiciones para almacenar cada una de las
parejas de parámetros PID (Nombre_parámetro, valor) que son modificadas
por el usuario.
Parámetro State: es un puntero al campo State de la estructura HttpState.
Valor de retorno:
_0 Para que la conexión al servidor HTTP este abierta en todo momento.
int env_paramPID(HttpState* state) {int i; if(state->length) { if(state->offset < state->length) {
state->offset += sock_fastwrite(&state->s, state->buffer + (int)state->offset, (int)state->length - (int)state->offset);
} else { state->offset = 0; state->length = 0; } } else { datoreciv[0].name = "setpoint"; datoreciv[1].name = "kp"; datoreciv[2].name = "ti"; datoreciv[3].name = "td"; datoreciv[4].name = "fm"; for(i=0;i<5;i++) { datoreciv[i].value[0] = '\0'; } state->p = state->buffer; if(analizar_post(state)) { //si es !=0 continua setpoint = atof(datoreciv [0].value); kp = atof(datoreciv [1].value); //la función atof convierte una cadena en float ti = atof(datoreciv[2].value);
188
td = atof(datoreciv[3].value); fm = atof(datoreciv[4].value); cgi_redirectto(state,CONFPID_REDIRECTTO); return 0; } //cierra if de parse post } //cierra if de state->length }//cierra función
FUNCIÓN MODIFICAR PARAMETROS DE USUARIO.
int modif_par_user(HttpState* state)
Descripción: permite la modificación de los parámetros contraseña y correo
electrónico de los usuarios definidos en el sistema. Al igual que las otras
funciones CGI, ésta hace uso de la función analizar_post() para verificar el
contenido del búfer, una vez confirmado la consistencia del buffer se
permite modificar cada parámetro y registrar los nuevos cambios realizados
por el usuario.
Parámetro State: es un puntero al campo State de la estructura HttpState.
Valor de retorno:
_0 Para que la conexión al servidor HTTP este abierta en todo momento.
int modif_par_user(HttpState* state) { int i; if(state->length) { if(state->offset < state->length) {
state->offset += sock_fastwrite(&state->s, state->buffer + (int)state->offset, (int)state->length - (int)state->offset);
} else { state->offset = 0; state->length = 0; } } else { datoreciv [0].name = "select"; datoreciv [1].name = "nueva_contrasena";
189
datoreciv [2].name = "verifique_contrasena"; datoreciv [3].name = "Correo_electronico"; for(i=0;i<4;i++) { datoreciv[i].value[0] = '\0'; } state->p = state->buffer; if(analizar_post(state)) { //si es !=0 continua if (strcmp(datoreciv[0].value, "Admin") == 0) { sauth_setpassword(usuario1, datoreciv[1].value); strcpy(email_1,datoreciv[3].value); } else if (strcmp(datoreciv[0].value, "Ingenieria")==0){ sauth_setpassword(usuario2, datoreciv[1].value); strcpy(email_2,datoreciv[3].value); } else if (strcmp(datoreciv[0].value, "Operario")==0){ sauth_setpassword(usuario3, datoreciv[1].value); strcpy(email_3,datoreciv[3].value); } cgi_redirectto(state,CONFUSER_REDIRECTTO); return 0; } //cierra if de parse post } //cierra if de state->length }//cierra función
FUNCIÓN LISTA DE OBJETOS DEL SERVIDOR.
void objetos_servidor(void).
Descripción: permite registrar todos los elementos que hacen parte del
servidor HTTP, gracias a la creación de una lista de objetos que contiene
variables, funciones, archivos que se utilizarán para el funcionamiento de la
aplicación.
Esto es posible a través de las funciones siguientes que adicionan
elementos a la lista de objetos del servidor:
sspec_addxmemfile(), sirve para agregar archivos.
sspec_addfunction (), agrega las funciones CGI.
sspec_addvariable(), se utiliza para agregar variables.
190
sspec_adduser(), define la validación de los permisos de acceso a las
páginas de la lista de objetos del servidor para cada usuario.
void objetos_servidor(void) { int pag1; int pag2; //Archivos sspec_addxmemfile("/", inicio_sesion_html, SERVER_HTTP); sspec_addxmemfile("inicio_sesion.html", inicio_sesion_html, SERVER_HTTP); sspec_addfunction("submit.cgi", submit, SERVER_HTTP); sspec_addxmemfile("inicio1.html", inicio1_html, SERVER_HTTP | SERVER_COMPRESSED); sspec_addxmemfile("inicio2.html", inicio2_html, SERVER_HTTP | SERVER_COMPRESSED); sspec_addxmemfile("inicio3.html", inicio3_html, SERVER_HTTP | SERVER_COMPRESSED); sspec_addxmemfile("ayuda.html", ayuda_html, SERVER_HTTP | SERVER_COMPRESSED ); sspec_addxmemfile("principal_image.shtml", princimage_shtml, SERVER_HTTP); sspec_addxmemfile("principal_text.shtml", princtext_shtml, SERVER_HTTP); sspec_addxmemfile("principal.shtml", principal_shtml, SERVER_HTTP); sspec_addvariable("tempe", &tempe, INT16, "%d", SERVER_HTTP); sspec_addvariable("setpoint", &setpoint, FLOAT32, "%f", SERVER_HTTP); pag1 = sspec_addxmemfile("Config_PID.html", config_PID_html, SERVER_HTTP); sspec_addfunction("env_paramPID.cgi", env_paramPID, SERVER_HTTP); sspec_adduser(pag1, usuario1); sspec_adduser(pag1, usuario2); sspec_setrealm(pag1, "Admin"); pag2 = sspec_addxmemfile("Config_usuario.html", config_usuario_html, SERVER_HTTP); sspec_addfunction("modif_par_user.cgi", modif_par_user, SERVER_HTTP); sspec_adduser(pag2, usuario1); sspec_adduser(pag2, usuario2); sspec_setrealm(pag2, "Admin"); //Imagenes sspec_addxmemfile("logo_scan.PNG", logo_scan_PNG, SERVER_HTTP | SERVER_COMPRESSED ); sspec_addxmemfile("butpid.PNG", butpid_PNG, SERVER_HTTP); sspec_addxmemfile("butusuario.PNG", butusuario_PNG,SERVER_HTTP); sspec_addxmemfile("butayuda.PNG", butayuda_PNG, SERVER_HTTP); }
FUNCIÓN PRINCIPAL.
Descripción: en la función principal del programa se encuentran
inicializadas de una manera global todas las variables que se manejan en la
función de configuración de parámetros PID, al igual que, la función de
191
inicio del socket para establecer la conexión de red con otras terminales y la
función de inicio del servidor HTTP, además se hace el llamado a la función
de manejo para la lista de objetos del servidor y el manejador del servidor
HTTP, entre otras funciones para el correcto desempeño del sistema.
void main(void) { //declaracion del socket tcp_Socket mysock; int i, retconex; char cadtempe[5]; #GLOBAL_INIT { tempe = 0; setpoint = 0.0; kp = 0.0; ti = 0.0; td = 0.0; fm = 0.0; } sock_init(); // inicializa la pila TCP/IP http_init(); // inicializa sevidor web http_setauthentication(HTTP_DIGEST_AUTH); //se agregan tres tipos de usuario usuario1 = sauth_adduser("Admin", "Ronald", SERVER_HTTP); usuario2 = sauth_adduser("Ingenieria", "Jorge", SERVER_HTTP); usuario3 = sauth_adduser("Operario", "Invit", SERVER_HTTP); objetos_servidor(); retconex = establecer_conex(&mysock,"192.168.0.15",1500); tcp_reserveport(80); //se reserva el pto por defecto para la aplicaciones web while(1) { http_handler(); //maneja el servidor HTTP tempe = func_pid(setpoint,kp,ti,td,fm); itoa(tempe,cadtempe);//convierte un entero a cadena de caracteres if (retconex == 1 && sockstate(&mysock)=="Established"){ sock_puts(&mysock, cadtempe); }else{ retconex = establecer_conex(&mysock,"192.168.0.15",1500); } if (tempe>60 || tempe<10) enviar_mens_alarm("[email protected]",tempe); } //ciera while } //cierra main
192
D.1.4 Descripción libreria RJTCPIP.LIB. La librería RJTCPIP.LIB realizada por
los ejecutores del proyecto para el uso de la familia de protocolos TCP/IP,
contiene una serie de macros que fijan la configuración de red del módulo
RCM2200, además se define la función que establece comunicación con la
aplicación SCAM Server dentro de la misma red Ethernet para efectos del envío
de datos desde el módulo. Esta librería al igual que otras implementadas por el
usuario se debe incluir en el archivo LIB.DIR de la carpeta raíz de Dynamic C.
Los siguientes macros permiten establecer los valores estáticos para la
configuración de red de la tarjeta RCM2200.
#ifndef CONFIG_RED #define CONFIG_RED 0 #endif #ifndef TIMEZONE #define TIMEZONE -5 #endif #define IP_STATICA "192.168.0.16" #define MASCARA_RED "255.255.255.0" #define NOMBRE_SERV "192.168.0.16" #ifndef PTA_ENLACE #define PTA_ENLACE "192.168.0.1" #endif #define MY_HOST "scam" #define MY_DOMAIN "curn.edu" #define SMTP_SERVER "192.168.0.15" /*"mymailserver.mydomain.com" Nombre o IP del Servidor del correo*/ #define SMTP_DOMAIN "curn.edu" //Nombre o IP del controlador #if CONFIG_RED == 1 /*CONFIGURACIÓN DE RED ESTATICA*/ #define USE_ETHERNET 1 #define IFCONFIG_ETH0 \ IFS_IPADDR,aton(IP_STATICA), \ IFS_NETMASK,aton(MASCARA_RED), \ IFS_NAMESERVER_SET, aton(NOMBRE_SERV), \ IFS_ROUTER_SET, aton(PTA_ENLACE), \ IFS_UP #endif
193
Luego de haber establecido la configuración de red, se hace el llamado a las
librerías básicas de gestión de red.
#use "neterrno.lib" // Números de error en la red #use "net.lib" // API General de red #use "arp.lib" // Protocolo de Resolución de Direcciones #use "ip.lib" // Protocolo de Internet #use "udp.lib" // Protocolo de Datagramas de usuarios #use "tcp.lib" // Protocolo de control de transporte #use "bootp.lib" // Bootstrap y Protocolo de Configuración Dinámica de Hosts #use "bsdname.lib" // BSD-compatible API #use "icmp.lib" // Protocolo de mensajes de control de Internet #use "dns.lib" // Protocolo de nombres de dominio #use smtp.lib // Protocolo de Transferencia de Simple Correo #use "http.lib" // Protocolo de Transferencia de Hipertexto #use "igmp.lib" // Protocolo de administración de grupos de Internet y Multicast
FUNCIÓN ESTABLECER CONEXIÓN.
int establecer_conex(tcp_Socket *mysocket, char *remip, int puertorem);
Descripción: permite que el módulo de control establezca comunicación con
un servidor remoto dentro de la misma red Ethernet a través del protocolo
TCPI/P. Esta comunicación es posible gracias a un conjunto de funciones
propias del lenguaje que se emplean para manipular el socket, la dirección
IP remota y el número del puerto que se escuchará en el servidor remoto.
Este módulo (cliente) envía la cadena "HELLO" para verificar que el
Servidor este activo a fin de establecer la conexión entre estos.
Parámetros:
mysocket: puntero al socket tcp para almacenar el estado de la conexión.
remip: contiene la dirección IP remota o nombre del host con que se
establecerá la conexión.
194
puertorem: número de puerto de escucha del equipo remoto.
int establecer_conex(tcp_Socket *mysocket, char *remip, int puertorem) {longword host; char mens1[5]; int retorno; if (!(host = resolve(remip))) { //retorna 0 si no puede resolver la direccion printf("No pudo resolver host"); return 0; } //retorna 0 si tcp_open no entra en sesion con el host remoto if (!tcp_open(mysocket, 0, host, puertorem, NULL)) { printf("falla de apertura \n"); return 0; } while (!sock_established(mysocket) && sock_bytesready(mysocket)== -1){ if (!tcp_tick(mysocket)){ printf("Falla al establecer la conexion\n"); return 0; break; } }//cierra ciclo printf("Establecida OK!\n"); strcpy(mens1,"HELLO"); sock_puts(mysocket, mens1); //Escribe una cadena a un socket. sock_flushnext(mysocket); //vacia los datos a la red retorno = recibir_mens(mysocket, mens1); if (retorno == 1){ printf("Servidor Activo \n"); return 1; }else{ return 0;} }
FUNCIÓN RECIBIR MENSAJE .
int recibir_mens (tcp_Socket *s, char *cadena);
Descripción: esta función trabaja en conjunto con la función establecer
conexión descrita anteriormente, ya que ésta permite recibir el mensaje de
confirmación (cadena HELLO) enviado desde el servidor para establecer la
comunicación. La función hace una comparación de la cadena recibida con
la enviada previamente para verificar que estas dos sean iguales.
195
Parámetros:
s: puntero al socket tcp para almacenar el estado de la conexión.
Cadena: puntero a un arreglo de cadena que contiene el mensaje.
Valor de retorno:
_ 1 cuando realiza la confirmación de la cadena correctamente.
_ 0 cuando no realiza la confirmación de la cadena correctamente.
int recibir_mens(tcp_Socket *s, char *cadena) {char buffer[6]; int valret; do{ valret = sock_fastread(s, buffer, 6); } while(tcp_tick(s) && valret==0); buffer[valret]= '\0'; if (strcmp(buffer,cadena)==0) return 1; else return 0; } //cierrra función
FUNCIÓN ESCUCHAR CONEXIÓN TELNET.
int escuchar_conex_telnet(tcp_Socket *s, int puertolocal);
Descripción: esta función permite recibir una conexión entrante vía Telnet
para establecer comunicación entre la tarjeta y una Terminal remota.
Parámetros:
s: puntero al socket para almacenar el estado de la conexión.
puertolocal: número de puerto local de escucha del Servidor Telnet para
establecer la conexión.
Valor de retorno:
_0 cuando existe una falla al establecer la conexión.
196
_1 cuando entra en sesión con otra Terminal.
int escuchar_conex_telnet(tcp_Socket *s, int puertolocal) { char buffer[ 512 ]; int status; tcp_listen(s, puertolocal, 0L, 0, NULL, 0); while (!sock_established(s) && sock_bytesready(s)==-1){ if (!tcp_tick(s)){ printf("Falla al establecer la conexion\n"); return 0; break; } } puts("Recibiendo conexiones entrantes desde Telnet"); sock_mode(s, TCP_MODE_ASCII ); do { if (sock_bytesready(s) >= 0) { //Se debe fijar el modo ASCII con sock_mode() para esta funcion. sock_gets(s, buffer, sizeof(buffer)-1); puts (buffer); } } while (tcp_tick(s)==1); return 1; }
FUNCIÓN ENVIAR MENSAJE DE ALARMA.
void enviar_mens_alarm(char *email_dest, float valtempe).
Descripción: envía un mensaje de correo electrónico a un servidor de correo
remoto siempre que el valor de la variable controlada por la tarjeta exceda
los límites del rango predefinido. La información tanto del destinatario como
la del remitente del mensaje se encuentra previamente definido por medio
de arreglos de cadenas.
Parámetros:
email_dest: cadena que contiene la dirección electrónica del destinatario del
mensaje.
Valtempe: variable que contiene el valor de la temperatura registrado por la
tarjeta.
197
void enviar_mens_alarm(char *email_dest, float valtempe){ char de[25]; char para[25]; char asunto[35]; char mensaje[60]; strcpy(de, "[email protected]"); strcpy(para,email_dest); strcpy(asunto,"Alarma"); if (valtempe < 0) strcpy(mensaje,"La Temperatura esta por debajo de su Rango Normal"); else if (valtempe > 100) strcpy(mensaje,"La Temperatura esta por Encima de su Rango Normal"); smtp_sendmail(para, de, asunto, mensaje); while(smtp_mailtick()==SMTP_PENDING) //el correo no se ha enviado aún, // se llama otra vez con continue continue; if(smtp_status()==SMTP_SUCCESS) //correo enviado. printf("Mensaje enviado \n"); else printf("Error enviando mensaje \n"); }
D.1.5 Descripción de funciones predefinidas de Dynamic c. Las siguientes
funciones a describir son propias del lenguaje de programación empleado en
Dynamic C, siendo de utilidad para el desarrollo del sistema SCAM.
FUNCIÓN CGI_REDIRECTTO.
void cgi_redirectto( HttpState *state, char *url );
Descrpción: se utiliza para remitir al usuario a otra página, utilizando un
URL almacenado a través de un macro (ej. REDIRECTTO). Los parámetros
que recibe son el campo state de la estructura Http_state y la cadena URL
que contiene la dirección de la página destino.
FUNCÓN CGI_SENDSTRING.
void cgi_sendstring( HttpState *state, char *cadcar );
Descripción: envía una cadena al usuario cuando se ejecuta una rutina CGI
en el servidor HTTP. Se debe emitir un "return 0" inmediatamente después
198
de llamar esta función. La rutina CGI es considerada finalizada cuando se
realiza el llamado a esta función. Esta función simplifica el manejo de CGI
porque permite generar una página en un buffer. Los parámetros que recibe
es el estado actual del servidor (state) y la cadena de caracteres a enviar
(scripts, html). No retorna ningún valor, ya que fija el estado para que el CGI
devuelva inmediatamente un valor de (0) cero.
FUNCIÓN HTTP_SCANPOST.
http_scanpost(char *buf_nom_etiq, char *buffer, char *buf_value, int
tam_max);
Descripción: permite examinar ó escanear un buffer con una respuesta
POST para los datos enviados desde el navegador como los pares
nombre/valor. Los valores de retorno son 0 (cero) cuando analiza los datos
enviados desde el navegador ó diferente de cero cuando hay falla !0.
FUNCIÓN HTTP_SETAUTHENTICATION.
int http_setauthentication(int auth);
Descripción: Fija el tipo de autenticación a ser usado globalmente por el
servidor HTTP. Por defecto, coloca el tipo HTTP_NO_AUTH. Recibe como
parámetro el tipo de autenticación que puede ser: HTTP_NO_AUTH (no
autenticación), HTTP_BASIC_AUTH (autenticación básica),
HTTP_DIGEST_AUTH (autenticación digest), retornado el resultado actual
del tipo de autenticación.
199
FUNCIÓN RESOLVE.
Int resolve (char *remip)
Descripción: esta función resuelve la dirección IP de un equipo dentro de
una red Ethernet. Recibe el parámetro remip que es la dirección IP o
nombre de host del equipo a resolver, con la finalidad de establecer una
conexión. La función retorna 0 si no encuentra al equipo de lo contrario
devolverá la dirección IP.
FUNCIÓN SAUTH_ADDUSER.
int sauth_adduser( char *username, char *password, word servermask );
Descripción: función que agrega un usuario a la lista de usuarios TCP/IP.
Los parámetros que recibe son: primero el nombre de usuario, segundo la
contraseña y el tercero representa los servidores válidos (SERVER_HTTP ó
SERVER_FTP). Retorna -1 si existe falla, sino un índice de usuario que es
mayor igual que cero (0) si hay éxito en la operación.
FUNCIÓN SAUTH_AUTHENTICATE.
int sauth_authenticate( char *username, char *password, word server );
Descripción: función que autentica un usuario, recibe como parámetro el
nombre de usuario, contraseña, y el tipo de servidor que se utilizará, ya sea
SERVER_HTTP ó SERVER_FTP. Los valores de retorno son -1 cuando el
usuario no es válido ó mayor igual que cero (0) cuando el usuario se
encuentra registrado.
200
FUNCIÓN SAUTH_SETPASSWORD.
int sauth_setpassword( int userid, char *password );
Descripción: Fija la nueva contraseña para un usuario. Los parámetros que
recibe son el índice de usuario de la lista de objetos de usuarios TCP/IP y
la nueva contraseña de usuario. Los valores de retorno son cero (0) si se
cumple la modificación de la contraseña ó -1 si hay alguna falla.
FUNCIÓN SMTP_SENDMAIL.
void smtp_sendmail(char *to, char *from, char *subject, char *message);
Descripción: inicializa la estructura de datos interna con cadenas de correo
electrónico para el destinatario y remitente, el asunto, y el cuerpo del
mensaje. Recibe como parámetros la dirección de correo del destinatario, la
dirección de correo del remitente, el asunto y el mensaje.
FUNCIÓN SMTP_MAILTICK.
int smtp_mailtick(void);
Descripción: se llama repetidamente hasta que el correo electrónico sea
enviado completamente. Para un mensaje pequeño, ésta necesitará ser
llamada aproximadamente 20 veces para enviar el mensaje. El número de
tiempo variará, dependiendo de la latencia de la conexión al servidor de
correo y el tamaño del mensaje.
Retorna los siguientes valores:
SMTP_SUCCESS: correo enviado.
SMTP_PENDING: correo no enviado aún, se llama otra vez a
smtp_mailtick().
SMTP_TIME: correo no enviado dentro de los segundos SMTP_TIMEOUT.
201
SMTP_UNEXPECTED: recibe una respuesta no valida del servidor de
correo.
FUNCIÓN SMTP_STATUS.
int smtp_status(void);
Descripción: devuelve el estado del último correo electrónico enviado, los
valores de retorno son iguales que la función smtp_mailtick ( ).
FUNCIÓN SOCK_AREAD.
int sock_aread( tcp_Socket *s, byte *dp, int len );
Descripción: lee exactamente el tamaño (len) de bytes del socket ó si esta
cantidad de datos no está disponible aún, no lee nada.
FUNCIÓN SOCK_BYTESREADY.
int sock_bytesready ( void *s );
Descripción: si el socket está en modo binario, sock_bytesready() retorna el
número de bytes esperados a ser leídos. Si no existen bytes esperándose,
esta retornara -1. Recibe como parámetro un puntero al socket TCP.
FUNCIÓN SOCK_ESTABLISHED.
int sock_established( void *s );
Descripción: permite establecer una conexión TCP entre un cliente y un
servidor remoto. Recibe como parámetro el puntero al socket TCP. Los
valores de retorno son uno (1) si se establece la comunicación ó de lo
contrario continuará devolviendo cero (0) hasta que la conexión se
establezca.
202
FUNCIÓN SOCK_FASTREAD.
int sock_fastread( tcp_Socket *s, byte *dp, int len );
Descripción: lee los bytes posibles en el socket y retorna el número de
bytes leídos ó -1 si existe algún error. Se utiliza sólo para sockets TCP y
UDP. El primer parámetro de la función es el puntero al socket, el segundo
son los bytes que se van a leer en el socket y el tercero es el número
máximo de bytes que se leerán en el socket.
FUNCIÓN SOCK_FASTWRITE.
int sock_fastwrite( tcp_Socket *s, byte *dp, int len );
Descripción: escribe tantos bytes posibles al socket y retorna el número de
bytes a enviar ó -1 si existe algún error. Se utiliza sólo para sockets TCP y
UDP. El primer parámetro de la función es el puntero socket, el segundo
parámetro son los bytes que se van a escribir en el socket y el tercero es el
número máximo de bytes que se escribirán en el socket.
FUNCIÓN SOCK_FLUSHNEXT.
void sock_flush( tcp_Socket *s );
Descripción: permite vaciar los datos escritos en el socket a la red Ethernet.
Recibe como parámetros un puntero al socket TCP.
FUNCIÓN SOCK_MODE.
word sock_mode( void *s, word mode );
Descripción: define el modo de envío de los datos a través del socket.
Recibe como parámetros el puntero al socket TCP y el modo que puede ser
203
TCP_MODE_ASCII, TCP_MODE_BINARY. Por defecto se usa el modo
TCP Binario
FUNCION SOCK_GETS.
int sock_gets( tcp_Socket *s, char *text, int len );
Descripción: lee una cadena de caracteres de tamaño len desde un socket
y reemplaza al CR ó LF con un carácter nulo. (\0). Si la cadena es mas
larga que len, la cadena es terminada en nulo y es resto de caracteres en la
cadena son descartados.
Para usar sock_gets(), primero debe fijar el modo ASCII usando la función
sock_mode().
FUNCION SOCK_PUTS.
int sock_puts( tcp_Socket *s, byte *buf );
Descripción: permite escribir datos al socket, ya que recibe como
parámetros el puntero al socket TCP y un búfer de cadena de caracteres a
escribir al socket. Retorna la longitud de la cadena o -1 si hay error.
FUNCIÓN TCP_LISTEN.
int tcp_listen( tcp_Socket *s, word ptolocal, longword remip, word
ptoremoto, dataHandler_t datahandler, word reserved );
Descripción: permite que un puerto particular sea escuchado y aceptado a
fin de establecer una sesión pasiva con otro host. La función recibe como
parámetros un puntero s a la estructura del socket, el puerto a escuchar
ptolocal, el parámetro remip que es la dirección IP del host remoto, el
parámetro ptoremoto que indica el puerto al que se le aceptará la conexión
o 0 para aceptar cualquiera, el parámetro datahandler que hace referencia a
204
una función cuando el dato se recibe o NULL para colocar los datos en el
búfer del socket, por último reserved que es empleado para un uso futuro y
se fija a cero. Retorna 1 para aceptar el puerto ó 0 si existe un error
FUNCIÓN TCP_OPEN.
int tcp_open( tcp_Socket *s, word ptolocal, longword remip, word ptoremoto,
dataHandler_t datahandler );.
Descripción: esta función crea una sesión activa con otro host. Recibe
como primer parámetro un puntero s a la estructura del socket, seguido del
puerto local que es fijado a 0 o a un valor comprendido entre 1025 y 65536,
la dirección IP del host a conectar (remip), el puerto remoto a conectar y por
ultimo parámetro datahandler que hace referencia a una función cuando el
dato se recibe o NULL para colocar los datos en el búfer del socket. Los
valores de retorno son: cero (0) si no puede resolverse la dirección de
hardware de la otra computadora, de lo contrario devolverá diferente de
cero (0).
FUNCIÓN TCP_RESERVEPORT.
void tcp_reserveport( word puerto );
Descripción: reserva el puerto por defecto para los protocolos de la familia
TCP/IP, permitiendo establecer una conexión aun cuando no hay un socket
disponible. Recibe como parámetro el puerto a usar. Por ejemplo el
protocolo HTTP emplea el puerto 80 para establecer conexión entre un
navegador Web (cliente) y servidor HTTP.
205
ANEXO E
FUNCIONAMIENTO DEL PIC
16F877
206
E.1 GENERALIDADES DEL CONTROLADOR DE INTERFACE PERIFÉRICO
PIC 16F877
El microcontrolador PIC 16F877 de Microchip pertenece a una gran familia de
microcontroladores de 8 bits (bus de datos) que tienen las siguientes
características generales que los distinguen de otras familias:
Arquitectura Harvard
Tecnología RISC
Tecnología CMOS
Estas características se conjugan para lograr un dispositivo altamente eficiente en
el uso de la memoria de datos y programa y por lo tanto en la velocidad de
ejecución.
Microchip ha dividido sus microcontroladores en tres grandes subfamilias de
acuerdo al número de bits de su bus de instrucciones:
Tabla 11. Familia de microcontroladores de Microchip.
Subfamilia Bits del Bus de Instrucciones
Nomenclatura
Línea Base 12 PIC12XXX y PIC14XXX
Rango Medio 14 PIC16XXX
High - End 16 PIC17XXX y PIC18XXX
207
Los microcontroladores que produce Microchip cubren un amplio rango de
dispositivos cuyas características pueden variar como sigue:
Empaquetado (desde 8 pines hasta 68 pines)
Tecnología de la memoria incluida (EPROM, ROM, Flash)
Voltajes de operación (desde 2.5 v. Hasta 6v)
Frecuencia de operación (Hasta 20 Mhz)
E.1.1 Nomenclatura. El nombre específico del microcontrolador puede aparecer
algunas siglas como se muestra en la siguiente tabla:
Tabla 12. Nomenclatura de la familia de microcontroladores de Microchip
TIPO DE MEMORIA
RANGO DE VOLTAJE
ESTÁNDAR EXTENDIDO
EPROM PIC16CXXX PIC16LCXXX
ROM PIC16CRXXX PIC16LCRXXX
Flash PIC16FXXX PIC16LFXXX
En la siguiente tabla se especifican los rangos de voltaje estándar y extendido
manejados por los dispositivos:
Tabla 13. Rango de voltaje de los microcontroladores
RANGO DE VOLTAJE
EPROM ROM Flash
ESTÁNDAR C 4.5 a 6 V CR 4.5 a 6 V F 4.5 a 6 V
EXTENDIDO LC 2.5 a 6 V LCR 2.5 a 6 V LF 2 a 6 V
208
E.1.2 Características generales del PIC16F877. La siguiente es una lista de las
características que comparte el PIC16F877 con los dispositivos más cercanos de
su familia.
Tabla 14. Familia del PIC 16Fxxx
PIC16F873 PIC16F874 PIC16F876 PIC16F877
CPU RISC
Sólo 35 instrucciones.
Todas las instrucciones se ejecutan en un ciclo de instrucción, excepto los
saltos que requieren dos.
Frecuencia de operación de 0 a 20 MHz (DC a 200 nseg de ciclo de
instrucción)
Hasta 8k x 14 bits de memoria Flash de programa
Hasta 368 bytes de memoria de datos (RAM)
Hasta 256 bytes de memoria de datos EEPROM
Hasta 4 fuentes de interrupción
Pila de hardware de 8 niveles
Reset de encendido (POR)
Retardo de encendido (PWRT)
Retardo de arranque del oscilador (OST)
Sistema de vigilancia Watchdog timer (Temporizador de perro guardián).
Protección programable de código
Modo SLEEP de bajo consumo de energía
Opciones de selección del oscilador
Programación y depuración serie “In-Circuit” (ICSP) a través de dos pines
Lectura/escritura de la CPU a la memoria flash de programa
Rango de voltaje de operación de 2.0 a 5.5 voltios
Alta capacidad de drenado de corriente de la fuente: 25mA
209
Rangos de temperatura: Comercial, Industrial y Extendido
Bajo consumo de potencia:
o Menos de 0.6mA a 3V, 4 Mhz
o 20 µA a 3V, 32 Khz
o menos de 1µA corriente de standby.
E.1.3 Periféricos.
Timer 0: Contador/Temporizador de 8 bits con pre-escalador de 8 bits
Timer 1: Contador/Temporizador de 16 bits con pre-escalador
Timer 0: Contador/Temporizador de 8 bits con pre-escalador y post-
escalador de 8 bits y registro de periodo.
Dos módulos de captura, comparación y PWM
Convertidor analógico/digital: de 10 bits, hasta 8 canales
- Puerto serie síncrono (SSP)
- Puerto serie universal (USART/SCI)
- Puerto paralelo esclavo (PSP): de 8 bits con líneas de protocolo
E.1.4 Diagrama de Bloques del PIC16F877. En las siguientes figuras se muestra
el diagrama de bloques de la organización interna del PIC16F877 y el esquema de
pines respectivamente, para tener una visión conjunta del interior y exterior del
Chip.
210
Figura 71. Esquema Interno del PIC16F877/874
Pu
erto
A
Pila de 8 niveles
(13 bits)
Pu
erto
B
Pu
erto
C
Pu
erto
D
Pu
erto
E
211
Figura 72. Esquema de pines del PIC16F877/874
E.1.5 Descripción de la CPU. La CPU es la responsable de la interpretación y
ejecución de la información (instrucciones) guardada en la memoria de programa.
Muchas de estas instrucciones operan sobre la memoria de datos. Para operar
sobre la memoria de datos además, si se van a realizar operaciones lógicas o
aritméticas, requieren usar la Unidad Lógica y Aritmética (ALU). La ALU controla
los bits de estado (Registro STATUS), los bits de este registro se alteran
dependiendo del resultado de algunas instrucciones.
Ciclo de instrucción. El registro contador de programa (Program Counter
PC) es gobernado por el ciclo de instrucción como se muestra en la
siguiente figura. En cada ciclo de instrucción la CPU lee (ciclo Fetch) la
instrucción guardada en la memoria de programa apuntada por PC y al
mismo tiempo ejecuta la instrucción anterior, esto debido a una cola de
instrucciones que le permite ejecutar una instrucción mientras lee la
próxima.
212
Figura 73. Ciclo de instrucción de PC
Como puede verse, cada ciclo de instrucción (Tcy) se compone a su vez de
cuatro ciclos del oscilador (Tosc). Cada ciclo Q provee la sincronización
para los siguientes eventos:
Q1: Decodificación de la instrucción
Q2: Lectura del dato (si lo hay)
Q3: Procesa el dato
Q4: Escribe el dato
Debido a esto cada ciclo de instrucción consume 4 ciclos de reloj, de
manera que si la frecuencia de oscilación es Fosc, Tcy será 4/Fosc.
Registros de la CPU. La CPU tiene los siguientes registros:
o Registro PC. Registro de 13 bits que siempre apunta a la siguiente
instrucción a ejecutarse. En la siguiente sección se dan mayores
detalles en el manejo de este registro.
o Registro de Instrucción. Registro de 14 bits. Todas las
instrucciones se colocan en él para ser decodificadas por la CPU
antes de ejecutarlas.
213
o Registro W. Registro de 8 bits que guarda resultados temporales de
las operaciones realizadas por la ALU.
o Registro STATUS. Registro de 8 bits, cada uno de sus bits
(denominados Banderas) es un indicador de estado de la CPU o del
resultado de la última operación como se indica en la siguiente
figura:
Figura 74. Configuración de bits del registro STATUS
Bit Z. Este bit se pone (=1) para indicar que el resultado de la última
operación fue cero, de lo contrario se limpia (=0).
Bit C. Bit de acarreo/préstamo’ de la última operación aritmética (en
el caso de resta, se guarda el préstamo invertido.
Bit DC. Acarreo/Préstamo’ proveniente del cuarto bit menos
significativo. Funciona igual que el bit C, pero para operaciones de 4
bits.
E.1.6 Formato General de las Instrucciones. Cada instrucción en lenguaje de
máquina (binario) del PIC contiene un código de operación (opcode) el cual puede
ser de 3 a 4 o 6 bits, dependiendo del tipo de instrucción.
A continuación se describe el formato para cada tipo de instrucción de los PIC de
rango medio:
214
Operaciones con el archivo de registros orientadas a bytes
Figura 75. Operación con el archivo de registros orientada a bytes
El bit d especifica el destino del resultado de la operación:
d = 0: destino W
d = 1: destino f
f = dirección de 7 bits del archivo de registros.
Operaciones con el archivo de registros orientados a bits
Figura 76. Operación con el archivo de registros orientada a bits
b : Especificación en tres bits del bit sobre el que se va a operar
f = dirección de 7 bits del archivo de registros.
Operaciones con literales y de control
Figura 77. Formato general
k : Literal = Valor de un operando de 8 bits
Figura 78. Formato para CALL y GOTO
215
k : Literal = Valor de un operando de 8 bits
E.1.7 Organización de la memoria del PIC. Los PIC tienen dos tipos de
memoria: memoria de programa y memoria de datos, cada bloque con su propio
bus: bus de programa y bus de datos; por lo cual cada bloque puede ser accesado
durante un mismo ciclo de oscilación.
La Memoria de programa. Los PIC de rango medio poseen un registro
contador del programa (PC) de 13 bits, capaz de direccionar un espacio de
8K x 14, como todas las instrucciones son de 14 bits, esto significa un
bloque de 8k instrucciones. El bloque total de 8K x 14 de memoria de
programa está subdividido en 4 páginas de 2K x 14. En la siguiente figura
se muestra esta organización.
Figura 79. Organización de la memoria de programa
Nota 1: No todos los PIC tienen implementado todo el espacio de 8K de
memoria de programa.
216
Nota 2: El fabricante puede grabar datos de calibración en localidades de
memoria de programa.
Vector de reset. Cuando ocurre un reset el contenido del PC es forzado a
cero, ésta es la dirección donde la ejecución del programa continuará
después del reset, por ello se le llama “dirección del vector de reset”.
Vector de interrupción. Cuando la CPU acepta una solicitud de
interrupción ejecuta un salto a la dirección 0004h, por lo cual a esta se le
conoce como “dirección del vector de interrupción”. El registro PCLATH no
es modificado en esta circunstancia, por lo cual habrá que tener cuidado al
manipular el PC dentro de la rutina de atención a la interrupción (Interrupt
Service Routine (ISR)).
o Manejo del contador de programa (PC). El registro contador del
programa (PC) especifica la dirección de la instrucción que la CPU
buscará (fetch) para ejecutarla. El PC consta de 13 bits, separados en
dos partes: como se muestra en la figura siguiente.
Figura 80. Registro contador de programa
El byte de orden bajo es llamado el registro PCL, mientras que el byte
de orden alto es llamado registro PCH. Este último contiene los bits
PC<12:8> y no se puede leer o escribir directamente. Todas las
actualizaciones al registro PCH deben ser hechas a través del registro
PCLATH. En las siguientes figuras se ilustran las cuatro situaciones y
las maneras correspondientes en que el PC puede ser actualizado.
217
Figura 81. Actualización del registro PCH a través del registro PCLATH <4:0>
Figura 82. Actualización del registro PCH a través del registro PCLATH <4:3>
Figura 83. Asignación del contenido del registro PC a la pila
PCLATH
PC
12 11 10 8 7 0
PCLATH <4:3> 2
Código de operación <10:0>
11
Pila (13 bits x 8)
Tope de la pila
Situación 3 – Instrucción CALL
PCH PCL
13
PCLATH
PC
12 PCH 8 7 PCL 0
PCLATH <4:0> 5
Resultado de la ALU
8
Pila (13 bits x 8)
Tope de la pila
Situación 1 - Instrucción con PCL como destinación
PCLATH
PC
12 11 10 8 7 0
PCLATH <4:3> 2
Código de operación <10:0>
11
Pila (13 bit x 8)
Tope de la pila
Situación 2 – Instrucción GOTO
PCH PCL
218
Figura 84. Asignación del contenido de la pila al registro PC
Nota 3: PCLATH nunca es actualizado con el contenido de PCH.
o Paginación. Para saltar entre una página y otra, los bits más
significativos del PC deberán ser modificados. Debido a que las
instrucciones GOTO y CALL sólo pueden direccionar un bloque de 2K
(pues usan una dirección de 11 bits) deben existir otros dos bits que
completen los 13 bits del PC para moverse sobre los 8K de memoria de
programa.
Estos dos bits extra se encuentran en el registro SFR denominado
PCLATH (Program Counter Latch High) en sus bits PCLATH<4:3>. Por
esto antes de un GOTO o un CALL el usuario deberá asegurarse que
estos bits apunten a la página deseada. Si las instrucciones se ejecutan
secuencialmente el PC cruza libremente los límites de página sin
necesidad de que el usuario escriba en el PCLATH
Memoria de la pila
La memoria de la pila es un área de memoria completamente separada de
la memoria de datos y la memoria de programa. La pila consta de 8 niveles
de 13 bits cada uno. Esta memoria es usada por la CPU para almacenar las
PCLATH
PC 12 11 10 8 7 0
Código de operación <10:0>
11
Pila (13 bits x 8)
Tope de la pila
Situación 4 – Instrucción RETURN, RETFILE, O RETLW
PCH PCL
13
219
direcciones de retorno de subrutinas. El apuntador de la pila no es ni legible
ni escribible.
Cuando se ejecuta una instrucción CALL o es reconocida una interrupción
el PC es guardado en la pila y el apuntador de la pila es incrementado en 1
para apuntar a la siguiente posición vacía. A la inversa, cuando se ejecuta
una instrucción RETURN, RETLW o RETFIE el contenido de la posición
actual de la pila es colocado en el PC.
Nota 4: PCLATH no se modifica en ninguna de estas operaciones.
Nota 5: Cuando el apuntador de la pila ya está en la posición 8 y se ejecuta
otro CALL se reinicia a la posición 1 sobrescribiendo en dicha posición. No
existe ningún indicador que avise de esta situación. Así que el usuario
deberá llevar el control para que esto no ocurra.
La Memoria de Datos. La memoria de datos consta de dos áreas
mezcladas y destinadas a funciones distintas:
o Registros de Propósito Especial (SFR)
o Registro de Propósito General (GPR)
Los SFR son localidades asociadas específicamente a los diferentes
periféricos y funciones de configuración del PIC y tienen un nombre
específico asociado con su función. Mientras que los GPR son memoria
RAM de uso general.
E.1.8 Bancos de memoria. Toda la memoria de datos está organizada en 4
bancos numerados 0, 1, 2 y 3. Para seleccionar un banco se debe hacer uso de
los bits del registro STATUS<7:5> denominados IRP, RP1 y RP0.
220
Hay dos maneras de acceder a la memoria de datos: direccionamiento directo e
indirecto. La selección de bancos se basa en las siguientes tablas.
Tabla 15. Selección del banco mediante el direccionamiento indirecto
Tabla 16. Selección del banco mediante el direccionamiento directo
Direccionamiento Directo (RP1:RP0)
Banco
Cada banco consta de 128 bytes (de 00h a 7Fh). En las posiciones más bajas de
cada banco se encuentran los SFR, y arriba de éstos se encuentran los GPR.
Toda la memoria de datos está implementada en Ram estática.
Direccionamiento Directo. Para acceder una posición de memoria
mediante direccionamiento directo, la CPU simplemente usa la dirección
indicada en los 7 bits menos significativos del código de operación y la
selección de banco de los bits RP1:RP0 como se ilustra en la siguiente
figura.
Direccionamiento Indirecto (IRP)
Banco
221
Figura 85. Direccionamiento directo e indirecto de la memoria de datos.
Direccionamiento indirecto. Este modo de direccionamiento permite
acceder una localidad de memoria de datos usando una dirección de
memoria variable a diferencia del direccionamiento directo, en que la
dirección es fija. Esto puede ser útil para el manejo de tablas de datos.
Registro INDF. En la figura anterior se muestra la manera en que esto se
realiza. Para hacer posible el direccionamiento indirecto se debe usar el
registro INDF. Cualquier instrucción que haga un acceso al registro INDF en
realidad accesa a la dirección apuntada por el registro FSR (File Select
Register).
La selección de banco en el caso de direccionamiento indirecto se realiza
mediante los bits IRP (STATUS<7>) y el bit 7 del registro FSR, como se
muestra en la figura 85.
7 Registro FSR 0 RP1: RP0 6 IRP 0
Banco Seleccionado
Ubicación seleccionada
Banco Seleccionado
Ubicación seleccionada
Memoria de Datos
00 01 10 11
Banco 0 Banco 1 Banco 2 Banco 3
00h
7Fh
00h
7Fh
00h
7Fh
00h
7Fh
Direccionamiento Directo Direccionamiento Indirecto
222
El registro INDF mismo al leerse de manera indirecta (con FSR=0)
producirá un cero. Y al escribirse de manera indirecta no es afectado.
A continuación se muestra un ejemplo del uso de este direccionamiento
para limpiar las localidades RAM 20h a 2Fh.
Ejemplo 1: borrado de un bloque de memoria de datos desde la localidad
20h a la localidad 2f h.
MOVLW 0X20 ; Carga el valor del apuntador a la RAM.
MOVWR FSR ; Inicializa apuntador.
CLRF INDF ; limpia la localidad apuntada por FSR.
INCF FSR, F ; incrementa apuntador.
BTFSS, FSR, 4 ; si ya terminó escapa a continuar.
GOTO ; Si no repite
Continuar...
Archivo de Registros. Aunque el archivo de registros en RAM puede
variar de un PIC a otro, la familia del PIC16F87x coincide casi en su
totalidad. En la tabla 17 se muestra a detalle el mapa de este archivo de
registros y su organización en los cuatro bancos que ya se describieron.
223
Tabla 17. Archivo de registros del PIC 16F87X
Dirección Registro
Dirección Registro
Dirección Registro
Dirección Registro
Direcc. Indirecto (*)
00h Direcc. Indirecto (*)
80h Direcc. Indirecto (*)
100h Direcc. Indirecto (*)
180h
TMR0
01h OPTION_REG 81h TMR0 101h OPCION_REG 181h
PCL 02h PCL 82h PCL 102h PCL 182h
STATUS 03h STATUS 83h STATUS 103h STATUS 183h
FSR 04h FSR 84h FSR 104h FSR 184h
PUERTO A 05h TRISA
85h 105h 185h
PUERTO B 06h TRISB 86h PUERTO B 106h TRISB 186h
PUERTO C
07h TRISC(1)
87h 107h 187h
PUERTO D(1) 08h TRISD
(1) 88h 108h 188h
PUERTO E (1)
09h TRISE 89h 109h 189h
PCLATH 0Ah PCLATH 8Ah PCLATH 10Ah PCLATH 18Ah
INTCON 0Bh INTCON 8Bh INTCON 10Bh INTCON 18Bh
PIR1 0Ch PIE1 8Ch EEDATA 10Ch EECON1 18Ch
PIR2 0Dh PIE2 8Dh EEDR 10Dh EECON2 18Dh
TMR1L 0Eh PCON 8Eh EEDATH 10Eh Reservado(2)
18Eh
TMR1H 0Fh 8Fh EEADRH 10Fh Reservado(2)
18Fh
TICON 10h 90h
Registros de propósito general 16 bytes
110h
Registros de propósito general 16 bytes
190H
TMR2 11h SSPCON2 91h 111h 191h
T2CON 12h PR2 92h 112h 192h
SSPBUF 13h SSPADD 93h 113h 193h
SSPCON 14h SSPSTAT 94h 114h 194h
CCPR1L 15h 95h 115h 195h
CCPR1H 16h 96h 116h 196h
CCP1CON 17h 97h 117h 197h
RCSTA 18h TXSTA 98h 118h 198h
TXREG 19h SPBRG 99h 119h 199h
RCREG 1Ah 9Ah 11Ah 19Ah
CCPR2L 1Bh 9Bh 11Bh 19Bh
CCPR2H 1Ch 9Ch 11Ch 19Ch
CCP2CON 1Dh 9Dh 11Dh 19Dh
ADRESH 1Eh ADRESL 9Eh 11Eh 19Eh
ADCON0 1Fh ADCON1 9Fh 11Fh 19Fh
Registros de propósito general 96 bytes
20h . . . 7Fh
Registros de propósito general 80 bytes
A0h… EFh
Registros de propósito general 80 bytes
120h… 16Fh
Registros de propósito general 80 bytes
1A0 h… 1EFh
Accesos 70h-7Fh F0h… FFh
Accesos 70h -7Fh 170h… 17Fh
Accesos 70h -7Fh 1E0h 1FFh
Banco 0 Banco 1 Banco 2 Banco 3
Ubicación de memoria de datos sin implementar, se leé “0”. * No es un registro físico
Nota 1: estos registros no son implementados en el PIC 16F876.
2: estos registros son reservados y deben mantenerse limpios.
224
E.2 CONVERSOR ANÁLOGO DIGITAL
Los microcontroladores PIC16F87x poseen un conversor A/D de 10 bits de
resolución y 5 canales de entrada en los modelos de con 28 pines (PIC16F873/6)
y 8 canales en los que tienen 40 pines (PIC16F877).
La resolución que tiene cada bit procedente de la conversión tiene un valor que es
función de la tensión de referencia Vref, de acuerdo con la siguiente fórmula:
Resolución = (Vref + - Vref -)/1024 = Vref /1024
Así por ejemplo, si la Vref += 5VDC y la Vref - es tierra, la resolución es de 4,8
mV / bit. Por tanto, la entrada analógica de 0 V le corresponde una digital 00 0000
0000 y para la de 5V una lógica una de 11 1111 1111. La tensión de referencia
determina los límites máximo y mínimo de la tensión analógica que se puede
convertir. El voltaje diferencial mínimo es de 2 V.
A través del canal de entrada seleccionado, se aplica la señal analógica a un
condensador de captura y mantenimiento y luego se introduce al conversor, el cual
proporciona un resultado digital de 10 bits de longitud usando la técnica de
"aproximaciones sucesivas".
El conversor A/D es el único dispositivo que puede funcionar en modo de reposo
(SLEEP), para ello el reloj del conversor deberá conectarse al oscilador RC
interno.
E.2.1 Registros de trabajo. El funcionamiento del conversor A/D requiere de la
manipulación de cuatro registros.
1° ADRESH: parte alta del resultado de la conversión
225
2° ADRESL: parte baja del resultado de la conversión
3° ADCON0: registro de control 0.
4° ADCON 1: registro de control 1.
En la pareja de registros ADRESH:ADRESL se deposita el resultado de la
conversión, que al estar compuesta por 10 de los bits de dicha pareja. El registro
ADCON0 controla la operación del conversor A/D, mientras que el ADCON1 sirve
para configurar los pines de la puerta A como entradas analógicas o E/S digitales.
Registro ADCON0. Los bits ADCON0 <7:6> sirven para seleccionar la
frecuencia de reloj que se emplea en la conversión, con la siguiente
asignación.
Figura 86. Asignación de los bits del registro de control ADCON0
ADCS1 ADCS2 CHS2 CHS1 CHS0 GO/DONE __ ADON
7 6 5 4 3 2 1 0
Se designa como TAD el tiempo que dura la conversión de cada bit y en el
caso de trabajar con valores digitales de 10 bits, se requiere un tiempo de
12•TAD. El valor de TAD se selecciona por software mediante estos bits
(ADCS1: ADCS0) y en los PIC16F87x no debe ser menos de 1,6
microsegundos.
Figura 87. Asignación de los bits ADCS1:0 del registro de control ADCON0
Frecuencia Fosc/2 Fosc/8 Fosc/32 FRC (procede del
oscilador RC interno)
ADCS1: ADSC0 00 01 10 11
226
Los bits CHS2, CHS1, CHS0 seleccionan el canal por el que se introduce la
señal analógica a convertir, de acuerdo con la siguiente tabla.
Tabla 18. Asignación de los bits CHS2:0 del registro de control ADCON0
CHS2, CHS1, CHS0 CANAL
000 Canal 0 (RA0/AN0)
001 Canal 1(RA1/AN1)
010 Canal 2(RA2/AN2)
011 Canal 3 (RA3/AN3)
100 Canal 4 (RA5/AN4)
101 Canal 5 (RE0/AN5). Los PIC 16F87X de 28 pines no tienen este canal
110 Canal 6 (RE1/AN6)
111 Canal 7 (RE2/AN7)
El bit GO/DONE# es el bit de estado de la conversión. Poniéndolo a 1 se
inicia la conversión y mientras esté a 1 está realizándose dicha operación.
Cuando GO/DONE# pasa a 0 confirma el final de la conversión y la puesta
del resultado en la pareja de registros ADRESH: ADRESL. El bit ADON
sirve para activar el conversor A/D poniéndolo a 1 y para inhabilitar su
funcionamiento se pone a 0.
Registro de control ADCON1.
Figura 88. Asignación de los bits del registro de control ADCON1
ADFM ___ ___ ____ PCFG3 PCFG2 PCFG1 PCFG0
7 6 5 4 3 2 1 0
227
El bit de menos peso (ADFM) del registro ADCON1 selecciona el formato
de resultado de la conversión si vale 1, el resultado está justificado en el
registro ADRESH, que tiene sus 6 bits de más peso a 0; mientras que, si
vale 0 la justificación se realizará sobre el registro ADRESL, que tiene sus
6 bits de menos pesos a 0. Esto significa que los 16 bits que forman la
concatenación de ADRESH : ADRESL unas veces tiene a 0 los 6 bits de
mas peso y otra los 6 bits de menos pesos (Alineación a la derecha o a la
izquierda), como se observa en la figura:
Figura 89. Alineación izquierda y derecha del resultado digital de 10 bits
RESULTADO DE 10 BITS
JUSTIFICACIÓN A LA DERECHA JUSTIFICACIÓN A LA IZQUIERDA
Bits colocados a cero.
Los restantes cuatro bits (PCFG3-0) de ADCON1 se utilizan para configurar los
pines de los canales de entrada al conversor como analógicas o como E/S
digitales, de acuerdo con la siguiente tabla.
7 1 0 7 0 7 0 7
6 0
ADFM = 1 ADFM = 0
ADRESH ADRESL ADRES
ADRESH ADRESL
228
Tabla 19. Configuración de los pines del PIC según el valor de <PCFG3 - 0 >
PCFG3-0
AN7/ RE2
AN6/ RE1
AN5/ RE0
AN4/ RA5
AN3/ RA3
AN2/ RA2
AN1/ RA1
AN0/ RA0
VREF+ VREF- CHAN/ REFS
0000 A A A A A A A A VDD Vss 8/0
0001 A A A A VREF+ A A A RA3 Vss 7/1
0010 D D D A A A A A VDD Vss 5/0
0011 D D D A VREF+ A A A RA3 Vss 4/1
0101 D D D D A D A A VDD Vss 3/0
011X D D D D VREF+ D A A RA3 Vss 2/1
1000 D D D D D D D D VDD Vss 0/0
1001 A A A A VREF+ VREF- A A RA3 RA2 6/2
1010 D D A A A A A A VDD Vss 6/0
1011 D D A A VREF+ A A A RA3 Vss 5/1
1011 D D A A VREF+ VREF- A A RA3 RA2 4/2
1100 D D D A VREF+ VREF- A A RA3 RA2 3/2
1101 D D D D VREF+ VREF- A A RA3 RA2 2/2
1110 D D D D D D D A VDD Vss 1/0
1111 D D D D VREF+ VREF- D A RA3 RA2 1/2
E.2.2 Estructura interna del conversor análogo/digital. En la figura 90 se
observa la forma como se habilitan/deshabilitan los 8 canales del conversor
mediante la configuración de los bits <CHS2-0> del registro ADCON0 y si estos
funcionarán como canales de entrada análogas ó E/S digitales de acuerdo con la
configuración de los bits <PCFG3-0> del registro ADCON1 vistos en la tabla
anterior.
229
Figura 90. Estructura interna del convertidor análogo digital
230
ANEXO F
FUNCIONAMIENTO DEL BUS I2C
EN EL MÓDULO RABBIT Y
PIC 16F877
231
INTRODUCCIÓN
Este anexo describe cómo funciona el bus serial I2C en el microprocesador Rabbit
2000 en modo maestro y en el microcontrolador PIC 16F877 en modo maestro y
esclavo, siendo este el dispositivo que se empleó para adaptar un conversor A/D
al módulo de control Rabbit RCM2200.
232
F.1 CONCEPTOS FUNDAMENTALES DEL BUS I2C
I2C es un bus serial síncrono diseñado por Philips, que puede compartirse por
varios dispositivos periféricos (microcontroladores, RAM, EEPROM, ADC, etc)
mediante un protocolo que evite el bloqueo de la información y garantice la
comunicación entre todos ellos. La conexión física es realizada por dos líneas,
SDA (datos) y SCL (reloj), las cuales transportan la información entre los
diferentes dispositivos conectados al bus. Cada dispositivo se identifica por una
única dirección y puede transmitir o recibir dependiendo de la operación que se
vaya a realizar.
Los dispositivos pueden clasificarse en maestro (master o principal) o esclavo
(slave o secundario). El maestro es el encargado de iniciar y terminar la
transferencia de información y el que genera la señal de reloj SCL, cuya
frecuencia es de hasta 100 KHz. Los esclavos son los dispositivos direccionados
por el maestro, mediante siete bits (dirección del esclavo). La línea de datos SDA
es utilizada tanto por el maestro como por el esclavo para la transmisión de
información.
Cuando el maestro inicia una trama de comunicación, envía a través de la línea de
datos la dirección del esclavo con el que se pretende establecer una
comunicación. Todos los esclavos reciben dicha dirección, pero uno solo
responderá y el resto permanece en espera de que se inicie una nueva trama.
Las dos líneas SCL y SDA están conectadas a la línea de alimentación positiva
VDD+, a través de resistencias cuya misión es asegurar una mínima carga de la
línea, necesaria para que la transmisión sea estable ante posibles "ruidos"
externos. Estas resistencias son llamadas de pull-up, y su valor está comprendido
233
entre 1K y 10K dependiendo de la tensión de alimentación y de los dispositivos
conectados. Otra función que tienen estas resistencias es la de permitir que tanto
la línea de datos como la de reloj sean bidireccionales, ya que cualquier
dispositivo (maestro o esclavo) puede forzar a nivel bajo la línea o dejarla libre,
teniendo entonces un nivel alto en la línea, siendo leída por los otros dispositivos.
Esto que en principio no parece muy útil en la línea de reloj, es fundamental
cuando el sistema tiene conectado más de un maestro (multi-maestro).
Los bits de datos sobre el bus pueden transferirse a una velocidad de 100 Kbits/s.
La capacidad máxima en el bus es de 400 pF y el número de dispositivos no debe
superarla.
Figura 91. Conexiones al bus I2C
F.1.1 Condiciones de inicio (star) y parada (parada). Existen dos situaciones
únicas que son definidas como las condiciones de inicio (Star) y parada (Stop),
que son generadas por el maestro, para iniciar y finalizar toda transferencia de
datos. La condición de inicio esta determinada por una transición de alto (1 lógico)
a bajo (0 lógico) en la línea SDA (flanco descendente) al tiempo que SCL
permanece a nivel alto, mientras que una transición de bajo a alto (flanco
SDA (datos)
EEPROM RAM MICROCONTROLADOR
SCL (reloj)
Rp Rp
+VDD
234
ascendente) sobre SDA al tiempo que SCL está a nivel alto determina la condición
de parada. El bus se considera ocupado tras la condición de inicio y, se considera
libre, cierto tiempo después de la condición de parada cuando SDA y SCL están a
nivel alto. Lo anterior se puede ver claramente en la siguiente figura.
Figura 92. Condiciones de inicio y parada de I2C
F.1.2 Transferencia de datos.
Formato del Byte. Todos los bytes colocados sobre la línea SDA deben
constar de 8 bits. Cada byte va seguido de un bit de reconocimiento, ACK,
y comienza por el bit de más peso.
Entre un byte y el siguiente puede haber un tiempo <<t>> de espera que se
puede aprovechar para por ejemplo dar servicio a una interrupción. En este
caso, la línea SCL se mantiene a <<0>> para forzar al transmisor a un
estado de espera.
Reconocimiento. El bit de acuse recibo o reconocimiento se produce con
el noveno pulso de reloj (al inicio de la trama tras los bits de la dirección + el
bit R/W#, o durante la trama tras los 8 bits de datos) y es obligatorio en la
transferencia de cada byte. El transmisor pone la línea SDA a nivel alto
durante dicho pulso del reloj. El receptor, por su parte, pone a <<0 lógico>>
SDA durante el pulso de reloj correspondiente al ACK y lo mantiene estable
Condición de inicio Condición de parada
235
durante todo el periodo de dicho pulso. En la siguiente figura se representa
la formación del bit ACK.
Figura 93. Bit de reconocimiento ACK
F.1.3 Formato. Tras la condición de inicio (S), el maestro envía la dirección del
esclavo al que se quiere dirigir. A esta dirección de 7 bits se añade el bit de
recepción/transmisión o lectura/escritura (R/W). Si R/W=0 será una lectura y si
R/W = 1 será transmisión o escritura. A continuación del bit R/W, se envía un bit
de reconocimiento (ACK) desde el esclavo. Después de estos bits, se transmiten
los datos, en grupos de 8 bits cada uno y al finalizar cada byte de dato se inserta
un bit de reconocimiento (ACK), que en este caso puede ser producido por el
esclavo o por el maestro. Para terminar la trama el maestro generará el bit de
parada (P). Si el maestro aún desea comunicar por el bus, puede generar otra
condición de inicio y direccionar otro esclavo sin generar previamente la condición
de parada. Lo anterior puede verse claramente en la figura 94.
Figura 94. Formato de transmisión de datos de I2C
S DIR. ESCLAVO R/W# ACK DATO ACK DATO ACK P
1 = Lectura 0 = Escritura
Datos trasferidos (n Bytes + ACK)
236
Tras el primer ACK enviado por el esclavo, el maestro transmisor se convierte en
receptor y esclavo receptor en transmisor.
F.2 FUNCIONAMIENTO DE I2C EN EL MICROPROCESADOR RABBIT
En el microprocesador Rabbit 2000 el protocolo I2C se implementa a través de
funciones predefinidas en la librería I2C.lib de Dynamic C. Estas funciones
manejan el aspecto genérico para una interfaz I2C, pudiendo ser programadas
para desarrollar controladores (drivers) de comunicación para un dispositivo
especifico que soporte I2C, en este caso el microcontrolador PIC 16F877.
El microprocesador Rabbit trabaja en modo maestro, encargándose de manejar
las líneas SDA para transmitir y recepcionar la información, y la SCL para
controlar el reloj. Estas dos líneas están implementadas en los pines PD4 = SCL
y PD5=SDA del puerto paralelo D, ya que éste tiene capacidades de colector
abierto. Sin embargo se puede utilizar cualquiera de los otros puertos paralelos
del Rabbit 2200, siempre y cuando se configure la librería I2C para soportar estos
cambios. La siguiente figura muestra las conexiones de SDA y SCL en el Rabbit y
el microcontrolador PIC 16F877.
Figura 95. Conexiones de SDA y SCL de Rabbit 2000 y el PIC 16f877
+VDD
Maestro Esclavo
PIC 16F877 PD4
PD5 SDA
SCL
RC4/SDA
RC3/SCL
R
p R
p
Rabbit 2000
237
F.2.1 Secuencia de pasos en una transmisión I2C en Rabbit. Para habilitar los
pines SCL y SDA en el Rabbit, primeramente se coloca la función i2c_init() antes
de cualquier otra función I2C, con el fin de inicializar el modo maestro de
transmisión. A partir de este momento la línea de datos y de reloj quedan
configuradas para soportar el protocolo I2C.
Luego, mediante las funciones i2c_start_tx() y i2c_stop_tx() se definen las
condiciones de inicio (star) y parada (stop) respectivamente, que determinan el
inicio y final de toda transmisión de datos entre el maestro y esclavo.
Después de haber establecido el inicio de la transmisión, el maestro debe
direccionar al esclavo por medio de la función i2c_wr_wait(), la cual reintenta
escribir una dirección hasta que el esclavo responda con un bit de reconocimiento
ACK.
Posteriormente, se envía un dato de 8 bits al esclavo, utilizando la función
i2c_write_char(). Cada vez que se envía el byte de dato se chequea si el esclavo
pone SDA a bajo (0 lógico) para el envió del bit ACK en el noveno pulso del reloj,
este procedimiento se hace implícitamente en i2c_write_char() haciendo el
llamado a la función i2c_check_ack().
Para leer o poner al módulo Rabbit en modo maestro de recepción, se emplea la
función i2c_read_char() que lee 8 bits desde el esclavo.
La función i2c_send_ack() envía un bit de reconocimiento ACK o acuse recibo al
esclavo, mientras que i2c_send_nak() envía una secuencia NAK (no generar bit
ACK).
A continuación se presenta un pequeño ejemplo del uso del protocolo I2C en el
módulo Rabbit.
238
#class auto #use "i2c.lib" //I2C dirección del microcontrolador esclavo #define DIR_ESCLAVO 0xA2 //101000102 const char cad_prueba[] = "A"; //6510 = 10000012 void main() { char buf_lect[8]; auto short int err; /*SE INICIA EL MAESTRO EN MODO DE TRANSMISION*/ //Se inicia el bus I2C i2c_init(); //Inicializa la transmisión I2C para enviar la secuencia S (START), err = i2c_startw_tx(); if (err != 0 ) i2c_stop_tx(); if ((err=i2c_wr_wait(DIR_ESCLAVO))!= 0 ) /*Reintenta escribir la dir. del esclavo hasta que este responda.*/ i2c_stop_tx(); i2c_write_char(cad_prueba[0]); //envía una cadena de 8 bits al esclavo i2c_stop_tx(); /****************************************************************************/ /*SE INICIA EL MAESTRO EN MODO DE RECEPCIÓN*/ if ((err=i2c_startw_tx())!= 0) i2c_stop_tx(); //i2c_Delay(10); if ((err=i2c_startw_tx())!= 0) i2c_stop_tx(); err=i2c_read_char(buf_lect); //lee un byte desde el esclavo y lo guarda en buf_lect if (err !=0) i2c_stop_tx(); i2c_send_ack(); //se envía el bit ACK al esclavo i2c_stop_tx();
}
239
F.3 FUNCIONAMIENTO DE I2C EN EL MICROCONTROLADOR PIC16F877
Para activar el bus I2C en el PIC16F877 hay que poner el bit SSPEN = 1 que es el
bit 5 del registro SSPCON. A partir de este momento los pines SDA (RC4/SDA) y
SCL (RC3/SCL) quedan configurados para soportar el protocolo I2C. Existen seis
registros para controlar el bus I2C, los cuales son:
SSPCON: registro de control
SSPCON2: registro de control 2
SSPSTAT: registro de estado
SSPBUF: buffer para los datos
SSPSR: registro de desplazamiento no accesible directamente
SSPADD: registro de dirección
Mediante el bit CKE se ponen a nivel alto los pines SDA y SCL en el modo
maestro y esclavo. Cuando CKE = 0 los niveles de dichos pines se configuran
según las especificaciones del bus I2C.
Registro SSPSTAT (Estado). Este registro contiene toda la información que
representa el estado de la transferencia de datos.
Figura 96. Bits del registro SSPSTAT
SMP
CKE
D/A #
P
S
R/W#
UA
BF
7 6 5 4 3 2 1 0
SMP: en modo maestro es un bit de muestreo que vale 1 cuando los bits de datos
se muestran al final del periodo, o SMP = 0 cuando se hace a la mitad del periodo.
240
CKE: selecciona los niveles de los pines SCL y SDA en modo maestro o multi-
maestro.
D/A#: el bit D/A# (Dato/Dirección#) indica si el dato recibido es de información (1)
o es una dirección (0).
P: detecta la llegada del bit o condición de STOP, es decir P = 1
S: detecta la condición de inicio o START, se pone S = 1
R/W#: Indica si se trata de una lectura o escritura. R/W = 1 indica lectura, R/W = 0
lectura
UA: si es igual a 1, indica que la dirección es de 10 bits y que hay que cargar el
byte alto.
BF: actúa como señalizador del búfer de datos. Si BF = 1 indica que tiene un dato
y la transmisión esta en proceso sin terminar.
Registro SSPCON (Control). Todos los bits son leíbles y escribibles y se ponen
a 0 tras un reset.
Figura 97. Bits del registro SSPCON
WCOL
SSPOV
SSPEN
CKP
SSPM3
SSPM2
SSPM1
SSPM0
7 6 5 4 3 2 1 0
WCOL: es un detector de colisiones en escritura y cuando vale 1 significa que se
ha intentado escribir en SSPBUF en condiciones no válidas para el protocolo.
241
SSPOV: si vale 1 indica desbordamiento, es decir, llega un byte a SSPBUF sin
haberse leído el anterior.
SSPEN: si vale 1 el puerto serie queda configurado con los pines SCL y SDA, y
pone en funcionamiento al microcontrolador en modo maestro. Si SSPEN = 0
RC3/SCL y RC4/SDA funcionan como líneas de entradas y salidas digitales.
CKP: activa el reloj en modo esclavo, no usándose en el modo maestro.
SSPM3-0: se selecciona la frecuencia del reloj y el modo de trabajo entre estos
tres posibles:
Modo I2C maestro.
Modo I2C esclavo con 7 bits para la dirección.
Modo I2C esclavo con 10 bit para la dirección.
Registro SSPCON 2.
Figura 98. Bits del registro SSPCON2
GCEN
ACKSTAT
ACKDT
ACKEN
RCEN
PEN
RSEN
SEN
7 6 5 4 3 2 1 0
CGEN: sólo se utiliza en el modo esclavo.
ACKSTAT: si es 1 significa que se ha recibido el bit ACK del esclavo.
ACKDT: es el bit de reconocimiento en el modo maestro en recepción. Si vale 0
el maestro ha transmitido el bit de reconocimiento pero, si ADKDT = 1 no lo ha
realizado.
242
ACKEN: si vale 1 se inicia la secuencia de generación de la condición de
reconocimiento. Este bit se borra automáticamente por hardware.
RCEN: si vale 1 habilita el modo de recepción del maestro.
PEN: si se coloca a 1, genera la condición de parada en las líneas SCL y SDA.
RSEN: si es igual a 1, inicia la repetición de la condición de inicio.
SEN: si es igual a 1, indica la condición de inicio.
Registro SSPBUF. Este registro actúa como búfer y soporta el dato que se va a
transmitir o que se ha recibido.
Registro SSPSR (Desplazamiento). Realiza la conversión serie / paralelo y
viceversa junto al SSPBUF. Cuando se ha completado la llegada del byte, que se
recibe en SSPSR, se traspasa a SSPBUF y se activa el señalizador SSPIF. Si se
recibe otro byte antes de haber leído al SSPBUF, se activa el señalizador de
desbordamiento SSPOV (bit 6 de SSPCON).
Registro SSPADD. Este registro guarda la dirección del esclavo.
Cuando se emplean direcciones de 10 bits, el usuario debe escribir el byte alto de
la dirección con el siguiente código dónde A9:A8 son los dos bits de más peso:
1 - 1 - 1 - 1 - 0 - A9 - A8 - 0.
F.3.1 Funcionamiento del modo maestro. El trabajo en el modo maestro se
pone en marcha escribiendo los valores adecuados en los bits del registro de
control SSPCON y SSPEN = 1. Una vez puesto en funcionamiento este modo, el
usuario tiene 6 opciones:
243
1a. Generar la condición de inicio.
2a. Generar la condición de repetición inicio.
3a. Escribir sobre SSPBUF para iniciar la transmisión de un dato o una dirección.
4a. Generar la condición de parada.
5a. Configurar el modo I2C en recepción.
6a. Generar la condición reconocimiento al final de la recepción de un byte de
datos.
A continuación, se describe la secuencia de pasos a realizar en una transmisión
del maestro:
1. Generar condición de inicio, poniendo SEN = 1 en SSPCON2.
2. Se pone SSPIF = 1. Se esperará a que finalice la operación de inicio antes
de empezar otra.
3. Se carga la dirección del esclavo a trasmitir en SSPBUF.
4. Se coloca en SDA la dirección del esclavo.
5. El esclavo genera el bit de reconocimiento ACK y en el maestro se escribe
el bit 1 en ACKSTAT del registro SSPCON2.
6. Se genera una interrupción al final del noveno impulso del reloj y SSPIF = 1
7. Se carga un dato de 8 bits por SDA
8. Se transmiten los 8 bits por SDA.
9. Se repite el paso 5.
10. Se repite el paso 6.
11. Se genera la condición de parada con PEN = 1 en SSPCON2.
12. Se genera una interrupción una vez completa la condición de parada.
Modo maestro en transmisión. En este modo primero se transmite la dirección
del esclavo que se carga en SSPBUF, en cuyo momento se pone el bit BF=1 del
registro SSPSTAT, colocándose en marcha el reloj e inicio de la transmisión.
Después se transmite el byte de datos, cargándose también en SSPBUF. Cada bit
244
que sale por SDA lo hace en el flanco descendente del impulso de reloj en SCL.
Tras sacar los 8 bits se borra el bit BF y el esclavo debe generar el ACK en el
noveno impulso de reloj. El bit ACK se coloca en el bit ACKDT en el flanco
descendente de SCL. Tras el noveno impulso SSPIF = 1 y se detiene el generador
de frecuencia hasta que no se cargue otro dato en SSPBUF.
Modo maestro en recepción. Para habilitar este modo se pone el bit RCEN=1. El
generador de frecuencia empieza a funcionar y SCL cambia de estado en cada
periodo controlado por el decremento del contador BRG. Entonces el dato
empieza a desplazarse sobre el registro SSPSR. Al final del octavo reloj se ponen
BF = SSPIF = 1 y se transfiere el contenido de SSPSR al SSPBUF, con lo que
RCEN = 0. Cuando el buffer es leído por la CPU BF se pone a 0
automáticamente. El usuario puede enviar un bit ACK al finalizar la recepción,
escribiendo ACKEN = 1.
Cuando una dato o una dirección se carga en SSPBUF desde SSPSR, el bit BF=1
y este bit pasa a 0 cuando la CPU lee SSPBUF. El señalizador de desbordamiento
SSPOV es 1 cuando se recibe un byte en SSPSR y aún la CPU no ha leído el dato
anterior. Ahora si se escribe en SSPBUF mientras hay una recepción en progreso,
el bit WCOL se pone a 1 y el contenido del buffer no cambia.
F.3.2 Funcionamiento del modo esclavo. En el modo esclavo, los pines SCL y
SDA deben configurarse como entradas. Cuando una dirección es igual, o el dato
transferido después de una dirección igual es recibida, el hardware
automáticamente generará el pulso de reconocimiento (ACK), y entonces carga el
registro SSPBUF con el valor recibido actualmente en el registro SSPSR.
Existen ciertas condiciones que causarán que el módulo MSSP (Puerto Serial
Maestro Sincrono “Master Synchronous Serial Port”) no entregue el pulso ACK.
Puede ser una o ambas de las dos siguientes condiciones:
245
a) El bit señalizador del buffer BF esta a 1 (SSPSTAT <0>) antes de que la
transmisión fuera recibida.
b) El bit de desbordamiento SSPOV esta a 1 (SSPCON <6>) antes de que la
transmisión fuera recibida.
Modo esclavo en recepción. Cuando el bit R/W# del byte de dirección es 0 y una
dirección igual ocurre, el bit R/W del registro SSPSTAT es puesto a 0. La dirección
recibida es cargada en el registro SSPBUF.
Cuando el byte de dirección desborda la condición existente, entonces, ningún
pulso de reconocimiento (ACK) es entregado. Una condición de desbordamiento
es definida cuando el bit BF es fijado a 1, o el bit SSPOV es 1.
El bit de señalización SSPIF (PIR1 <3>) debe ser colocado a 0 por software. El
registro SSPSTAT se usa para determinar el estado del byte recibido.
Modo esclavo en transmisión. Cuando el bit R/W# del byte de dirección
entrante es 1 y una dirección igual ocurre, el bit R/W# del registro SSPSTAT es
puesto a 1. La dirección recibida es cargada en el registro SSPBUF. Los pulsos
ACK se envían en el noveno bit, y la línea SCL se mantiene a bajo mientras la
CPU responde a SSPIF. La transmisión de los datos debe cargarse en el registro
SSPBUF, que también carga el registro SSPSR. Entonces, la línea SCL debe
habilitarse poniendo el bit CKP = 1 (SSPCON <4>). El maestro debe supervisar
SCL antes de confirmar otro pulso de reloj. Los dispositivos esclavos pueden estar
rechazando al maestro estirando el reloj. Los ocho bit de los datos son cambiados
en el descenso final de la entrada de SCL. Esto asegura que la señal de SDA es
válida durante el tiempo alto SCL.
246