Post on 26-Sep-2018
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
1. Índice
1. Índice .............................................................................................................................. 1
2. Introducción ................................................................................................................... 4
3. Antecedentes .................................................................................................................. 5
4. Objetivos ........................................................................................................................ 6
5. Comparativa de Posibles Soluciones.............................................................................. 7
5.1. LabView .................................................................................................................. 7
5.2. C# ............................................................................................................................ 8
5.3. Visual Basic ............................................................................................................ 8
5.4. Conclusiones ........................................................................................................... 9
6. 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
7. 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.Índice
2
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
1.Índice
3
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
2. Introducción
4
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.
3. Antecedentes
5
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).
4. Objetivos
6
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
5. Comparativa de Posibles Soluciones
7
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
5. Comparativa de Posibles Soluciones
8
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.
5. Comparativa de Posibles Soluciones
9
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
6. Comparativa con Otras Aplicaciones
10
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.
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
Figura 6.1. Juego WWF Switch’em off
6. Comparativa con Otras Aplicaciones
11
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.
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.
Figura 6.2. Juego CLMNTK
6. Comparativa con Otras Aplicaciones
12
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.
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
Figura 6.3. Juego Iberdrola Sustainability Game
Figura 6.4. Juego ElectroCity
6. Comparativa con Otras Aplicaciones
13
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
7. Introducción a Visual Basic
14
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
7. Introducción a Visual Basic
15
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.
Figura 7.2.2. Microsoft Visual Studio 2015
7. Introducción a Visual Basic
16
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,
7. Introducción a Visual Basic
17
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.
7. Introducción a Visual Basic
18
Figura 7.3.1. Controles de Form
8. Índice de Programación
19
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.
8. Índice de Programación
20
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.
8. Índice de Programación
21
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.
9. Código
22
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 /////
9. Código
23
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
9. Código
24
86. FHidro.ContPresa.Text = Capacidad & " %" 87. RefCapacidad() 88. If Facil Then 89. 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
9. Código
25
138. HoraSiguiente = 0 139. ElseIf Hora = 21 Then 140. HoraSiguiente = 1 141. ElseIf Hora = 22 Then 142. HoraSiguiente = 2 143. ElseIf Hora = 23 Then 144. HoraSiguiente = 3 145. Else 146. HoraSiguiente = Hora + 4 147. End If 148. LabelHoraSeg.Text = "Revisió: " & HoraSiguiente & ":00" 149. '//////////Iniciamos las preguntas///////////////// 150. TimerEventos.Start() 'Iniciamos el temporizador de
preguntas 151. '///////Dificultad/////////////////// 152. If Facil Then 153. TimerNuc.Interval = 2000 154. Else 155. TimerNuc.Interval = 1700 156. 157. End If 158. End Sub 159. Sub Refrescar() 'Funcion que permite refrescar el valor total de
energia 160. VTotal = VSol + VEol + VHidro + VNuc + VCicle + EnergiaBase 161. ContEGenSol.Text = VSol 162. ContEGenEol.Text = VEol 163. ContEGenNuc.Text = VNuc 164. ContEGenCicle.Text = VCicle 165. ContEGenTot.Text = VTotal & " kWh" 166. FCicle.ContEGenTot.Text = VTotal & " kWh" 167. FEol.ContEGenTot.Text = VTotal & " kWh" 168. FHidro.ContEGenTot.Text = VTotal & " kWh" 169. FNuc.ContEGenTot.Text = VTotal & " kWh" 170. FSol.ContEGenTot.Text = VTotal & " kWh" 171. End Sub 172. Sub Climatologia() 'Funcion que permite dar un clima aleatorio 173. Randomize() 174. Clima = Rnd() * 100 'Le damos un valor aleatorio a la
variable Clima 175. 'Según el valor aleatorio distinguimos entre dos situaciones 176. If Hora >= 21 Or Hora < 7 Then 'Segun la hora sera de noche o
día 177. Noche = True 178. Else 179. Noche = False 180. End If 181. If Noche Then 182. LabelNubes.Visible = False 183. PBClima.Image = ControlE.My.Resources.Resources.Noche 184. TBSol = 0 185. VSol = 0 186. Refrescar() 187. ContEGenSol.ForeColor = Color.Red 188. LastClim = Clima 189. Timerlluvia.Stop() 190. ElseIf Clima < 77 Then 'Probabilidad de sol 77% 191. ContEGenSol.ForeColor = Color.White 192. PBClima.Image = ControlE.My.Resources.Resources.Sol 193. LabelNubes.Visible = False 194. If LastClim >= 77 Then 'Si el anterior clima fue nubes
9. Código
26
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)
9. Código
27
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
9. Código
28
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
9. Código
29
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"
9. Código
30
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
9. Código
31
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
9. Código
32
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) *
9. Código
33
(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
9. Código
34
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
9. Código
35
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
9. Código
36
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
9. Código
37
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
9. Código
38
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
9. Código
39
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
9. Código
40
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
9. Código
41
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()
9. Código
42
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
9. Código
43
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
9. Código
44
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
9. Código
45
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
10. Interfaz Gráfica
46
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
FinicioFigura 10.1
FInfo1Figura 10.3
FInfo2Figura 10.4
Form1Figura 10.5
FSalirFigura 10.2
FCicleFigura 10.6
FEolFigura 10.7FHidro
Figura 10.8
FNucFigura 10.9
FSolFigura 10.10
FEventosFigura 10.11
FEventosImagenesFigura 10.13
FEventosRespFigura 10.12
FinalFigura 10.14
Se cierra el programa
Evento temporizado
Elección usuario
Pasadas 24 horas
Figura 10.0. Diagrama de flujo
10. Interfaz Gráfica
47
10.1. FInicio
10.2. FSalir
Figura 10.1. FInicio
Figura 10.2. FSalir
10. Interfaz Gráfica
48
10.3.FInfo1
Figura 10.3. FInfo1
10. Interfaz Gráfica
49
10.4.Finfo2
Figura 10.4. FInfo2
10. Interfaz Gráfica
50
10.5. Form1
Figura 10.5. Form1
10. Interfaz Gráfica
51
10.6. FCicle
Figura 10.6. FCicle
10. Interfaz Gráfica
52
10.7. FEol
Figura 10.7. FEol
10. Interfaz Gráfica
53
10.8. FHidro
Figura 10.8. FHidro
10. Interfaz Gráfica
54
10.9. FNuc
Figura 10.9. FNuc
10. Interfaz Gráfica
55
10.10. FSol
Figura 10.10. FSol
10. Interfaz Gráfica
56
10.11. FEventos
10.12. FeventosResp
Figura 10.11. FEventos
Figura 10.12. FEventosResp
10. Interfaz Gráfica
57
10.13. FEventosImagenes
10.14. Final
Figura 10.14. Final
Figura 10.13. FEventosImagenes
11. Modelo Matemático
58
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 = 31896
Case 1
EnergiaAbs = 28405
Case 2
EnergiaAbs = 26890
Case 3
EnergiaAbs = 25902
Case 4
EnergiaAbs = 25020
Case 5
EnergiaAbs = 24500
Case 6
EnergiaAbs = 25020
Case 7
EnergiaAbs = 26908
Case 8
EnergiaAbs = 28701
Case 9
EnergiaAbs = 29910
Case 10
EnergiaAbs = 32000
Case 11
EnergiaAbs = 34700
Case 12
EnergiaAbs = 35631
Case 13
EnergiaAbs = 36082
Case 14
EnergiaAbs = 37152
11. Modelo Matemático
59
Case 15
EnergiaAbs = 36290
Case 16
EnergiaAbs = 36286
Case 17
EnergiaAbs = 35900
Case 18
EnergiaAbs = 35480
Case 19
EnergiaAbs = 34800
Case 20
EnergiaAbs = 34100
Case 21
EnergiaAbs = 33684
Case 22
EnergiaAbs = 32800
Case 23
EnergiaAbs = 30820
End Select
End Sub
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-sistema-
electrico-espanol-2014
11. Modelo Matemático
60
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)
Figura 11.1. Potencia instalada en la península.
11. Modelo Matemático
61
Con el siguiente reparto:
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.
Figura 11.2. Potencia instalada en el juego.
Ciclo Combinado
34%
Nuclear9%Hidráulica
23%
Eólica27%
Solar7%
GENERACIÓN (%)
11. Modelo Matemático
62
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.
11. Modelo Matemático
63
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.
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
Figura 11.3. Rango de funcionamiento de un aerogenerador.
11. Modelo Matemático
64
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.
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
Figura 11.4. Histograma de frecuencias relativas de las velocidades del viento
11. Modelo Matemático
65
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
11. Modelo Matemático
66
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
11. Modelo Matemático
67
Viento = 6
Case > 32.65
Viento = 7
Case > 23.75
Viento = 8
Case > 16.45
Viento = 9
Case > 11.25
Viento = 10
Case > 8.25
Viento = 11
Case > 6.1
Viento = 12
Case > 4.7
Viento = 13
Case > 3.6
Viento = 14
Case > 2.7
Viento = 15
Case > 1.95
Viento = 16
Case > 1.35
Viento = 17
Case > 0.85
Viento = 18
Case > 0.5
Viento = 19
Case > 0.3
Viento = 20
Case > 0.175
Viento = 21
Case > 0.095
Viento = 22
Case > 0.045
Viento = 23
Case > 0.025
Viento = 24
Case > 0.015
Viento = 25
Case > 0.005
Viento = 26
Case > 0
Viento = 27
End Select
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
11. Modelo Matemático
68
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 T TM Tm R H DR DN DT DF DH DD I
Enero 9.0 14.1 3.9 29 70 4.0 0.2 0.2 0.3 5.7 7.2 157
Febrero 9.7 14.9 4.5 28 68 3.5 0.1 0.1 1.3 2.9 5.4 162
Marzo 11.9 17.1 6.6 28 67 3.8 0.1 0.3 1.9 0.8 6.0 197
Abril 13.8 19.0 8.6 37 66 5.0 0.0 0.5 0.8 0.0 3.9 222
Mayo 17.2 22.2 12.1 54 66 5.4 0.0 1.5 0.4 0.0 4.2 251
Junio 21.2 26.3 16.1 25 63 3.1 0.0 1.4 0.2 0.0 6.3 274
Julio 24.2 29.3 19.1 15 63 2.0 0.0 1.3 0.1 0.0 9.4 306
Agosto 24.6 29.4 19.7 42 66 3.6 0.0 2.6 0.2 0.0 6.2 265
Septiembre 21.5 26.3 16.6 77 70 5.1 0.0 3.1 0.2 0.0 4.8 209
Octubre 17.5 22.3 12.7 75 73 6.0 0.0 1.9 0.4 0.0 3.9 182
Noviembre 12.6 17.5 7.6 53 72 4.4 0.0 0.6 0.3 1.3 5.4 157
Diciembre 9.7 14.6 4.7 36 72 4.1 0.0 0.3 0.7 3.6 5.7 145
Año 16.1 21.1 11.1 500 68 49.8 0.4 13.9 6.7 12.5 68.3 -
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
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
[2] http://www.aemet.es/es/serviciosclimaticos/datosclimatologicos/valoresclimatologicos?l=0016A&k=cat
11. Modelo Matemático
69
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()
11. Modelo Matemático
70
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
11. Modelo Matemático
71
ContPresa.Text = Capacidad & " %" 'Actualizamos los labels
con cada vuelta
FHidro.ContPresa.Text = Capacidad & " %"
RefCapacidad()
If Facil Then
TimerHidro.Interval = (3000 - VHidro / 13) 'En funcion
de lo que generen se reduce mas rapido
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
11. Modelo Matemático
72
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"
11. Modelo Matemático
73
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
11. Modelo Matemático
74
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
11. Modelo Matemático
75
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
11. Modelo Matemático
76
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.
12. Conclusiones
77
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.
13. Bibliografía
78
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]
13. Bibliografía
79
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 Rosa de los
Vientos]
https://commons.wikimedia.org/wiki/File:GeysirEruptionNear.jpg[Imagen Geiser]