Ivan Bellanco Bellanco PROGRAMA INFORMÁTICO PARA

Anuncio
Ivan Bellanco Bellanco
PROGRAMA INFORMÁTICO PARA PROMOCIONAR LA INGENIERÍA
ELÉCTRICA
TRABAJO FIN DE GRADO
dirigido por José Antonio Barrado Rodrigo
Grado de Ingeniería Eléctrica
Tarragona
2016
1.Índice
1. Índice
1.
Índice .............................................................................................................................. 1
2.
Introducción ................................................................................................................... 4
3.
Antecedentes .................................................................................................................. 5
4.
Objetivos ........................................................................................................................ 6
5.
Comparativa de Posibles Soluciones.............................................................................. 7
6.
7.
5.1.
LabView .................................................................................................................. 7
5.2.
C# ............................................................................................................................ 8
5.3.
Visual Basic ............................................................................................................ 8
5.4.
Conclusiones ........................................................................................................... 9
Comparativa con Otras Aplicaciones ........................................................................... 10
6.1.
WWF Switch’em off ............................................................................................. 10
6.2.
CLMNTK .............................................................................................................. 10
6.3.
Iberdrola Sustainability Game .............................................................................. 11
6.4.
ElectroCity ............................................................................................................ 12
6.5.
REE Controla tu energia ....................................................................................... 12
Introducción a Visual Basic ......................................................................................... 14
7.1.
Plataforma de Desarrollo ...................................................................................... 14
7.1.1.
Toolbox.......................................................................................................... 15
7.1.2.
Formulario ..................................................................................................... 15
7.1.3.
Properties ....................................................................................................... 15
7.1.4.
Código ........................................................................................................... 16
7.2.
Controles ............................................................................................................... 16
7.2.1.
Button ............................................................................................................ 16
7.2.2.
CheckBox ...................................................................................................... 16
7.2.3.
Label .............................................................................................................. 16
7.2.4.
PictureBox ..................................................................................................... 17
1
1.Índice
7.2.5.
ProgressBar .................................................................................................... 17
7.2.6.
TableLayoutPanel .......................................................................................... 17
7.2.7.
Timer ............................................................................................................. 17
7.2.8.
TrackBar ........................................................................................................ 17
8.
Índice de Programación................................................................................................ 19
9.
Código .......................................................................................................................... 22
9.1.
Form 1 ................................................................................................................... 22
9.2. FInicio ....................................................................................................................... 35
9.3. FCicle ........................................................................................................................ 35
9.4. FEol ........................................................................................................................... 35
9.5. FHidro ....................................................................................................................... 36
9.6. FSol ........................................................................................................................... 37
9.7. FNuc .......................................................................................................................... 37
9.8. FSalir ......................................................................................................................... 37
9.9.FEventos .................................................................................................................... 38
9.10. FEventosImagenes .................................................................................................. 39
9.11. FEventosResp ......................................................................................................... 42
9.12. FInfo1 ...................................................................................................................... 44
9.13. Finfo2 ...................................................................................................................... 44
9.14. Final ........................................................................................................................ 45
10.Interfaz Gráfica ............................................................................................................... 46
10.1
. FInicio ................................................................................................................. 47
10.2.
FSalir ................................................................................................................. 47
10.3.
FInfo1 ................................................................................................................ 48
10.4.
Finfo2 ................................................................................................................ 49
10.5.
Form1 ................................................................................................................ 50
10.6.
FCicle ............................................................................................................... 51
2
1.Índice
10.7.
FEol ................................................................................................................... 52
10.8.
FHidro .............................................................................................................. 53
10.9.
FNuc .................................................................................................................. 54
10.10.
FSol ................................................................................................................... 55
10.11.
FEventos ............................................................................................................ 56
10.12.
FeventosResp .................................................................................................... 56
10.13.
FEventosImagenes ............................................................................................ 57
10.14.
Final ................................................................................................................... 57
11.
Modelo Matemático.................................................................................................. 58
11.1. Energia Consumida Programada............................................................................. 58
11.2. Cuotas de Generación ............................................................................................. 59
11.3. Generación Eólica ................................................................................................... 62
11.4. Velocidad del Viento .............................................................................................. 64
11.5. Generación Solar..................................................................................................... 67
11.6. Generación Hidráulica ............................................................................................ 70
11.7. Generación Nuclear ................................................................................................ 71
11.8. Generación Térmica ................................................................................................ 72
11.9. Funciones didacticas ............................................................................................... 72
11.10. Excepción.............................................................................................................. 75
11.11. Conclusiones ......................................................................................................... 76
12.
Conclusiones............................................................................................................. 77
13.
Bibliografía ............................................................................................................... 78
3
2. Introducción
2. Introducción
En el presente trabajo de final de grado se detalla la creación de una aplicación
informática, similar a un juego interactivo, para fomentar el interés de personas ajenas al
mundo universitario en el área de la ingeniería eléctrica.
Dedicado sobre todo a estudiantes de ESO, primaria o bachillerato que suelen asistir a
jornadas de puertas abiertas o visitas de la universidad, ayudándoles a enfocar su trayectoria
hacia la ingeniería eléctrica y mostrándoles algunos de los conocimientos que podrían
adquirir.
Se ha tomado como punto de partida un programa anterior, de la misma índole, con el
objetivo de corregir las deficiencias que se observaron y mejorar el rendimiento global y la
parte visual de la aplicación, así como hacerlo más dinámico y entretenido.
4
3. Antecedentes
3. Antecedentes
Durante el curso 2014 – 2015 se me otorgó una beca de colaboración para dar soporte
a proyectos de innovación docente del Instituto de Ciencias de la Educación, con una jornada
laboral de 15 horas semanales, durante 6 meses.
Durante ese tiempo se creó un programa basado en el lenguaje LabView que, a
diferencia de los lenguajes tradicionales, presenta una programación gráfica. Además, se
complementa con una tarjeta de adquisición para que el equipo pueda comunicarse con el
mundo externo.
Tras crear el programa, se puso a prueba con alumnos de educación primaria,
secundaria y bachillerato, con la intención de detectar los posibles errores y las mejoras
pertinentes.
LabView presentaba restricciones severas, ya que, para poder ejecutar el programa se
necesitaba instalar en el ordenador programas propios de LabView, no reajustaba el apartado
gráfico a las diferentes resoluciones de pantalla y no disponía de documentación de soporte,
ya sea impresa o digital, para consultar en caso de dudas sobre el lenguaje.
A partir de toda la experiencia anterior, se decidió cambiar el lenguaje de
programación a uno con mayor accesibilidad para los usuarios, y definir unos objetivos
basados en la experiencia anterior (Descritos en el apartado 4. Objetivos).
5
4. Objetivos
4. Objetivos
Llegados a este punto, se marcan los siguientes objetivos:

Hacer el programa más interactivo

Utilizar un lenguaje más accesible para los usuarios

Implementar diferentes niveles de dificultad

Adaptarse a diferentes resoluciones de pantalla

No infringir derechos de imágenes

Continuar con la divulgación de la ingeniería eléctrica
6
5. Comparativa de Posibles Soluciones
5. Comparativa de Posibles Soluciones
En el siguiente apartado se comparan las diferentes soluciones que existen para
cumplir los objetivos del apartado 4.
5.1. LabView
LabVIEW (acrónimo de Laboratory Virtual Instrumentation Engineering Workbench)
es una plataforma y entorno de desarrollo para diseñar sistemas, con un lenguaje de
programación visual gráfico. Recomendado para sistemas de hardware y software de
pruebas, control y diseño, ya que se complementa con una tarjeta de adquisición, conectada
a los puertos del ordenador, permitiendo adquirir datos del exterior. El lenguaje que usa se
llama lenguaje G, donde la G simboliza lenguaje Gráfico.
Este programa fue creado por National Instruments (1976) para funcionar sobre
máquinas MAC. Ahora está disponible para las plataformas Windows, UNIX, MAC y
GNU/Linux.
Su principal característica es la facilidad de uso, válido para programadores
profesionales como para personas con pocos conocimientos en programación pueden hacer
programas relativamente complejos. También es muy rápido hacer programas con LabVIEW
y cualquier programador, por experimentado que sea, puede beneficiarse de él. Los
programas en LabView son llamados instrumentos virtuales (VIs).
El lenguaje G tiene una gran potencia de cálculo, típica de lenguajes orientados a
operaciones matemáticas. Sin embargo el aspecto gráfico queda de un tono un tanto
desfasado, en comparación con las posibilidades gráficas de otros lenguajes. En la figura
5.1.1. se puede ver un ejemplo del entorno gráfico de LabView.
Figura 5.1.1. Entorno gráfico de LabView
7
5. Comparativa de Posibles Soluciones
A demás este lenguaje necesita de un programa que lo interprete para poder ser
ejecutado. Es decir, que el usuario tendría que descargar software de LabView, e instalarlo
en el ordenador para poder ejecutar el programa.
5.2. C#
C# (pronunciado si sharp en inglés) es un lenguaje de programación orientado a
objetos desarrollado y estandarizado por Microsoft como parte de su plataforma .NET. C#
es uno de los lenguajes de programación diseñados para la infraestructura de lenguaje
común.
Su sintaxis básica deriva de C/C++ y utiliza el modelo de objetos de la plataforma
.NET, similar al de Java, aunque incluye mejoras derivadas de otros lenguajes.
El nombre C Sharp fue inspirado por la notación musical, donde '#' (sostenido, en
inglés sharp) indica que la nota (C es la nota do en inglés) es un semitono más alta, sugiriendo
que C# es superior a C/C++. Además, el signo '#' se compone de cuatro signos '+' pegados.
Aunque C# forma parte de la plataforma .NET, ésta es una API, mientras que C# es
un lenguaje de programación independiente diseñado para generar programas sobre dicha
plataforma. Ya existe un compilador implementado que provee el marco Mono - DotGNU,
el cual genera programas para distintas plataformas como Windows, Unix, Android, iOS,
Windows Phone, Mac OS y GNU/Linux.
Este lenguaje esta principalmente orientado a objetos, con una potente capacidad
gráfica, además de tener un amplio repositorio de información por parte de Microsoft y
muchos libros para tomar referencia del lenguaje. Como puntos en contra destaca la
necesidad de una buena base de programación y conocimientos de programación a objetos.
5.3.Visual Basic
Visual Basic es un lenguaje de programación dirigido por eventos, desarrollado por
Alan Cooper para Microsoft. Este lenguaje de programación es un dialecto de BASIC, con
importantes agregados. Su primera versión fue presentada en 1991, con la intención de
simplificar la programación utilizando un ambiente de desarrollo que facilitó en cierta
medida la programación misma.
8
5. Comparativa de Posibles Soluciones
Aunque Visual Basic es de propósito general, también provee facilidades para el
desarrollo de aplicaciones de bases de datos usando Data Access Objects, Remote Data
Objects o ActiveX Data Objects.
Visual Basic contiene un entorno de desarrollo integrado o IDE que integra editor de
textos para edición del código fuente, un depurador, un compilador (y enlazador) y un editor
de interfaces gráficas o GUI.
Visual Basic suele ser un lenguaje muy común en las escuelas de ingeniería, ya que
resulta muy accesible para los usuarios con pocos conocimientos de programación, y permite
crear interfaces gráficas con mucha rapidez. Además permite crear ejecutables para
programas con sistema operativo Windows, que es uno de los más populares del mercado.
5.4. Conclusiones
Tras todo lo anterior mostrado, se decidió elegir Visual Basic como lenguaje de
programación por las siguientes razones:

Fácil programación

Riqueza de recursos gráficos

Fácil implementación con Windows
9
6. Comparativa con Otras Aplicaciones
6. Comparativa con Otras Aplicaciones
La idea de promocionar la ingeniería eléctrica no es nueva, ya que, en la red podemos
encontrar diferentes programas o juegos que promueven el uso de las energías renovables
con la intención de inculcar buenos hábitos al público infantil. A continuación se muestran
algunos ejemplos:
6.1. WWF Switch’em off
En este juego de la World Wildlife Fund, se debe desconectar las centrales
contaminantes que van apareciendo a lo largo de las pantallas. Si se tarda mucho en
desconectarlas, la contaminación del aire provocará que se pierda el juego. Ver figura 6.1.
Figura 6.1. Juego WWF Switch’em off
Pese a ser un juego entretenido, resulta injusto para las centrales térmicas, ya que las
centrales de ciclo combinado pueden tener una elevada eficiencia. Además, en vez de
enfatizar el uso de energía renovable la intención acaba siendo evitar el uso de energía
contaminante.
6.2.CLMNTK
Este juego de la asociación gallega Climantica es uno de los más completos. Se trata
de construir una ciudad y tomar decisiones que la conduzcan a un crecimiento sostenible. A
10
6. Comparativa con Otras Aplicaciones
lo largo del juego aparecen preguntas que comportaran un beneficio o una penalización. El
único inconveniente del juego es su duración y complejidad, ya que pueden ser excesivas
para algunos usuarios. Ver Figura 6.2.
Figura 6.2. Juego CLMNTK
6.3. Iberdrola Sustainability Game
Este juego de la compañía de energía eléctrica Iberdrola se asemeja a un juego de mesa
tipo Trivial, en el que las casillas contienen preguntas, que al ser respondidas correctamente
suman puntos al usuario, como se ve en la Figura 6.3. Las preguntas pueden tratar sobre:
consejos para ahorrar factura eléctrica, preguntas sobre la energía eólica, cambio climático
o información de las acciones que Iberdrola lleva a cabo a nivel mundial. Es un juego online
y además tiene dos niveles de dificultad, uno para niños y otro para adultos, pudiendo jugar
a la vez varias personas de una familia.
11
6. Comparativa con Otras Aplicaciones
Figura 6.3. Juego Iberdrola Sustainability Game
6.4.ElectroCity
Este juego en inglés se basa en crear una ciudad y aprovechar los recursos naturales,
decidiendo entre respetar el medio ambiente o generar energía eléctrica a bajo coste. El
desarrollo del juego es lento, pero posee un alto contenido educativo. Ver Figura 6.4.
Figura 6.4. Juego ElectroCity
6.5. REE Controla tu energía
Juego de Red Eléctrica de España que consiste en igualar la generación de energía
eléctrica a la energía demandada a través de las diferentes centrales, como se ve en la Figura
6.5. Van sucediendo diferentes eventos como: líneas que fallan por robos o fenómenos
meteorológicos, paradas de la central nuclear, países como Portugal, Marruecos o Francia
12
6. Comparativa con Otras Aplicaciones
que necesitan energía. En mi opinión es un juego entretenido pero puede resultar difícil de
seguir.
Figura 6.5. Juego REE controla tu energia
13
7. Introducción a Visual Basic
7. Introducción a Visual Basic
En este punto, se detallan las características propias del lenguaje de programación
Visual Basic. No se especifica en detalle el funcionamiento de las características de código,
ya que es recomendable que el lector posea ciertas bases en programación, como
conocimiento de variables, asignaciones de valores o el uso de funciones.
7.1.Plataforma de Desarrollo
La plataforma de desarrollo que se utilizó para este proyecto fue la aplicación de
Microsoft Visual Studio 2015, que es gratuita para usuarios con cuenta Microsoft.
En la figura 7.2.1. y 7.2.2. se puede ver el aspecto visual de Microsoft Visual Studio
2015. En el área de trabajo podemos destacar, a parte de las barras superiores de
herramientas, cuatro secciones principales: la sección denominada Toolbox, la ventana
nombrada Form [Design], que es la interfaz visual, la sección de Propierties y la ventana
nombrada Form, que se corresponde con la ventana de código.
Figura 7.2.1. Microsoft Visual Studio 2015
14
7. Introducción a Visual Basic
Figura 7.2.2. Microsoft Visual Studio 2015
7.1.1. Toolbox
Esta parte de la interfaz nos permite seleccionar los controles que podemos incluir en
nuestra ventana, como pueden ser botones, imágenes o texto. Si el lector es usuario habitual
del sistema operativo de Windows, podrá observar que todos estos controles son los más
habituales de las ventanas de este sistema.
Con simplemente arrastrar un control hasta el formulario, este se situara donde
deseemos, y se incluirá en el código automáticamente, sin tener que escribir en código todo
su funcionamiento.
7.1.2. Formulario
Formulario (abreviado a Form) es como se denomina en Visual Basic a las ventanas
que el usuario ve en un sistema Windows. Con lo cual el programador, puede ver en todo
momento el resultado visual del programa, sin tener que ejecutar una y otra vez el programa.
7.1.3. Properties
Esta pestaña permite al programador cambiar cualquier parámetro del Form o los
controles incluidos en el Form.
15
7. Introducción a Visual Basic
Desde la posición, si es visible o no para el usuario, tamaño, color y un número de
propiedades aun mayor, el programador puede personalizar, con un número infinito de
posibilidades, el aspecto del programa.
7.1.4. Código
Cada Form tiene asociada una ventana de código, donde se puede generar eventos. Por
ejemplo, si un Form tiene un botón, en la ventana de código podremos escribir, cuales son
las acciones que el programa generará cuando el usuario haga un doble clic sobre el mismo.
Esta es la ventana que el usuario final no podrá ver y que solo se usa durante la fase
de programación.
7.2. Controles
Por tal de que el lector pueda interpretar bien el código se explicará cuales son cada
uno de los controles que han sido utilizados en el desarrollo del programa. En la imagen
7.3.1. mostrada al final de este punto, se puede observar el aspecto visual de cada uno de los
controles, mostrados de izquierda a derecha en el mismo orden que son enumerados. El
control Timer no tiene una interfaz visual, ya que es un cálculo del programa, por tanto no
saldrá en la imagen nombrada.
7.2.1. Button
El control Button permite al usuario hacer clic en él para llevar a cabo una acción. El
control Button puede mostrar texto e imágenes. Al hacer clic en el botón, parece como si se
hubiera presionado y soltado.
7.2.2. CheckBox
El control CheckBox indica si una condición determinada está activada o desactivada.
Normalmente se utiliza para presentar una selección Sí/No o Verdadero/Falso al usuario. Se
puede utilizar de controles de casilla en grupos para mostrar múltiples opciones de entre las
que el usuario puede seleccionar una o más. Es similar al control RadioButton, pero se puede
seleccionar cualquier número de controles CheckBox agrupados.
7.2.3. Label
Los controles Label de formularios se utilizan para mostrar texto o imágenes que el
usuario no puede editar. Se utilizan para identificar objetos en un formulario; por ejemplo,
16
7. Introducción a Visual Basic
para proporcionar una descripción de lo que hará cierto control si se hace clic en él o para
mostrar información en respuesta a un evento o proceso en tiempo de ejecución de la
aplicación. Dado que el control Label no puede recibir el foco, puede utilizarse también para
crear teclas de acceso para otros controles.
7.2.4. PictureBox
Representa un control de cuadro de imagen de Windows para mostrar una imagen.
7.2.5. ProgressBar
Representa un control de barra de progreso de Windows, simulando procesos de carga
de datos.
7.2.6. TableLayoutPanel
Representa un panel que dispone dinámicamente su contenido en una cuadrícula que
se compone de filas y columnas y permite ajustar la distancia entre ellas, permitiendo
mantener una relación de aspecto entre los controles. Solo es visible durante la
programación.
7.2.7. Timer
Genera un evento después de un intervalo establecido, con la opción de generar
eventos recurrentes.
7.2.8. TrackBar
El control TrackBar (también denominado en ocasiones control "deslizante") se utiliza
para navegar por grandes volúmenes de información o para ajustar visualmente una
configuración numérica. El control TrackBar tiene dos partes: el control de posición,
también conocido como control deslizante, y las marcas de paso. El control de posición es
la parte que puede ajustarse. Su posición corresponde a la propiedad Value. Las marcas de
paso son indicadores visuales espaciados a intervalos regulares. La barra de seguimiento se
desplaza en los incrementos que se especifiquen y puede alinearse horizontal o
verticalmente. Un ejemplo del uso de una barra de seguimiento sería el establecimiento de
la velocidad de intermitencia del cursor o de la velocidad del mouse.
17
7. Introducción a Visual Basic
Figura 7.3.1. Controles de Form
18
8. Índice de Programación
8. Índice de Programación
Debido al alto número de variables del programa, puede resultar un tanto confuso,
encontrar qué variable tiene determinada función, por tanto, en este punto se enumerarán
todas las variables del programa y los controles con nombres específicos, ordenados
alfabéticamente en la Tabla 8.1.
Nombre
Función
AumentoEolica
Aumento del tanto por ciento de energía Eólica.
AumentoSolar
Aumento del tanto por ciento de energía solar.
AuxEol
Variable global, que se utiliza como variable de apoyo en el proceso
de cálculo de la velocidad del viento.
AuxHidro
Variable global, que se utiliza como variable de apoyo en el proceso
de vaciado de la presa.
Capacidad
Variable global que indica el tanto por ciento de llenado de la presa
hidráulica.
Clima
Variable global que se utiliza para calcular cual es el clima a
mostrar (soleado o nubes).
EnergiaAbs
Variable global que indica cual es la energía absorbida, y que por
tanto es la que el usuario tiene que generar.
EnergiaBase
Energía base siempre presente.
Facil
Variable que indica si el usuario a elegido la versión fácil.
FCicle
Form perteneciente al ciclo combinado.
FEol
Form perteneciente a la energía eólica.
FEventos
Form que se utiliza para mostrar preguntas y eventos al usuario.
FHidro
Form perteneciente a la energía hidroeléctrica.
FInfo
Form perteneciente a la información inicial para el usuario.
FInicio
Pantalla de carga inicial del programa.
FNuc
Form perteneciente a la energía nuclear.
Form1
Form principal. Es la pantalla principal del juego.
FSalir
Form que se muestra al salir, por tal de asegurar de que el usuario
realmente quiere salir.
FSol
Form que pertenece a la energía solar generada.
GraficAbs(5)
Guarda la energía absorbida.
19
8. Índice de Programación
GraficEnergia(5)
Guarda la energía producida.
GraficHores(5)
Guarda las horas para mostrarlas por un gráfico.
Hora
Variable global que indica la hora a mostrar en el reloj.
HoraSiguiente
La hora a la que se comprobara la energía.
LluviaTim
Para determinar si había lluvia al parar un timer.
Minutos
Variable global que indica que minutos mostrar en el reloj.
Noche
Variable global que indica si es o no de noche.
NumPregunta
Para determinar en qué número de pregunta nos encontramos.
PBNuc
Variable global que indica el valor de posición del ProgresBar de
FNuc.
PreguntasActivas
Variable para determinar si se ha activado una pregunta.
Probabilidad
Para calcular la probabilidad de Velocidad de viento.
ReduccionConsumo Reducción del consumo de energía.
RepNucTim
Para determinar si estábamos reparando al parar un timer.
RespCorrecta
Para determinar qué respuesta es la correcta.
TBCicle
Variable global que indica el valor de posición del TrackBar de
FCicle.
TBEol
Variable global que indica el valor de posición del TrackBar de
FEol.
TBHidro
Variable global que indica el valor de posición del TrackBar de
FHidro.
TBSol
Variable global que indica el valor de posición del TrackBar de
FSol
UltimaHora
Variable global que indica se utiliza para guardar la última hora del
reloj, y poder hacer cálculos de comparación.
VCicle
Variable global que indica el valor de energía generada en el ciclo
combinado.
VEol
Variable global que indica el valor de energía eólica generada.
VHidro
Variable global que indica el valor de energía hidroeléctrica
generada.
Viento
Variable global que se utiliza para calcular cual es la velocidad del
viento.
VNuc
Variable global que indica el valor de energía nuclear generada.
20
8. Índice de Programación
VSol
Variable global que indica el valor de energía solar generada.
VTotal
Variable global que indica el valor de toda la energía generada.
Vuelta
Para saber cuántas veces se ha pasado por la hora de revisión.
Tabla 8.1. Índice de programación.
21
9. Código
9. Código
En este apartado se muestra todo el código que forma la aplicación desarrollada. Se
dividirá por los diferentes forms a los que pertenece. Recuérdese que las líneas que empiezan
con el símbolo del apostrofe ( ‘ ) son anotaciones que solo sirven para aclarar información,
y no son leídas por el compilador.
Se ha seguido el mismo código de color que se utiliza en el programa Visual Studio,
para facilitar su comprensión.
9.1. Form 1
10. Imports System.Threading
'Necesario para ejecutar programas en paralelo
11.
12. Module Variables
13.
'///////////Variables de los valores de generacion/////////
14.
Public VSol As Integer 'Variable global indica Valor energia generada
por Sol
15.
Public VEol As Integer 'Variable global indica Valor energia generada
por Eol
16.
Public VHidro As Integer
17.
Public VCicle As Integer
18.
Public VNuc As Integer
19.
Public VTotal As Double 'Variable global que indica el valor de totes les
energies
20.
'/////Variables para guardar datos de los controles////////
21.
'Para que el valor del trackbar no fuese 0 cada vez que se llama a un
nuevo form, se definen
22.
'las variables TBXXXX, para almacenar el ultimo valor del TB.
23.
Public TBSol As Integer
'Variable global indica Valor del trackbar
de Sol
24.
Public TBEol As Integer 'Variable global indica Valor del trackbar de
Eol
25.
Public TBHidro As Integer
26.
Public TBCicle As Integer
27.
Public PBNuc As Integer 'Variable que guarda el valor del progres bar nuc
28.
Public Capacidad As Integer 'Variable global que indica el valor de
llenado de la presa
29.
Public NumPregunta As Integer ' Marca que pregunta se mostrará
30.
Public RespCorrecta As String 'Indica si la respuesta es correcta o
incorrecta
31.
Public GraficHores(5) As Integer 'Guarda las horas para mostrarlas por un
grafico
32.
Public GraficEnergia(5) As Integer 'Guarda la energia producida
33.
Public GraficAbs(5) As Integer 'Guarda la energia absorvida
34.
Public Vuelta As Integer 'Para saber cuantas veces se ha pasado por la
hora de revision
35.
Public Hora As Integer 'hora actual
36.
Public Minutos As Integer
'Minutos actuales
37.
Public EnergiaAbs As Integer
'variable que indica la energia
programada
38.
Public Facil As Boolean
'Variable que indica si el usuario a elegido
la versión fácil
39.
Public EmpezadoCicle As Boolean 'Para saber si hemos mostrado ya un
mensaje
40.
Public Contaminacion As Integer 'Valor de la contaminacion
41.
'////////Variables de procesos internos aleatorios /////
22
9. Código
42.
Public Clima As Integer 'Variable global que indica el clima que debemos
mostrar
43.
Public Estado As Boolean
'Variable global que indica si una funcion
esta activa o desactivada
44.
Public Viento As Integer 'Variable que indica el viento que hace
45.
Public Probabilidad As Integer 'Para calcular la probabilidad de
Velocidad de viento
46.
Public AuxEol As Integer
'Variable que ayuda al calculo de saturacion
del viento
47.
Public Noche As Boolean
'Para determinar si la hora corresponde a la
noche
48.
Public HoraSiguiente As Integer 'La hora a la que se comprovara la
energia
49.
Public LluviaTim As Boolean
'Para determinar si habia lluvia al parar
un timer
50.
Public RepNucTim As Boolean
'Para determinar si estabamos reparando
al parar un timer
51.
'////Variables de proceso en paralelo/////////
52.
Public Prueba As Thread 'Variable que permite el subproceso
53.
Public AuxHidro As Integer 'Variable para ayudar a la reduccion de la
presa
54.
Public PreguntasActivas As Boolean ' Variable para determinar si se ha
activado una pregunta
55.
'//////Variables de las respuestas a las preguntas/////
56.
Public ReduccionConsumo As Integer
'Reduccion del consumo de energia
57.
Public EnergiaBase As Integer
'Energia base siempre presente
58.
Public AumentoSolar As Integer
'Aumento del tanto porciento de
energia solar
59.
Public AumentoEolica As Integer
'Aumento del tanto porciento de
energia Eolica
60. End Module
61.
62. Public Class Form1
63.
'///Definicion de variables iniciales/////
64.
Dim RespCorrecta = "Incorrecte"
65.
Dim Capacidad = 93
66.
Dim PBNuc = 100
67.
Dim Minutos = 0
68.
Dim VNuc = 4050 'Energia nuclear a máximo rendimiento
69.
Dim Vuelta = 0
70.
Dim EmpezadoCicle = False
71.
'/////Variables propias de esta funcion/////
72.
Private Aux As Boolean
73.
Private LastClim As Integer
74.
Private CallVAlertaCap = False 'Variable que define si hemos llamado o
no a ValertaCAp
75.
'para no repetir el mensaje varias veces
76.
Public Sub ThreadTask() 'Método que permite ir actualizando el valor de
la capacidad de la presa
77.
Control.CheckForIllegalCrossThreadCalls = False 'Orden por tal de que
se puede cambiar los labels desde un subproceso
78.
Estado = True
'Indicamos que la funcion esta activa
79.
Do
80.
If Capacidad <= 10 Then 'Mostramos un mensaje si la capacidad
disminuye demasiado
81.
VAlertaCap()
82.
Else
83.
Capacidad = Capacidad - AuxHidro 'Vamos restando valor a la
capacidad con auxhidro, que es 0 en caso de
84.
'que no haya empezado el programa
85.
ContPresa.Text = Capacidad & " %" 'Actualizamos los labels
con cada vuelta
23
9. Código
86.
87.
88.
89.
FHidro.ContPresa.Text = Capacidad & " %"
RefCapacidad()
If Facil Then
Thread.Sleep(3000 - VHidro / 13) 'En funcion de lo que
generen se reduce mas rapido
90.
Else
91.
Thread.Sleep(3000 - VHidro / 9) 'Esperamos 2 segundos
entre vueltas
92.
End If
93.
94.
End If
95.
Loop
96.
End Sub
97.
Sub RefCapacidad() 'Para refrescar la imagen de la capacidad de la presa
98.
If Capacidad > 90 Then
99.
PBCapacidad.Image = ControlE.My.Resources.Resources.Capacidad100
100.
ElseIf Capacidad > 80 Then
101.
PBCapacidad.Image =
ControlE.My.Resources.Resources.Capacidad90
102.
ElseIf Capacidad > 70 Then
103.
PBCapacidad.Image =
ControlE.My.Resources.Resources.Capacidad80
104.
ElseIf Capacidad > 60 Then
105.
PBCapacidad.Image =
ControlE.My.Resources.Resources.Capacidad70
106.
ElseIf Capacidad > 50 Then
107.
PBCapacidad.Image =
ControlE.My.Resources.Resources.Capacidad60
108.
ElseIf Capacidad > 40 Then
109.
PBCapacidad.Image =
ControlE.My.Resources.Resources.Capacidad50
110.
ElseIf Capacidad > 30 Then
111.
PBCapacidad.Image =
ControlE.My.Resources.Resources.Capacidad40
112.
ElseIf Capacidad > 21 Then
113.
PBCapacidad.Image =
ControlE.My.Resources.Resources.Capacidad30
114.
Else
115.
PBCapacidad.Image =
ControlE.My.Resources.Resources.Capacidad20
116.
End If
117.
End Sub
118.
Public Sub SecuenciaInicial()
119.
'///////////Parte de eólica/////////
120.
VViento()
'Viento aleatorio
121.
LabelVViento.Text = "Velocitat vent: " & Int(Viento) & " m/s"
122.
FEol.ComprovarMaximo() 'Comprobamos la saturación
123.
VEol = TBEol * 0.0074 * AuxEol ^ 3 'Calculamos la generación
124.
'////////////Parte del reloj/////////////
125.
Randomize() 'Para números realmente aleatorios
126.
Hora = Int(Rnd() * 24) 'Numero aleatorio entre 0 y 24
127.
If Hora = 24 Then
'Las 24 horas son las 00
128.
Hora = 0
129.
End If
130.
LabelHora.Text = "Actual: " & Hora & ":00"
131.
'////////////Parte climatica////////////
132.
Climatologia() 'Clima (sol) aleatorio
133.
'///////////Parte de consumo////////////
134.
BaseDatos() 'Marcamos la energia a consumir
135.
ContECons.Text = EnergiaAbs & " kWh"
136.
'///////////Escribimos la hora de revision//////////
137.
If Hora = 20 Then
24
9. Código
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
preguntas
151.
152.
153.
154.
155.
156.
157.
158.
End
159.
Sub
energia
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
End
172.
Sub
173.
174.
variable Clima
175.
176.
día
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
HoraSiguiente = 0
ElseIf Hora = 21 Then
HoraSiguiente = 1
ElseIf Hora = 22 Then
HoraSiguiente = 2
ElseIf Hora = 23 Then
HoraSiguiente = 3
Else
HoraSiguiente = Hora + 4
End If
LabelHoraSeg.Text = "Revisió: " & HoraSiguiente & ":00"
'//////////Iniciamos las preguntas/////////////////
TimerEventos.Start()
'Iniciamos el temporizador de
'///////Dificultad///////////////////
If Facil Then
TimerNuc.Interval = 2000
Else
TimerNuc.Interval = 1700
End If
Sub
Refrescar() 'Funcion que permite refrescar el valor total de
VTotal = VSol + VEol + VHidro + VNuc + VCicle + EnergiaBase
ContEGenSol.Text = VSol
ContEGenEol.Text = VEol
ContEGenNuc.Text = VNuc
ContEGenCicle.Text = VCicle
ContEGenTot.Text = VTotal & " kWh"
FCicle.ContEGenTot.Text = VTotal & " kWh"
FEol.ContEGenTot.Text = VTotal & " kWh"
FHidro.ContEGenTot.Text = VTotal & " kWh"
FNuc.ContEGenTot.Text = VTotal & " kWh"
FSol.ContEGenTot.Text = VTotal & " kWh"
Sub
Climatologia() 'Funcion que permite dar un clima aleatorio
Randomize()
Clima = Rnd() * 100 'Le damos un valor aleatorio a la
'Según el valor aleatorio distinguimos entre dos situaciones
If Hora >= 21 Or Hora < 7 Then 'Segun la hora sera de noche o
Noche = True
Else
Noche = False
End If
If Noche Then
LabelNubes.Visible = False
PBClima.Image = ControlE.My.Resources.Resources.Noche
TBSol = 0
VSol = 0
Refrescar()
ContEGenSol.ForeColor = Color.Red
LastClim = Clima
Timerlluvia.Stop()
ElseIf Clima < 77 Then 'Probabilidad de sol 77%
ContEGenSol.ForeColor = Color.White
PBClima.Image = ControlE.My.Resources.Resources.Sol
LabelNubes.Visible = False
If LastClim >= 77 Then 'Si el anterior clima fue nubes
25
9. Código
195.
TBSol = TBSol + TBSol * 42.874 / 100
'Actualizamos
el valor automaticamente
196.
VSol = VSol + VSol * 42.874 / 100
197.
Timerlluvia.Stop() 'Detenemos la lluvia
198.
If VSol > 3150 Then 'Para evitar valores superiores al
máximo
199.
VSol = 3150
200.
TBSol = 3150
201.
End If
202.
Refrescar()
203.
End If
204.
LastClim = Clima
205.
Else 'Evento Nubes
206.
ContEGenSol.ForeColor = Color.White
207.
PBClima.Image = ControlE.My.Resources.Resources.nubes
208.
If LastClim < 77 Then
'Si el anterior clima fue sol
209.
TBSol = TBSol - TBSol * 30 / 100
210.
VSol = VSol - VSol * 30 / 100
211.
Refrescar()
212.
End If
213.
LabelNubes.Visible = True
'Mostramos informacion de que
se ha reducido VSol
214.
LastClim = Clima
215.
Timerlluvia.Start() 'La lluvia rellena la presa
216.
End If
217.
218.
End Sub
219.
Sub Climatologia_Sub() 'Para la subform
220.
If Noche Then
221.
FSol.PBClima.Image = ControlE.My.Resources.Resources.Noche
222.
FSol.TrackBarSol.Enabled = False
223.
FSol.LabelBloq.Visible = True
224.
ElseIf Clima < 77 Then
'Clima con Sol
225.
FSol.PBClima.Image = ControlE.My.Resources.Resources.Sol
226.
FSol.TrackBarSol.Maximum = 3150
227.
FSol.TrackBarSol.Enabled = True
228.
FSol.LabelBloq.Visible = False
229.
Else 'Clima con nubes
230.
FSol.PBClima.Image = ControlE.My.Resources.Resources.nubes
231.
FSol.TrackBarSol.Maximum = 2205
232.
FSol.TrackBarSol.Enabled = True
233.
FSol.LabelBloq.Visible = False
234.
End If
235.
End Sub
236.
Sub RandomViento()
237.
Randomize() 'Para que los numeros no sean los mismos cada vez
que se inicia el programa
238.
'Sumaremos todas las probabilidades para que salga un numero
239.
'Probabilidad = (Rnd() * 1.1) + (Rnd() * 1.3) + (Rnd() * 2.4)
+ (Rnd() * 4.05) + (Rnd() * 5.2) + (Rnd() * 5.7) + (Rnd() * 6.2) + (Rnd() *
6.3) + (Rnd() * 6.2) + (Rnd() * 6.15) + (Rnd() * 6.25) + (Rnd() * 5.9) +
(Rnd() * 5.5) + (Rnd() * 5.1) + (Rnd() * 4.5) + (Rnd() * 4.4) + (Rnd() * 3.9)
+ (Rnd() * 3.4) + (Rnd() * 2.8) + (Rnd() * 2.4) + (Rnd() * 1.7) + (Rnd() *
1.3) + (Rnd() * 1.2) + (Rnd() * 0.95) + (Rnd() * 0.7) + (Rnd() * 0.7) +
(Rnd() * 0.5) + (Rnd() * 0.6) + (Rnd() * 0.5) + (Rnd() * 0.4) + (Rnd() * 0.4)
+ (Rnd() * 0.35) + (Rnd() * 0.3) + (Rnd() * 0.3) + (Rnd() * 0.3) + (Rnd() *
0.2) + (Rnd() * 0.2) + (Rnd() * 0.15) + (Rnd() * 0.01) + (Rnd() * 0.01) +
(Rnd() * 0.075) + (Rnd() * 0.05) + (Rnd() * 0.05) + (Rnd() * 0.03) + (Rnd() *
0.03) + (Rnd() * 0.02) + (Rnd() * 0.01) + (Rnd() * 0.01) + (Rnd() * 0.005) +
(Rnd() * 0.005) + (Rnd() * 0.005) + (Rnd() * 0.005) + (Rnd() * 0.005)
240.
Probabilidad = (Rnd() * 100)
26
9. Código
241.
Select Case Probabilidad
'Segun la probabilidad habrá una
velocidad de viento
242.
Case > 97.6
243.
Viento = 1
244.
Case > 91.15
245.
Viento = 2
246.
Case > 80.25
247.
Viento = 3
248.
Case > 67.75
249.
Viento = 4
250.
Case > 55.4
251.
Viento = 5
252.
Case > 43.25
253.
Viento = 6
254.
Case > 32.65
255.
Viento = 7
256.
Case > 23.75
257.
Viento = 8
258.
Case > 16.45
259.
Viento = 9
260.
Case > 11.25
261.
Viento = 10
262.
Case > 8.25
263.
Viento = 11
264.
Case > 6.1
265.
Viento = 12
266.
Case > 4.7
267.
Viento = 13
268.
Case > 3.6
269.
Viento = 14
270.
Case > 2.7
271.
Viento = 15
272.
Case > 1.95
273.
Viento = 16
274.
Case > 1.35
275.
Viento = 17
276.
Case > 0.85
277.
Viento = 18
278.
Case > 0.5
279.
Viento = 19
280.
Case > 0.3
281.
Viento = 20
282.
Case > 0.175
283.
Viento = 21
284.
Case > 0.095
285.
Viento = 22
286.
Case > 0.045
287.
Viento = 23
288.
Case > 0.025
289.
Viento = 24
290.
Case > 0.015
291.
Viento = 25
292.
Case > 0.005
293.
Viento = 26
294.
Case > 0
295.
Viento = 27
296.
End Select
297.
End Sub
298.
Sub VViento() 'Funcion que permite dar un viento aleatorio
299.
RandomViento()
300.
'Según el valor aleatorio distinguimos entre diferentes
situaciones
27
9. Código
301.
If Viento < 4 Then
'Con ningun viento
302.
PBViento.Image = ControlE.My.Resources.Resources.Viento0
303.
LabelViento.Text = "Vent insuficient!"
304.
ContEGenEol.ForeColor = Color.Red
305.
VEol = 0
306.
TBEol = 0
307.
Refrescar()
308.
ElseIf Viento < 10 Then 'Con poco viento
309.
PBViento.Image = ControlE.My.Resources.Resources.Viento40
310.
LabelViento.Text = ""
311.
ContEGenEol.ForeColor = Color.White
312.
ElseIf Viento < 25 Then
'Con viento
313.
PBViento.Image = ControlE.My.Resources.Resources.Viento75
314.
LabelViento.Text = ""
315.
ContEGenEol.ForeColor = Color.White
316.
Else
'Con mucho viento
317.
PBViento.Image = ControlE.My.Resources.Resources.Viento100
318.
LabelViento.Text = "Hi ha massa vent!"
319.
VEol = 0
320.
TBEol = 0
321.
Refrescar()
322.
ContEGenEol.ForeColor = Color.Red
323.
End If
324.
End Sub
325.
Sub VViento_Sub()
326.
If Viento < 4 Then
'Con ningun viento
327.
FEol.PBViento.Image =
ControlE.My.Resources.Resources.Viento0
'Cambiamos el gif
328.
FEol.LabelAvisoEol.Text = " Molins parats"
329.
FEol.TrackBarEol.Enabled = False
330.
ElseIf Viento < 10 Then 'Con poco viento
331.
FEol.PBViento.Image =
ControlE.My.Resources.Resources.Viento40 'Cambiamos el gif
332.
FEol.LabelAvisoEol.Text = ""
333.
ElseIf Viento < 25 Then
'Con viento
334.
FEol.PBViento.Image =
ControlE.My.Resources.Resources.Viento75 'Cambiamos el gif
335.
FEol.LabelAvisoEol.Text = ""
336.
Else
'Con mucho viento
337.
FEol.PBViento.Image =
ControlE.My.Resources.Resources.Viento100 'Cambiamos el gif
338.
FEol.LabelAvisoEol.Text = "Molins parats per seguretat"
339.
FEol.TrackBarEol.Enabled = False
340.
End If
341.
End Sub
342.
Sub VAlertaCap() 'Funcion que muesta un mensaje de que se acaba la
capacidad
343.
If Not CallVAlertaCap Then 'Si no se ha mostrado el mensaje
antes lo mostramos
344.
345.
If MessageBox.Show("Alerta, has esgotat la capacitat de la
presa, ja no podras utilitzar la energia hidràulica!", "Alerta",
346.
MessageBoxButtons.OK,
347.
MessageBoxIcon.Exclamation) = DialogResult.OK Then 'Si pulsan
ok entonces:
348.
VHidro = 0 'La energia generada por Hidro es 0
349.
CallVAlertaCap = True
'Indicamos que hemos ya hemos
mostrado el mensaje
350.
Refrescar()
351.
ContEGenHidro.Text = VHidro
352.
Prueba.Abort() 'paramos la ejecucion en paralelo
353.
End If
28
9. Código
354.
355.
End If
356.
End Sub
357.
Private Sub BEol_Click(sender As Object, e As EventArgs) Handles
BEol.Click
358.
'Para evitar que cada vez que sellame a FEol, su label que
indica el valor de energia
359.
'sea 0, se indica que LabelEol tome el ultimo valor del Valor
de energia (VEol)
360.
FEol.LabelEol.Text = VEol & " kWh"
361.
FEol.TrackBarEol.Value = TBEol 'Cargamos el último valor del
trackbar de FEol
362.
FEol.LabelVViento.Text = Int(Viento) & " m/s"
363.
VViento_Sub()
364.
FEol.Show() 'Invocamos a FEol
365.
End Sub
366.
Private Sub BSolar_Click(sender As Object, e As EventArgs) Handles
BSolar.Click
367.
'Para evitar que cada vez que sellame a FSol su label que
indica el valor de energia
368.
'sea 0, se indica que LabelSol tome el ultimo valor del Valor
de energia (VSol)
369.
FSol.LabelSol.Text = VSol & " kWh"
370.
FSol.TrackBarSol.Value = TBSol 'Cargamos el último valor del
trackbar de FSol
371.
Climatologia_Sub()
372.
FSol.Show() 'Invocamos a FSol
373.
End Sub
374.
Private Sub BNuc_Click(sender As Object, e As EventArgs) Handles
BNuc.Click
375.
FNuc.ProgressBar1.Value = PBNuc
376.
FNuc.LabelNuc.Text = VNuc & "kWh"
377.
FNuc.Label2.Text = PBNuc
378.
FNuc.ProgressBar1.Value = PBNuc
379.
FNuc.Show() 'Invocamos a FNuc
380.
End Sub
381.
Private Sub BHidro_Click(sender As Object, e As EventArgs) Handles
BHidro.Click
382.
FHidro.ContPresa.Text = Capacidad & " %"
'Actualizamos el
valor de la capcidad de la presa
383.
FHidro.TrackBarHidro.Value = TBHidro
'Mantenemos el valor
del TrackBar
384.
FHidro.LabelHidro.Text = VHidro & " kWh" 'Mantenemos el valor
en el label
385.
If Estado Then 'Para evitar problemas a la hora del primer
inicio del programa, ya que estariamos parando algo ya parado
386.
Prueba.Abort()
387.
End If
388.
If Capacidad <= 10 Then
389.
FHidro.TrackBarHidro.Value = 0
'Ponemos todos los
valores a 0
390.
FHidro.LabelHidro.Text = 0
391.
FHidro.TrackBarHidro.Enabled = False
'Bloqueamos el
control por falta de capacidad
392.
FHidro.LabelBloq.Visible = True
393.
End If
394.
FHidro.Show()
'Invocamos a FHidro
395.
End Sub
396.
Private Sub BCicle_Click(sender As Object, e As EventArgs) Handles
BCicle.Click
397.
FCicle.LabelCicle.Text = VCicle & " kWh"
29
9. Código
398.
FCicle.TrackBarCicle.Value = TBCicle 'Cargamos el último
valor del trackbar de FEol
399.
FCicle.Show() 'Invocamos a FEol
400.
End Sub
401.
Private Sub TimerNuc_Tick(sender As Object, e As EventArgs)
Handles TimerNuc.Tick
402.
If Not Facil Then
'Desactivado para el nivel Facil
403.
If ((PBNuc Mod 10) = 0) And PBNuc <> 100 Then
'Si
vajamos un 10% el mantenimiento penalizamos
404.
VNuc = VNuc - 150
405.
End If
406.
End If
407.
Refrescar() 'Vamos actualizando los labels
408.
PBNuc = PBNuc - 1
'Reducimos el mantenimiento
409.
If FNuc.Enabled = True Then 'En caso de que este activa la
form, actualizamos sus valores
410.
FNuc.Label2.Text = PBNuc & "%"
411.
FNuc.ProgressBar1.Value = PBNuc
412.
End If
413.
Labeldesgastnuc.Text = PBNuc & "%"
414.
ProgressBarNuc.Value = PBNuc
415.
If PBNuc = 10 Then
416.
TimerNuc.Stop()
417.
TimerNucRep.Start()
418.
419.
MessageBox.Show("La central nuclear no pot continuar
aixi!! L'estat t'obliga a fer el manteniment de la cental.", "Alerta",
420.
MessageBoxButtons.OK,
421.
MessageBoxIcon.Exclamation)
422.
End If
423.
End Sub
424.
Private Sub TimerNucRep_Tick(sender As Object, e As EventArgs)
Handles TimerNucRep.Tick
425.
VNuc = 0
'En reparaciones no se genera
426.
PBNuc = PBNuc + 1
'Aumentamos el valor de fiabilidad
427.
ProgressBarNuc.Value = PBNuc
428.
Refrescar()
429.
Labeldesgastnuc.Text = PBNuc & "%"
430.
RepNucTim = True
431.
If FNuc.Enabled = True Then
432.
FNuc.Label2.Text = PBNuc & "%"
433.
FNuc.ProgressBar1.Value = PBNuc
434.
FNuc.LabelNuc.Text = VNuc & " kWh"
435.
End If
436.
If PBNuc = 100 Then
437.
TimerNuc.Start()
438.
FNuc.LabelNuc.Text = 4050 & " kWh"
439.
VNuc = 4050
440.
TimerNucRep.Stop()
441.
RepNucTim = False
442.
End If
443.
End Sub
444.
Private Sub TimerHora_Tick(sender As Object, e As EventArgs)
Handles TimerHora.Tick
445.
Minutos = Minutos + 15 'Aumentamos 15 minutos el temporizador
446.
If Minutos = 60 Then
'Si ha pasado una hora
447.
Minutos = "0" & 0 'Para que se vea 00 en minutos
448.
Hora = Hora + 1
'Aumentamos una hora
449.
If Hora = 24 Then
450.
Hora = 0
451.
End If
452.
End If
30
9. Código
453.
LabelHora.Text = "Actual: " & Hora & ":" & Minutos
454.
If (Hora = 7 Or Hora = 21) And Minutos = 0 Then 'Sies la hora
de anochecer (21) o la del amanecer(7)
455.
Climatologia()
456.
End If
457.
'Ya han pasado las 4 horas, comprobamos:
458.
If Hora = HoraSiguiente And Minutos = 0 Then
459.
Comprobar()
460.
GraficHores(Vuelta) = Hora 'Añadimos la hora
461.
Vuelta = Vuelta + 1
462.
End If
463.
If Vuelta > 2 Then
464.
TimerHora.Interval = 1875 'Aumentamos la velocidad
465.
ElseIf Vuelta > 0 Then
466.
TimerHora.Interval = 2815 'Aumentamos la velocidad del
juego
467.
End If
468.
If Vuelta = 6 Then 'Ya hemos hecho todo el ciclo
469.
Final.Show()
470.
Me.Close()
471.
If FHidro.Enabled Then
472.
FHidro.Close()
473.
End If
474.
If FNuc.Enabled Then
475.
FNuc.Close()
476.
End If
477.
If FSol.Enabled Then
478.
FSol.Close()
479.
End If
480.
If FCicle.Enabled Then
481.
FCicle.Close()
482.
End If
483.
End If
484.
485.
End Sub
486.
Public Sub BaseDatos() 'La energia absorvida para cada hora
487.
Select Case HoraSiguiente
488.
Case 0
489.
EnergiaAbs = 31896
490.
Case 1
491.
EnergiaAbs = 28405
492.
Case 2
493.
EnergiaAbs = 26890
494.
Case 3
495.
EnergiaAbs = 25902
496.
Case 4
497.
EnergiaAbs = 25020
498.
Case 5
499.
EnergiaAbs = 24500
500.
Case 6
501.
EnergiaAbs = 25020
502.
Case 7
503.
EnergiaAbs = 26908
504.
Case 8
505.
EnergiaAbs = 28701
506.
Case 9
507.
EnergiaAbs = 29910
508.
Case 10
509.
EnergiaAbs = 32000
510.
Case 11
511.
EnergiaAbs = 34700
512.
Case 12
31
9. Código
513.
EnergiaAbs = 35631
514.
Case 13
515.
EnergiaAbs = 36082
516.
Case 14
517.
EnergiaAbs = 37152
518.
Case 15
519.
EnergiaAbs = 36290
520.
Case 16
521.
EnergiaAbs = 36286
522.
Case 17
523.
EnergiaAbs = 35900
524.
Case 18
525.
EnergiaAbs = 35480
526.
Case 19
527.
EnergiaAbs = 34800
528.
Case 20
529.
EnergiaAbs = 34100
530.
Case 21
531.
EnergiaAbs = 33684
532.
Case 22
533.
EnergiaAbs = 32800
534.
Case 23
535.
EnergiaAbs = 30820
536.
End Select
537.
EnergiaAbs = EnergiaAbs - (ReduccionConsumo / 100) *
(EnergiaAbs)
538.
GraficAbs(Vuelta) = EnergiaAbs
539.
End Sub
540.
Public Sub Comprobar()
541.
'/////Comprobacion de energia total/////////////
542.
Dim total As Integer
543.
If Noche Then
544.
If Viento > 25 Then
545.
total = (FCicle.TrackBarCicle.Maximum) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc)
546.
ElseIf Viento > 12 Then
547.
total = (FCicle.TrackBarCicle.Maximum) +
(FEol.TrackBarEol.Maximum * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) *
(FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc)
548.
ElseIf Viento > 4 Then
549.
total = (FCicle.TrackBarCicle.Maximum) +
(FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) *
(FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc)
550.
Else
551.
total = (FCicle.TrackBarCicle.Maximum) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc)
552.
End If
553.
Else
554.
If Viento > 25 Then
555.
total = (FCicle.TrackBarCicle.Maximum) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc)
556.
ElseIf Viento > 12 Then
557.
total = (FCicle.TrackBarCicle.Maximum) +
(FEol.TrackBarEol.Maximum * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) *
(FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) + (FSol.TrackBarSol.Maximum +
(AumentoSolar / 100) * (FSol.TrackBarSol.Maximum))
558.
ElseIf Viento > 4 Then
559.
total = (FCicle.TrackBarCicle.Maximum) +
(FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) *
32
9. Código
(FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) + (FSol.TrackBarSol.Maximum +
(AumentoSolar / 100) * (FSol.TrackBarSol.Maximum))
560.
Else
561.
total = (FCicle.TrackBarCicle.Maximum) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) + (FSol.TrackBarSol.Maximum +
(AumentoSolar / 100) * (FSol.TrackBarSol.Maximum))
562.
End If
563.
End If
564.
565.
If total < EnergiaAbs Then
566.
MessageBox.Show("Sembla que no pots arribar. Però
tranquil els veïns estan per això. La ciutat veïna et deixa elèctricitat.",
"Oh oh", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
567.
GraficEnergia(Vuelta) = EnergiaAbs
568.
Else
569.
If VTotal > (EnergiaAbs - (EnergiaAbs * 5 / 100)) And
VTotal < (EnergiaAbs + (EnergiaAbs * 5 / 100)) Then
570.
MsgBox("Quina precisió !!!")
571.
ElseIf VTotal > (EnergiaAbs - (EnergiaAbs * 10 / 100))
And VTotal < (EnergiaAbs + (EnergiaAbs * 10 / 100)) Then
572.
MsgBox("Perfecte, continua !")
573.
ElseIf VTotal > (EnergiaAbs - (EnergiaAbs * 15 / 100))
And VTotal < (EnergiaAbs + (EnergiaAbs * 15 / 100)) Then
574.
MsgBox("Molt bé, continua aixi!")
575.
ElseIf VTotal > (EnergiaAbs - (EnergiaAbs * 20 / 100))
And VTotal < (EnergiaAbs + (EnergiaAbs * 20 / 100)) Then
576.
MsgBox("Pots ajustar una mica més, però no et
desanimis!")
577.
Else
578.
MsgBox("Intenta-ho amb més ganes!")
579.
End If
580.
GraficEnergia(Vuelta) = VTotal
581.
End If
582.
'Volvemos a generar los valores aleatorios
583.
VViento() 'Cambiamos el viento
584.
LabelVViento.Text = "Velocitat vent: " & Int(Viento) & " m/s"
585.
FEol.ComprovarMaximo() 'comprovamos si esta en saturacion
586.
'////Generacion dependiendo de la velocidad del viento
587.
If Viento < 12 Then 'Velocidades lentas
588.
VEol = TBEol * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100)
* (TBEol * 0.005 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una
constante y por
589.
'la razón cúbica de la velocidad del viento
590.
Else
'Velocidad rápida
591.
VEol = TBEol * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100)
* (TBEol * 0.0036 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una
constante y por
592.
'la razón cúbica de la velocidad del viento
593.
End If
594.
Climatologia() 'Tiempo aleatorio
595.
'Ajustamos la hora
596.
If Hora = 20 Then
597.
HoraSiguiente = 0
598.
ElseIf Hora = 21 Then
599.
HoraSiguiente = 1
600.
ElseIf Hora = 22 Then
601.
HoraSiguiente = 2
602.
ElseIf Hora = 23 Then
603.
HoraSiguiente = 3
604.
Else
605.
HoraSiguiente = Hora + 4
33
9. Código
606.
End If
607.
LabelHoraSeg.Text = "Revisió: " & HoraSiguiente & ":00"
608.
BaseDatos()
'Miramos que energia absorve para esa hora
609.
ContECons.Text = EnergiaAbs & " kWh"
610.
611.
612.
End Sub
613.
Private Sub TimerEventos_Tick(sender As Object, e As EventArgs)
Handles TimerEventos.Tick
614.
NumPregunta = NumPregunta + 1
615.
PreguntasActivas = True
616.
If NumPregunta < 8 Then 'Total de 7 preguntas
617.
'Si la siguiente pregunta es la 3 tendremos que llamar a
otra funcion
618.
If NumPregunta = 3 Then
619.
FEventosImagenes.Show()
620.
ElseIf NumPregunta = 6 And Facil Then
621.
FEventosImagenes.Show()
622.
Else
623.
FEventos.Show()
624.
End If
625.
'//////Detenemos todas las rutinas///////
626.
If RepNucTim Then
627.
TimerNucRep.Stop()
628.
Else
629.
TimerNuc.Stop()
630.
End If
631.
If LluviaTim Then
632.
Timerlluvia.Stop()
633.
Else
634.
If Estado Then
635.
Prueba.Abort()
636.
End If
637.
End If
638.
TimerHora.Stop()
639.
TimerEventos.Stop()
640.
'Cerramos todos los subforms
641.
If FHidro.Enabled Then
642.
FHidro.Close()
643.
End If
644.
If FNuc.Enabled Then
645.
FNuc.Close()
646.
End If
647.
If FSol.Enabled Then
648.
FSol.Close()
649.
End If
650.
If FCicle.Enabled Then
651.
FCicle.Close()
652.
End If
653.
Else
654.
TimerEventos.Stop() 'Si hemos hecho todas las preguntas
paramos
655.
End If
656.
End Sub
657.
Private Sub Form1_Closing(sender As Object, e As
System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
658.
If Vuelta <> 6 Then
659.
If FSalir.ShowDialog() =
System.Windows.Forms.DialogResult.Abort Then
660.
e.Cancel = True
661.
End If
662.
End If
34
9. Código
663.
End Sub
664.
Private Sub Timerlluvia_Tick(sender As Object, e As EventArgs)
Handles Timerlluvia.Tick
665.
If Capacidad = 98 Then
666.
Timerlluvia.Stop() 'paramos la lluvia
667.
LluviaTim = False
668.
Else
669.
LluviaTim = True
670.
Capacidad = Capacidad + 1 'Aumentamos las reservas de agua
a causa de la lluvia
671.
End If
672.
673.
674.
End Sub
675.
End Class
9.2. FInicio
Public Class FInicio
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
ProgressBar1.Value = ProgressBar1.Value + 2
If ProgressBar1.Value = 100 Then
Timer1.Stop()
ProgressBar1.Visible = False
FInfo1.Show()
Me.Close()
End If
End Sub
End Class
9.3. FCicle
Public Class FCicle
Private Sub BSCicle_Click(sender As Object, e As EventArgs) Handles
BSCicle.Click
Me.Close()
End Sub
Private Sub TrackBarCicle_Scroll(sender As Object, e As EventArgs) Handles
TrackBarCicle.Scroll
VCicle = TrackBarCicle.Value
TBCicle = TrackBarCicle.Value
'Guardamos el valor del trackbar
LabelCicle.Text = VCicle & " kWh"
Form1.Refrescar()
End Sub
End Class
9.4. FEol
Public Class FEol
Public Sub ComprovarMaximo()
AuxEol = Viento
If Viento > 15 Then
AuxEol = 15
'Con viento de 15m/s se satura la produccion
End If
End Sub
Private Sub BSEol_Click(sender As Object, e As EventArgs) Handles BSEol.Click
Me.Close() 'Volvemos al principal
End Sub
35
9. Código
Private Sub TrackBarEol_Scroll(sender As Object, e As EventArgs) Handles
TrackBarEol.Scroll
ComprovarMaximo()
'////Generacion dependiendo de la velocidad del viento
If Viento < 12 Then 'Velocidades lentas
VEol = TrackBarEol.Value * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) *
(TrackBarEol.Value * 0.005 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por
una constante y por
'la razón cúbica de la velocidad del viento
Else
'Velocidad rápida
VEol = TrackBarEol.Value * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) *
(TrackBarEol.Value * 0.0036 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por
una constante y por
'la razón cúbica de la velocidad del viento
End If
LabelEol.Text = VEol & " kWh"
'Indicamos que Label tome el valor de VEol
Form1.ContEGenEol.Text = VEol 'Indicamos que el label que muestra el valor
de energia de Eol
' en el programa principal, se actualice al que ahora le estamos dando
Form1.Refrescar()
TBEol = TrackBarEol.Value
'Guardamos el valor del trackbar
End Sub
End Class
9.5. FHidro
Imports System.Threading
'Importem les preferencies per poder executar en
paral·lel
Public Class FHidro
Public Sub EndThread() 'Para poder parar la subrutina que resta la capacidad
Prueba.Abort() 'Paramos la subrutina
End Sub
Private Sub BSHidro_Click(sender As Object, e As EventArgs) Handles
BSHidro.Click
Me.Close() 'Cerramos FHidro
End Sub
Private Sub FHidro_FormClosing(sender As Object, e As EventArgs) Handles
Me.FormClosing
'If (FEventosResp.Enabled = False) Or (FEventosImagenes.Enabled = False)
Then
If Not PreguntasActivas Then
Prueba = New Thread(AddressOf Form1.ThreadTask) 'Definimos prueba como
una variable Thread
'(para ejecutar en paralelo)'
Prueba.IsBackground = True 'Ralizacion de fondo
Prueba.Start() 'llamamos al procedimiento
End If
End Sub
Private Sub TrackBarHidro_Scroll(sender As Object, e As EventArgs) Handles
TrackBarHidro.Scroll
If TrackBarHidro.Value = 0 Then 'Por tal de que restemos la capacidad de la
presa solo cuando
'la hemos activado
AuxHidro = 0
'Si el valor del trackbar es 0, no restaremos
Else
AuxHidro = 1
'Si es diferente de 0 restaremos 1
End If
TBHidro = TrackBarHidro.Value
'Guardamos el valor del trackbar
VHidro = TrackBarHidro.Value * 10.35 'Multiplicamos el valor del trackbar
por 10.35 para adecuarlo a
'la energia que generaria un sistema hidráulico
LabelHidro.Text = VHidro
'Indicamos que Label tome el valor de VHidro
36
9. Código
Form1.ContEGenHidro.Text = VHidro 'Indicamos que el label que muestra el
valor de energia de Hidro
' en el programa principal, se actualice al que ahora le estamos dando
Form1.Refrescar()
End Sub
End Class
9.6. FSol
Public Class FSol
Private Sub BSSol_Click(sender As Object, e As EventArgs) Handles BSSol.Click
Me.Close() 'Volvemos al principal
End Sub
Private Sub TrackBarSol_Scroll(sender As Object, e As EventArgs) Handles
TrackBarSol.Scroll
VSol = TrackBarSol.Value + (AumentoSolar / 100) * (TrackBarSol.Value)
'Multiplicamos el valor del trackbar por 16 para adecuarlo a
'la energia que generaria un sistema fotovoltaico
LabelSol.Text = VSol & " kWh" 'Indicamos que Label tome el valor de VSol
Form1.ContEGenSol.Text = VSol 'Indicamos que el label que muestra el valor
de energia de Sol
' en el programa principal, se actualice al que ahora le estamos dando
Form1.Refrescar()
TBSol = TrackBarSol.Value
'Guardamos el valor del trackbar
End Sub
End Class
9.7. FNuc
Public Class FNuc
Private Sub BSNuc_Click(sender As Object, e As EventArgs) Handles BSNuc.Click
Me.Close()
End Sub
Private Sub BNucRep_Click(sender As Object, e As EventArgs) Handles
BNucRep.Click
PBNuc = ProgressBar1.Value
Form1.TimerNuc.Stop()
Form1.TimerNucRep.Start()
LabelNuc.Text = VNuc
End Sub
End Class
9.8. FSalir
Public Class FSalir
Private Sub BSi_Click(sender As Object, e As EventArgs) Handles BSi.Click
If Estado Then
Prueba.Abort()
End If
Me.Close()
End Sub
Private Sub BNo_Click(sender As Object, e As EventArgs) Handles BNo.Click
Me.Close()
DialogResult = DialogResult.Abort
End Sub
End Class
37
9. Código
9.9.FEventos
Public Class FEventos
Public Sub CargaPreguntas()
Select Case NumPregunta 'Seleccionamos en que pregunta estamos
Case 1
LabelPregunta.Text = "D'on s'obté principalment la biomassa?"
RadioButton1.Text = "Dels Iogurs amb bífidus"
RadioButton2.Text = "De les restes de plàstic de la brossa"
RadioButton3.Text = "De les restes de residus forestals i agrícoles"
Case 2
LabelPregunta.Text = "Les xarxes intel·ligents (smart grids) són..."
RadioButton1.Text = "xarxes que milloraran l'eficiència elèctrica"
RadioButton2.Text = "xarxes formadess per smartphones"
RadioButton3.Text = "tecnologies que encara no han arribat a Europa"
Case 4
LabelPregunta.Text = "Quin creus que és el nom correcte d'una
central elèctrica marina? (Bouy significa boia)."
RadioButton1.Text = "Power Buoy"
RadioButton2.Text = "Turbo Buoy"
RadioButton3.Text = "Electrical-Marine Buoy"
Case 5
LabelPregunta.Text = "En quina orientació col·locaries unes plaques
solars per aprofitar al màxim el sol?"
RadioButton1.Text = "Orientació Nord"
RadioButton2.Text = "Orientació Sud"
RadioButton3.Text = "És indiferent"
Case 6
LabelPregunta.Text = "Què creus que és una central de cicle
combinat?"
RadioButton1.Text = "Una central on es crema les restes de residus
urbans"
RadioButton2.Text = "Una combinació d'una central tèrmica i una
nuclear"
RadioButton3.Text = "Una central tèrmica que aprofita al màxim el
combustible"
Case 7
LabelPregunta.Text = "En què es basa l'energia geotèrmica?"
RadioButton1.Text = "En aprofitar l'energia de les fonts termals"
RadioButton2.Text = "En aprofitar l'escalfor dels raigs solars"
RadioButton3.Text = "En aprofitar l'energia tèrmica de la Terra"
End Select
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles
ButtonComprova.Click
'///////Diferenciamos entre todas las posibles respuestas/////
If NumPregunta = 1 Or NumPregunta = 6 Or NumPregunta = 7 Then
If RadioButton3.Checked = True Then
RespCorrecta = "Correcte"
Else
RespCorrecta = "Incorrerte"
End If
FEventosResp.CargarRespuestas()
FEventosResp.Show()
ElseIf NumPregunta = 2 Or NumPregunta = 4 Then
If RadioButton1.Checked = True Then
RespCorrecta = "Correcte"
Else
38
9. Código
RespCorrecta = "Incorrerte"
End If
FEventosResp.CargarRespuestas()
FEventosResp.Show()
Else
If RadioButton2.Checked = True Then
RespCorrecta = "Correcte"
Else
RespCorrecta = "Incorrerte"
End If
FEventosResp.CargarRespuestas()
FEventosResp.Show()
End If
Me.Close()
End Sub
Private Sub FEventos_Load(sender As Object, e As EventArgs) Handles MyBase.Load
CargaPreguntas()
End Sub
End Class
9.10. FEventosImagenes
Imports System.Threading
Public Class FEventosImagenes
Dim respuesta = 0
'/////Cargamos la pregunta////////////
Private Sub FEventosImagenes_Load(sender As Object, e As EventArgs) Handles
MyBase.Load
CargarPreguntas()
End Sub
Public Sub CargarPreguntas()
If NumPregunta = 6 Then
RadioButton1.Visible = False
RadioButton2.Visible = False
RadioButton3.Visible = False
PictureBox1.BackgroundImage =
ControlE.My.Resources._450px_Centrale_Eolica_Frigento
PictureBox2.BackgroundImage =
ControlE.My.Resources._800px_Ciclo_combinado_Plana_del_Vent
PictureBox3.BackgroundImage =
ControlE.My.Resources._800px_Placas_solares_en_Vilalba
Label1.Text = "Quina de les següents imatges correspon a una central
eòlica?"
Label2.Text = "Central eòlica"
Label3.Text = "Central de Cicle Combinat"
Label3.ForeColor = Color.Red
Label4.Text = "Central Solar"
Label4.ForeColor = Color.Red
ElseIf NumPregunta = 3 Then
Label1.Text = "Quin tipus de molí eòlic és d'eix horitzontal?"
RadioButton1.Visible = True
RadioButton2.Visible = True
RadioButton3.Visible = True
TableLayoutPanel1.Controls.Remove(TableLayoutPanel2)
TableLayoutPanel1.Controls.Add(PictureBox1, 1, 2)
PictureBox1.BackgroundImage = Nothing
PictureBox1.Image = My.Resources.Molinos
PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
PictureBox1.Dock = DockStyle.Fill
End If
End Sub
39
9. Código
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles
Button1.Click
PreguntasActivas = False
If NumPregunta = 6 Then
If respuesta = 1 Then
MsgBox("Correcte!
+10 % de generació eòlica!!")
AumentoEolica = AumentoEolica + 10
If Viento < 12 Then 'Velocidades lentas
VEol = TBEol * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) *
(TBEol * 0.0036 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una
constante y por
'la razón cúbica de la velocidad del viento
Else
'Velocidad rápida
VEol = TBEol * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) *
(TBEol * 0.0036 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una
constante y por
'la razón cúbica de la velocidad del viento
End If
Else
MsgBox("Incorrecte!")
End If
Label2.Visible = True
Label3.Visible = True
Label4.Visible = True
End If
If NumPregunta = 3 Then
If respuesta = 2 Then
MsgBox("Correcte! HAWT = Horitzontal Axis Wind Turbine
+10 % de generació eòlica!!")
AumentoEolica = AumentoEolica + 10
If Viento < 12 Then 'Velocidades lentas
VEol = TBEol * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) *
(TBEol * 0.0036 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una
constante y por
'la razón cúbica de la velocidad del viento
Else
'Velocidad rápida
VEol = TBEol * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) *
(TBEol * 0.0036 * AuxEol ^ 3) 'Multiplicamos el valor del trackbar por una
constante y por
'la razón cúbica de la velocidad del viento
End If
Else
MsgBox("Incorrecte! VAWT = Vertical Axis Wind Turbine, podràs veure
una en l'edifici de laboratoris de la universitat a prop de l'escola d'art.")
End If
End If
Me.Enabled = False
TimerClose.Start()
End Sub
'/////////Para la pregunta numero 6////////////////////
Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles
PictureBox1.Click
If NumPregunta = 6 Then
respuesta = 1
'/////Resaltamos el color del fondo///////
If PictureBox2.BackColor = Color.Silver Then
PictureBox2.BackColor = Color.Transparent
End If
If PictureBox3.BackColor = Color.Silver Then
PictureBox3.BackColor = Color.Transparent
End If
40
9. Código
PictureBox1.BackColor = Color.Silver
End If
End Sub
Private Sub PictureBox2_Click(sender As Object, e As EventArgs) Handles
PictureBox2.Click
respuesta = 2
If PictureBox1.BackColor = Color.Silver Then
PictureBox1.BackColor = Color.Transparent
End If
If PictureBox3.BackColor = Color.Silver Then
PictureBox3.BackColor = Color.Transparent
End If
PictureBox2.BackColor = Color.Silver
End Sub
Private Sub PictureBox3_Click(sender As Object, e As EventArgs) Handles
PictureBox3.Click
respuesta = 3
If PictureBox1.BackColor = Color.Silver Then
PictureBox1.BackColor = Color.Transparent
End If
If PictureBox2.BackColor = Color.Silver Then
PictureBox2.BackColor = Color.Transparent
End If
PictureBox3.BackColor = Color.Silver
End Sub
'////////Para la pregunta 3///////////////////////
Private Sub RadioButton2_CheckedChanged(sender As Object, e As EventArgs)
Handles RadioButton2.CheckedChanged
respuesta = 2
End Sub
Private Sub RadioButton1_CheckedChanged(sender As Object, e As EventArgs)
Handles RadioButton1.CheckedChanged
respuesta = 1
End Sub
Private Sub RadioButton3_CheckedChanged(sender As Object, e As EventArgs)
Handles RadioButton3.CheckedChanged
respuesta = 3
End Sub
Private Sub FEventosImagenes_FormClosing(sender As Object, e As
FormClosingEventArgs) Handles MyBase.FormClosing
'////////Reactivamos todos los temporizadores/////////
If RepNucTim Then
Form1.TimerNucRep.Start()
Else
Form1.TimerNuc.Start()
End If
If LluviaTim Then
Form1.Timerlluvia.Start()
End If
Prueba = New Thread(AddressOf Form1.ThreadTask) 'Definimos prueba como una
variable Thread
'(para ejecutar en paralelo)'
Prueba.IsBackground = True 'Ralizacion de fondo
Prueba.Start() 'llamamos al procedimiento
Form1.TimerHora.Start()
Form1.TimerEventos.Start()
End Sub
Private Sub TimerClose_Tick(sender As Object, e As EventArgs) Handles
TimerClose.Tick
TimerClose.Stop()
41
9. Código
Me.Close()
End Sub
End Class
9.11. FEventosResp
Imports System.Threading
Public Class FEventosResp
Public Sub CargarRespuestas()
Select Case NumPregunta
Case 1
If RespCorrecta = "Correcte" Then
Label1.Text = RespCorrecta & ", tota resta orgànica es pot
transformar en biomassa, per després utilitzar-la com a combustible sent una molt
bona opció com a energia renovable.
Es Es redueix el consum de la teva ciutat un 2%!!"
ReduccionConsumo = ReduccionConsumo + 2
Else
Label1.Text = RespCorrecta & ", tota resta orgànica es pot
transformar en biomassa, per després utilitzar-la com a combustible sent una molt
bona opció com a energia renovable."
End If
PictureBox1.BackgroundImage = ControlE.My.Resources.Pellets
Case 2
If RespCorrecta = "Correcte" Then
Label1.Text = RespCorrecta & ", les Smart Grids permeten que els
habitatges i els negocis puguin convertir-se en generadors fent que ja no es
depengui tant de grans centrals
Es redueix el consum de la teva ciutat un 2%!!"
ReduccionConsumo = ReduccionConsumo + 2
Else
Label1.Text = RespCorrecta & ", les Smart Grids permeten que
els habitatges i els negocis puguin convertir-se en generadors fent que ja no es
depengui tant de grans centrals"
End If
PictureBox1.BackgroundImage = ControlE.My.Resources.Smartcity
Case 4
If RespCorrecta = "Correcte" Then
Label1.Text = RespCorrecta & ", la POWER BUOY aprofita el
moviment de les ones, per generar electricitat en el seu eix vertical, com si d'una
manxa de bici es tractés.
Tindràs una generació extra de 1500 kWh per aquest descobriment!!"
EnergiaBase = EnergiaBase + 1500
Else
Label1.Text = RespCorrecta & ", la POWER BUOY aprofita el
moviment de les ones, per generar electricitat en el seu eix vertical, com si d'una
manxa de bici es tractés."
End If
PictureBox1.BackgroundImage = ControlE.My.Resources.powerbuoy
Case 5
If RespCorrecta = "Correcte" Then
Label1.Text = RespCorrecta & ", en orientació SUD s'aprofita
millor les hores de sol. Les cases orientades al sud necessiten menys energia per
escalfar-se.
Tindràs un augment d'un 10 % en la generació solar"
AumentoSolar = 10
VSol = TBSol + (AumentoSolar / 100) * (TBSol)
Else
42
9. Código
Label1.Text = RespCorrecta & ", en orientació SUD s'aprofita
millor les hores de sol. Les cases orientades al sud necessiten menys energia per
escalfar-se."
End If
PictureBox1.BackgroundImage = ControlE.My.Resources.rosewind
Case 6
If RespCorrecta = "Correcte" Then
Label1.Text = RespCorrecta & ", hi ha un primer cicle de
combustió, i amb els gasos d'aquesta, es fa una segona combustió. Com si
aprofitessis els gasos d'escapament del cotxe per extreure més energia. La central
de la imatge està a prop de Vandellòs.
Tindràs una generació extra de 1500 kWh per aquest descobriment!!"
Else
Label1.Text = RespCorrecta & ", hi ha un primer cicle de
combustió, i amb els gasos d'aquesta, es fa una segona combustió. Com si
aprofitessis els gasos d'escapament del cotxe per extreure més energia. La central
de la imatge està a prop de Vandellòs."
End If
PictureBox1.BackgroundImage =
ControlE.My.Resources._800px_Ciclo_combinado_Plana_del_Vent
Case Else
If RespCorrecta = "Correcte" Then
Label1.Text = RespCorrecta & ", el nucli de la Terra es troba a
prop dels 6700ºC, una part d'aquesta calor es pot aprofitar per generar
electricitat, però només en llocs especials (amb activitat volcànica).
Tindràs una generació extra de 1500 kWh per aquest descobriment!!"
EnergiaBase = EnergiaBase + 1500
Else
Label1.Text = RespCorrecta & ", el nucli de la Terra es troba a
prop dels 6700ºC, una part d'aquesta calor es pot aprofitar per generar
electricitat, però només en llocs especials (amb activitat volcànica)."
End If
PictureBox1.BackgroundImage =
ControlE.My.Resources._800px_GeysirEruptionNear
End Select
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles
Button1.Click
PreguntasActivas = False
Me.Close()
'////////Reactivamos todos los temporizadores/////////
If RepNucTim Then
Form1.TimerNucRep.Start()
Else
Form1.TimerNuc.Start()
End If
If LluviaTim Then
Form1.Timerlluvia.Start()
End If
Prueba = New Thread(AddressOf Form1.ThreadTask) 'Definimos prueba como una
variable Thread
'(para ejecutar en paralelo)'
Prueba.IsBackground = True 'Ralizacion de fondo
Prueba.Start() 'llamamos al procedimiento
Form1.TimerHora.Start()
Form1.TimerEventos.Start()
End Sub
End Class
43
9. Código
9.12. FInfo1
Public Class FInfo1
Private Sub ButtonMig_Click(sender As Object, e As EventArgs) Handles
ButtonMig.Click
Facil = False 'Ha escogido el nivel dificil
FInfo2.Show()
Me.Close()
End Sub
Private Sub ButtonFacil_Click(sender As Object, e As EventArgs) Handles
ButtonFacil.Click
Facil = True 'Ha escogido el nivel facil
FInfo2.Show()
Me.Close()
End Sub
End Class
9.13. Finfo2
Public Class FInfo2
Dim cops = 0
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles
Button1.Click
Select Case cops
Case 0
TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._2
Label1.Visible = False
Label2.Visible = True
Case 1
TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._3
Label2.Visible = False
Label1.Text = "Aquest és el rellotge. Quan arribi l'hora de revisió
es comprovarà quina és l'energia que es genera s'assembli amb la que es gasta.
Intenta ajustar-te el màxim possible!"
Label1.Visible = True
Case 2
TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._4
Label3.Visible = True
Label1.Visible = False
Case 3
TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._5
Label3.Visible = False
Label5.Visible = True
Case 4
TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._6
Label4.Text = "El vent et limitarà la producció d'energia eòlica. Si
fa massa, o massa poc vent, no podràs produir."
Label4.Visible = True
Label5.Visible = False
Case 5
TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._7
Label4.Text = "El pantà té una quantitat limitada d'aigua. Tindràs
que RESERVAR un 10% per què la gent pugui tenir aigua a les seves cases. La pluja
omplirà el pantà. Troba l'equilibri entre la producció i el consum d'aigua!"
Case 6
TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._8
Label4.Visible = False
Label6.Visible = True
If Facil Then
44
9. Código
Label6.Text = "La central nuclear produirà contínuament, però
hauràs de fer revisions per assegurar-te que funcioni correctament. En reparacions
no generarà RES."
End If
Case 7
TableLayoutPanel1.BackgroundImage = ControlE.My.Resources._9
Button1.Text = "COMENÇAR"
Label6.Visible = False
TableLayoutPanel1.Controls.Remove(Label2)
Label3.Text = "¡¡¡¡¡¡¡El joc ara comença!!!!!!!"
TableLayoutPanel1.Controls.Remove(Label4)
TableLayoutPanel1.Controls.Remove(Label5)
TableLayoutPanel1.Controls.Remove(Label6)
TableLayoutPanel1.ColumnStyles.RemoveAt(0)
Label1.Text = "Intenta utilitzar al màxim les centrals renovables,
ja que són les que no et generaran cap perjudici. Se't faran preguntes durant el
joc, si contestes bé tindràs beneficis, però tranquil mentre et pregunti es pararà
el temps."
Label1.Visible = True
Label3.Visible = True
Case Else
Form1.TimerHora.Start()
Form1.TimerNuc.Start()
Form1.SecuenciaInicial()
Form1.Show()
Me.Close()
End Select
cops = cops + 1
End Sub
End Class
9.14. Final
Public Class Final
Private Sub Label1_Click(sender As Object, e As EventArgs) Handles Label1.Click
Chart1.Series.Clear()
InicializaLeyenda()
End Sub
Private Sub InicializaLeyenda()
Chart1.Series.Add("Energia Abs")
Chart1.Series.Add("Energia Gen")
Chart1.Series("Energia Abs").ChartType =
DataVisualization.Charting.SeriesChartType.Spline
Chart1.Series("Energia Gen").ChartType =
DataVisualization.Charting.SeriesChartType.Spline
'System.Windows.Forms.
For counter = 0 To 6
Chart1.Series("Energia
Gen").Points.AddXY(GraficHores(counter).ToString(), GraficEnergia(counter))
Chart1.Series("Energia
Abs").Points.AddXY(GraficHores(counter).ToString(), GraficAbs(counter))
Next
End Sub
Private Sub Final_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Chart1.Series.Clear()
InicializaLeyenda()
End Sub
End Class
45
10. Interfaz Gráfica
10. Interfaz Gráfica
Seguidamente, se muestra cual es la interfaz visual que podrá ver el usuario en las
diferentes etapas del juego. En la figura 10.0. se puede ver el diagrama de flujo que sigue el
programa
Finicio
Figura 10.1
FInfo1
Figura 10.3
FInfo2
Figura 10.4
FEventos
Figura 10.11
Se cierra el
programa
FSalir
Figura 10.2
FEventosResp
Figura 10.12
Form1
Figura 10.5
Evento
temporizado
FEventosImagenes
Figura 10.13
Elección
usuario
Pasadas 24
horas
FSol
Figura 10.10
FNuc
Figura 10.9
FHidro
Figura 10.8
FEol
Figura 10.7
Final
Figura 10.14
Figura 10.0. Diagrama de flujo
46
FCicle
Figura 10.6
10. Interfaz Gráfica
10.1. FInicio
Figura 10.1. FInicio
10.2. FSalir
Figura 10.2. FSalir
47
10. Interfaz Gráfica
10.3.FInfo1
Figura 10.3. FInfo1
48
10. Interfaz Gráfica
10.4.Finfo2
Figura 10.4. FInfo2
49
10. Interfaz Gráfica
10.5. Form1
Figura 10.5. Form1
50
10. Interfaz Gráfica
10.6. FCicle
Figura 10.6. FCicle
51
10. Interfaz Gráfica
10.7. FEol
Figura 10.7. FEol
52
10. Interfaz Gráfica
10.8. FHidro
Figura 10.8. FHidro
53
10. Interfaz Gráfica
10.9. FNuc
Figura 10.9. FNuc
54
10. Interfaz Gráfica
10.10. FSol
Figura 10.10. FSol
55
10. Interfaz Gráfica
10.11. FEventos
Figura 10.11. FEventos
10.12. FeventosResp
Figura 10.12. FEventosResp
56
10. Interfaz Gráfica
10.13. FEventosImagenes
Figura 10.13. FEventosImagenes
10.14. Final
Figura 10.14. Final
57
11. Modelo Matemático
11. Modelo Matemático
Pese a ser un trabajo de programación, eso no significa que no tenga un modelo matemático
en el cual se base. Se ha intentado basar el comportamiento de ciertas variables como
la velocidad del viento en modelos probabilísticos reales.
11.1. Energia Consumida Programada
La energía consumida, es decir, la que el usuario tiene que conseguir igualar, se basa
en la demanda real de todo el sistema eléctrico español. A partir de la información obtenida
en la página web de Red Eléctrica de España (REE) y eligiendo un día cualquiera del año,
que en este caso fue el día 18 de abril de 2016, se guardan los valores de la energía consumida
durante ese día, y se asignan a su hora correspondiente. Esto queda reflejado en la función
BaseDatos() en el Form1, como se puede ver en el código 1:
Public Sub BaseDatos()
Select Case Hora
Case 0
EnergiaAbs
Case 1
EnergiaAbs
Case 2
EnergiaAbs
Case 3
EnergiaAbs
Case 4
EnergiaAbs
Case 5
EnergiaAbs
Case 6
EnergiaAbs
Case 7
EnergiaAbs
Case 8
EnergiaAbs
Case 9
EnergiaAbs
Case 10
EnergiaAbs
Case 11
EnergiaAbs
Case 12
EnergiaAbs
Case 13
EnergiaAbs
Case 14
EnergiaAbs
= 31896
= 28405
= 26890
= 25902
= 25020
= 24500
= 25020
= 26908
= 28701
= 29910
= 32000
= 34700
= 35631
= 36082
= 37152
58
11. Modelo Matemático
Case 15
EnergiaAbs
Case 16
EnergiaAbs
Case 17
EnergiaAbs
Case 18
EnergiaAbs
Case 19
EnergiaAbs
Case 20
EnergiaAbs
Case 21
EnergiaAbs
Case 22
EnergiaAbs
Case 23
EnergiaAbs
End Select
End Sub
= 36290
= 36286
= 35900
= 35480
= 34800
= 34100
= 33684
= 32800
= 30820
Código 1. Código de la función BaseDatos()
En este caso, se usó la función Select Case, donde cada hora tiene su valor concreto de
energía.
11.2. Cuotas de Generación
En cuanto a la capacidad de cada fuente de energía se basó en el Informe del Sistema
Eléctrico Español de 2014 de REE[1]. Si nos fijamos en la Figura 11.1. podemos ver cómo
se reparte la potencia instalada del sistema eléctrico peninsular.
[1]
http://www.ree.es/es/estadisticas-del-sistema-electrico-espanol/informe-anual/informe-del-sistemaelectrico-espanol-2014
59
11. Modelo Matemático
Figura 11.1. Potencia instalada en la península.
Para simplificar, se redujo a las siguientes fuentes de energía:
 Ciclo combinado
 Nuclear
 Hidráulica
 Eólica
 Solar (sin distinguir entre fotovoltaica o térmica)
60
11. Modelo Matemático
Con el siguiente reparto:
GENERACIÓN (%)
Solar
7%
Ciclo
Combinado
34%
Eólica
27%
Nuclear
9%
Hidráulica
23%
Figura 11.2. Potencia instalada en el juego.
Si se observa el apartado 11.1. se puede ver que en ningún momento se pasa de 40000
kWh, pero para que el usuario le sea más fácil, el total de la generación será de 50000 kWh,
con el siguiente reparto:

Ciclo combinado .................................................................................... 17000 kWh

Nuclear ..................................................................................................... 4500 kWh

Hidráulica ............................................................................................... 11500 kWh

Eólica ...................................................................................................... 13500 kWh

Solar (sin distinguir entre fotovoltaica o térmica) .................................... 3500 kWh
Teniendo en cuenta que hay fenómenos como las nubes, la variación de la velocidad
del viento, o los beneficios de responder bien a las preguntas, que harán variar estos números.
61
11. Modelo Matemático
11.3. Generación Eólica
La generación eólica sigue una razón cúbica, de acuerdo a la expresión:
1
𝑃𝑇 = 𝐶𝑝 2 𝜌𝐴𝑣 3 (1)
Siendo:

PT: potencia mecánica transformada por la turbina en W.

Cp: coeficiente de potencia de la turbina.

ρ: densidad del aire en kg/m3.

A: Área abarcada por las aspas en m2.

v: velocidad del viento en m/s.
Para implementar esta fórmula en el software, se consideró una única variable: la
velocidad del viento, por ser la que presenta más variabilidad y ser más fácil de plasmar
visualmente. Dado que estadísticamente, (ver apartado 11.4.) las velocidades del viento
suelen ser inferiores a 9 m/s, se decide diferenciar entre dos situaciones. La primera, se trata
de velocidades inferiores a 9 m/s y la segunda para velocidades mayores. La razón de
diferenciar entre estas dos situaciones, se debe a que, al tratarse de una multiplicación al
cubo, para velocidades bajas, solo se genera unos cientos de kWh, haciendo difícil que el
usuario llegue a los valores requeridos. La forma de implementación, se puede ver en el
código 2:
If Viento < 9 Then 'Velocidades lentas
VEol = TrackBarEol.Value * 0.0123456 * AuxEol ^ 3 + (AumentoEolica
/ 100) * (TrackBarEol.Value * 0.0123456 * AuxEol ^ 3)
Else
'Velocidad rápida
VEol = TrackBarEol.Value * 0.0078125 * AuxEol ^ 3 + (AumentoEolica
/ 100) * (TrackBarEol.Value * 0.0078125 * AuxEol ^ 3)
End If
Código2. Cálculo de la energía eólica.
Siendo:

VEol: el valor de energía generada (PT en (1)).

TrackBarEol.Value: el valor que el usuario quiere utilizar siendo un tanto por
mil.

0.0123456/ 0.0078125: una constante para que el valor máximo sea de 13500
kWh.
62
11. Modelo Matemático

AuxEol: la velocidad del viento.
También se ha tenido en cuenta que los aerogeneradores no pueden generar a cualquier
velocidad de viento, tienen un mínimo y un máximo, tal y como se puede ver en la Figura
11.3.
Figura 11.3. Rango de funcionamiento de un aerogenerador.
Este rango queda reflejado en el código 3 y el código 4:
Sub VViento_Sub()
If Viento < 4 Then
'Con ningun viento
FEol.PBViento.Image = ControlE.My.Resources.Resources.Viento0
'Cambiamos el gif
FEol.LabelAvisoEol.Text = " Molins parats"
FEol.TrackBarEol.Enabled = False
ElseIf Viento < 10 Then 'Con poco viento
FEol.PBViento.Image =
ControlE.My.Resources.Resources.Viento40 'Cambiamos el gif
FEol.LabelAvisoEol.Text = ""
ElseIf Viento < 25 Then
'Con viento
FEol.PBViento.Image =
ControlE.My.Resources.Resources.Viento75 'Cambiamos el gif
FEol.LabelAvisoEol.Text = ""
Else
'Con mucho viento
FEol.PBViento.Image =
ControlE.My.Resources.Resources.Viento100 'Cambiamos el gif
FEol.LabelAvisoEol.Text = "Molins parats per seguretat"
FEol.TrackBarEol.Enabled = False
End If
End Sub
Código3. Limitación de la generación eólica.
AuxEol = Viento
If Viento > 15 Then
AuxEol = 15
'Con viento de 15m/s se satura la produccion
63
11. Modelo Matemático
End If
Código4. Saturación de la generación eólica.
En el código 3 se limita la generación a una velocidad de viento de 4 m/s y una máxima
de 25 m/s, mostrando mensajes de aviso al usuario de que la energía eólica está en desuso
por superar estos límites.
El código 4 intenta imitar el comportamiento de la saturación de la curva que podíamos
ver en la figura 11.3. donde a partir de los 13 m/s se satura la generación.
11.4. Velocidad del Viento
La velocidad del viento, como cualquier otro fenómeno meteorológico, tiene una cierta
probabilidad difícil de predecir, pero que con datos históricos, se puede determinar cuál es
la probabilidad de una determinada velocidad de viento, tal y como se ve en la figura 11.4.
Figura 11.4. Histograma de frecuencias relativas de las velocidades del viento
A partir de la Figura 11.4. se genera la Tabla 11.4. donde se entrelazan los valores de
probabilidad para cada velocidad de viento:
Velocidad viento (m/s)
Probabilidad (%)
0
1,1
0,5
1,3
1
2,4
1,5
4,05
64
11. Modelo Matemático
2
5,2
2,5
5,7
3
6,2
3,5
6,3
4
6,2
4,5
6,15
5
6,25
5,5
5,9
6
5,5
6,5
5,1
7
4,5
7,5
4,4
8
3,9
8,5
3,4
9
2,8
9,5
2,4
10
1,7
10,5
1,3
11
1,2
11,5
0,95
12
0,7
12,5
0,7
13
0,5
13,5
0,6
14
0,5
14,5
0,4
15
0,4
15,5
0,35
16
0,3
16,5
0,3
17
0,3
17,5
0,2
18
0,2
65
11. Modelo Matemático
18,5
0,15
19
0,1
19,5
0,1
20
0,075
20,5
0,05
21
0,05
21,5
0,03
22
0,03
22,5
0,02
23
0,01
23,5
0,01
24
0,005
24,5
0,005
25
0,005
25,5
0,005
26
0,005
Tabla 11.4. Probabilidad de velocidad del viento.
Para trasladar estos valores de velocidad de viento al programa, se crea una variable
aleatoria llamada Probabilidad, que toma un valor entre 0 y 100. En función de este valor se
le asigna una velocidad de viento ponderada por su peso probabilístico, tal y como se puede
ver en el código 5:
Sub RandomViento()
Randomize() 'Para que los numeros no sean los mismos cada vez
que se inicia el programa
'Sumaremos todas las probabilidades para que salga un numero
Probabilidad = (Rnd() * 100)
Select Case Probabilidad
'Segun la probabilidad habrá una
velocidad de viento
Case > 97.6
Viento = 1
Case > 91.15
Viento = 2
Case > 80.25
Viento = 3
Case > 67.75
Viento = 4
Case > 55.4
Viento = 5
Case > 43.25
66
11. Modelo Matemático
Viento =
Case > 32.65
Viento =
Case > 23.75
Viento =
Case > 16.45
Viento =
Case > 11.25
Viento =
Case > 8.25
Viento =
Case > 6.1
Viento =
Case > 4.7
Viento =
Case > 3.6
Viento =
Case > 2.7
Viento =
Case > 1.95
Viento =
Case > 1.35
Viento =
Case > 0.85
Viento =
Case > 0.5
Viento =
Case > 0.3
Viento =
Case > 0.175
Viento =
Case > 0.095
Viento =
Case > 0.045
Viento =
Case > 0.025
Viento =
Case > 0.015
Viento =
Case > 0.005
Viento =
Case > 0
Viento =
End Select
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
End Sub
Código 5. Probabilidad de velocidad
11.5. Generación Solar
Para simplificar la aplicación, se dejaron al margen los factores que determinan la
eficiencia de la generación solar y no se distingue entre los diferentes tipos de generación de
67
11. Modelo Matemático
energía eléctrica con energía solar. Se distinguieron tres casos: si había sol y cielo despejado,
si había sol con cielo nublado o si era de noche. Para distinguir entre noche y día se utiliza
la hora, siendo de día de las 7:00 a las 21:00.
En cambio, para determinar cuál es la probabilidad real de que haya nubosidad que
puedan afectar a la producción de energía solar, se utilizan los datos de la Agencia Estatal
de Meteorología de España, en concreto, los valores climatológicos normales del Aeropuerto
de Reus, datos reflejados en la Tabla 11.5.
Mes
Enero
Febrero
Marzo
Abril
Mayo
Junio
Julio
Agosto
Septiembre
Octubre
Noviembre
Diciembre
Año
T
9.0
9.7
11.9
13.8
17.2
21.2
24.2
24.6
21.5
17.5
12.6
9.7
16.1
TM
14.1
14.9
17.1
19.0
22.2
26.3
29.3
29.4
26.3
22.3
17.5
14.6
21.1
Tm R
3.9
29
4.5
28
6.6
28
8.6
37
12.1 54
16.1 25
19.1 15
19.7 42
16.6 77
12.7 75
7.6
53
4.7
36
11.1 500
H
70
68
67
66
66
63
63
66
70
73
72
72
68
DR
4.0
3.5
3.8
5.0
5.4
3.1
2.0
3.6
5.1
6.0
4.4
4.1
49.8
DN
0.2
0.1
0.1
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.4
DT
0.2
0.1
0.3
0.5
1.5
1.4
1.3
2.6
3.1
1.9
0.6
0.3
13.9
DF
0.3
1.3
1.9
0.8
0.4
0.2
0.1
0.2
0.2
0.4
0.3
0.7
6.7
DH
5.7
2.9
0.8
0.0
0.0
0.0
0.0
0.0
0.0
0.0
1.3
3.6
12.5
DD
7.2
5.4
6.0
3.9
4.2
6.3
9.4
6.2
4.8
3.9
5.4
5.7
68.3
I
157
162
197
222
251
274
306
265
209
182
157
145
-
Tabla 11.5. Probabilidades meteorológicas [2]
Siendo:

T
Temperatura media mensual/anual (°C)

TM
Media mensual/anual de las temperaturas máximas diarias (°C)

Tm
Media mensual/anual de las temperaturas mínimas diarias (°C)

R
Precipitación mensual/anual media (mm)

H
Humedad relativa media (%)

DR
Número medio mensual/anual de días de precipitación superior o igual a 1
mm
[2]

DN
Número medio mensual/anual de días de nieve

DT
Número medio mensual/anual de días de tormenta

DF
Número medio mensual/anual de días de niebla
http://www.aemet.es/es/serviciosclimaticos/datosclimatologicos/valoresclimatologicos?l=0016A&k=cat
68
11. Modelo Matemático

DH
Número medio mensual/anual de días de helada

DD
Número medio mensual/anual de días despejados

I
Número medio mensual/anual de horas de sol
A partir de estos datos, se suman todos los días que no se consideran despejados, es
decir DR, DN, DT,DF y DH, que en total suman 83,3 días al año de media.
Lo cual hace una probabilidad del 22,82 % de que un día no tenga las condiciones de
máxima radiación solar. Teniendo en cuenta lo anterior, se establece una probabilidad del
23 % de que cuando el programa realice la serie climatológica, el usuario se vea afectado
por el evento “Nubes”, con lo cual se reduce la producción de energía solar un 30 % , tal y
como se ve en el código 6:
Sub Climatologia() 'Funcion que permite dar un clima aleatorio
Randomize()
Clima = Rnd() * 100 'Le damos un valor aleatorio a la variable
Clima
'Según el valor aleatorio distinguimos entre dos situaciones
If Hora >= 21 Or Hora < 7 Then 'Segun la hora sera de noche
o día
Noche = True
Else
Noche = False
End If
If Noche Then
LabelNubes.Visible = False
PBClima.Image = ControlE.My.Resources.Resources.Noche
TBSol = 0
VSol = 0
Refrescar()
ContEGenSol.ForeColor = Color.Red
LastClim = Clima
Timerlluvia.Stop()
ElseIf Clima < 77 Then 'Probabilidad de sol 77%
ContEGenSol.ForeColor = Color.White
PBClima.Image = ControlE.My.Resources.Resources.Sol
LabelNubes.Visible = False
If LastClim >= 77 Then 'Si el anterior clima fue nubes
TBSol = TBSol + TBSol * 42.874 / 100
'Actualizamos
el valor automaticamente
VSol = VSol + VSol * 42.874 / 100
Timerlluvia.Stop() 'Detenemos la lluvia
If VSol > 3150 Then 'Para evitar valores superiores
al máximo
VSol = 3150
TBSol = 3150
End If
Refrescar()
69
11. Modelo Matemático
End If
LastClim = Clima
Else 'Evento Nubes
ContEGenSol.ForeColor = Color.White
PBClima.Image = ControlE.My.Resources.Resources.nubes
If LastClim < 77 Then
'Si el anterior clima fue sol
TBSol = TBSol - TBSol * 30 / 100
VSol = VSol - VSol * 30 / 100
Refrescar()
End If
LabelNubes.Visible = True
'Mostramos informacion de que
se ha reducido VSol
LastClim = Clima
Timerlluvia.Start() 'La lluvia rellena la presa
End If
End Sub
Código 6. Probabilidad de nubes
11.6. Generación Hidráulica
Para agilizar la aplicación, la generación hidráulica solo depende de lo que el usuario
decida. Para ello se incluye un control deslizante, que tiene un valor entre uno y mil. Cuanto
mayor sea el valor, de forma lineal, más alta es la generación.
Sin embargo, no es un recurso ilimitado, ya que el usuario empieza con una
determinada cantidad de agua, siendo un tanto por ciento del pantano, en concreto el 93%.
Mediante código, se crea una ejecución en paralelo que disminuye la capacidad la presa en
función del valor del control deslizante.
No obstante, para facilitar el transcurso de la aplicación, en el caso de que surja el
evento climatológico “Nubes”, se llenara el pantano, dando a entender al usuario que la
energía hidráulica es una fuente renovable, pero a la vez dependiente de diferentes factores.
En el Código 7 se puede ver cómo funciona la ejecución en paralelo:
Private Sub TimerHidro_Tick(sender As Object, e As EventArgs) Handles
TimerHidro.Tick
If Capacidad <= 10 Then 'Mostramos un mensaje si la capacidad
disminuye demasiado
VAlertaCap()
Else
Capacidad = Capacidad - AuxHidro 'Vamos restando valor a la
capacidad con auxhidro, que es 0 en caso de
'que no haya empezado el programa
70
11. Modelo Matemático
ContPresa.Text = Capacidad & " %"
con cada vuelta
'Actualizamos los labels
FHidro.ContPresa.Text = Capacidad & " %"
RefCapacidad()
If Facil Then
TimerHidro.Interval = (3000 - VHidro / 13)
de lo que generen se reduce mas rapido
'En funcion
Else
TimerHidro.Interval = (3000 - VHidro / 10)
End If
End If
End Sub
Código 7. Ejecución en paralelo
11.7. Generación Nuclear
Para mostrar que la energía nuclear es una central de base que tiene una generación
más o menos constante, la central está siempre activa. El usuario no puedo controlar su
generación, sin embargo, el usuario tendrá que realizar un “mantenimiento” cada cierto
tiempo, para asegurar ese valor de generación. Cuando se realiza el mantenimiento de la
central, su generación será 0. Ver Código 8.
Por tanto el usuario tendrá que anticiparse, ya que si el valor de mantenimiento de la
central llega al 10 %, se reparará sola, pudiendo afectar a su partida.
Private Sub TimerNuc_Tick(sender As Object, e As EventArgs) Handles
TimerNuc.Tick
If Not Facil Then
'Desactivado para el nivel Facil
If ((PBNuc Mod 10) = 0) And PBNuc <> 100 Then
'Si vajamos
un 10% el mantenimiento penalizamos
VNuc = VNuc - 150
End If
End If
Refrescar() 'Vamos actualizando los labels
PBNuc = PBNuc - 1
'Reducimos el mantenimiento
If FNuc.Enabled = True Then 'En caso de que este activa la form,
actualizamos sus valores
FNuc.Label2.Text = PBNuc & "%"
FNuc.ProgressBar1.Value = PBNuc
End If
Labeldesgastnuc.Text = PBNuc & "%"
ProgressBarNuc.Value = PBNuc
71
11. Modelo Matemático
If PBNuc = 10 Then
TimerNuc.Stop()
TimerNucRep.Start()
MessageBox.Show("La central nuclear no pot continuar aixi!!
L'estat t'obliga a fer el manteniment de la cental.", "Alerta",
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation)
End If
End Sub
Código 8. Reducción del mantenimiento de la central nuclear.
11.8. Generación Térmica
En este caso, solo se tiene en cuenta las centrales de ciclo combinado, por ser más
eficientes que los otros tipos de centrales térmicas. Para mostrar que las centrales térmicas
pueden ser utilizadas como centrales de rápida entrada y salida del sistema de generación, la
energía generada se determina por un control deslizante sobre el cual actúa el usuario.
11.9. Funciones didácticas
Para no saturar al usuario con información, en esta aplicación se realizan preguntas
relacionadas con las energías renovables cada cierto tiempo. Las preguntas son de tipo
multirespuesta. Si el usuario acierta, obtendrá importantes beneficios que le ayudarán en el
transcurso de la aplicación, si se equivoca no recibirá ningún efecto negativo.
La intención es que el usuario reciba información de una forma más discreta,
intentando crear un dialogo entre el usuario y el programa. En el Código 9, se puede ver un
extracto de las diferentes preguntas y en el Código 10, sus respectivas respuestas.
Public Sub CargaPreguntas()
Select Case NumPregunta 'Seleccionamos en que pregunta estamos
Case 1
LabelPregunta.Text = "D'on s'obté principalment la
biomassa?"
RadioButton1.Text = "Dels Iogurs amb bífidus"
RadioButton2.Text = "De les restes de plàstic de la
brossa"
RadioButton3.Text = "De les restes de residus forestals i
agrícoles"
Case 2
LabelPregunta.Text = "Les xarxes intel·ligents (smart
grids) són..."
RadioButton1.Text = "xarxes que milloraran l'eficiència
elèctrica"
72
11. Modelo Matemático
RadioButton2.Text = "xarxes formadess per smartphones"
RadioButton3.Text = "tecnologies que encara no han
arribat a Europa"
Case 4
LabelPregunta.Text = "Quin creus que és el nom correcte
d'una central elèctrica marina? (Bouy significa boia)."
RadioButton1.Text = "Power Buoy"
RadioButton2.Text = "Turbo Buoy"
RadioButton3.Text = "Electrical-Marine Buoy"
Case 5
LabelPregunta.Text = "En quina orientació col·locaries
unes plaques solars per aprofitar al màxim el sol?"
RadioButton1.Text = "Orientació Nord"
RadioButton2.Text = "Orientació Sud"
RadioButton3.Text = "És indiferent"
Case 6
LabelPregunta.Text = "Què creus que és una central de
cicle combinat?"
RadioButton1.Text = "Una central on es crema les restes
de residus urbans"
RadioButton2.Text = "Una combinació d'una central tèrmica
i una nuclear"
RadioButton3.Text = "Una central tèrmica que aprofita al
màxim el combustible"
Case 7
LabelPregunta.Text = "En què es basa l'energia
geotèrmica?"
RadioButton1.Text = "En aprofitar l'energia de les fonts
termals"
RadioButton2.Text = "En aprofitar l'escalfor dels raigs
solars"
RadioButton3.Text = "En aprofitar l'energia tèrmica de la
Terra"
End Select
End Sub
Código 9. Preguntas
Public Sub CargarRespuestas()
Select Case NumPregunta
Case 1
If RespCorrecta = "Correcte" Then
Label1.Text = RespCorrecta & ", tota resta orgànica
es pot transformar en biomassa, per després utilitzar-la com a
combustible sent una molt bona opció com a energia renovable.
Es Es redueix el consum de la teva ciutat un 2%!!"
ReduccionConsumo = ReduccionConsumo + 2
Else
Label1.Text = RespCorrecta & ", tota resta orgànica
es pot transformar en biomassa, per després utilitzar-la com a
combustible sent una molt bona opció com a energia renovable."
End If
73
11. Modelo Matemático
PictureBox1.BackgroundImage =
ControlE.My.Resources.Pellets
Case 2
If RespCorrecta = "Correcte" Then
Label1.Text = RespCorrecta & ", les Smart Grids
permeten que els habitatges i els negocis puguin convertir-se en
generadors fent que ja no es depengui tant de grans centrals
Es redueix el consum de la teva ciutat un 2%!!"
ReduccionConsumo = ReduccionConsumo + 2
Else
Label1.Text = RespCorrecta & ", les Smart Grids
permeten que els habitatges i els negocis puguin convertir-se en
generadors fent que ja no es depengui tant de grans centrals"
End If
PictureBox1.BackgroundImage =
ControlE.My.Resources.Smartcity
Case 4
If RespCorrecta = "Correcte" Then
Label1.Text = RespCorrecta & ", la POWER BUOY
aprofita el moviment de les ones, per generar electricitat en el seu eix
vertical, com si d'una manxa de bici es tractés.
Tindràs una generació extra de 1500 kWh per aquest descobriment!!"
EnergiaBase = EnergiaBase + 1500
Else
Label1.Text = RespCorrecta & ", la POWER BUOY
aprofita el moviment de les ones, per generar electricitat en el seu eix
vertical, com si d'una manxa de bici es tractés."
End If
PictureBox1.BackgroundImage =
ControlE.My.Resources.powerbuoy
Case 5
If RespCorrecta = "Correcte" Then
Label1.Text = RespCorrecta & ", en orientació SUD
s'aprofita millor les hores de sol. Les cases orientades al sud
necessiten menys energia per escalfar-se.
Tindràs un augment d'un 10 % en la generació solar"
AumentoSolar = 10
VSol = TBSol + (AumentoSolar / 100) * (TBSol)
Else
Label1.Text = RespCorrecta & ", en orientació SUD
s'aprofita millor les hores de sol. Les cases orientades al sud
necessiten menys energia per escalfar-se."
End If
PictureBox1.BackgroundImage =
ControlE.My.Resources.rosewind
Case 6
If RespCorrecta = "Correcte" Then
Label1.Text = RespCorrecta & ", hi ha un primer cicle
de combustió, i amb els gasos d'aquesta, es fa una segona combustió. Com
si aprofitessis els gasos d'escapament del cotxe per extreure més
energia. La central de la imatge està a prop de Vandellòs.
Tindràs una generació extra de 1500 kWh per aquest descobriment!!"
Else
Label1.Text = RespCorrecta & ", hi ha un primer cicle
de combustió, i amb els gasos d'aquesta, es fa una segona combustió. Com
74
11. Modelo Matemático
si aprofitessis els gasos d'escapament del cotxe per extreure més
energia. La central de la imatge està a prop de Vandellòs."
End If
PictureBox1.BackgroundImage =
ControlE.My.Resources._800px_Ciclo_combinado_Plana_del_Vent
Case Else
If RespCorrecta = "Correcte" Then
Label1.Text = RespCorrecta & ", el nucli de la Terra
es troba a prop dels 6700ºC, una part d'aquesta calor es pot aprofitar
per generar electricitat, però només en llocs especials (amb activitat
volcànica).
Tindràs una generació extra de 1500 kWh per aquest descobriment!!"
EnergiaBase = EnergiaBase + 1500
Else
Label1.Text = RespCorrecta & ", el nucli de la Terra
es troba a prop dels 6700ºC, una part d'aquesta calor es pot aprofitar
per generar electricitat, però només en llocs especials (amb activitat
volcànica)."
End If
PictureBox1.BackgroundImage =
ControlE.My.Resources._800px_GeysirEruptionNear
End Select
End Sub
Código 10. Respuestas
11.10. Excepción
Debido a que los factores climatológicos pueden provocar que el usuario no pueda
llegar a la energía demandada, en el programa se genera una excepción. Cuando surge esa
excepción, se muestra un mensaje al usuario, alertándole de que no se puede llegar a la
energía demandada, y se avisa de que la ciudad vecina le prestará energía, intentando hacer
un símil a la interconexión eléctrica que existe entre España y los países colindantes. Esta
excepción se puede ver en el Código 11.
'/////Comprobacion de energia total/////////////
Dim total As Integer
If Noche Then
If Viento > 25 Then
total = (FCicle.TrackBarCicle.Maximum) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc)
ElseIf Viento > 12 Then
total = (FCicle.TrackBarCicle.Maximum) +
(FEol.TrackBarEol.Maximum * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) *
(FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc)
ElseIf Viento > 4 Then
total = (FCicle.TrackBarCicle.Maximum) +
(FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) *
(FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc)
Else
75
11. Modelo Matemático
total = (FCicle.TrackBarCicle.Maximum) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc)
End If
Else
If Viento > 25 Then
total = (FCicle.TrackBarCicle.Maximum) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc)
ElseIf Viento > 12 Then
total = (FCicle.TrackBarCicle.Maximum) +
(FEol.TrackBarEol.Maximum * 0.005 * AuxEol ^ 3 + (AumentoEolica / 100) *
(FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) +
(FSol.TrackBarSol.Maximum + (AumentoSolar / 100) *
(FSol.TrackBarSol.Maximum))
ElseIf Viento > 4 Then
total = (FCicle.TrackBarCicle.Maximum) +
(FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3 + (AumentoEolica / 100) *
(FEol.TrackBarEol.Maximum * 0.0036 * AuxEol ^ 3)) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) +
(FSol.TrackBarSol.Maximum + (AumentoSolar / 100) *
(FSol.TrackBarSol.Maximum))
Else
total = (FCicle.TrackBarCicle.Maximum) +
(FHidro.TrackBarHidro.Maximum * 10.35) + (VNuc) +
(FSol.TrackBarSol.Maximum + (AumentoSolar / 100) *
(FSol.TrackBarSol.Maximum))
End If
End If
If total < EnergiaAbs Then
MessageBox.Show("Sembla que no pots arribar. Però tranquil
els veïns estan per això. La ciutat veïna et deixa electricitat.", "Oh
oh", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
GraficEnergia(Vuelta) = EnergiaAbs
Código 11. Control de excepción
11.11. Finalización Programa
En cuanto han pasado 6 ciclos de programa (24 horas), se cierra el programa principal,
y el usuario puede ver los valores de generación y los de consumo en función de la hora del
día.
La finalidad es la de establecer una relación entre las curvas de energía programada y
energía generada, para que el usuario pueda ver como la energía va fluctuando a lo largo de
un día, y que pueda intuir las denominadas horas pico y horas valle.
76
12. Conclusiones
12. Conclusiones
Para finalizar, es necesario revisar el cumplimiento de los objetivos marcados:
Hacer el programa más interactivo: el programa es mucho más intuitivo, dinámico
y ameno.
Utilizar un lenguaje más accesible para los usuarios: Visual Basic permite que todo
usuario de Windows puede acceder a este programa y la modificación del código del mismo
sea más fácil.
Implementar diferentes niveles de dificultad: los diferentes niveles aseguran que el
juego sea ameno para diferentes niveles de conocimientos.
Adaptarse a diferentes resoluciones de pantalla: el programa funciona con
resoluciones de pantalla a partir de 800x600 píxeles en adelante.
No infringir derechos de imágenes: en todo el programa solo se han usado imágenes
con derechos Creative Commons o hechas por mí, por tanto, no infringen ningún derecho,
asegurando que el programa pueda distribuirse libremente, ya que los derechos de este
trabajo pertenecen a la universidad.
Continuar con la divulgación de la ingeniería eléctrica: al final se consigue que
usuarios sin conocimientos en ingeniería, aprendan datos curiosos acerca de la misma.
Por tanto, se han cumplido todos los objetivos marcados al principio de este proyecto.
En mi opinión, la única carencia es la de un equipo externo para mejorar el atractivo del
juego, parecido a una maqueta con diferentes dispositivos de entrada y salida, como pueden
ser leds o botones.
Finalmente me gustaría concluir este trabajo diciendo que ha sido uno de los más
completos que he tenido ocasión de realizar. He podido llevar a la práctica muchas de las
enseñanzas adquiridas a lo largo de la carrera.
77
13. Bibliografía
13. Bibliografía
J.A. Barrado, Apuntes de la Asignatura Energías Renovables 2014-2015.
Aprenda Microsoft Visual Basic 6.0 ya ,Michael Halvorson, McGrawHill, 1998.
Microsoft Visual Basic 2010: step by step, Michael Halvorson, , Microsoft Press, 2010.
http://www.ni.com/labview/esa/. [Info LabView] 2016
https://es.wikipedia.org/wiki/LabVIEW [Info LabView] 29/04/2016
https://msdn.microsoft.com/es-es/library/zkxk2fwf(v=vs.90).aspx. [Info C#] 11/2007
https://es.wikipedia.org/wiki/C_Sharp.[Info C#] 21/06/2016
https://msdn.microsoft.com/es-es/library/2x7h1hfk.asp.[Info Visual Basic] 2015
https://es.wikipedia.org/wiki/Visual_Basic [Info visual Basic] 08/07/2016
https://msdn.microsoft.com/es-es/library/3xdhey7w(v=vs.100).aspx[Controles Visual Basic] 2010
http://wwf.moccu.com/game.php?lang=es. [Juego WWF]
http://proyectoislarenovable.iter.es/recursos/juegos/.[Información Juegos]
http://xogo.climantica.org/es/index.html.[Juego CLMTK]
http://www.sustainabilitygame.iberdrola.com/index.php.[Juego Iberdrola] 2013
http://www.electrocity.co.nz/Game/game.aspx[Juego ElectroCity] 2016
http://wwww.ree.es/educacion/controla/. [Juego REE]
https://demanda.ree.es/demanda.html[Demanda REE]
https://commons.wikimedia.org/wiki/File:Sarnia_Solar-06.JPG [Imagen Solar]
https://commons.wikimedia.org/wiki/File:Weather-m-clear.svg [Icono Sol]
https://commons.wikimedia.org/wiki/File:Weather-sun-unsettled.svg [Icono Sol y Nubes]
https://commons.wikimedia.org/wiki/File:Gnome-weather-clear-night.svg[Icono Luna]
https://commons.wikimedia.org/wiki/File:Asc%C3%B3_nuclear_power_plant__smokestack.JPG[Imagen central nuclear]
78
13. Bibliografía
https://commons.wikimedia.org/wiki/File:Ciclo_combinado_Plana_del_Vent.jpg[Ciclo
Combinado]
https://commons.wikimedia.org/wiki/File:Icon_tools.svg[Icono Herramienta]
https://commons.wikimedia.org/wiki/File:Flecha_arriba.svg[Icono Flecha]
https://commons.wikimedia.org/wiki/File:IoTnabled_Smart_City_Framework_White_Paper_Image
_2.png [Imagen Smart City]
https://commons.wikimedia.org/wiki/File:Biomass_Pellets_from_India_-_White_coal..jpg[Imagen
pellets]
https://commons.wikimedia.org/wiki/File:Optbuoy.jpg[Imagen Power Buoy]
https://commons.wikimedia.org/wiki/File:Jorge_Aguiar_Wind_rose.jpg[Imagen
Vientos]
https://commons.wikimedia.org/wiki/File:GeysirEruptionNear.jpg[Imagen Geiser]
79
Rosa
de
los
Descargar