Práctica 8MiniSCADA: Estructura de un SCADA

Anuncio
Práctica 8MiniSCADA: Estructura de un SCADA
1. Objetivos
El objetivo de esta práctica es familiarizar al alumno con la estructura de datos interna de un
SCADA y con su programación. En el mercado hay herramientas como FIX, WinCC,
Wonderware, etc., que permiten aligerar el trabajo de construcción de un sistema supervisor
(SCADA), sin necesidad de bajar a niveles bajos. Sin embargo, la filosofía en la organización
de la información es común: vectores, listas, árboles, etc. Esta organización es crucial en el
SCADA y es uno de los trabajos que debe realizar el ingeniero en la fase de especificación y
análisis.
Como complemento a la organización de la información, el segundo objetivo es familiarizar al
alumno con la representación gráfica de la planta (sinóptico).
El tercer objetivo es acostumbrar al alumno a trabajar con herramientas que son vistas como
cajas negras: se sabe casi siempre qué hacen pero no se sabe cómo lo hacen. En el caso de la
práctica, el trabajo de dibujar se realiza a través de una herramienta, Visual C++ con MFC,
construida en C++, es decir, en programación orientada a objetos (no vista en clase), y que va a
ser utilizada desde la programación estructurada.
2. Tiempo de laboratorio
2 sesiones sin incluir opcionales.
3. Trabajo previo
Para la segunda sesión hay que preparar un sinóptico con su estructura de datos asociada.
4. Mi primer dibujo
En este apartado se detallan los pasos a realizar para pintar en una ventana y para aislarse de la
complejidad del entorno MFC (Microsoft Foundation Class) de Visual C++.
Los pasos son los siguientes:
1. Abrir Microsoft Visual C++
2. Crear un nuevo proyecto (New – Projects) del tipo MFC AppWizard (exe) y con
nombre MiniScada.
3. En la siguiente pantalla, seleccionar el tipo de aplicación como: Single document. Con
Next saltar las siguientes ventanas hasta llegar a la ventana MFC AppWizard – Step 6
of 6 donde se selecciona Finish (y a continuación OK).
Con esta serie de pasos el Visual C++ ha preparado un proyecto con el código suficiente para
poder pintar “cómodamente” en una ventana. La siguiente labor es añadir nuestro programa, que
simulará un MiniScada muy simple. El primer trabajo será aislar nuestro código del código
propio de Visual C++ para gestionar las ventanas. Los pasos son los siguientes:
1. Seleccione la ventana FileView en la ventana de proyectos para acceder a los ficheros
que ha creado Visual C++. Pinche en MiniScada files.
2. Seleccione Source Files y con el ratón derecho seleccione Add Files to Folder para
añadir el fichero MiMiniScada.cpp.
3. Repita la misma operación sobre Header Files para añadir el fichero MiMiniScada.h.
4. Abra el fichero MiMiniScada.h (pinchar el nombre del fichero) y escriba el siguiente
código:
#ifndef MiMiniScada_h
#define MiMiniScada_h
#include "stdafx.h"
void MiMiniScada(CDC* pDC);
#endif
5. Abra el fichero MiMiniScada.cpp (pinche el nombre del fichero) y añada el siguiente
código:
#include "stdafx.h"
#include "MiMiniScada.h"
void MiMiniScada(CDC* pDC){
}
pDC->Rectangle(0,0,100,100);
pDC->Rectangle(0,0,10,10);
pDC->TextOut(100,100,"MiSCADA");
La función de este código es pintar un rectángulo en la pantalla según las coordenadas
indicadas. CDC es un puntero a un objeto que maneja la ventana (programación
orientada a objetos en C++). Todas las operaciones de salida hacia la ventana hay que
realizarlas a través de ese puntero. Aunque sea C++, se puede manejar perfectamente
desde C estructurado respetando la sintaxis. Si una función necesita pintar en pantalla
debe recibir el puntero pDC.
Comprobar qué ocurre si a la hora de pintar los dos rectángulos se intercambia el orden
(primero se pinta el rectángulo de coordenadas (0,0,10,10)).
6. El siguiente paso es conectar el código de Microsoft con nuestro primer programa de
prueba. Para ello edite el fichero MiniScadaView.cpp y añada en la cabecera, a
continuación de los includes, la siguiente línea:
#include "MiMiniScada.h"
A continuación busque la función
void CMiniScadaView::OnDraw(CDC* pDC)
y añada a partir de la línea
// TODO: add draw code for native data here
la siguiente línea
MiMiniScada(pDC);
7. Compile, enlace y ejecute el código. Para ello basta con seleccionar Build-Execute en el
menú (El icono ! o Ctrl-F5 también realizan la misma labor). Si todo ha ido bien,
aparecerá una ventana con un menú superior y con el rectángulo indicado y el texto
indicado. Para salir de la ventaja utilice su menú superior.
El código resultante funciona de la siguiente manera:
•
•
•
El código generado por Visual C++ se encarga de pintar la ventana y el menú superior.
Lo último que ejecuta es la función OnDraw (CMiniScadaView::OnDraw ).
La función OnDraw llama a nuestro código a través de MiMiniScada() pasando el
parámetro pDC que es el puntero a la ventana donde pintar.
La función MiMiniScada(), a través de pDC pinta en la ventana. De igual forma, si
MiMiniScada() se apoya en otras funciones para pintar, ésta debería pasarles el
puntero pDC y seguir la sintaxis. Sin necesidad de conocer la programación orientada a
objetos en C++, podemos pintar en la pantalla.
A partir de ahora, vamos a trabajar sólo sobre la función MiMiniScada y funciones hijas. Si
se añaden más ficheros, todos deben llevar en la cabecera la siguiente línea:
#include "stdafx.h"
(¿Por qué? Pregunta para Microsoft)
5. Encapsulamiento del código para pintar.
Con el fin de aislarse de la programación orientada a objetos, se va a añadir al proyecto una
librería formada por los ficheros: MiniScadaGraficos.h y MiniScadaGraficos.cpp. Esta
librería está compuesta por las funciones
LineaDibuja
PoligonoDibuja
ElipseDibuja
TextoDibuja
que permiten pintar una línea y un polígono respectivamente. Tanto la línea como el polígono se
definen a partir de un vector de puntos cuya estructura también se define en dicha librería (TPto
y TVPtos). Además, para mayor comodidad, se exportan unas constantes con los colores más
habituales.
Para trabajar con este código, descárguese de la página web de la asignatura, los ficheros
anteriores (incluir el módulo de manejo de memoria mem.h y mem.cpp) y modifique el main
(MiMiniScada(CDC *pDC)) con el siguiente código:
#include
#include
#include
#include
"stdafx.h"
"MiMiniScada.h"
"MiniScadaGraficos.h"
"stdio.h"
void MiMiniScada(CDC* pDC){
TPto mPto1[3]={{20,100},{150,150},{350,150}};
TVPtos VPLinea={3,mPto1};
TPto mPto2[3]={{120,300},{400,250},{550,150}};
TVPtos VPPoligono={3,mPto2};
TPto Pto={400,300};
TPto mPto3[2]={{300,350},{350,450}};
TVPtos VPElipse={2,mPto3};
LineaDibuja(pDC,&VPLinea,NEGRO);
PoligonoDibuja(pDC,&VPPoligono,NEGRO,AZUL);
TextoDibuja(pDC, "HOLA", &Pto, BLANCO,ROJO);
ElipseDibuja(pDC,&VPElipse,VERDE,AMARILLO);
}
6. Sinóptico.
El objetivo es dibujar un sinóptico descrito en un fichero. Cada grupo dibujará un sinóptico
diferente. El trabajo a realizar es el siguiente:
1. Elección del sinóptico a dibujar, de acuerdo con el profesor. Por ejemplo:
D1
B1
B2
Pozo
D2
n
Riego
2. Diseño de la estructura de datos para definir el sinóptico.
3. Confección del fichero de datos para el sinóptico.
4. Realización de un programa que lea el sinóptico desde el fichero y lo dibuje en la
pantalla.
Conviene empezar con un ejemplo sencillo: describir un triángulo en un fichero, leerlo y
pintarlo.
Descargar