Post on 28-Feb-2023
UNIVERSIDAD PONTIFICIA COMILLAS
ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA (ICAI) INGENIERO INDUSTRIAL
PROYECTO FIN DE CARRERA
Programa gráfico para el
posicionamiento de seguidores en
huertas solares fotovoltaicas
conectadas a red
AUTOR: Paula Calles Ayastuy
MADRID, Septiembre de 2007
Resumen
Actualmente existen muchos factores que están provocando una grave
crisis tanto energética como medioambiental. Por un lado, el cercano
agotamiento de los combustibles fósiles evidencia la necesidad de disponer de
otros sistemas eficientes de generación de energía. Además, el crecimiento
desproporcionado de la demanda que no se corresponde con el de la generación
plantea la necesidad de diversificar las fuentes de energía y la posibilidad de su
uso a pequeña escala que no precisen de sistemas de distribución de electricidad
(especialmente recomendable en el caso de las energías renovables).
Finalmente el cambio climático está impulsando una elevada restricción
medioambiental orientada a aumentar las inversiones en energías renovables.
Dentro de las energías renovables encontramos la Solar fotovoltaica para
la que España, por su privilegiada situación y climatología, está especialmente
indicada.
El presente proyecto trata de facilitar la instalación de sistemas de
generación de energías renovables, concretamente de huertas solares
fotovoltaicas conectadas a red las cuales se realizan mediante seguidores
solares. Este tipo de instalaciones está experimentando un gran desarrollo en
España debido a las propicias condiciones en que está situado dado que las
compañías distribuidoras están obligadas a comprar la energía generada por este
tipo de instalaciones.
El problema que presenta este tipo de instalaciones es el de calcular las
distancias entre seguidores. Hasta el momento, el cálculo de la proyección de
sombras entre seguidores debe realizarse manualmente lo que implica una gran
pérdida de tiempo. Algunos fabricantes de seguidores solares adjuntan
recomendaciones sobre las distancias a guardar según el tipo de seguidor; sin
embargo, estas distancias son muy genéricas y en muchos casos, muy
conservadoras.
En el caso de que el fabricante no realice ninguna recomendación, el valor
de la distancia que suele utilizarse es el que se obtiene de calcular la sombra que
proyecta un seguidor a las 12 del mediodía solar del día correspondiente al
solsticio de invierno (21 de Diciembre); día en el que la sombra es más alargada.
Sin embargo, este cálculo es muy poco preciso puesto que no permite saber a lo
largo del año la cantidad de sombra que va a recibir cada seguidor, dato que
permitiría realizar un diseño más preciso según las necesidades.
El problema de las sombras es especialmente importante en el caso de la
energía solar fotovoltaica debido a su funcionamiento. La capacidad de generar
energía eléctrica de una célula fotovoltaica está supeditada a la presencia de
radiación solar incidente sobre ella, por lo que en el momento en el que ésta
desaparezca, la célula dejará de generar.
Lo que pretende el presente proyecto es facilitar una herramienta que
permita realizar dichos cálculos de forma clara y rápida con la finalidad de que el
responsable de diseñar la instalación pueda escoger, en base a los criterios
propios de cada proyecto, la disposición que más le convenga.
Primero se hizo un estudio del problema con el fin de decidir las mejoras
que se podían conseguir. Por un lado, la dificultad que suponía la utilización de
las ecuaciones tridimensionales del movimiento del Sol se simplifica
enormemente mediante la programación.
Además, manualmente resulta inviable hacer el cálculo de la sombra
proyectada por un seguidor a lo largo de todo el año y más aún si se tiene en
cuenta que para ver la sombra que incide sobre un seguidor habrá que calcular
la que proyectan todos los que le rodean. En programación, mediante bucles
resulta bastante sencillo realizar esta operación.
Al irse desarrollando el diseño del proyecto ha habido que hacer frente a
diferentes problemas derivados de la programación. Lo que implica un mayor
número de problemas es el hecho de que el diseño debe realizarse para un caso
lo más genérico posible.
El resultado final es un programa que, introduciéndole los datos referentes
al seguidor: Base de la parrilla de módulos, Altura de la parrilla de módulos,
Altura de la columna del seguidor y ángulo máximo de inclinación del seguidor,
una disposición de la huerta mediante un plano de AutoCAD y la ubicación de la
instalación, muestra la sombra que va a incidir sobre cada seguidor cada mes del
año.
La herramienta utilizada para presentar los resultados es Microsoft Excel
puesto que permite al usuario, una vez finalizado el programa utilizar y
manipular los datos obtenidos.
Dada la facilidad de uso del programa y la rapidez con la que permite
realizar estos cálculos, el usuario puede probar fácilmente varias disposiciones
distintas y varios seguidores diferentes para después, con ayuda de los valores
obtenidos, decidir cuál es la que más le interesa.
Como conclusión cabe destacar que este programa por sí mismo resulta
una herramienta muy útil a la hora de diseñar la disposición de los seguidores
fotovoltaicos en huertas solares conectadas a red; sin embargo, también puede
utilizarse como base para desarrollar programas más complejos en este mismo
ámbito. Por ejemplo para realizar un programa que dibuje las sombras en cada
uno de los seguidores o uno que calcule dichas sombras pudiendo colocar en
cada posición seguidores diferentes bastaría con ampliar el presente proyecto.
Summary
Many of circumstances are currently leading up to a serious crisis in both, the
energy and environmental fields. On the one hand, the imminent running out of
fossil fuels shows that other efficient energy generating systems are required.
Besides the fact that the huge increase in the demand of energy which is not
consistent with the generation, gives raise to the need of diversifying the energy
sources and the need of using such sources on a small scale which do not
require an electricity supply network (strongly recommended in case of
renewable energy).
Finally, many environmental restrictions in support of increasing the investment
in renewable energy are being caused by the climatic change.
Within the renewable energies the photovoltaic energy is included. Due to the
geographical circumstances and the climatic conditions of Spain, this energy is
specially suitable in this country.
The purpose of this project is to make easier the instalment of renewable
energy’s generating systems. In particular, the installation of photovoltaic farms
connected to the network which are carried out by means of sun trackers. This
kind of installations are growing and developing in Spain due to the fact that the
energy supply companies are bound to purchase the energy produced by such
installations.
The calculation of the distance that must be kept between the sun trackers
would be the most inconvenience identified in this kind of installations. So far,
the estimation of the shadow projected between sun trackers must be carried
out manually, this leading up to an important waste of time. A number of sun
trackers’ manufacturers do attach their advises on the distance that should be
kept depending on the type of sun trakers.Albeit this advise is commonly a
generic distance and, in many occasions, very conservative.
In cases where no advise is given by the manufacturer, the distance is
commonly obtained from calculating the shadow which is projected by a sun
tracker at 12 p.m. in the winter solstice (i.e. 21st December). This is the day of
the year with the most extended shadow. However, this calculation is not very
precise since there is no way to be aware of the quantity of shadow that each of
the sun trackers would receive during the year. This data would allow to carry
out a more precise design depending on the particular needs.
Because of the operation of the solar photovoltaic energy, the problem of the
shadow is specially relevant. The electricity generating capacity of a photovoltaic
cell is subject to the solar radiation affecting the cell. For that reason, the cell
will stop generating as soon as the radiation disappears.
The aim of this project is to provide a tool which enables calculating on a clear
and quick manner. This way, the person in charge of designing the installation
will be able to choose the most convenience layout/arrangement in view of the
criteria to be followed in each project.
At a previous step, the problem was analyzed in order to evaluate the
improvements that could be achieved. By way of programming, the difficulty of
using the equations of the Sun’s movement was simplified.
Additionally, it is unfeasible to calculate the shadow which is projected by a sun
tracker during the whole year. Even more considering that for the shadow
affecting a particular sun tracker to be obtained, it is required to calculate the
one projected by the other sun trackers nearby. In programming, this operation
is quite easy by means of loops.
Whilst developing the design of this project, a number of problems arising out of
programming have been faced. The most relevant inconvenience being that the
design must be carried out for a single case, as more generic as possible.
The final result is a program which, by including the data in connection with the
sun tracker: the base and the height of the sun trackers, iii) height of the sun
tracker’s column and the maximum inclination angle of the sun trackers, iv) the
layout of the farm by an AutoCAD design and v) the arrangement of the
installation, shows the shadow that will be affecting each of the sun trakers
during each month in a year.
Given that Microsoft Excel enables the user changing and manipulating the data
obtained once the program has been finalized, this tool has been chosen to show
the results.
Provided the easiness of the program and the quick the calculus are made, the
user can easily try a number of different layouts and different sun trackers. In
view of the values obtained, the user will be able to decide which of them is the
most advisable one.
By way of conclusion, it should be highlighted that this program appears to be a
very useful tool when designing the layout of photovoltaic sun trackers in solar
farms connected to the network. Additionally, appears to be also useful for
developing more complex programs in this same field. This program would be
the basis of the most complex one. For instance, in order to carry out a program
which either draws each of the sun trackers’ shadow or calculates such shadows
allowing the possibility of establishing different sun trakers in every position, it
will be enough by extending the current project.
INDICE 1 Introducción y planteamiento del proyecto…… 1 1.1 Introducción…………………………………………………… 2 1.1.1 La energía solar………………………………………………….. 4 1.1.2 Energía solar fotovoltaica…………………………………….. 4 1.2 Planteamiento del proyecto…………………………………… 8 2 Descripción de las tecnologías……………………… 11 3 Descripción d el modelo desarrollado…………… 15 3.1 Objetivos y especificación……………………………… 16 3.1.1 Objetivos……………………………………………………………. 16 3.1.2 Especificación……………………………………………………… 16 3.1.2.1 Especificaciones del seguidor………………………… 16 3.1.2.2 Especificaciones de la disposición…………………… 16 3.1.2.3 Especificaciones de la ubicación del terreno…… 17 3.2 Datos………………………………………………………………….. 17 3.2.1 Introducción de datos…………………………………………. 17 3.2.1.1 Dimensiones del seguidor……………………………… 17 3.2.1.2 Distribución de los seguidores………………………. 17 3.2.1.3 Ubicación de la instalación………………………….… 18 3.3 Algoritmos…………………………………………………………… 18 3.3.1 Cálculos previos al código…………………………………….. 19 3.3.1.1 Ejes fijos y ejes solidarios al seguidor……………… 22 3.3.1.2 Coordenadas de un seguidor genérico……………… 23 3.3.1.3 Proyección de la sombra………………………………… 26 3.3.1.4 Calculo de sombra sobre un seguidor genérico…. 27 3.3.1.4.1 Seguidor nº1………………………………. 30 3.3.1.4.2 Seguidor nº2………………………………. 30 3.3.1.4.3 Seguidor nº3………………………………. 31 3.3.1.4.4 Seguidor nº4………………………………. 31 3.3.1.4.5 Seguidor nº5………………………………. 32 3.3.1.4.6 Seguidor nº6………………………………. 32 3.3.1.4.7 Seguidor nº7………………………………. 33 3.3.1.4.8 Seguidor nº8………………………………. 33 3.3.2 Desarrollo del código……………………………………………. 34 3.3.2.1 Obtención de datos desde un plano de Autocad…. 34 3.3.2.2 Procesamiento de los datos…………………………….. 42 3.3.2.2.1 El movimiento del Sol……………………. 43 3.3.2.2.1.1 La Latitud…………………………………………………………. 43 3.3.2.2.1.2 La posición del sol……………………………………………… 45 3.3.2.2.2 Posición del seguidor…………………….. 52 3.3.2.2.2.1 Coordenadas locales del seguidor………………………… 53 3.3.2.2.2.2 Coordenadas globales del seguidor………………………. 57 3.3.2.2.3 Cálculo de la sombra……………………… 59 3.3.2.2.3.1 Longitud de la sombra………………………………………… 59 3.3.2.2.3.2 Coordenadas locales de la sombra………………………. 62 3.3.2.2.3.3 Coordenadas globales de la sombra……………………… 63
3.3.2.2.4 Cálculo de las pérdidas por sombra…. 64 3.3.2.2.4.1 Seguidor nº1……………………………………………………… 66 3.3.2.2.4.2 Seguidor nº2……………………………………………………… 68 3.3.2.2.4.3 Seguidor nº3……………………………………………………… 69 3.3.2.2.4.4 Seguidor nº4……………………………………………………… 70 3.3.2.2.4.5 Seguidor nº5……………………………………………………… 71 3.3.2.2.4.6 Seguidor nº6……………………………………………………… 72 3.3.2.2.4.7 Seguidor nº7……………………………………………………… 73 3.3.2.2.4.8 Seguidor nº8……………………………………………………… 74 3.3.2.2.5 Final del programa………………………. 75 3.3.2.3 Presentación de los resultados en tabla de Excel. 77 3.4 Implantación numérica………………………………………. 78 4 Análisis de los resultados……………………………………… 83 4.1 Caso 1……………………………………………………………………. 85 4.2 Caso 1-2…………………………………………………………………. 85 4.3 Caso 2-3…………………………………………………………………. 87 4.4 Caso 3-4…………………………………………………………………. 87 5 Conclusiones…………………………………………………………… 89 5.1 Conclusiones sobre los resultados…………………………….. 90 5.2 Recomendaciones para futuros estudios……………………. 90 6 Bibliografía……………………………………………………………… 91 7 Apéndice………………………………………………………………… 93 7.1 Estructuras de decisión……………………………………… 95 7.1.1 Sentencia IF ... THEN ... ELSE ... ……………………………… 95 7.1.2 Sentencia SELECT CASE…………………………………........... 96 7.2 Estructuras de bucle…………………………….................... 97 7.2.1 Sentencia FOR ... NEXT…………………………………............ 97 7.2.2 Sentencia DO…LOOP……………………………………............. 98 8 . Código…………………………………………………………............... 99
1.1 Introducción
La energía es fundamental para el desarrollo económico de un país y para el
bienestar de su población. Forma parte del instrumental económico, pues se la
requiere para activar todo tipo de maquinaria o herramienta y, aunque no se
incorpora materialmente a los bienes o servicios producidos, tiene incidencia en los
costos de producción. Además, es un bien de consumo final que se utiliza para la
satisfacción (para el confort) humano. Esto la convierte en un bien estratégico y su
disponibilidad resulta primordial.
La seguridad en el abastecimiento energético requiere de un equilibrio entre
las diversas fuentes energéticas, a fin de evitar o reducir nuestra exposición a
eventuales problemas en el suministro. En este sentido, a fin de contribuir a tener
una mayor seguridad, es necesaria una correcta diversificación en el suministro y
distribución de energía, tanto para los diferentes tipos de energía como de las
distintas fuentes. La energía es un bien básico y estratégico que se encuentra en la
agenda actual de todos los países o regiones comerciales. Hechos como el
desajuste entre oferta y demanda de combustibles fósiles y el consiguiente efecto
sobre los precios, o las restricciones en el suministro de gas, han suscitado un
debate sobre el futuro energético mundial y la elaboración de estrategias que
permitan no sólo garantizar el suministro energético a largo plazo sino también
conforme a unos criterios de responsabilidad medioambiental.
España no es ajena a este contexto de preocupación. Muy al contrario,
tenemos mayores motivos de inquietud: un grado de dependencia energética
superior al 80%; inseguridad en el actual armazón regulatorio del sector;
indefinición sobre el uso en el futuro de determinadas fuentes de energía; elevada
restricción medioambiental y pérdida de peso en los escenarios internacionales. Sin
embargo, también contamos con otros elementos a favor como un mix tecnológico
bien diversificado; una posición ventajosa en el desarrollo de energías renovables.
La elevada dependencia de las importaciones para satisfacer la demanda
española de energía pone en evidencia otra de las características de nuestro patrón
energético: su vulnerabilidad. Más del 65% del consumo energético en el Estado
español descansa sobre los combustibles fósiles, de los que apenas producimos un
2%. El resto lo importamos de países que (en total importamos un 80% de
nuestros recursos energéticos), en un momento dado, podrían cortar el suministro;
entre otros motivos, porque tengan que hacer frente a su propia demanda interna.
Es por esto que para España, y mas concretamente para su estructura productiva,
2
resulta esencial superar las debilidades que presenta el actual modelo energético,
con el fin de elevar la eficiencia y reducir la dependencia del petróleo y la
consiguiente vulnerabilidad ante las fluctuaciones de los mercados internacionales
de este recurso.
Por otro lado, las emisiones de gases de efecto invernadero (derivadas de la
combustión de estos recursos fósiles) seguirán sobrepasando con creces los
compromisos fijados
De todo lo expuesto se deduce que el balance energético español es
lamentable, por lo que resulta absolutamente necesario potenciar las energías
renovables.
Se denominan energías renovables a aquellas que se obtienen de fuentes
naturales virtualmente inagotables, unas por la inmensa cantidad de energía que
contienen, y otras porque son capaces de regenerarse por medios naturales.
Las fuentes renovables de energía pueden dividirse en dos categorías: no
contaminantes o limpias y contaminantes. Entre las primeras encontramos la
energía solar, energía eólica, energía hidráulica, energía mareomotriz, energía
geotérmica. En el caso de las contaminantes, que son las realmente renovables, se
obtienen a partir de la materia orgánica o biomasa, y se pueden utilizar
directamente como combustible o bien convertida en bioetanol o biogás mediante
procesos de fermentación orgánica o en biodiésel, mediante reacciones de
transesterificación.
Hace tiempo que las energías renovables se han considerado como una
alternativa a las energías tradicionales, tanto por su disponibilidad presente y
futura garantizada (a diferencia de los combustibles fósiles que precisan miles de
años para su formación) como por su menor impacto ambiental en el caso de las
energías limpias Según la Comisión Nacional de Energía española, la venta anual de
energía del Régimen Especial se ha multiplicado por más de 10 en España, a la vez
que sus precios se han rebajado un 11 %. Se considera que el Sol abastecerá estas
fuentes de energía (radiación solar, viento, lluvia, etc.) durante los próximos cuatro
mil millones de años. La primera ventaja de la mayor cantidad de fuentes de
energía renovables es que no producen gases de efecto invernadero ni otras
emisiones, contrariamente a lo que ocurre con los combustibles, sean fósiles o
renovables. Algunas fuentes renovables no emiten dióxido de carbono adicional,
salvo los necesarios para su construcción y funcionamiento, y no presentan ningún
riesgo suplementario, tales como el riesgo nuclear.
3
Además, el uso a pequeña escala de energías renovables, que a menudo
puede producirse "in situ", disminuye la necesidad de disponer de sistemas de
distribución de electricidad. Los sistemas corrientes, raramente rentables
económicamente, revelaron que un hogar medio que disponga de un sistema solar
con almacenamiento de energía, y paneles de un tamaño suficiente, sólo tiene que
recurrir a fuentes de electricidad exteriores algunas horas por semana.
Por lo tanto, las ventajas más significativas derivadas del uso de las energías
renovables serían: no emiten CO2 a la atmósfera y evitan así el proceso de
calentamiento terrestre como consecuencia del efecto invernadero, no contribuyen
a la formación de lluvia ácida, no dan lugar a la formación de NOx , no necesitan
sofisticadas medidas de seguridad dado que no producen residuos tóxicos de difícil
o imposible tratamiento o eliminación. Los impactos derivados de estas energías
son de menor dimensión y más localizados, por lo tanto más fácilmente corregibles
o controlables. Además sus efectos no son permanentes ya que no se prolongan
después de la utilización de la fuente energética.
1.1.1 La energía solar
El Sol, fuente de vida y origen de las demás formas de energía que el hombre
ha utilizado desde los albores de la Historia, puede satisfacer todas nuestras
necesidades, si aprendemos cómo aprovechar de forma racional la luz que
continuamente derrama sobre el planeta. Ha brillado en el cielo desde hace unos
cinco mil millones de años, y se calcula que todavía no ha llegado ni a la mitad de
su existencia. Durante el presente año, el Sol arrojará sobre la Tierra cuatro mil
veces más energía que la que vamos a consumir.
España, por su privilegiada situación y climatología, se ve particularmente
favorecida respecto al resto de los países de Europa, ya que sobre cada metro
cuadrado de su suelo inciden al año unos 1.500 kilovatios-hora de energía, cifra
similar a la de muchas regiones de América Central y del Sur.
Esta energía puede aprovecharse directamente, o bien ser convertida en
otras formas útiles como, por ejemplo, en electricidad. No sería racional no intentar
aprovechar, por todos los medios técnicamente posibles, esta fuente energética
gratuita, limpia e inagotable, que puede liberarnos definitivamente de la
dependencia del petróleo o de otras alternativas poco seguras, contaminantes o,
simplemente, agotables. Es preciso, no obstante, señalar que existen algunos
problemas que debemos afrontar y superar.
4
Aparte de las dificultades que una política energética solar avanzada
conllevaría por sí misma, hay que tener en cuenta que esta energía está sometida a
continuas fluctuaciones y a variaciones más o menos bruscas. Así, por ejemplo, la
radiación solar es menor en invierno, precisamente cuando más la solemos
necesitar. Es de vital importancia proseguir con el desarrollo de la incipiente
tecnología de captación, acumulación y distribución de la energía solar, para
conseguir las condiciones que la hagan definitivamente competitiva, a escala
planetaria.
1.1.2 Energía solar fotovoltaica
Las «células solares», dispuestas en paneles solares, ya producían
electricidad en los primeros satélites espaciales. Actualmente se perfilan como la
solución definitiva al problema de la electrificación rural, con clara ventaja sobre
otras alternativas, pues, al carecer los paneles de partes móviles, resultan
totalmente inalterables al paso del tiempo, no contaminan ni producen ningún ruido
en absoluto, no consumen combustible y no necesitan mantenimiento. Además, y
aunque con menos rendimiento, funcionan también en días nublados, puesto que
captan la luz que se filtra a través de las nubes.
La electricidad que así se obtiene puede usarse de manera directa (por
ejemplo para sacar agua de un pozo o para regar, mediante un motor eléctrico), o
bien ser almacenada en acumuladores para usarse en las horas nocturnas. También
es posible inyectar la electricidad generada en la red general, obteniendo un
importante beneficio.
Si se consigue que el precio de las células solares siga disminuyendo,
iniciándose su fabricación a gran escala, es muy probable que, para la segunda
década del siglo, una buena parte de la electricidad consumida en los países ricos
en sol tenga su origen en la conversión fotovoltaica.
La energía solar puede ser perfectamente complementada con otras energías
convencionales, para evitar la necesidad de grandes y costosos sistemas de
acumulación. Así, una casa bien aislada puede disponer de agua caliente y
calefacción solares, con el apoyo de un sistema convencional a gas o eléctrico que
únicamente funcionaría en los periodos sin sol. El coste de la «factura de la luz»
sería sólo una fracción del que alcanzaría sin la existencia de la instalación solar.
5
Desde que la conservación de las fuentes de energía no renovables empezó
a tratarse como una necesidad, los desarrollos que se han producido en el
aprovechamiento de las energías renovables han sido espectaculares. En concreto,
el actual mercado fotovoltaico crece de forma contundente y lo más importante
respaldado por un interés gubernamental.
• Previsiones de potencia a instalar
Debemos remitirnos al Plan de Fomento de las Energías Renovables. El
Consejo de Ministros (30/12/1999) aprobó el Plan de Fomento de las Energías
Renovables para el período 2000-2010. El Plan es una planificación de carácter
indicativo que recoge los principales elementos y orientaciones para la articulación
de una estrategia que logre que el crecimiento de cada una de las áreas de
energías renovables pueda cubrir, en su conjunto, al menos el 12 por 100 del
consumo de energía primaria en España en el año 2010, que es el objetivo que
recoge la Ley 54/1997 del Sector Eléctrico.
Así, las energías renovables en el año 2010 deberán aportar al
abastecimiento nacional 16,6 millones de tep, frente a los 7,1 millones de tep
actuales. Este objetivo implica duplicar la participación de estas energías en el
consumo de energía primaria.
La planificación propuesta tiene un marcado carácter indicativo al definirse en
un contexto, en el marco de la UE, de liberación creciente hacia un Mercado Único
de la energía. Sin embargo, por su carácter estratégico y beneficios intrínsecos,
presentes en diversos ámbitos, a las energías renovables se les otorga un
tratamiento específico diferenciado.
Con la ejecución de este Plan, además de cubrirse el 12,3 por 100 de la
demanda total de energía en España en el año 2010 con energías renovables, se
consiguen los principales objetivos trazados para la política energética nacional: la
diversificación de las fuentes primarias para garantizar la seguridad en el
suministro energético, la eficiencia en su utilización y el respeto al medio ambiente.
Por otro lado, el Plan de Fomento se revela como un instrumento
indispensable para alcanzar los compromisos adquiridos por España en el campo
medioambiental, en concreto en materia de limitación de las emisiones de gases de
efecto invernadero.
6
Como principales efectos derivados de la ejecución del Plan cabe citar:
• Fortalecimiento y conformación de un moderno tejido industrial para el
sector a través del desarrollo y la puesta en el mercado de tecnologías propias que
producirán unos efectos de importancia creciente sobre la exportación. Se podría
establecer en más de 1.000 el número de empresas que hasta el año 2006 pueden
surgir para el aprovechamiento directo de las energías renovables, lo que
contribuirá de forma efectiva a la creación de empleo.
• El ahorro de emisiones de CO2 derivado de la ejecución del Plan se ha
estimado entre 19,5 y 41,5 millones de toneladas en el año 2010, según las fuentes
de energías renovables sustituyan, respectivamente, al gas natural o al carbón para
la generación de energía eléctrica.
Las energías y áreas técnicas que considera el Plan son: biomasa, de la cual
se aprovecha su contenido energético en una primera transformación (residuos
agrícolas, forestales, cultivos energéticos, etcétera) o en una segunda etapa
(residuos animales transformados a biogás, biocarburante, etcétera); eólica;
aprovechamiento de la energía cinética del viento; hidráulica, aprovechamiento de
la energía potencial del agua; solar: energía solar térmica en sus diversas
transformaciones (pasiva, directa y termoeléctrica) y fotovoltaica; y valorización
energética de residuos urbanos (biogás, sólidos, etcétera).
Los datos más relevantes sobre solar fotovoltaica que define el Plan los
encontramos resumidos en la siguiente tabla. El Plan de Fomento de las Energías
Renovables tiene como previsión el instalar durante el período 2000-2010, 135
MWp nuevos en sistemas fotovoltaicos. De esta cantidad, aproximadamente 20
MWp podrían corresponder a aplicaciones aisladas de la red y 115 MWp a
aplicaciones conectadas. Detalle sobre el gráfico anterior en la siguiente tabla:
• Ventajas e inconvenientes
Las ventajas de la energía solar fotovoltaica son numerosas. En primer
lugar, son sistemas silenciosos, limpios y respetuosos con el medio ambiente, y
suponen un gran ahorro en el traslado de energía, puesto que se encuentran cerca
del punto de consumo. Cuando se trata de centrales fotovoltaicas, se requiere poco
tiempo para su construcción, cerca de las localidades a las que tiene que
suministrar energía. En el caso de los paneles fotovoltaicos instalados en las
7
viviendas, éstos requieren un mínimo mantenimiento ofreciendo un gran periodo de
vida útil, con lo que se amortiza en un breve periodo de tiempo. En definitiva, su
uso ofrece un suministro de energía continuo y fiable sin tener que depender de las
fuentes de energía convencional.
En cuanto a los inconvenientes, las instalaciones fotovoltaicas tienen unas
limitaciones que deben llevar a sus usuarios a la moderación en el consumo y al
empleo de aparatos de consumo con elevados rendimientos. Asimismo, el precio y
el gran tamaño de los paneles solares frenan su expansión, puesto que la
tecnología disponible actualmente requiere de una gran superficie de captación.
1.2 Planteamiento del proyecto
El presente proyecto trata de facilitar la instalación de sistemas de
generación de energías renovables, concretamente de huertas solares fotovoltaicas
conectadas a red las cuales se realizan mediante seguidores solares. Como ya se ha
comentado en la introducción, este tipo de instalaciones está experimentando un
gran desarrollo en España.
En este tipo de instalación resulta especialmente importante la disposición
con la que van a instalarse los seguidores; sin embargo, dada la situación actual,
resulta especialmente difícil y tedioso obtener unos valores óptimos para la
disposición. Por lo tanto, la motivación principal a la hora de realizar este proyecto
surge de la inexistencia de un software comercial genérico para todo generador por
lo que resultaría interesante la implantación de un sistema de cálculo de sombras
con el fin de hallar la mejor disposición para los seguidores comerciales con la que
conseguir el máximo aprovechamiento solar.
Debido a la inexistencia de un software con las características comentadas,
hasta el momento el cálculo de la proyección de sombras entre seguidores debía
realizarse manualmente lo que implica una gran pérdida de tiempo. Para realizar un
exhaustivo cálculo de la sombra que incide sobre un seguidor dispuesto en una
huerta solar, hay que tener en cuenta tanto la posición del sol como la del seguidor.
El problema es que ambas varían a cada momento por lo que el número de cálculos
puede ser infinito. Dado que es imposible realizarlos para cada instalación, se
utilizan algunas soluciones con sus correspondientes limitaciones.
8
Algunos fabricantes de seguidores solares adjuntan recomendaciones sobre
las distancias a guardar según el tipo de seguidor; sin embargo, estas distancias
son muy genéricas y en muchos casos, muy conservadoras.
En otros casos se proponen unas distancias según el incremento de
rendimiento deseado, pero nuevamente resultan demasiado poco particulares.
Además, no permiten saber realmente los valores de incremento de rendimiento o
de porcentaje de sombra.
Cuando el fabricante no realiza ninguna recomendación, los cálculos debe
realizarlos el propio diseñador de la instalación. En estos casos se recomienda
efectuar los cálculos para el día del solsticio de invierno, que es cuando la
trayectoria del sol es más baja y, por lo tanto, las sombras alcanzan su máxima
longitud sobre el suelo. Concretamente, estos cálculos suelen realizarse para el
mediodía solar de dicho día. Sin embargo, utilizando las distancias así calculadas,
durante un amplio intervalo de días, especialmente en los meses de diciembre y
enero, se producirá sombreado en los seguidores y por lo tanto es posible que
durante esos meses apenas pueda ser inyectada energía útil a la red, a pesar de
que los paneles puedan recibir en esos meses una apreciable cantidad de radiación.
Este problema es exclusivo de los paneles fotovoltaicos puesto que en el caso
de los colectores térmicos, el anterior sombreado no tendría más consecuencia que
una pequeña disminución en su rendimiento durante el invierno.
La razón por la que la incidencia de sombras resulta tan decisiva para el
rendimiento de una instalación fotovoltaica reside en el funcionamiento de las
células fotovoltaicas. El principio de funcionamiento de las mismas es el siguiente:
9
o La unión de dos elementos semiconductores, uno de tipo N y
otro de tipo P, provoca una diferencia de potencial en las
proximidades de esa unión.
o Los fotones transfieren la energía de la radiación solar incidente
a los electrones de los semiconductores, liberándolos de la red
cristalina a la que estaban unidos (generación electrón-hueco)
o La diferencia de potencial existente en la unión provoca un flujo
ordenado de portadores (electrones y huecos) fotogenerados,
originando una diferencia neta de potencial en la célula.
o Mediante los contactos existentes en la célula, puede
disponerse un circuito exterior, por el que circulará una
corriente eléctrica, la cual podrá entregar potencia eléctrica útil.
La diferencia de potencial existente entre los extremos de la célula solar
fotovoltaica se debe a la separación espacial de los portadores fotogenerados. Estos
potadores sólo mantienen su condición de “libres” durante un tiempo limitado, al
cabo del cual se recombinan y pierden su capacidad para formar parte de una
corriente eléctrica por lo que su funcionamiento requiere de la presencia de la
radiación solar incidente.
Por todo lo expuesto, lo que pretende el presente proyecto es facilitar una
herramienta que permita realizar los cálculos de sombras de forma clara y rápida
con la finalidad de facilitar la optimización de las inatalaciones de huertas solares
fotovoltaicas conectadas a red.
10
Para el desarrollo del proyecto se han utilizado tres programas
relacionándolos entre sí:
o AutoCAD
o Microsoft Excel
o Visual Basic 6
Básicamente, la herramienta que sirve de unión es el Visual Basic, además
es este programa el que lleva el peso del proyecto. Visual Basic es una herramienta
de programación que permite crear aplicaciones para Microsoft Windows.
De cara a este proyecto, la ventaja que presenta Visual Basic frente a otras
herramientas de programación es que esta permite programar aplicaciones tanto
para Excel como para AutoCAD. Además la aplicación terminada es un auténtico
.exe que utiliza una máquina virtual que se puede distribuir sin necesidad de tener
el programa de Visual Basic
AutoCad es una herramienta de dibujo, que en este caso va a utilizarse
como entrada de datos, mediante un plano. Realmente utiliza el archivo .dxf
correspondiente al plano. AutoCAD DXF (Drawing Exchange Format) es un formato
de archivo desarrollado por AutoDesk para facilitar el intercambio de dibujos de
AutoCAD con otros programas de CAD. Es un archivo que contiene el código del
dibujo de AutoCAD de tal forma que puede leerse como un archivo de texto. Esta
última cualidad es la que se ha aprovechado en el proyecto para facilitar la
obtención de datos del plano.
Microsoft Excel es un programa de hoja de cálculo. En el presente proyecto,
este programa se utiliza para presentar mediante una tabla el resultado obtenido
mediante el programa que se ha desarrollado. Una de las razones por la que se ha
elegido este programa es que, una vez obtenidos los resultados, pueden ser
utilizados para realizar otras operaciones.
Microsoft Excel también se utiliza para realizar un intercambio dinámico de
datos con Visual Basic; esto permite obtener de una tabla memorizada en Excel un
dato necesario para el desarrollo del programa.
12
La forma en la que se relacionan estas tres herramientas y, por lo tanto, la
forma en la que se desarrolla el programa es el siguiente:
o El usuario introduce los datos que el .exe le pide, entre ellos la
ubicación del plano de AutoCAD (el archivo DXF del plano)
o Mediante Visual Basic se transforman los datos, los que lo
necesiten, a un formato útil para su manejo. Esto se realiza de
dos formas:
Se abre el archivo DXF del plano y mediante un archivo
de texto se extraen los datos de situación de los
seguidores. Estos datos son colocados en matrices.
Se abre en Excel la tabla asociada a las latitudes de las
Comunidades Autónomas y se realiza un intercambio
de datos entre Visual Basic y Excel de forma que se
obtiene el valor de la latitud correspondiente a la
Comunidad escogida. Se cierra la tabla.
Se procesan todos los datos hasta obtener los
resultados deseados, los porcentajes de sombra de
cada seguidor en cada mes.
Se crea una tabla en Excel donde con los resultados
obtenidos.
En la siguiente figura se muestra el flujo de información entre los
programas:
13
3.1 Objetivos y especificación.
3.1.1 Objetivos
o Establecimiento de criterios para el cálculo de sombras
o Cálculo de sombras para la generación de seguidores
o Implantación en ecuaciones tridimensionales de la geometría solar
o Ofrecer una herramienta que permita optimizar la energía solar en las
huertas solares fotovoltaicas.
3.1.2 Especificación
Las especificaciones para el presente proyecto se en tres apartados. Las
especificaciones de los seguidores para los que se va a diseñar el programa, de la
disposición de los mismos y por último, la ubicación del terreno.
3.1.2.1 Especificaciones del seguidor.
A pesar de existir muchos tipos de seguidores, los que se han utilizado para
diseñar este proyecto han sido los seguidores de dos ejes puesto que permiten
realizar un seguimiento casi completo del movimiento del sol. Esto implica que la
posición del seguidor en cada momento viene determinada por la posición del Sol o,
lo que es lo mismo, las variables que la determinan.
Sin embargo, hay que tener en cuenta que éstos seguidores tienen algunas
limitaciones. La más importante a la hora del diseño de este proyecto es que tienen
un ángulo máximo de inclinación por lo que el seguidor no siempre se mantendrá
perpendicular a los rayos del sol en cuanto a lo que altura solar se refiere. Cuando
la altura solar sea inferior a dicho ángulo máximo, el seguidor se mantendrá con
dicha inclinación aunque la altura solar disminuya.
3.1.2.2 Especificaciones de la disposición.
Como disposición genérica se ha utilizado una bastante habitual y que
coincide con la recomendación de los fabricantes de diseñadores. Se trata de un
marco de implantación rectangular respecto a los ejes Norte-Sur y Este-Oeste.
16
Además se ha supuesto un único tipo de seguidor en cada caso de forma que
en dicha disposición todos los seguidores sean iguales.
3.1.2.3 Especificaciones de la ubicación del terreno.
El espacio para la ubicación del terreno se ha limitado a las Comunidades
Autónomas Españolas. Lo que la ubicación del terreno especifica es la latitud del
lugar y por lo tanto, la posición del sol respecto de los seguidores.
3.2 Datos
3.2.1 Introducción de datos.
Esta es la parte del programa orientada hacia El usuario y la única a la que el
mismo tiene acceso. Aquí de lo que se trata es de definir la instalación para la cual
se quieren obtener los datos de sombra, por lo que está dividido en tres partes: las
dimensiones del seguidor, la distribución que se quiere estudiar y la ubicación de la
misma.
3.2.1.1 Dimensiones del seguidor
Las dimensiones que van a definir el seguidor que se quiere estudiar
el ancho y alto de la parrilla de módulos, altura de la columna y ángulo
máximo de inclinación. En la siguiente figura puede verse a qué
corresponde cada una de estas dimensiones. La función que cumple
cada una de ellas en el desarrollo del programa se explicará más
adelante.
3.2.1.2 Distribución de los seguidores
La distribución de los seguidores se introducirá mediante un plano de
Autocad. Sin embargo, este plano deberá introducirse en la extensión
*.dxf. Este es el Formato de intercambio de dibujos de Autocad
(Drawing Interchange Format). Lo que esto supone de cara al
programa que se ha desarrollado es que es un archivo de texto donde
se va almacenando lo que Autocad va dibujando, de tal manera que,
17
leyendo dicho archivo, pueden obtenerse todos los datos asociados al
dibujo.
Para permitir que el programa pueda obtener los datos necesarios del
plano, es necesario facilitar la siguiente información: el nombre de la
capa correspondiente a la posición de los seguidores. La función de
estos datos se explicará más adelante, en el apartado referente a la
obtención de datos desde Autocad.
3.2.1.3 Ubicación de la instalación
En este caso, lo que se requiere es la Comunidad Autónoma en la que
va a realizarse la instalación. La función de este dato es la conocer la
Latitud correspondiente para poder conocer con exactitud la posición
del sol respecto a los seguidores en cada momento.
La ventana de introducción de datos tiene la siguiente forma:
3.3 Algoritmos
Previamente al desarrollo del código, se estudio la forma de llevar a cabo los
cálculos que se debían realizar. La base del programa es el cálculo de las sombras
que sobre un seguidor proyectan todos los de su alrededor; por lo tanto, la manera
18
en al que va a realizarse ese cálculo será la que defina la dinámica del programa y,
en consecuencia, el desarrollo del programa.
3.3.1 Cálculos previos al código.
La primera decisión que se debía tomar era la forma en la que se iba a
realizar el cálculo de las sombras. El método elegido fue el de intersección de
planos y la metodología la siguiente:
Lo que se pretende es obtener la sombra que proyecta un seguidor sobre
otro; la idea es que los límites de la sombra los definirán las sombras proyectadas
por las aristas del seguidor. Por lo tanto, bastará calcular la intersección entre la
sombra proyectada por dichas aritas y la superficie del seguidor sobre el que incide
la sombra. Dichas rectas intersección estarán contenidas en la superficie del
seguidor.
Según lo expuesto, lo que hay que conseguir son dos rectas. Dado que una
recta se pude definir como la intersección entre dos planos lo que tratamos es de
hallar los dos planos que definan a cada una de las dos rectas.
Por un lado, uno de los planos será el plano definido por el seguidor sobre el
que se proyecta lo sombra. Como en ambos casos las rectas intersección están
contenidas en la superficie de dicho seguidor, este plano será común a ambas.
Los otros dos planos deberán contener la arista que se quiere proyectar y su
sombra. Una de estas aristas será siempre la arista superior del seguidor. La otra,
que será una de las aristas laterales, dependerá del lugar en el que se sitúe un
seguidor respecto al otro y de la posición del sol respecto a ambos.
Existen múltiples formas de definir un plano (tres puntos no alineados, una
recta y un punto exterior a ella, dos rectas paralelas o dos rectas secantes); en
este caso se ha optado por definirlo mediante tres puntos no alineados contenidos
en él.
A continuación se van a detallar los pasos a seguir para la obtención de los
planos a partir de tres puntos no alineados, la intersección entre planos y,
finalmente, la intersección entre dos líneas.
19
o primero habrá que definir los tres puntos que serán de la
forma:
R=( ) 321 ,, rrr
S=( ) 321 ,, sss
T=( ) 321 ,, ttt
Los elementos necesarios para lograr la ecuación del plano son
dos vectores directores y un punto. Los dos vectores
directores serán ( )y ( ) y el punto, s. → →
a 321 ,, aaa b 321 ,, bbb
Los vectores directores se calculan a través de los tres puntos
ya definidos de la siguiente forma:
111 tsa −= 111 rtb −=
222 tsa −= 222 rtb −=
333 tsa −= 333 rtb −=
La forma del plano que se ha utilizado es la reducida,
resultado de igualar a cero el determinante formado por los
dos vectores y el punto genérico X=(x, y, z) con el punto
dado. De esta manera la ecuación del plano es
det[(X-P) , u , v]=0 => Ax +By +Cz +D =0
Donde (A, B, C) es un vector perpendicular al plano y coincide
con el producto vectorial de los vectores u y v.
En el caso particular que estamos tratando, habrá que calcular
tres planos:
0321 =+++ dzvyvxv 0321 =+++ ezwywxw
20
0321 =+++ fzuyuxu
Desarrollando el determinante anterior, obtenemos:
)()*( 23321 babav −−=
))()*(( 13312 babav −−−=
)()*( 12213 babav −−=
332211 *** vsvsvsd −−−=
Este plano será el común a ambas rectas. Los valores de los
otros dos planos se hallarán de la misma forma que el anterior
sustituyendo las v y la d por lo que corresponda.
Por lo tanto, las dos rectas intersección vendrán definidas por
los planos:
r1: 0321 =+++ dzvyvxv
0321 =+++ ezwywxw
r2: 0321 =+++ dzvyvxv
0321 =+++ fzuyuxu
De donde, operando obtenemos las siguientes rectas:
3
131
*1
wwv
vra −= 3
232
*1
wwv
vrb −= 3
3 *1
wev
drc −=
3
131
*2
wwu
ura −= 3
232
*2
wwu
urb −= 3
3 *2
weu
frc −=
Y por lo tanto las coordenadas X e Y del punto de intersección
de ambas rectas será:
21
22*11
12
2*1
rbrarbra
rcrb
rcrb
X−
−=
22)*2(
rbrcXraY +
−=
En el caso del plano definido por el seguidor, bastará con utilizar tres de los
cuatro extremos del mismo y así que dará perfectamente definido el mismo.
Para el caso de los otros dos planos, se ha optado por utilizar los dos puntos
que corresponden al extremo de la arista que se deba emplear y la proyección de la
sombra de uno de ellos sobre el suelo.
Una vez definida la metodología que se va a seguir, hay que ver la manera de
llegar hasta ella.
3.3.1.1 Ejes fijos y ejes solidarios al seguidor.
El primer paso era definir unos ejes que sirvieran como base de coordenadas
para poder definir los puntos, los planos y todo lo necesario para hallar las
sombras.
Definir los ejes fijos es bastante sencillo. Como una de las bases de todos
estos cálculos es el movimiento del sol el cual se define a través de los ejes Norte-
Sur y Este-Oeste parece bastante lógico utilizar estos mismos ejes como ejes fijos.
Además, el tipo de instalaciones que se están estudiando, las huertas solares
conectadas a red, se suele utilizar un marco de implantación rectangular según
esos mismos ejes. Por lo tanto adoptando los ejes N-S, E-O como fijos se facilita
considerablemente el trabajo.
Hay que tener en cuenta que el tipo de seguidores para los que se está
diseñando el programa, son seguidores con seguimiento de dos ejes. Esto significa
que en todo momento permanecen perpendiculares a los rayos del sol. Como la
posición del sol se define mediante dos ángulos (Azimut solar,ψ , y Altura solar,α ),
la posición del seguidor respecto de los ejes fijos también estará definida por esos
dos ángulos. Por lo tanto, resulta muy complicado proyectar cualquier punto del
22
seguidor directamente sobre los ejes fijos. Para facilitar el trabajo, se han utilizado
unos ejes solidarios al seguidor tales que su posición respecto a los ejes fijos
vendrá definida por el Azimut.
Como puede apreciarse en la figura(num de la figura) el sentido positivo del
eje x se ha hecho coincidir con el Oeste y el sentido positivo del eje y con el Sur. La
razón por la que se ha elegido el Sur como el sentido positivo de la y se debe al
Azimut que, como se ha comentado anteriormente, toma como origen el Sur.
A los ejes solidarios al seguidor de ahora en adelante se les llamará ejes
locales y a los ejes fijos, ejes globales de tal forma que cualquier variable con
subíndice L estará en ejes locales y lo mismo ocurrirá con el subíndice G.
Las ecuaciones que relacionarán los ejes locales con los globales serán los
siguientes:
ψψ senyxx LLG −= cos
ψψ cosLLG ysenxy +=
3.3.1.2 Coordenadas de un seguidor genérico
El siguiente paso es definir las coordenadas de los extremos del seguidor en
los ejes locales y globales. Para ello se utiliza un seguidor genérico de tal forma que
el eje de coordenadas se sitúe en la base del mismo. La numeración de los
extremos del seguidor va a ser la siguiente (en la figura se representa un momento
en el que el Azimut solar es cero):
23
Una vez numerados los extremos del seguidor genérico, queda definir el valor
de las coordenadas de esos cuatro en ejes locales para unos valores de Altura solar
y Azimut solar igualmente genéricos.
Para definir dichas coordenadas habrá que tener en cuenta que la base de la
parrilla de módulos se mantiene en todo momento paralela al eje X lo que implica
que la coordenada X de los cuatro extremos del seguidor se mantendrá
invariable; independientemente de los valores que adopten las variables Altura y
Azimut solar. Por lo tanto las coordenadas X de los cuatro extremos del seguidor
valdrán:
L
L
L
221basexx LL ==
243basexx LL −==
En el caso de la coordenada Y , es un poco más complicado. De las variables
referentes a las dimensiones del seguidor, en la que habrá que fijarse es en la
altura de la parrilla de los módulos; sin embargo, en este caso, el valor de la
proyección dependerá del ángulo de inclinación del seguidor. Dicho ángulo de
inclinación viene definido por la Altura solar o, más directamente, por su
complemento, el Ángulo cenital.
L
24
Antes de proceder a escribir las ecuaciones correspondientes falta determinar
un último detalle. Puesto que los ejes locales son solidarios al seguidor y giran
junto con él, los extremos 1 y 4 tendrán siempre un valor en coordenada y local
positivo, mientras que los extremos 2 y 3 serán siempre negativos.
Por todo lo expuesto hasta ahora y dada la simetría del seguidor tanto
respecto del eje X como del Y , el valor absoluto de la coordenada Y de los
cuatro extremos del seguidor será el mismo. Exactamente lo mismo ocurre en el
caso de los valores de la coordenada X L .
L L L
θcos241
alturayy LL ==
θcos232
alturayy LL −==
Finalmente queda por ver el valor de z para los cuatro extremos del seguidor.
Como ya se ha comentado el eje z no varía de ejes locales a globales por lo que no
hay necesidad de hacer distinciones.
Aquí es donde entra en juego la Altura de la columna del seguidor. Dicha
altura corresponde a la distancia existente entre el suelo y el centro del seguidor.
Lo que hay que determinar es la altura de los extremos del seguidor en cualquier
momento.
Dado el tipo de movimiento que realiza el seguidor, manteniéndose en todo
momento perpendicular a los rayos del sol, cuando el seguidor esté inclinado los
extremos 1 y 4 se mantendrán siempre a una altura inferior que le de los extremos
2 y 3. Por lo tanto, excepto en el caso en que el seguidor esté totalmente paralelo
al suelo o lo que es lo mismo, totalmente horizontal (bastante improbable), la
altura de los extremos 1 y 4 será inferior a la de la columna del seguidor y la altura
de los extremos 2 y 3, superior.
Para el cálculo de estos datos será necesario conocer tanto la altura de la
columna del seguidor como la altura de la parrilla de los módulos y el valor del
Ángulo cenital:
25
)(*241 θsenalturahZZ LL −==
)(*232 θsenalturahZZ LL +==
Dado que los cuatro extremos del seguidor genérico ya están totalmente
definidos para los ejes locales y que su adaptación a los ejes globales es inmediata
a través del Azimut, la obtención del primero de los planos necesario para el cálculo
de la sombra ya queda resuelto.
3.3.1.3 Proyección de la sombra
Una vez que las coordenadas de los extremos ya son conocidas en todo
momento, se puede proceder a calcular la proyección de la sombra de dichos
extremos. La definición de estos datos permitirá, finalmente, obtener las
ecuaciones de los dos planos que quedaban por calcular en la actividad que nos
ocupa; el cálculo de la sombra.
Como ya se ha comentado en el capítulo 1, en un instante en el que el Sol se
encuentra en una posición definida por su azimut y su altura, la longitud sobre el
suelo horizontal de la sombra de un objeto de altura h será:
)tan(αhl =
Esta longitud está calculada sobre el eje y local. Concretamente, dado que el
sol se encuentra en todo momento situado en el eje y positivo, esta longitud será
siempre negativa en el eje y local.
De lo expuesto se deduce que la sombra sólo afectará a la coordenada y local
de los extremos, quedando de la siguiente manera:
1cos241 dalturayy LL −== θ
2cos232 dalturayy LL −−== θ
26
Donde d1 y d2 corresponde al valor de la longitud de la sombra. Para el
cálculo de estas longitudes habrá que utilizar la altura de los extremos del panel; es
decir, la coordenada z correspondiente a cada extremo:
αtan/11 hd =
αtan/22 hd =
De tal manera que:
)(*2
1 41 θsenalturahZZh LL −===
)(*2
2 32 θsenalturahZZh LL +===
Concluido el cálculo de las coordenadas de la sombra de los extremos del
seguidor en ejes locales, al igual que sucedía con las coordenadas de dichos
extremos, la proyección de éstas sobre los ejes globales es inmediata sabiendo el
azimut solar.
3.3.1.4 Calculo de sombra sobre un seguidor genérico.
Finalmente, para definir los planos cuya intersección será la sombra
proyectada de un seguidor sobre otro, solo queda decidir en cada ocasión cuál de
las aristas laterales será la que haya que tener en cuenta.
La solución planteada es la siguiente: A un seguidor cualquiera colocado en
una huerta solar, le darán sombra todos los seguidores que tenga alrededor. En
general, se supondrá que el seguidor está totalmente rodeado por otros seguidores.
Como el criterio que se utiliza para la colocación de los mismos es la de
ordenarlos en filas y columnas, en el caso de un seguidor que esté totalmente
rodeado la disposición será la siguiente:
27
El seguidor genérico sobre el que se proyectarán las sombras es el del centro,
el rayado. La numeración de la figura es la que se va a seguir en el desarrollo del
programa y en este apartado va a utilizarse para definir en cada caso los planos
que formarán parte del cálculo.
Básicamente, lo que determinará los planos a utilizar será la posición de cada
uno de los ocho seguidores respecto del central en cada momento; en definitiva, el
azimut solar. Se estudia cada caso por separado.
Al tratarse de planos infinitos, excepto que los tres sean paralelos, siempre
habrá intersecciones entre unos y otros; lo cual no significa que un seguidor esté
proyectando sombra sobre otro. Este hecho implica que debe especificarse en qué
momento se considera qué la sombra de uno se está proyectando sobre el otro y en
qué momento no.
El caso más fácil es el común a todos; es decir, el de la intersección que
forman los planos definidos por el seguidor genérico y el de la sombra de la arista
superior del panel cuya sombra se esté estudiando. Dado que esta arista es
siempre la 2-3, los planos serán los formados por los puntos:
o 1 , 2 y 3 globales del seguidor genérico.
o 2 y 3 del seguidor de la sombra junto con la proyección de la
sombra del punto 3.
Para obtener las coordenadas en ejes globales de los puntos 2 y 3 (y en
general de los cuatro extremos del seguidor) basta sumarle a las coordenadas
globales de esos mismos puntos del seguidor genérico, la distancia entre el
seguidor que estemos estudiando y el anterior; es decir, si S y es la x Sy
28
separación entre el seguidor genérico y unos de los ocho seguidores que le rodean,
las coordenadas globales de este último serán:
xGG SgenéricoXX +=
YGG SgenéricoYY +=
Una vez obtenida la recta intersección entre estos dos planos, habrá que
comprobar que se encuentre por encima de la arista inferior del seguidor, en caso
contrario la sombra no incidirá sobre el seguidor genérico.
La altura de la recta intersección entre los dos planos será la siguiente:
2
233
2
2
2
211
*
)*(*)*(
wvw
v
wvedX
wvwv
Zrecta
−
−+−−=
Donde el valor de la x será el correspondiente al valor de la coordenada x en
ejes globales del extremo 1 del seguidor.
Además habrá que comprobar que la sombra no se encuentra fuera de la
superficie del seguidor, bien sea por la izquierda o por la derecha.
La forma de obtener las coordenadas de los puntos que definen el plano de la
sombra de la arista lateral es idéntica a la expuesta anteriormente. Por la forma en
la que se va a calcular dicho plano o, más concretamente, la forma en la que se
realiza la elección de la arista que define el plano, lo que habrá que comprobar es
que las coordenadas x e y del punto de intersección de las dos líneas esté dentro de
la superficie del seguidor genérico; es decir, dentro de los valores de x y de y de los
extremos del seguidor en cada instante:
41 GG XXX >>
31 GG YYY >>
29
Cuando la X y la Y estén entre esos valores máximos y mínimos, uno de los
ocho seguidores, el que se esté calculando, estará proyectando sombra sobre el
seguidor genérico.
3.3.1.4.1 Seguidor nº1
El seguidor nº1 es el que se halla al Suroeste del seguidor que nos
sirve de base. Como puede apreciarse en la figura, este seguidor
proyectará sombra sobre el seguidor central a partir del mediodía
solar. Por la manera en la que se han definido los ángulos, después
del mediodía solar el azimut será negativo (a la hora de hablar de la
posición solar, por convención, el azimut es negativo si se refiere a
antes del mediodía y positivo después; sin embargo, dado el
funcionamiento de los ángulos en un eje de coordenadas, negativo
según el movimiento de las agujas del reloj, resulta más práctico
utilizar el signo del azimut al contrario para definir la posición del eje
local respecto del global).
Además, para la elección de los planos que definen la sombra
habrá que diferenciar dos posiciones:
o Azimut>-45º arista lateral 3-4
o Azimut<-45º arista lateral 1-2
o A partir de Azimut=-90º, no proyectará sombra.
3.3.1.4.2 Seguidor nº2
Este seguidor se encuentra al Oeste del seguidor que nos sirve de
referencia. Como consta en la figura, este seguidor proyectará
sombra sobre el seguidor central a partir del mediodía solar, cuando
el azimut sea negativo.
Además, para la elección de los planos que definen la sombra
habrá que diferenciar dos posiciones:
o Azimut>-90º arista lateral 3-4
30
o Azimut<-90º arista lateral 1-2
o En este caso, la variable valdrá cero. YS
3.3.1.4.3 Seguidor nº3
Este está al Noroeste del seguidor que nos sirve de referencia. El
seguidor nº3 proyectará sombra sobre el seguidor central a partir del
mediodía solar, cuando el azimut sea negativo y dada su ubicación,
cuando el azimut sea menor que menos noventa grados.
Además, para la elección de los planos que definen la sombra
habrá que diferenciar dos posiciones:
o Azimut>-135º arista lateral 3-4
o Azimut<-135º arista lateral 1-2
o Sin embargo, teniendo en cuenta que el valor
máximo del azimut está en torno a los 120º, la
última opción no es necesario tenerla en cuneta.
3.3.1.4.4 Seguidor nº4
El seguidor nº4 está justo al norte del seguidor genérico. Por lo
general, dado el movimiento del sol que se ha estudiado en capítulos
anteriores, este seguidor no proyectará sombra sobre el genérico
excepto en casos excepcionales en los que ambos seguidores estén
muy próximo. Se ha decidido incluirlo por si en algún caso resulta
interesante conocer su aportación. Según lo comentado, este
seguidor cabe la posibilidad de que proyecte sombra por la mañana
muy temprano o a última hora de la tarde y únicamente durante unos
pocos días del verano.
Por lo tanto habrá que diferenciar entre las dos posiciones
comentadas, la que se refiere a la mañana (azimut positivo) y la de
la tarde(azimut negativo).
31
o Azimut>0 arista lateral 3-4
o Azimut<0 arista lateral 1-2
o En este caso, la variable valdrá cero. XS
3.3.1.4.5 Seguidor nº5
Este seguidor se encuentra al Noreste del seguidor que nos sirve
de referencia. Como consta en la figura, este seguidor proyectará
sombra sobre el seguidor central antes del mediodía solar, cuando el
azimut sea positivo. Los valores relevantes del azimut para el caso
del seguidor nº5 son similares a los del seguidor nº3 teniendo en
cuenta que en este último caso el azimut era negativo.
Para la elección de los planos que definen la sombra habrá que
diferenciar dos posiciones:
o Azimut< 135º arista lateral 1-2
o Azimut>135º arista lateral 3-4
o Como el azimut no superará el valor de 135º, bastará
con usar como límite los 90º a partir de los cuales
será cuando este seguidor comience a proyectar
sombra.
3.3.1.4.6 Seguidor nº6
Este seguidor se encuentra al Este del seguidor que nos sirve de
referencia. Como consta en la figura, este seguidor proyectará
sombra sobre el seguidor central antes del mediodía solar, cuando el
azimut sea positivo.
Para la elección de los planos que definen la sombra habrá que
diferenciar dos posiciones:
o Azimut>90º arista lateral 3-4
o Azimut<90º arista lateral 1-2
o En este caso, la variable valdrá cero. YS
32
3.3.1.4.7 Seguidor nº7
Este seguidor se encuentra al Sureste del seguidor que nos sirve
de referencia. Como consta en la figura, este seguidor proyectará
sombra sobre el seguidor central antes del mediodía solar, cuando el
azimut sea positivo. Los valores relevantes del azimut para el caso
del seguidor nº7 son similares a los del seguidor nº1 teniendo en
cuenta que en este último caso el azimut era negativo.
Para la elección de los planos que definen la sombra habrá que
diferenciar dos posiciones:
o Azimut< 45º arista lateral 1-2
o Azimut>45º arista lateral 3-4
3.3.1.4.8 Seguidor nº8
Este seguidor se encuentra al Sur del seguidor que nos sirve de
referencia. La sombra de este seguidor se intersecará con el seguidor
genérico en las horas cercanas al mediodía solar (tanto azimut
positivo como negativo) y especialmente en invierno, cuando la
sombra es más alargada.
Para la elección de los planos que definen la sombra habrá que
diferenciar dos posiciones:
o Azimut>0º arista lateral 3-4
o Azimut<0º arista lateral 1-2
o En este caso, la variable valdrá cero. XS
33
3.3.2 Desarrollo del código
3.3.2.1 Obtención de datos desde un plano de Autocad
Esta parte del programa se ha desarrollado para poder leer los datos de
posición de cada uno de los seguidores según el plano indicado por el usuario y
ordenarlos de tal forma que sean útiles para el resto del programa.
Lo que se pretendía es obtener unas matrices con las coordenadas x, y z de
cada uno de los seguidores de tal forma que la distribución de la matriz coincida
con la de los seguidores sobre el plano.
Es decir, de lo que se trata es de lo siguiente (va a ilustrarse con un
ejemplo):
En este caso se trata de una distribución de 6 seguidores dispuestos de la
siguiente forma:
Puesto que hay 3 coordenadas diferentes en x y otras 3 en y, la matriz
resultante será de 3*3 lo que implica 9 posiciones; por lo tanto, aquellas en las que
no hay seguidores serán 0. De esta manera puede asociarse muy fácilmente los
datos de la matriz con los seguidores a los que corresponden.
A continuación se verá paso a paso cada una de las instrucciones y su función
hasta obtener las matrices finales anteriormente comentadas.
For cont = 1 To Filas Do linea = Dibujo.readline j = j + 1 If j > Filas Then Exit For End If Loop While StrComp(linea, "SEGUIDORES") <> 0 Do linea = Dibujo.readline j = j + 1 Loop While StrComp(linea, " 10") <> 0
34
i = i + 1 ReDim Preserve xDibujo(i) ReDim Preserve yDibujo(i) ReDim Preserve zDibujo(i) xDibujo(i) = Dibujo.readline Dibujo.skipline yDibujo(i) = Dibujo.readline Dibujo.skipline zDibujo(i) = Dibujo.readline j = j + 5 Next Dibujo.Close
Estas instrucciones del código lo que hacen es leer el archivo DXF asociado al
plano indicado por el usuario. Para extraer del mismo los datos que necesita, utiliza
el nombre de la capa asignada a los seguidores. Por lo tanto, la manera de trabajar
es la siguiente:
o Busca en el archivo de texto la palabra ENTITIES, momento a partir
del cual comienza a dibujar.
o Buscar en el archivo de texto la palabra que corresponde al nombre
de los seguidores, por ejemplo, SEGUIDORES.
o Cuando encuentra la palabra SEGUIDORES, sigue buscando hasta
encontrar el “10” que corresponde a la coordenada x.
o Una vez encontrado el 10, pasa a la siguiente línea que corresponde
al valor de la coordenada x lo almacena en una matriz llamada
xDibujo().
o Se salta la siguiente línea, que será un “20”, y almacena el valor que
corresponde a la coordenada y en la matriz yDibujo().
o Se salta la siguiente línea, que será un “30”, y almacena el valor que
corresponde a la coordenada z en la matriz zDibujo().
o Una vez hecho esto con todo el archivo, cierra el mismo.
35
o Para asegurarnos de que lee todas las líneas y evitar errores, en unas
instrucciones anteriores, abre el archivo, lee el número de filas que
tiene y lo vuelve a cerrar. Así se obtiene la variable “Filas” y mediante
una instrucción de condición IF se asegura de no sobrepasar el
número de filas total.
A continuación se puede ver una parte del código de texto de DXF que
corresponde al dibujo de un seguidor. Aquí pude verse más fácilmente el
funcionamiento del programa.
0 INSERT 5 140 330 1F 100 AcDbEntity 8 SEGUIDORES Encuentra SEGUIDORES y empieza buscar 10 62 5 100 AcDbBlockReference 2 A$C3C474A2B 10 Encuentra 10 100.0000 Almacena el valor 20 Se salta la línea 200.0000 Almacena el valor 30 Se salta la línea 714.0 Almacena el valor y vuelve a empezar a buscar SEGUIDORES siempre que no haya llegado al final del archivo. 0 INSERT …
En el código DXF los valores “10”, “20” y “30” corresponden a las
coordenadas “x”, “y” y “z” respectivamente.
Las matrices obtenidas de esta forma presentan dos problemas; por un lado,
el número de veces que el archivo DXF llama a “SEGUIDORES” es superior al
número de seguidores que hay en plano, esto se debe a que antes de dibujarlos
debe definir la capa, el color de la misma,… por lo que habrá que extraer de esas
matrices los elementos realmente necesarios.
36
Por otro lado, dado que el archivo es de texto, los datos obtenidos son de
tipo texto, habrá que pasarlos a un formato numérico para poder operar con ellos.
Estas dos acciones se llevan a cabo en las siguientes instrucciones donde,
como se ve, hace uso del dato introducido por el usuario en referencia al número
de seguidores que sirve para saber cuales son los elementos necesarios de las
matrices.
For posicion = (i - (Numseguidores - 1)) To i ii = ii + 1 zSeg(ii) = Val(zDibujo(posicion)) xSeg(ii) = Val(xDibujo(posicion)) ySeg(ii) = Val(yDibujo(posicion)) Next
La función Val(string) devuelve un valor numérico de la cadena(string) que se
introduzca.
A partir de aquí, lo que trata es de colocar los valores de “x”, “y” y “z” que se
han extraído del dibujo en la matriz final que se ha comentado antes; de tal forma
que sus posiciones coincidan con las del plano de forma visual. Algo que a priori
parece bastante sencillo requiere bastantes operaciones para llevarse a cabo de
forma satisfactoria.
Parece claro que, para conseguir la coincidencia mencionada, son los valores
de la “x” y la “y” combinados los que me definirán el lugar de cada dato en la
matriz final. A continuación van a explicarse los pasos que se han llevado a cabo
para conseguirlo.
Con las instrucciones que vienen a continuación, lo que se logra es ordenar
los datos de las “x” de mayor a menor:
For j = 1 To Numseguidores compara = 0.1 For i = 1 To Numseguidores If xSeg(i) > compara Then compara = xSeg(i)
37
posicion = i End If Next ORDENX(j) = compara POSICIONX(j) = posicion xSeg(posicion) = 0 Next
Su forma de trabajar es la siguiente:
o Revisa toda la matriz buscando el valor más alto.
o Cuando lo encuentra, introduce ese valor en una nueva matriz
denominada ORDENX() y lo pone a cero en la matriz original,
de forma q pasa a ser el más pequeño.
o Además, memoriza la posición que ocupaba ese elemento en la
matriz original en una matriz denominada POSICIONX(); de
esta manera, más adelante, se podrá relacionar cada valor de
“x” con los de “y” y “z” que le correspondan.
o Repite esta operación hasta que todos los elementos de la
matriz original sean iguales a cero; momento en el que acaba.
Una vez ordenadas las coordenadas x, se procede a ordenar las coordenadas
y. Las instrucciones son muy similares a las anteriores cambiando xSeg(),
ORDENX() y POSICIONX() por ySeg(), ORDENY() y POSICIONY() . Por lo tanto
la forma de trabajar es casi idéntica.
Por lo tanto, en este punto del programa ya tenemos las coordenadas de x y
de y de los seguidores ordenadas de mayor a menor. A continuación se procede a
calcular las dimensiones de la matriz final.
Para calcular dichas dimensiones se verá cuántos valores diferentes de x y de
y hay en las matrices correspondientes. En las instrucciones que siguen se lleva a
cabo esta operación y la forma de operar es la siguiente:
38
xSeg() = ORDENX() For j = 1 To Numseguidores If xSeg(j) <> 0 Then compara = xSeg(j) ii = ii + 1 For i = 1 To Numseguidores If xSeg(i) = compara Then xSeg(i) = 0 End If Next End I Next
o Utilizando la matriz de elementos ordenados de mayor a
menor, coge el primer valor de x de la misma y cuenta 1.
o A continuación compara todos los valores de la matriz con el
anterior y pone a cero todos los que son iguales a él.
o Una vez revisada toda la matriz, coge el siguiente valor distinto
de cero y vuelve a empezar.
o Cuando todos los valores de la matriz sean cero finaliza.
o Al acabar, el valor de ii será el que nos indique la primera
dimensión de la matriz final.
Para obtener la segunda dimensión de dicha matriz, bastará con realizar la
misma operación anterior con la matriz de elementos ordenados de mayor a menor
correspondientes a la coordenada y. De aquí obtendremos el valor jj; por lo tanto,
la matriz final será de orden ii*jj.
Ahora falta por determinar el lugar que va a de ocupar cada elemento.
La opción que se escogido para realizar esta operación es la siguiente:
39
o Por un lado, asignar el valor de la primera dimensión
correspondiente a cada elemento mediante su valor de x de tal
forma que los que vayan en la primera fila serán aquellos cuya
x corresponda con el valor mayor, los de la segunda fila
aquellos con la x inmediatamente inferior al valor mayor… así
hasta llegar al valor más pequeño.
o Por otro lado, asignar el valor de la segunda dimensión
repitiendo la operación anterior con la y.
o Por último, utilizando lo anterior y relacionando los datos a
través de las matrices de posición ya almacenadas, hacer tres
matrices de dimensiones ii*jj, una para cada coordenada,
colocando cada elemento en el lugar que le corresponde.
A continuación se explican cada uno de los procedimientos según el código
correspondiente:
For i = 1 To Numseguidores If xSeg(i) <> 0 Then b = b + 1 compara = xSeg(i) For j = 1 To Numseguidores If xSeg(j) = compara Then a = POSICIONX(j) posx(a) = b xSeg(j) = 0 End If Next End If
En este primer procedimiento lo que se hace es asignar a cada uno de los
elementos, a través de la x, el subíndice de la primera dimensión que le
corresponde. Funciona de la siguiente manera.
40
o Utilizando nuevamente la matriz con los elementos ordenados,
coge el primer elemento y le asigna el subíndice 1. Esta
asignación la realiza a través de la posición que ocupaba en la
matriz original.
o Compara el resto de elementos de la matriz con ese primero y
a los que son iguales a él les asigna el subíndice 1 y los pone a
0.
o Cuando no hay más elementos iguales a ese primero, pasa al
siguiente elemento distinto de cero, corresponderá con el de
valor inmediatamente inferior al primero y repite desde el
segundo paso.
o En el momento en el que todos los elementos que quedan sean
igual a cero, acaba el procedimiento.
Al acabar este procedimiento se habrá creado una nueva matriz que relaciona
las posiciones de los elementos en las matrices originales (las obtenidas del archivo
de Autocad) con los subíndices de la primera dimensión que les correspondan.
Para hallar el subíndice de la segunda dimensión, el procedimiento será muy
similar al anterior utilizando las coordenadas y en lugar de las x.
Finalmente, lo único que queda por hacer es crear tres matrices de
dimensiones ii*jj colocando en cada una de las posiciones las coordenadas
correspondientes al seguidor que en el plano ocupa ese lugar.
El procedimiento es el siguiente:
For i = 1 To Numseguidores For j = 1 To Numseguidores If POSICIONX(j) = i Then a = posx(i) b = posy(i) c = POSICIONX(j) PoscSegX1(a, b) = XSEGUIDOR(c) PoscSegY1(a, b) = YSEGUIDOR(c) PoscSegZ1(a, b) = zSeg(c) End If
41
Next Next
o Para cada posición de la matriz inicial, coge el subíndice de la
primera dimensión(a) que la matriz pertinente le indica, coge el
subíndice de la segunda dimensión(b) que la matriz pertinente
le indica y coloca los elementos “x”, “y” y “z” pertenecientes a
dicha posición y los coloca en otra matriz en el lugar(a,b).
Finalmente, se realiza un último retoque a las matrices finales con el único
objeto de facilitar su uso posteriormente. Como los datos se han ordenado de
mayor a menor, la posición (1,1) la ocupará el seguidor más alejado del origen; es
decir, el que tenga los valores más altos de x y de y. Resulta mucho más útil que
sea al contrario, que el seguidor que ocupe la posición (1,1) sea aquel cuyos x e y
sean los menores. Este último paso lo realiza el siguiente procedimiento:
For a = ii To 1 Step -1 i = i + 1 For b = jj To 1 Step -1 j = j + 1 PoscSegX(i, j) = PoscSegX1(a, b) PoscSegY(i, j) = PoscSegY1(a, b) PoscSegZ(i, j) = PoscSegZ1(a, b) Next j = 0 Next
3.3.2.2 Procesamiento de los datos
En el procesamiento de datos se llevan a cabo todas las operaciones
necesarias para, a partir de los datos introducidos por el usuario obtener los
resultados finales; aquellos que aparecerán en la tabla de Excel.
42
Hasta el momento lo que se ha hecho ha sido adaptar los datos introducidos
de tal manera que puedan ser empleados en esta sección pero no se ha operado
con ellos.
3.3.2.2.1 El movimiento del Sol
Puesto que la finalidad de este programa es obtener las sombras que
proyectan unos seguidores sobre otros en una huerta solar, el primer paso será
estudiar el movimiento del Sol. Lo que se pretende es conocer la posición del Sol
respecto de cada uno de los seguidores en cada momento; de esta forma podremos
saber cada uno de ellos la sombra que proyecta y, por lo tanto, la que reciben los
demás.
3.3.2.2.1.1 La Latitud
La Latitud es el único dato introducido por el usuario que queda
por adaptar, pero su adaptación es más directa que las anteriores.
Como ya se ha comentado anteriormente, este dato es
introducido a través de la Comunidad Autónoma en la que se ubica la
instalación. Obviamente este no es un dato numérico con el que
pueda operarse pero sí tiene uno asociado. Ésta asociación se realiza
mediante un “intercambio dinámico de datos” entre Visual Basic y
Excel.
Se parte de una tabla realizada en Excel en la que para cada
Comunidad Autónoma se encuentra el correspondiente valor de la
Latitud; de esta manera, cuando al programa se le introduce el dato
de la Comunidad, Visual Basic acude a la tabla correspondiente de
Excel y compara el dato introducido con los de la tabla. Una vez que
encuentra el que coincide recoge el valor de la latitud de tal forma
que ya puede ser usado por el programa.
Para llevar a acabo este intercambio de datos, Visual Basic debe
abrir el archivo de Excel en el que se encuentra la tabla que relaciona
cada Comunidad Autónoma con la Latitud que le corresponde. Dicha
tabla coincide con la siguiente:
Altitud(m) Latitud(º) Longitud(º) Alava 542 42,9 2.7W
43
Albacete 686 39 1.8W Alicante 7 38,4 0.5W Almería 65 36,9 2.4W Asturias 232 43,4 5.8W Avila 1126 40,7 4.9W Badajoz 186 38,9 7.0W Baleares 28 39,6 2.6E Barcelona 95 41,1 2.2E Burgos 929 42,3 3.7W Cáceres 459 39,5 6.4W Cádiz 28 36,5 6.3W Cantabria 69 43,5 3.8W Castellón 27 40 0 Ceuta 206 35,9 5.3W Ciudad Real 628 39 3.9W Córdoba 128 37,9 4.8W La Coruña 54 43,4 8.4W Cuenca 949 40,1 2.1W Gerona 95 42 2.7E Granada 775 37,2 3.7W Guadalajara 685 40,6 3.2W Guipuzcoa 181 43,3 2.0W Huelva 4 37,3 6.9W Huesca 488 42,1 0.4W Jaén 586 37,8 3.8W León 908 42,6 5.6W Lérida 323 41,7 1.2E Lugo 465 43 7.6W Madrid 667 40,4 3.7W Málaga 40 36,7 4.4W Melilla 47 35,3 3.0W Murcia 42 38 1.1W Navarra 449 42,8 1.6W Orense 139 42,3 7.8W Palencia 734 42 4.5W Las Palmas 6 28,2 15.4W Pontevedra 19 42,4 8.6W La Rioja 380 42,5 2.4W Salamanca 803 41 5.6W Sta. Cruz de Tenerife 37 28,5 16.2 Segovia 1002 41 4.1W Sevilla 30 37,4 6.0W Soria 1063 41,8 2.5W Tarragona 60 41,1 1.2E Teruel 915 40,4 1.1W Toledo 540 39,9 4.0W Valencia 10 39,5 0.4W Valladolid 694 41,7 4.7W Vizcaya 32 43,3 3.0W Zamora 649 41,5 5.7W Zaragoza 200 41,7 0.9W
.
44
El procedimiento asociado a dicho intercambio de datos es el
siguiente:
For Fila = 72 To 123 Latitud.LinkMode = 0 Latitud.LinkTopic = "Excel|Hoja1" Latitud.LinkItem = "F" & Fila & "C1" Latitud.LinkMode = 1 ColumnaA = "F" & CStr(Fila) & "C1" Latitud.LinkItem = ColumnaA If Left(Latitud.Text, Len(cmbComunidad)) = cmbComunidad Then Latitud.LinkMode = 0 Latitud.LinkTopic = "Excel|Hoja1" Latitud.LinkItem = "F" & Fila & "C3" Latitud.LinkMode = 1 ColumnaA = "F" & CStr(Fila) & "C3" Latitud.LinkItem = ColumnaA Exit For End If Next L = (Latitud.Text) * PI / 180
Donde el primer bloque busca en la primera columna, la
correspondiente a las Comunidades Autónomas, la que coincide con la
seleccionada; mientras que en el segundo bloque, una vez encontrada la
Comunidad deseada, Obtiene de la tercera columna el valor de la Latitud
que le corresponde y la asigna a una caja de texto. Es a través de dicho
texto que se le asigna a la variable L.
Puede comprobarse como, al tratarse de un valor que viene dado en
grados, al asignarlo a la variable L, se hace uso de 180π para pasarlo a
radianes.
3.3.2.2.1.2 La posición del sol
Una vez obtenida la latitud, se puede conocer la posición del Sol
para cada día del año en cualquier momento del día. Dada la finalidad
45
de estos cálculos se ha obtenido la posición del Sol para cada día del
año y para cada hora del día; con intervalos de media hora.
Las expresiones utilizadas con este fin son las siguientes:
)84,77973,0(º45,23 −= Nsenδ
δωδα senLsenLsen += coscoscos
αωδψ cos/cos sensen =
)cos/(cos)(cos αδαψ LsensenLsen −=
αθ −= º90
Donde:
δ = Declinación solar
N = Número de orden del día en el año( N=1 para el 1 de enero,
N=365 para el 31 de diciembre)
α = Altura solar
L= Latitud del lugar
ω = ángulo horario
46
ψ = Azimut solar
θ = Ángulo cenital
El primer detalle a tener en cuenta a la hora de realizar el
cálculo de estas variables en Visual Basic es que éste trabaja en
radianes por lo que será necesario adaptar las expresiones anteriores.
En el caso de la declinación solar, primero se calcula 0,973*N-
77,84. Este dato, tal y como está calculado, se obtiene en grados
centígrados por lo que habrá que pasarlo a radianes. Además, tal y
como se indica, el factor por el que debe multiplicarse para obtener la
declinación solar también está en grados. Una vez realizados estas
operaciones puede procederse al cálculo de la declinación solar, que
como puede apreciarse únicamente depende del día del año.
Para poder obtener el resto de variables es necesario realizar
otros ajustes. Por un lado, la latitud está, nuevamente, en grados
centígrados por lo que se debe ajustar a radianes. El valor del ángulo
horario en grados coincide con el número de horas de diferencia entre
el instante considerado y el mediodía solar, multiplicado por 15 de tal
forma que el ángulo horario sea positivo por la mañana. Este valor
también debe ser adaptado a radianes.
Por último, para el caso del ángulo cenital, dado que es el
complemento de la altura solar, habrá que sustituir los 90º por su
equivalente en radianes: 2/π
El cálculo de estos datos se realiza mediante dos funciones:
CalculoAngulos1 y CalculoAngulos2. La llamada a estas dos funciones
47
debe realizarse indicando como variables tanto el día como la hora
del día de la que se quiere obtener los datos.
Por definición, la Altura solar es el ángulo que forma el rayo
(recta que va desde el centro del disco solar hasta el punto
considerado) con el plano horizontal que pasa por el punto de
observación. Dada la definición y como puede observarse en la figura,
la Altura solar en ningún momento será mayor a 90º, dado que su
posición respecto de los ejes Norte-Sur Este-Oeste vendrá definido
por el Azimut solar por lo que en este caso no será necesario hacer
más consideraciones.
Como se ha comentado, es el Azimut solar el que define la
posición del sol respecto a los dos ejes por lo que es necesario tener
en cuenta que puede hallarse en cualquiera de los cuatro cuadrantes.
Es por esta razón que para su cálculo se utilizan dos ecuaciones, una
para el seno y otra para el coseno de forma que quede
completamente definido. Para obtener el dato del Azimut se procede
de la siguiente manera:
o Realizar el cálculo del seno y el coseno del Azimut solar.
o Si: Seno >0 , Coseno >0 -- ángulo del 1º cuadrante, cálculo
del valor del Azimut solar mediante el ArcoSeno o ArcoCoseno.
o Si: Seno >0 , Coseno < 0 -- ángulo del 2º cuadrante, cálculo
del valor del Azimut solar mediante el ArcoCoseno.
o Si: Seno <0 , Coseno >0 -- ángulo del 4º cuadrante, cálculo
del valor del Azimut solar mediante el ArcoSeno.
o Si: Seno <o , Coseno <0 -- ángulo del 3º cuadrante, no es
posible realizar el cálculo del Azimut solar de forma directa por
lo que se ha resuelto calcular el valor del ángulo
correspondiente al 4º cuadrante mediante el ArcoSeno y
restárselo a -180º.
48
Una vez obtenidas las variables referentes a la posición del sol para
cada hora del día y para cada día del año y haciendo uso de los
valores introducidos por el usuario referentes al tamaño del seguidor,
base y altura de la parrilla de módulos, altura de la columna y
tamaño del terreno en el que va a instalarse la huerta solar, se puede
proceder a realizar los cálculos necesarios para la obtención de las
separaciones óptimas entre filas y columnas de seguidores.
En lo sucesivo, cuando sea necesario utilizar estos datos nos
referiremos a ellos de la siguiente manera:
o Base: base de la parrilla de módulos
o Altura: altura de la parrilla de módulos
o h: altura de la columna
A continuación se verá el extracto de código perteneciente a cada
una de las funciones. Por un lado la función CalculoAngulos1 permite
calcular la altura solar para el día y la hora del día requeridos de la
siguiente forma:
Function CalculoAngulos1(N As Integer, Hora As Single) XD = (0.973 * N - 77.84) * PI / 180 DecliRad(N) = (23.45 * PI / 180) * Sin(XD) wGrad = Abs(12 - Hora) * 15 w = wGrad * PI / 180 Desviacion = 0
49
X1 = Cos(L) * Cos(DecliRad(N)) * Cos(w) + Sin(L) * Sin(DecliRad(N)) If X1 < 0 Then CalculoAngulos1 = 0 Exit Function Else If -X1 * X1 + 1 = 0 Then AlturaRad(N, Hora) = PI / 2 Else AlturaRad(N, Hora) = Atn(X1 / Sqr(-X1 * X1 + 1)) 'Arcoseno End If End If CalculoAngulos1 = AlturaRad(N, Hora) End Function
Como ya se comentó anteriormente, el primer cálculo que debe
realizarse es el de la Declinación solar que únicamente depende del
día del año para el que se quiera calcular.
A continuación, se cambia la hora por su homólogo en grados como
ya se explicó anteriormente. A lo largo del código también puede
apreciarse que se lleva a cabo siempre que es necesario la conversión
de grados a radianes.
Por último cabe comentar que Visual Basic desconoce las funciones
ArcoSeno y ArcoCoseno pero sí permite realizar la función
ArcoTangente. Es por eso que a través de esta última se calcula el
valor de las dos anteriores, según las fórmulas:
)1)*(
()(+−
=xx
xteArcoTangenxArcoSeno
)1(cot*2)1)*(
()( angenteArxx
teArcoTangenxArcoCoseno ++−
x−=
Por otro lado, la función CalculoAngulos2 permite calcular el Azimut
solar para el día y la hora del día requeridos de la siguiente manera:
Function CalculoAngulos2(N As Integer, Hora As Single)
50
Altura = CalculoAngulos1(N, Hora) If Altura = 0 Then CalculoAngulos2 = 0 Exit Function Else X2 = Cos(DecliRad(N)) * Sin(w) / Cos(Altura) X3 = (Sin(L) * Sin(Altura) - Sin(DecliRad(N))) / (Cos(L) * Cos(Altura)) If X2 >= 0 Then If X3 > 0 Then '1er cuadrante If X2 = 1 Then AzimutRad(N, Hora) = PI / 2 Else AzimutRad(N, Hora) = Atn(X2 / Sqr(-X2 * X2 + 1)) 'Arcoseno End If Else '2º cuadrante AzimutRad(N, Hora) = Atn(-X3 / Sqr(-X3 * X3 + 1)) + 2 * Atn(1) 'Arcocoseno End If ElseIf X3 > 0 Then '4º Cuadrante AzimutRad(N, Hora) = Atn(X2 / Sqr(-X2 * X2 + 1)) 'Arcoseno Else '3º cuadrante If X2 = -1 Then AzimutRad(N, Hora) = -PI / 2 Else AzimutRad(N, Hora) = Atn(X2 / Sqr(-X2 * X2 + 1)) - (PI / 2) 'Arcoseno End If End If End If If Hora <= 12 Then CalculoAngulos2 = AzimutRad(N, Hora) Else CalculoAngulos2 = -AzimutRad(N, Hora) End If
En esta función hay varios aspectos a comentar. Para empezar,
para calcular el Azimut solar es necesario conocer la Altura solar por
lo que, al principio de la función se hace una llamada a la función
correspondiente a la Altura que es CalculoAngulos1. Aquí puede
apreciarse como para efectuar dicha llamada se deben adjuntar los
datos de día y hora del día para los que se quiere conocer la Altura.
51
Una vez obtenido el valor de la altura, comprueba que éste no sea
igual a cero; es decir, que no sea por la noche en cuyo caso no se
hará ningún cálculo puesto que no habrá sombras.
Siempre que la Altura sea diferente de cero, se procederá a realizar
los cálculos propios del Azimut para lo cual se procederá teniendo en
cuenta lo expuesto con anterioridad sobre los diferentes cuadrantes.
Puede observarse como lo primero que hace es calcular el seno y el
coseno del mismo ángulo con el fin de poderlo situar con exactitud y
finalmente, dependiendo del cuadrante que le corresponda, se
procede a su cálculo.
Como último apunte, cabe resaltar que tal y como está hecho el
cálculo el Azimut siempre saldrá positivo, independientemente de que
se calcule para antes o después de las 12 del mediodía; momento en
el que el Azimut es igual a cero, dado que coincide con el eje Norte-
Sur, y por lo tanto implica un cambio de signo. Para corregir este
defecto, se le adjunta un signo positivo o negativo dependiendo de la
hora a la que se realice el cálculo.
3.3.2.2.2 Posición del seguidor
Para realizar el cálculo de la sombra de un seguidor que incide sobre
otro es imprescindible conocer la posición de cada uno de los seguidores.
Puesto que en la instalación todos los seguidores serán iguales,
bastará saber las coordenadas de uno genérico, que tomaremos como origen, y
mediante las distancias entre seguidores podremos determinar las coordenadas de
los extremos de cada uno de los seguidores.
En el cálculo de las coordenadas de los extremos de los seguidores se
utilizan los datos de entrada correspondientes a las dimensiones del seguidor:
Base, Altura, h y el dato de entrada correspondiente al ángulo máximo de
inclinación.
El proceso de cálculo es el siguiente: primero calcular las
coordenadas locales del seguidor, segundo convertirlas a globales.
52
Las coordenadas locales se calculan respecto a unos ejes solidarios al
seguidor que giran con respecto a los ejes fijos definidos por las líneas Norte-Sur y
Este-Oeste, un valor que equivale al azimut solar.
Por lo tanto, la relación entre los ejes locales y los globales los define
el Azimut solar.
3.3.2.2.2.1 Coordenadas locales del seguidor
Como ya se ha comentado, las coordenadas correspondientes a las
cuatro aristas del seguidor se calculan para un seguidor genérico y se
supone el origen de coordenadas en la base del seguidor de tal forma
que cuando el Azimut solar sea igual a cero y el seguidor esté
totalmente paralelo al suelo, el seguidor, visto desde arriba, quede de
la siguiente manera.
Teniendo en cuenta la figura anterior es fácil observar que la
proyección sobre el eje x solidario al seguidor será siempre la mitad
del valor de la base con el signo que le corresponda. En el caso del
eje y solidario al seguidor, el valor de la proyección dependerá de la
inclinación del seguidor y, por lo tanto de la Altura solar.
Además, para cada una de los cuatro extremos del seguidor, el
signo de la proyección sobre esos mismos ejes será siempre el
mismo. Por lo tanto, las ecuaciones de las proyecciones de los cuatro
extremos del seguidor sobre los ejes solidarios al mismo serán de la
forma:
221basexx LL ==
243basexx LL −==
θcos241
alturayy LL ==
θcos232
alturayy LL −==
Finalmente, queda por ver el valor de la proyección sobre el eje z.
Este valor será el mismo tanto en ejes locales como en globales
puesto que el eje z no varía.
La proyección de cada uno de los cuatro extremos sobre el eje z
depende de la altura de la columna del seguidor, h, la altura de la
53
parrilla, altura, y el ángulo de inclinación del seguidor de tal manera
que:
)cos(*241 AlturaSegalturahZZ LL −==
)cos(*232 AlturaSegalturahZZ LL +==
En el programa, el cálculo de estas tres coordenadas para cada
extremo de seguidor se realiza mediante tres funciones que son las
siguientes:
Function XLSeguidor(Punto As Integer) Select Case Punto Case 1, 2 XL = BaseP / 2 Case 3, 4 XL = -BaseP / 2 End Select XLSeguidor = XL End Function
La llamada a esta función, a la que le corresponde el cálculo de la
coordenada x local, debe realizarse indicando el número del extremo
del que quiere saberse dicha coordenada.
Lo que esta función hace es ver cuál es el punto para el que se le
ha pedido la información y, según cual sea realizar una operación u
otra; la que corresponda. Finalmente devuelve el valor requerido.
Function YLSeguidor(N As Integer, Hora As Single, Punto As Integer, Sombra As Integer, h As Single, AngMax As Single) Altura = CalculoAngulos1(N, Hora) If Altura < AngMax Then AlturaSeg = AngMax Else AlturaSeg = Altura End If AnguloNormalSeg = (PI / 2) - AlturaSeg If Sombra = 0 Then
54
Select Case Punto Case 1, 4 YL = AlturaP * Cos(AnguloNormalSeg) / 2 Case 2, 3 YL = -(AlturaP * Cos(AnguloNormalSeg) / 2) End Select ElseIf Sombra = 1 Then Select Case Punto Case 1, 4 YL = (AlturaP / 2) - DistanciaSombra1(N, Hora, h, AngMax) * Cos(AnguloNormalSeg) Case 2, 3 YL = -((AlturaP / 2) + DistanciaSombra2(N, Hora, h, AngMax)) * Cos(AnguloNormalSeg) End Select End If YLSeguidor = YL End Function
Esta función, la correspondiente al cálculo de la coordenada y, es
algo más complicada que la anterior. En primer lugar, la llamada a la
misma ha de realizarse indicando muchas más variables para que el
cálculo pueda llevarse a cabo. Por supuesto, debe indicarse el número
del extremo para el que se desea obtener la información. Además,
según lo expuesto anteriormente, el valor de la proyección sobre el
eje y depende de otras variables como la Altura solar y el ángulo
máximo de inclinación. Debido a que necesita calcular la Altura solar
es por lo que deben indicársele el día y la hora del día en el que se
está trabajando. También hay dos variables que se refieren al cálculo
de la sombra que son la denominada Sombra, que será 1 o 0 según si
se quiere calcular la sombra o no, y la h. Todo lo referente a estas
dos variables y el papel que juegan se explicará en el apartado
dedicado a las Sombras.
El procedimiento que sigue esta función es el siguiente:
o Calcular el valor de la Altura solar en ese instante
para lo cual realiza una llamada a la función
correspondiente, CalculoAngulos1.
55
o Comprueba que la Altura solar sea mayor que el
ángulo de inclinación del seguidor. En caso de que no
lo sea, el valor de la Altura del seguidor será igual al
ángulo de inclinación máximo; sino, será igual a la
Altura solar.
o Calcula el Angulo Normal del seguidor.
o Comprueba si debe calcular el valor de la sombra o
no (El proceso que sigue en caso de que calcule la
sombra se expondrá en el apartado de sombras).
o En caso de que sea que no, según cuál sea el punto
para el que debe realizar la operación, hace una
operación u otra
o Devuelve el valor requerido.
Function ZLSeguidor(N As Integer, Hora As Single, Punto As Integer, h As Single) Altura = CalculoAngulos1(N, Hora) If Altura < AngMax Then AlturaSeg = AngMax Else AlturaSeg = Altura End If Select Case Punto Case 1, 4 ZL = h - (AlturaP * Cos(AlturaSeg) / 2) Case 2, 3 ZL = h + (AlturaP * Cos(AlturaSeg) / 2) End Select ZLSeguidor = ZL End Function
56
Esta última función es la que se encarga de calcular la coordenada
z de cada uno de los extremos del seguidor. Las variables que
necesita para realizar su tarea son las mismas que las de la función
anterior exceptuando las relacionadas con la sombra. La dinámica de
trabajo de la función ZLSeguidor() es la siguiente:
o Calcular el valor de la Altura solar en ese instante
para lo cual realiza una llamada a la función
correspondiente, CalculoAngulos1.
o Comprueba que la Altura solar sea mayor que el
ángulo de inclinación del seguidor. En caso de que no
lo sea, el valor de la Altura del seguidor será igual al
ángulo de inclinación máximo; sino, será igual a la
Altura solar.
o Dependiendo del punto para el que deba realizar el
cálculo, realiza una operación u otra.
o Devuelve el valor requerido.
3.3.2.2.2.2 Coordenadas globales del seguidor
Para hallar las coordenadas globales del seguidor, basta proyectar
las coordenadas locales ya calculadas sobre los ejes fijos según la
relación:
ψψ senyxx LLG −= cos
ψψ cosLLG ysenxy +=
Para realizar esta transformación se ha definido una función
denominada LocalesAGlobales() que es de la siguiente forma:
Function LocalesAGlobales(N As Integer, Hora As Single, Coord As Integer, Punto As Integer, Sombra As Integer, h As Single, AngMax As Single) Azimut = CalculoAngulos2(N, Hora) If Coord = 1 Then
57
XL = XLSeguidor(Punto) YL = YLSeguidor(N, Hora, Punto, Sombra, h, AngMax) G = XL * Cos(Azimut) - YL * Sin(Azimut) ElseIf Coord = 2 Then XL = XLSeguidor(Punto) YL = YLSeguidor(N, Hora, Punto, Sombra, h, AngMax) G = XL * Sin(Azimut) + YL * Cos(Azimut) Else G = ZLSeguidor(N, Hora, Punto, h) End If LocalesAGlobales = G End Function
La razón por la que cada vez las funciones dependen de mayor
número de variables es que según avanza el desarrollo del programa,
cada una de las funciones, a su vez, realiza llamadas a otras
funciones y cada una de estas funciones requieren de sus propias
variables.
Esta función distingue entre las coordenadas x, y y z globales para
realizar sus cálculos. A su vez, el cálculo de x o y dependerá de los
valores de x e y locales, que deberán ser calculados.
Por su parte, en el caso de que la coordenada global a calcular sea
z, ésta será igual a la z local; según lo expuesto anteriormente.
El funcionamiento de esta función es el siguiente:
o Calcular el Azimut solar.
o Comprobar qué coordenada global queremos
obtener: x, y o z.
o Según sea x o y, realizar las operaciones pertinentes.
o En el caso de z, calcular el valor de la z local.
o Devuelve el valor requerido.
58
3.3.2.2.3 Cálculo de la sombra
Puesto que el programa ya está en condiciones de calcular las variables
relacionadas con la posición del sol en cada momento, puede pasar a calcular la
sombra que proyecta cada seguidor en cada uno de esos momentos. Para llevar a
cabo estos cálculos es indispensable utilizar los datos referentes a las dimensiones
del seguidor.
Principalmente habrá que saber la altura de las cuatro esquinas del seguidor
en cada momento para lo cual habrá que tener en cuenta la inclinación del mismo.
Una vez obtenidas las longitudes de sombra, se puede obtener la proyección
de dicha sombra tanto sobre la línea Norte-Sur como sobre la línea Este-Oeste.
Estas dos líneas van a definir los ejes de coordenadas x e y.
3.3.2.2.3.1 Longitud de la sombra
En un instante en que el Sol se encuentra en una posición definida
por su azimut ψ y su altura α , la longitud sobre el suelo horizontal
de la sombra de un objeto de altura h será h/tanα , y la proyección
de dicha sombra sobre la línea Norte-Sur, trazada en el plano
horizontal (meridiano del lugar), valdrá:
αψ tan/coshd =
Utilizando esta expresión es posible hallar la longitud sobre el suelo
horizontal de la sombra de los cuatro extremos del seguidor en cada
momento para lo cual se debe tener en cuenta el ángulo de
inclinación del seguidor. Dado que se trata de seguidores de dos ejes,
éstos van a mantenerse en todo momento perpendiculares a los
rayos del sol lo que implica que cuando el ángulo cenital valga θ , el
ángulo de inclinación del seguidor con la horizontal valdrá θ .
Mediante el ángulo de inclinación del seguidor, en cada momento
se obtendrán dos alturas diferentes a tener en cuenta; las
59
correspondientes a la arista superior e inferior del seguidor que serán
respectivamente:
)(*2
1 θsenalturahh −=
)(*2
2 θsenalturahh +=
Por lo tanto se obtendrán dos longitudes sobre el suelo horizontal
correspondientes a la sombra de la arista superior e inferior del
seguidor:
αtan/11 hd =
αtan/22 hd =
El cálculo de estas dos distancias, o longitudes de sombra, se
realizan mediante dos funciones, una para cada distancia,
denominadas DistanciaSombra1 y DistanciaSombra2
respectivamente.
Function DistanciaSombra1(N As Integer, Hora As Single, h As Single, AngMax As Single) Altura = CalculoAngulos1(N, Hora) If Altura < AngMax Then AlturaSeg = AngMax Else AlturaSeg = Altura End If If Altura = 0 Then d1(N, Hora) = 0 Else h1(N, Hora) = h - (AlturaP * Sin((PI / 2) - AlturaSeg) / 2) d1(N, Hora) = h1(N, Hora) / Tan(Altura) End If DistanciaSombra1 = d1(N, Hora)
60
End Function Function DistanciaSombra2(N As Integer, Hora As Single, h As Single, AngMax As Single) Altura = CalculoAngulos1(N, Hora) If Altura < AngMax Then AlturaSeg = AngMax Else AlturaSeg = Altura End If If Altura = 0 Then d2(N, Hora) = 0 Else h2(N, Hora) = h + (AlturaP * Sin((PI / 2) - AlturaSeg) / 2) d2(N, Hora) = h2(N, Hora) / Tan(Altura) End If DistanciaSombra2 = d2(N, Hora) End Function
Lo que diferencia ambas funciones es la altura de los puntos para
los que se está calculando la longitud de la sombra; puesto que la
primera se refiere a la arista superior del seguidor y la segunda a la
arista inferior.
Para calcular dichas longitudes, como ya se ha comentado, hay que
tener en cuenta la inclinación del seguidor. Según lo expuesto, al
tratarse de seguidores con seguimiento a dos ejes, éstos se
mantienen siempre perpendiculares a los rayos del sol; sin embargo,
hay que tener en cuenta una limitación del sistema: los seguidores
tienen un ángulo máximo de inclinación, a partir del cual dejarán de
seguir al sol. Es por ello que resulta necesario distinguir entre dos
ángulos diferentes cuando hablemos de la Altura; por un lado la
Altura solar, calculada según la función correspondiente, y por otro
lado el ángulo Altura del seguidor que coincidirá con la Altura solar
siempre y cuando éste sea menor que el ángulo máximo de
inclinación del seguidor. Cuando sea menor, el ángulo Altura del
seguidor será el ángulo máximo de inclinación del mismo. Este ángulo
máximo de inclinación es un dato de entrada que debe tenerse en
cuenta a la hora de calcular la altura de las aristas en cada momento.
61
3.3.2.2.3.2 Coordenadas locales de la sombra
Primero debemos definir el lugar exacto que los cuatro extremos
del seguidor ocupan respecto a los ejes solidarios al mismo y sumarle
la longitud de la sombra calculada. El origen de coordenadas se
encuentra en la base del seguidor.
Los ejes x e y globales o fijos coinciden con las líneas Norte-Sur y
Este-Oeste como ya se ha comentado; el sentido positivo del eje x
coincide con el Este y el del eje y con el Sur. Por su parte los ejes
solaces o solidarios al seguidor son tales que cuando el Azimut sea
cero, coincidan con los ejes globales.
Por lo tanto, los cuatro extremos de la sombra del seguidor en ejes
locales quedan:
221basexx LL ==
243basexx LL −==
1cos241 dalturayy LL −== θ
2cos232 dalturayy LL −−== θ
De estas ecuaciones se deduce que en ejes locales la única
coordenada que varía entre los extremos del seguidor y los extremos
de la sombra del seguidor es la y. Por lo tanto, el cálculo de las
coordenadas locales se realiza en tres funciones diferentes; una para
el cálculo de la x, otra para el cálculo de la y y por último, una para el
cálculo de la z. Estas funciones se denominan XLSeguidor, YLSeguidor
y ZLSeguidor respectivamente.
Las funciones XLSeguidor y ZlSeguidor ya han sido explicadas en el
apartado referente a las coordenadas del seguidor (Apartado
1.3.2.1). Estas dos funciones sirven igualmente en el caso de las
sombras puesto que en coordenadas locales, lo único que varía es el
valor de la y.
Dentro de la función para el cálculo de la y, YLSeguidor, hay dos
partes; la que se refiere al calculo de la coordenada y del seguidor y
aquella para el cálculo de la coordenada y de la sombra del seguidor.
62
En el apartado del cálculo de las coordenadas del seguidores se ha
explicado el funcionamiento de esta función a excepción de la parte
que concierne al cálculo de la sombra; es decir, cuando la variable
Sombra tiene valor 1. A continuación se reproduce ésta última parte
con el fin de que la explicación pueda ser más clara:
ElseIf Sombra = 1 Then Select Case Punto Case 1, 4 YL = (AlturaP / 2) - DistanciaSombra1(N, Hora, h, AngMax) * Cos(AnguloNormalSeg) Case 2, 3 YL = -((AlturaP / 2) + DistanciaSombra2(N, Hora, h, AngMax)) * Cos(AnguloNormalSeg) End Select End If
El funcionamiento es muy similar a los anteriores, según el
extremo del que se quiera saber el valor, realiza las operaciones
necesarias. La diferencia es que en este caso utiliza las funciones
DistanciaSombra1() y DistanciaSombra2(). Es por esta razón que
requiere las variables Angulo máximo de inclinación y h.
3.3.2.2.3.3 Coordenadas globales de la sombra
Dentro del programa existe una función específica para la
transformación de coordenadas locales en globales denominada
LocalesAGlobales que ya ha sido expuesta en el apartado 1.3.2.2.
Lo único que variará respecto a lo anterior es que en este caso la
variable Sombra adoptará el valor 1.
63
3.3.2.2.4 Cálculo de las pérdidas por sombra.
Una vez definidas todas las funciones que integran el programa, queda por
ver cómo se realiza el cálculo del porcentaje de sombra que recibe cada seguir
debido a los que le rodean.
Puesto que este cálculo debe realizar para cada uno de los seguidores de la
instalación y el dato quiere obtenerse mes a mes, los tres primeros bucles se
encargan de eso.
Los dos primeros lo que hacen es barrer las matrices obtenidas en la
obtención de datos desde un plano de Autocad (Apartado 1.2) . Por lo tanto, cada
uno de los seguidores vendrá definido por el lugar que ocupa en la matriz; de tal
forma que, por ejemplo, el seguidor 1 tendrá las coordenadas (1,1); el seguidor 2
las coordenadas (1,2),…
La dinámica que sigue el código es la siguiente;
o se coloca en uno de los seguidores de la instalación, el (a,b) y
memoriza sus datos en dos variables:
XSEGFijo = PoscSegX(a, b) YSEGFijo = PoscSegY(a, b)
Hasta que pase al siguiente seguidor de la instalación, estos
dos datos serán los únicos que se mantengan invariables puesto que
hacen referencia a la posición que el seguidor ocupa en el plano y por
lo tanto le relaciona con los de alrededor.
o A través de estas variables el programa comprueba que en esa
posición realmente haya un seguidor, en caso contrario pasa
directamente al siguiente puesto que no habrá seguidor sobre el
que calcular las sombras.
o En caso de que el seguidor exista, se le suma uno a una variable
llamada “SeguidorNumero” cuya única función es facilitar la salida
de datos al final del programa.
SeguidorNumero = SeguidorNumero + 1
64
o Dado que la salida de datos se quiere realizar mes a mes, el
programa va pasando por cada uno de ellos desde enero (1) hasta
diciembre (12). Dependiendo del mes en el que esté, selecciona el
número de días correspondientes al mismo.
For Mes = 1 To 12 Select Case Mes Case 4, 6, 9, 11 FinMes = 30
Case 1, 3, 5, 7, 8, 10, 12
FinMes = 31
Case 2
FinMes = 28
End Select
o Una vez posicionado en un mes, recorre el mes entero día a día.
Dado que para el cálculo de los ángulos, y por lo tanto el de la
mayoría de las variables es necesario saber el día del año para el
que se quieren realizar los cálculos, cada vez que pasa por un
nuevo día suma una unidad a la variable denominada Día.
Dia = Dia + 1
o Las dos siguientes tareas que realiza son pasar por todos los
seguidores que rodean al seguidor “fijo” (del 1 al 8 como ya se ha
explicado más arriba) y recorrer todas las horas del día en
intervalos de media hora.
Llegados a este punto es cuando empieza a realizar los cálculos para
determinar la sombra que proyectan los ocho seguidores de alrededor sobre el q
esté estudiando.
o Primero calcula el Azimut y la Altura llamando a las funciones
respectivas. Estos dos datos van a servirle para comprobar varias
condiciones a lo largo del procedimiento.
65
o Para empezar comprueba que no sea de noche mediante la Altura
solar. En caso de que sí sea de noche, pone todos los cálculos a
cero y pasa a la siguiente hora.
o En caso de que sea de día continúa con el procedimiento.
A partir de aquí, lo que hará es ir viendo en qué seguidor de los de alrededor
al fijo está situado para realizar los cálculos respectivos a cada uno de ellos. Se
analizará uno a uno cada uno de los casos para aclarar las diferencias existentes
entre ellos. Los fundamentos de estas acciones ya han sido expuestos con
anterioridad por lo que se tratarán escuetamente.
3.3.2.2.4.1 Seguidor nº1
Como puede apreciarse en el código, el seguidor número 1 está
tratado en conjunto con el número 3. Esto se debe a que, aunque
obviamente existen algunas diferencias, también comparten
bastantes similitudes de cara al cálculo de sombras.
La posición de ambos es oblicua respecto del seguidor “fijo” y en el
caso de ambos, la separación respecto al anterior es positiva en el eje
x o eje Este-Oeste.
Además, ambos proyectarán sombra después del mediodía solar;
es decir, después de las 12 en la hora solar por lo que el Azimut con
el que trabajarán tendrá el mismo signo para ambos.
Para ambos seguidores, si la coordenada a es igual a 1, no se
realizará ningún cálculo y se pasará al siguiente puesto que el
seguidor estará en la columna de la derecha y a su derecha no tendrá
seguidores que le puedan hacer sombra.
En el caso del seguidor número uno el desarrollo del programa será
el siguiente:
o Si el seguidor “fijo” está en la primera fila, b es igual
a 1, no se realizará ningún cálculo y se pasará al
siguiente puesto que no habrá ningún seguidor en la
posición del seguidor 1.
66
o Si el Azimut es mayor que 90º, el seguidor uno no
proyectará sombra sobre el seguidor “fijo”, por lo que
tampoco se realizará ningún cálculo y se pasará al
siguiente.
o Si se han superada estas condiciones, se procederá a
calcular la distancia que separa, en ejes x e y
globales, el seguidor “fijo” de aquel que se encuentre
en la posición del seguidor 1 cuyas coordenadas de la
matriz de seguidores será: (a-1, b-1).
sx = XSEGFijo -PoscSegX(a - 1, b - 1) sy = YSEGFijo -PoscSegY(a - 1, b - 1)
o Nuevamente se debe comprobar que el seguidor de
esa posición existe; en caso negativo, no se realiza
ningún cálculo y se pasa al siguiente. Este paso se
realiza para todos los seguidores en el procedimiento
correspondiente a cada uno de ellos.
o En caso de que dicho seguidor exista, se procederá a
realizar los cálculos de la sombra; el plano que
corresponde al seguidor será el del seguidor fijo,
mientras que los planos formados con las
proyecciones de las sombras serán los del seguidor
que corresponda a la posición del seguidor nº1.
Estos cálculos se realizarán según lo expuesto en el
apartado de cálculos previos.
3.3.2.2.4.2 Seguidor nº2
En el caso del seguidor número 2, el desarrollo del programa será
el siguiente:
o Si el seguidor “fijo” está en la primera columna; es
decir, a es igual a 1, no se realizará ningún cálculo y
se pasará al siguiente puesto que no existirá ningún
seguidor en la posición del seguidor 2.
67
o En el caso de que a no sea igual a 1, se comprobará
que existe un seguidor en la posición correspondiente
al seguidor número dos en la matriz, cuyas
coordenadas serán: (a-1, b). Si no existe, no se hace
ningún calculo y se pasa al siguiente caso.
o En el caso de que sí haya un seguidor en esa
posición, se procederá a calcular la distancia que
separa, en ejes x e y globales, el seguidor “fijo” de
aquel que se encuentre en la posición del seguidor 2
sx = XSEGFijo -PoscSegX(a - 1, b ) sy = YSEGFijo -PoscSegY(a - 1, b )
o Finalmente, se procederá a realizar los cálculos de la
sombra; el plano que corresponde al seguidor será el
del seguidor fijo, mientras que los planos formados
con las proyecciones de las sombras serán los del
seguidor que corresponda a la posición del seguidor
nº2.
Estos cálculos se realizarán según lo expuesto en el
apartado de cálculos previos.
3.3.2.2.4.3 Seguidor nº3
Como ya se ha comentado en el caso del seguidor nº1, estos dos
son tratados juntos. Una vez realizadas las comprobaciones comunes
a ambos que ya se han tratado en el apartado del seguidor nº1
(Apartado 1.3.4.1) se verá lo que difiere al seguidor nº3 del seguidor
nº1.
Como podrá comprobarse, llegados a este punto, todos los
procedimientos son muy similares. Difieren únicamente en pequeños
detalles esenciales sin embargo para el buen funcionamiento del
programa. Es por ello que se intenta detallar minuciosamente.
68
o Si el seguidor “fijo” está en la última fila, b es igual a
jj, no se realizará ningún cálculo y se pasará
directamente al siguiente caso ya que no habrá
posibilidad de que haya ningún seguidor en la
posición del seguidor nº3.
o Si el Azimut es menor que 90º, el seguidor 3 no
proyectará sombra sobre el seguidor “fijo”, por lo que
tampoco se realizará ningún cálculo y se pasará al
siguiente.
o Si se han superada estas condiciones, se procederá a
calcular la distancia que separa, en ejes x e y
globales, el seguidor “fijo” de aquel que se encuentre
en la posición del seguidor 3 cuyas coordenadas de la
matriz de seguidores será: (a-1, b+1).
sx = XSEGFijo -PoscSegX(a - 1, b + 1) sy = YSEGFijo -PoscSegY(a - 1, b +1)
o Nuevamente se debe comprobar que el seguidor de
esa posición existe; en caso negativo, no se realiza
ningún cálculo y se pasa al siguiente.
o En caso de que dicho seguidor exista, se procederá a
realizar los cálculos de la sombra; el plano que
corresponde al seguidor será el del seguidor fijo,
mientras que los planos formados con las
proyecciones de las sombras serán los del seguidor
que corresponda a la posición del seguidor nº3.
Estos cálculos se realizarán según lo expuesto en el
apartado de cálculos previos.
69
3.3.2.2.4.4 Seguidor nº4
El seguidor nº 4 corresponde al que se halla justamente detrás
del seguidor “fijo”, por lo que su procedimiento trabajará de la
siguiente manera:
o Si el seguidor “fijo” está en la última fila, b es igual a
jj, no se realizará ningún cálculo y se pasará al
siguiente caso puesto que eso significa que no habrá
ningún seguidor en la posición del seguidor nº4.
o En caso de que b sea menor que jj, se comprobará
que en la posición (a, b+1) de la matriz de
seguidores exista algún seguidor. En caso de que no
sea así, todos los cálculos serán cero y se procederá
a realizar el siguiente caso
o Si se han superada estas condiciones, se procederá a
calcular la distancia que separa, en ejes x e y
globales, el seguidor “fijo” de aquel que se encuentre
en la posición del seguidor 4.
sx = XSEGFijo -PoscSegX(a , b + 1) sy = YSEGFijo -PoscSegY(a , b + 1)
o Finalmente, se procederá a realizar los cálculos de la
sombra; el plano que corresponde al seguidor será el
del seguidor fijo, mientras que los planos formados
con las proyecciones de las sombras serán los del
seguidor que corresponda a la posición del seguidor
nº4.
Ha de tenerse en cuenta que en el caso de este
seguidor, podrá dar sombra tanto en el caso de que
sea antes como después del mediodía; es decir, para
ambos signos del Azimut solar.
El resto de cálculos se realizarán según lo expuesto
en el apartado de cálculos previos.
70
3.3.2.2.4.5 Seguidor nº5
Al igual que ocurría con los seguidores nº1 y nº3, el seguidor nº5
comparte procedimiento con el seguidor nº7. Como puede
observarse la posición de estos dos también es oblicua al seguidor
“fijo” pero en este caso, la separación respecto a este último es
negativa en el eje x o eje Este- Oeste.
La razón por la que estos cuatro seguidores se han agrupado de
esta manera (1-3 y 5-7) se debe al valor del Azimut. Han sido
agrupados en base al signo de éste puesto que dada su localización,
los seguidores nº5 y nº7 proyectarán sombra sobre el seguidor “fijo”
antes del mediodía solar. En este caso, por lo ya explicado, el Azimut
será positivo.
En el caso de estos dos seguidores, si el seguidor “fijo está en la
última columna; es decir, la coordenada a es igual a ii, no se realizará
ningún cálculo y se pasará al siguiente caso puesto que el seguidor a
su izquierda no tendrá seguidores que le puedan hacer sombra.
En el caso del seguidor nº5 el desarrollo del programa será el
siguiente:
o Si el seguidor “fijo” está en la última fila, b es igual a
jj, no se realizará ningún cálculo y se pasará al
siguiente caso puesto que no habrá ningún seguidor
en la posición del seguidor nº5.
o Si el Azimut es menor que 90º, el seguidor nº5 no
proyectará sombra sobre el seguidor “fijo”, por lo que
tampoco se realizará ningún cálculo y se pasará al
siguiente caso.
o Si se han superada estas condiciones, se procederá a
calcular la distancia que separa, en ejes x e y
globales, el seguidor “fijo” de aquel que se encuentre
en la posición del seguidor nº5 cuyas coordenadas de
la matriz de seguidores será: (a+1, b+1).
sx = XSEGFijo -PoscSegX(a + 1, b + 1)
71
sy = YSEGFijo -PoscSegY(a + 1, b + 1)
o Nuevamente se debe comprobar que el seguidor de
esa posición existe; en caso negativo, no se realiza
ningún cálculo y se pasa al siguiente.
o En caso de que dicho seguidor exista, se procederá a
realizar los cálculos de la sombra; el plano que
corresponde al seguidor será el del seguidor “fijo”,
mientras que los planos formados con las
proyecciones de las sombras serán los del seguidor
que corresponda a la posición del seguidor nº5.
Estos cálculos se realizarán según lo expuesto en el
apartado de cálculos previos.
3.3.2.2.4.6 Seguidor nº6
El procedimiento a seguir en el caso del seguidor nº6 es muy
similar al seguido con el seguidor nº2 teniendo en cuenta que están
situados en posiciones opuestas. El desarrollo será el siguiente.
o Si el seguidor “fijo” está en la última columna; es
decir, a es igual a ii, no se realizará ningún cálculo y
se pasará al siguiente puesto que no existirá ningún
seguidor en la posición del seguidor nº6.
o En el caso de que a no sea igual a jj, se comprobará
que existe un seguidor en la posición correspondiente
al seguidor nº6 en la matriz, cuyas coordenadas
serán: (a+1, b). Si no existe, no se hace ningún
calculo y se pasa al siguiente caso.
o En el caso de que haya un seguidor en esa posición,
se procederá a calcular la distancia que separa, en
ejes x e y globales, el seguidor “fijo” de aquel que se
encuentre en la posición del seguidor nº6
72
sx = XSEGFijo -PoscSegX(a +1, b ) sy = YSEGFijo -PoscSegY(a + 1, b )
o Finalmente, se procederá a realizar los cálculos de la
sombra; el plano que corresponde al seguidor será el
del seguidor fijo, mientras que los planos formados
con las proyecciones de las sombras serán los del
seguidor que corresponda a la posición del seguidor
nº6.
Estos cálculos se realizarán según lo expuesto en el
apartado de cálculos previos.
3.3.2.2.4.7 Seguidor nº7
Como ya se ha comentado, el seguidor nº7 es tratado junto con el
nº5 debido a las similitudes que comparten. Sin embargo, dentro de
la aplicación común a ambos, existen tareas específicas del seguidor
nº7 las cuales van a explicarse con mayor detenimiento a
continuación:
o Si el seguidor “fijo” está en la primera fila, b es igual
a 1, no se realizará ningún cálculo y se pasará
directamente al siguiente caso ya que no habrá
posibilidad de que haya ningún seguidor en la
posición del seguidor nº7.
o Si el Azimut es mayor que 90º, el seguidor nº7 no
proyectará sombra sobre el seguidor “fijo”, por lo que
tampoco se realizará ningún cálculo y se pasará al
siguiente caso.
o Si se han superada estas condiciones, se procederá a
calcular la distancia que separa, en ejes x e y
globales, el seguidor “fijo” de aquel que se encuentre
en la posición del seguidor nº7, cuyas coordenadas
de la matriz de seguidores será: (a-1, b+1).
73
sx = XSEGFijo -PoscSegX(a + 1, b - 1) sy = YSEGFijo -PoscSegY(a + 1, b -1)
o Nuevamente se debe comprobar que el seguidor de
esa posición existe; en caso negativo, no se realiza
ningún cálculo y se pasa al siguiente.
o En caso de que dicho seguidor exista, se procederá a
realizar los cálculos de la sombra; el plano que
corresponde al seguidor será el del seguidor fijo,
mientras que los planos formados con las
proyecciones de las sombras serán los del seguidor
que corresponda a la posición del seguidor nº7.
Estos cálculos se realizarán según lo expuesto en el
apartado de cálculos previos.
3.3.2.2.4.8 Seguidor nº8
Al igual que ocurría en el caso del seguidor nº2 y nº6, el
procedimiento del seguidor nº8 es muy semejante al del nº4; siendo
sus posiciones opuestas. En el caso del seguidor nº8 su posición
corresponde al que está justamente delante del seguidor “fijo”.
El desarrollo de su procedimiento será el siguiente:
o Si el seguidor “fijo” está en la primera fila; es decir,
b es igual a 1, no se realizará ningún cálculo y se
pasará al siguiente caso puesto que eso supone que
no hay ningún seguidor en la posición del seguidor
nº8.
o En caso de que b sea mayor que 1, se comprobará
que en la posición (a, b-1) de la matriz de seguidores
exista algún seguidor. En caso de que no sea así,
todos los cálculos serán cero y se procederá a
realizar el siguiente caso
74
o Si se han superada estas condiciones, se procederá a
calcular la distancia que separa, en ejes x e y
globales, el seguidor “fijo” de aquel que se encuentre
en la posición del seguidor nº8.
sx = XSEGFijo -PoscSegX(a , b - 1) sy = YSEGFijo -PoscSegY(a , b - 1)
o Finalmente, se procederá a realizar los cálculos de la
sombra; el plano que corresponde al seguidor será el
del seguidor fijo, mientras que los planos formados
con las proyecciones de las sombras serán los del
seguidor que corresponda a la posición del seguidor
nº8.
Ha de tenerse en cuenta que en el caso de este
seguidor, podrá dar sombra tanto en el caso de que
sea antes como después del mediodía; es decir, para
ambos signos del Azimut solar.
El resto de cálculos se realizarán según lo expuesto
en el apartado de cálculos previos.
3.3.2.2.5 Final del programa
Una vez visto el funcionamiento del programa para cada uno de los
seguidores, falta comentar el final del programa.
Esta última parte lo que hace es tratar los datos obtenidos de
forma que cumplan la función que se desea. Para ello realiza
diferentes pasos:
o Para cada caso, habrá cuatro variables finales:
AreaPerdidas, Area, AreaPerdidasTotal, AreaTotal
Las dos primeras renovarán su valor en cada nuevo
caso, mientras que las dos últimas aumentarán su
75
valor la cantidad correspondiente a las dos anteriores
en cada nuevo caso; es decir,
AreaPerdidas = basex * basey Area = BaseP * AlturaP
AreaPerdidasTotal = AreaPerdidasTotal + AreaPerdidas AreaTotal = AreaTotal + Area
La primera y la tercera; AreaPerdidas y
AreaPerdidasTotal se refieren al área de la sombra,
mientras que las otras dos registran el área total del
seguidor. De esta manera lo que hace es ver el área
que hay en sombra y el área que captaría radiación
en caso de no haber sombra.
o Como la salida de datos se realiza mes a mes,
cuando va a cambiar de mes hace el cálculo del
porcentaje de sombra respecto del área total:
PorcPerdidas = (AreaPerdidasTotal / AreaTotal)
Además inicializa las variables AreaPerdidasTotal y
AreaTotal a cero de forma que estén preparadas para
comenzar el cálculo de un nuevo mes.
o Por otra parte, cada vez que cambia de seguidor
“fijo”, lo que supone que ya ha realizado el cálculo de
sombras del seguidor anterior durante el año
completo, inicializada la variable Dia a cero con el fin
de que los cálculos del nuevo seguidor sean
correctos.
3.3.2.3 Presentación de los resultados en tabla de Excel.
La presentación de los resultados se realiza en una tabla de Excel donde cada
fila corresponde a un seguidor y cada columna a un mes del año.
Al principio del programa, abre un documento de Excel y asigna, en la fila
número 1 a patir de la columna número 2 (B), a cada mes una columna de tal
forma que:
76
o Enero: Fila 1, Columna B
o Febrero: Fila1, Columna C
o Así sucesivamente hasta:
Diciembre: Fila1 Columna M
En el código puede apreciarse como se realiza dicha asignación. Además
realiza algunas acciones como cambiar el tamaño de la letra y resaltarla mediante
la función “Negrita”.
ApExcel.cells(1, 2).formula = "Enero" ApExcel.cells(1, 3).formula = "Febrero" ApExcel.cells(1, 4).formula = "Marzo" ApExcel.cells(1, 5).formula = "Abril" ApExcel.cells(1, 6).formula = "Mayo" ApExcel.cells(1, 7).formula = "Junio" ApExcel.cells(1, 8).formula = "Julio" ApExcel.cells(1, 9).formula = "Agosto" ApExcel.cells(1, 10).formula = "Septiembre" ApExcel.cells(1, 11).formula = "Octubre" ApExcel.cells(1, 12).formula = "Noviembre" ApExcel.cells(1, 13).formula = "Diciembre" ApExcel.range("b1:m1").Font.Size = 10 ApExcel.range("b1:m1").Font.Bold = True
El resto de la tabla se rellena al final del programa, antes de cambiar de un
mes a otro. Lo primero que ha de hacer es indicar, en la primera columna, el
seguidor con el que está trabajando.
ApExcel.cells(SeguidorNumero + 1, 1).formula = "Seguidor" & SeguidorNumero ApExcel.cells(SeguidorNumero + 1, 1).Font.Size = 10 ApExcel.cells(SeguidorNumero + 1, 1).Font.Bold = True
A continuación escribe, en el lugar que le corresponda, el porcentaje de
sombra calculado. Este dato se introduce con estilo de porcentaje y formato de
número “0.00%”.
77
ApExcel.cells(SeguidorNumero + 1, Mes + 1).formula = PorcPerdidas ApExcel.cells(SeguidorNumero + 1, Mes + 1).Style = "Percent" ApExcel.cells(SeguidorNumero + 1, Mes + 1).NumberFormat = "0.00%"
3.4 Implantación numérica
La implantación numérica va a realizarse para varios casos diferentes, cuatro
concretamente. Los cuatro casos van a tener unas diferencias significativas entre sí
de cara a comprobar el buen funcionamiento del programa en el análisis de los
resultados. En cada uno de los cuatro casos será una única variable la que cambie
respecto al anterior para poder comprobar como afecta dicho cambio.
Lo que se pretende es comprobar que, por ejemplo, al cambiar las
dimensiones del seguidor, cambia el porcentaje de sombra.
Los cuatro casos que se van a implantar son los siguientes:
o Un plano que contiene 100 seguidores, cuya separación es de
20 metros en el eje Norte-Sur y de 25 metros en el eje Este-
Oeste. El seguidor será de 18 * 10 metros, altura de la
columna=5m. La comunidad Autónoma es Granada.
o Las mismas condiciones anteriores pero en Guipúzcoa.
o En este caso se tiene el mismo plano, Comunidad Autónoma
Guipúzcoa. Seguidor: 14*10 metros, altura de la columna=5m.
o Por último, se repite el caso anterior esta vez con un nuevo
plano que contiene 9 seguidores y cuya separación es de 10
metros Norte-Sur, 10 metros Este-Oeste.
Las tablas obtenidas en los casos de los 100 seguidores son excesivamente
largas por lo que se ha optado por reproducir únicamente partes de ellas; partes
que puedan ser relevantes a la hora de valorar los resultados.
Caso1
78
4 Análisis de los resultados
Parta facilitar el análisis de los resultados, a continuación se numera los
seguidores en función de la tabla de resultados donde el seguidor q es el que más
al Sur y más al Oeste de todos; es decir, corresponde con el de la esquina inferior
izquierda del plano.
Imagen
Imagen
Una vez realizada la implantación numérica y obtenidos los resultados
expuestos en el capítulo anterior, se procede a su análisis.
Dada la extensión de las tres primeras tablas de resultados, se ha omitido
parte de las mismas. Como puede comprobarse, de la tabla del caso 1 es de la que
84
más partes se han expuesto; esto se debe a que a través de ésta se va a ver que
los diferentes valores que adopta el valor de la sombra se debe al diseño del plano.
4.1 Caso 1
Con este caso lo que se pretende es ver si los diferentes valores de sombra
tienen relación con las diferentes posiciones de los seguidores.
Para empezar se observa que los valores más pequeños corresponden con los
seguidores que se encuentran en las esquinas y, concretamente, los de las dos
esquinas de la primera fila registran los valores más pequeños. (Seguidor1 y
seguidor 92). Esto se debe a que las posiciones en las que estos dos no tienen
seguidores son las posiciones orientadas hacia el Sur que son las que mayores
sombras proyectan.
Por otro lado se puede observar como los seguidores de la primera
columna(1 al 16) registran valores inferiores a los de la segunda (17 al 32).
Concretamente, los seguidores del 18 al 31 serían seguidores que mantienen la
configuración del seguidor genérico que se ha definido por lo que serían éstos los
que mayores valores de sombra deberían registrar y así es.
En las tablas que van del seguidor 43 al 48 y del seguidor 59 al 64 podemos
observar la diferencia entre unos seguidores con la configuración del genérico y
otros que a su derecha no tienen seguidores que les den sombra. Comprobar que
estos valores sí se diferencian permite cerciorarse de que la obtención de datos
desde AutoCAD y la forma de ordenarlos es correcta puesto que es capaz de una
vez diseñada la matriz completa, comprobar en qué lugares de dicha matriz no
existen seguidores.
4.2 Caso 1-2
En este apartado de lo que se trata es de comparar el caso 1 con el 2. Lo
único que diferencia estos dos casos es el lugar en el que están ubicados: Granada
y Guipúzcoa. Lo que se pretende con esto es comprobar que un cambio en la
variable latitud comporta un cambio en los resultados para comprobar que el
cálculo de las variables que definen la posición del sol se están realizando
correctamente.
85
La razón por la que se han elegido estas dos localidades es simplemente sus
valores de latitud, que se encuentran entre las mayores y las menores dentro de
España. El valor de la latitud en Granada es de 37.2º y en Guipúzcoa de 43.3º
Mirando las tablas de resultados podemos comprobar que efectivamente
existe una variación de unos resultados a otros. En general, el caso de Guipúzcoa,
la sombra que recibe cada uno de los seguidores es mayor que en el caso de
Granada. Esto se debe a que la trayectoria del sol en el caso de una latitud de 43º
es más bajo que en el caso de la latitud de 37º y por lo tanto, las sombras serán
más alargadas en el primer caso.
Las siguientes imágenes muestran la trayectoria del sol sobre un punto de la
tierra a lo largo del año para ambos casos. La primera es la trayectoria para una
latitud de 43º mientras que la segunda muestra el mismo caso para una latitud de
37º.
Observando ambas imágenes puede apreciarse como en el primer caso las
marcas que limitan la trayectoria del sol tiene mayor inclinación que en el segundo
caso. Además ambas imágenes representan el mismo momento en el tiempo, el día
2 de Marzo a las 8 de la mañana. En este instante tanto el azimut como la altura
solares son menores en el primer caso.
Sin embargo, aunque en general los valores de las sombras son mayores
para el caso de Guipúzcoa, los seguidores que ocupan la primera fila, en los meses
de invierno, reciben menos sombra que en el caso de Granada. Este hecho no deja
de ser razonable, puesto que los seguidores de la primera fila carecen de
seguidores en las posiciones en las que se proyecta mayor sombra en invierno,
especialmente en la posición sur.
86
4.3 Caso 2-3
El caso 2 y el caso 3 se diferencian entre sí en las dimensiones del seguidor;
concretamente en la dimensión de la base del módulo de parrillas que en el caso 2
vale 18 y en el 3, 14. Las proyecciones de la sombra en el primer caso deberían ser
mayores que en el segundo, puesto que las distancias que separan a unos
seguidores de otros son las mismas en ambos casos. A la vista de los resultados, se
confirma este hecho.
87
4.4 Caso 3-4
Por último, la diferencia entre el caso 3 y el caso 4 es la distancia existente
entre los seguidores. Dichas distancias en cada uno de los casos son las que
aparecen a continuación.
Caso3 Caso4
Como se ve, la variación de las distancias es bastante considerable por lo que
debería existir una diferencia significativa entre unos valores de sombras y otros.
Los resultados confirman este hecho, dado que en los seguidores centrales,
en el mes de Enero, cuando se registran mayores sombras, pasa de un valor del
1.51% al 13.08% y en el caso del seguidor 1, para ese mismo mes los resultados
son de 0.05% y 1.91% respectivamente.
88
5 Conclusiones
5.1 Conclusiones sobre los resultados
Observando los resultados obtenidos, se puede concluir que el programa
desarrollado cumple las funciones para las que se ha diseñado. Proporciona unos
datos útiles y claros de las sombras proyectadas sobre cada seguidor fotovoltaico
dentro de una huerta solar. Además estos datos se proporcionan individualmente
para cada seguidor y mes a mes lo que permite estudiar detalladamente cada
configuración y permite comparar fáciles distintas configuraciones.
Además permite, sin necesidad de involucrarse en exceso en el estudio del
movimiento del sol y la proyección de sombras, tras probar algunos diseños
diferentes, poder obtener una idea aproximada de la forma en que éstos influyen
sobre la instalación.
El uso de la aplicación es sumamente sencillo. El único detalle a tener en
cuenta es la necesidad de introducir el plano en formato DXF, lo cual tampoco
entraña ninguna dificultad.
5.2 Recomendaciones para futuros estudios
A lo largo del desarrollo del presente proyecto se han ido encontrando
múltiples problemas así como variantes del mismo. Muchos de dichos problemas se
han ido solucionando mientras que otros han limitado la generalidad del proyecto
debido a la complejidad que suponían.
El principal problema era la falta de documentación que pudiera servir de
base para desarrollar el proyecto; por lo tanto, éste puede cumplir esa función.
Algunas posibles ampliaciones de este proyecto bastante recomendables serían
aquellas que permitieran dibujar las sombras calculadas, permitir que cada
seguidor sea de dimensiones diferentes, ampliar las posibles ubicaciones.
Por otro lado también podría diseñarse una aplicaciones que hiciese lo
contrarío a ésta; es decir, a partir de un terreno dado y un rendimiento deseado (lo
que implica una cantidad de sombra máxima), estimar la disposición de los
90
seguidores. De esta forma se podría cerrar el ciclo. Para desarrollar esta aplicación
también sirve como base el presente proyecto puesto que realiza todos los cálculos
correspondientes a las sombras.
91
6 Bibliografía
• [UNED 05] Programa de postgrado (UNED). V Curso De Experto Profesional en Energía Fotovoltaica.
• Visual Basic 6 a fondo. Inforbooks ediciones. Sergio Arboles y Luis Navarro. • VBA for AutoCAD2002. Writing AutoCAD macros. Jeffrey E. Clark • Aprenda Visual Basic como si estuviera en primero. Javier García de Jalón ,
José Ignacio Rodríguez , Alfonso Brazález • Retratos de la conexión fotovoltaica a la red (IV). Seguidores y huertas
solares.Eduardo Lorenzo. Instituto de energía solar. Universidad politécnica de Madrid.
• Manual del usuario. AutoCAD 2006. • www.canalvisualbasic.net • www.recursosvisualbasic.com. • www.vb-mundo.com • www.elguille.info • msdn.microsoft.com/vbasic • www.portalvb.comv • vbasic.astalaweb.com • www.lawebdelprogramador.com/ • www.vbsiglo21.net • [GUÍA 03] Guía Solar de Greenpeace • [ASIF] Página web de la Asociación de la Industria Fotovoltaica (ASIF).
www.asif.org • [IDAE 04]Guía práctica de la energía. Consumo eficiente y responsable. IDAE,
2004 • www.isofoton.es • www.bpsolar.com • www.ibersolar.com • [RD 436/2004] R.D. 436/2004 de 12 de marzo • [FENO] www.unionfenosa.es • [PLAN 06] Conferencia: Posicionamiento político en la planificación energética
nacional. La cuestión nuclear. • [AYTO 06] www.ayto-coslada.es • www.censolar.es • [WIKI 06] http://es.wikipedia.org/ • [EKO] http://www.ekogaia.net • http://tecnologias.gio.etsit.upm.es/domotica • www.ine.es • http://www.terra.org/html/s/ecologia.html • [IBER 05] http://bdd.unizar.es/pag3/pag6-1/potencia.htm
93
7 . Apéndice
El presente apéndice se adjunta para facilitar la comprensión del código. Lo
que se pretende es explicar algunos comandos propios de la programación cuya
utilización se repite muy a menudo a lo largo del código
7.1 Estructuras de decisión
Son las encargadas de comprobar condiciones, y dependiendo de los
resultados, realizar diferentes operaciones.
7.1.1 Sentencia IF ... THEN ... ELSE ...
Esta estructura permite ejecutar condicionalmente una o más sentencias y
puede escribirse de dos formas. La primera ocupa sólo una línea y tiene la forma
siguiente:
If condicion Then sentencia1 [Else sentencia2]
La segunda es más general y se muestra a continuación:
If condicion Then
sentencia(s)
[Else
sentencia(s)]
End If
Si condicion es True (verdadera), se ejecutan las sentencias que están a
continuación de Then, y si condicion es False (falsa), se ejecutan las sentencias que
95
están a continuación de Else, si esta cláusula ha sido especificada (pues es
opcional). Para indicar que se quiere ejecutar uno de varios bloques de sentencias
dependientes cada uno de ellos de una condición, la estructura adecuada es la
siguiente:
If condicion1 Then
sentencias1
ElseIf condicion2 Then
sentencias2
Else
sentencia-n
End If
Si se cumple la condicion1 se ejecutan las sentencias1, y si no se cumple, se
examinan secuencialmente las condiciones siguientes hasta Else, ejecutándose las
sentencias correspondientes al primer ElseIf cuya condición se cumpla. Si todas las
condiciones son falsas, se ejecutan las sentencias-n correspondientes a Else, que es
la opción por defecto. La Figura 7.1 presenta esquemáticamente ambas formas de
representar estas sentencias:
7.1.2 Sentencia SELECT CASE
Esta sentencia permite ejecutar una de entre varias acciones en función del
valor de una expresión. Es una alternativa a If ... Then ... ElseIf cuando se
96
compara la misma expresión con diferentes valores. Su forma general es la
siguiente:
Select Case expresion
Case etiq1
[sentencias1]
Case etiq2
[sentencias2]
Case Else
sentenciasn
End Select
Donde expresión es una expresión numérica o alfanumérica, y etiq1, etiq2, ...
pueden adoptar distintas formas, en el presente proyecto se han utilizado las
siguientes:
1. expresión
2. combinación de expresiones separadas por comas
Cuando se ejecuta una sentencia Select Case, Visual Basic evalúa la
expresión y el control del programa se transfiere a la sentencia cuya etiqueta tenga
el mismo valor que la expresión evaluada, ejecutando a continuación el
correspondiente bloque de sentencias. Si no existe un valor igual a la expresión
entonces se ejecutan las sentencias a continuación de Case Else.
7.2 Estructuras de bucle
También son llamadas repetitivas. Se utilizan para ejecutar una o más líneas
de código un número determinado de veces.
7.2.1 Sentencia FOR ... NEXT
La sentencia For da lugar a un lazo o bucle, y permite ejecutar un conjunto
de sentencias cierto número de veces. Su forma general es:
For variable = expresion1 To expresion2 [Step expresion3]
97
[sentencias]
Exit For
[sentencias]
Next [variable]
Cuando se ejecuta una sentencia For, primero se asigna el valor de la
expresion1 a la variable y se comprueba si su valor es mayor o menor que la
expresion2. En caso de ser menor se ejecutan las sentencias, y en caso de ser
mayor el control del programa salta a las líneas a continuación de Next. Todo esto
sucede en caso de ser la expresion3 positiva. En caso contrario se ejecutarán las
sentencias cuando la variable sea mayor que expresion2. Una vez ejecutadas las
sentencias, la variable se incrementa en el valor de la expresion3, o en 1 si Step no
se especifica, volviéndose a efectuar la comparación entre la variable y la
expresion2, y así sucesivamente.
La sentencia Exit For es opcional y permite salir de un bucle For ... Next
antes de que éste finalice.
7.2.2 Sentencia DO…LOOP
Un Loop (bucle) repite la ejecución de un conjunto de sentencias mientras
una condición dada sea cierta, o hasta que una condición dada sea cierta. La
condición puede ser verificada antes o después de ejecutarse el conjunto de
sentencias. Sus posibles formas son las siguientes:
’ Formato 1:
Do [{While/Until} condicion]
[sentencias]
[Exit Do]
[sentencias]
Loop
’ Formato 2:
Do
98
[sentencias]
[Exit Do]
[sentencias]
Loop [{While/Until}condicion]
La sentencia opcional Exit Do permite salir de una bucle Do ... Loop antes
de que finalice éste. La representación esquemática del mismo sería la siguiente:
En el código desarrollado en este proyecto se ha utilizado el formato 2 con
while. Con este formato el bucle se ejecuta al menos una vez y se continuará
ejecutando mientras se cumpla la condición.
99
'Agosto 'Prueba Option Explicit Const PI As Double = 3.14159265359 Dim Dibujoname As String 'VARIABLES PARA CÁLCULO DE ÁNGULOS Dim w As Single: Dim wGrad As Integer Dim DecliRad(1 To 365) As Double: Dim AlturaRad(1 To 365, 1 To 24) As Double: Dim AzimutRad(1 To 365, 1 To 24) As Double Dim L As Single: Dim AnguloNormalRad(1 To 365, 1 To 24) As Double: Dim Incli As Single: Dim Desviacion As Single Dim XD As Double: Dim X1 As Double: Dim X2 As Double: Dim X3 As Double 'Dim Hora As Integer Dim DecliGrad(1 To 365) As Double: Dim AlturaGrad(1 To 365, 1 To 24) As Double: Dim AzimutGrad(1 To 365, 1 To 24) As Double Dim AnguloNormalGrad(1 To 365, 1 To 24) As Double Dim AnguloNormalSeg As Single Dim Altura As Single: Dim Azimut As Single 'DATOS DEL SEGUIDOR Dim BaseP As Single: Dim AlturaP As Single: Dim h As Integer: Dim AlturaColumna As Integer 'VARIABLES PARA EL CÁLCULO DE LA SOMBRA Dim h1(1 To 365, 1 To 24) As Single: Dim h2(1 To 365, 1 To 24) As Single Dim d1(1 To 365, 1 To 24) As Single: Dim d2(1 To 365, 1 To 24) As Single Dim AlturaSeg As Single: Dim AngMax As Single: Dim AnguloNormal As Single 'Variables para calculo de coordenadas Dim XL As Single: Dim YL As Single: Dim ZL As Single Dim G As Single 'CÁLCULO DE LOS ÁNGULOS Function CalculoAngulos1(N As Integer, Hora As Single) XD = (0.973 * N - 77.84) * PI / 180 DecliRad(N) = (23.45 * PI / 180) * Sin(XD) wGrad = Abs(12 - Hora) * 15 w = wGrad * PI / 180 Desviacion = 0 X1 = Cos(L) * Cos(DecliRad(N)) * Cos(w) + Sin(L) * Sin(DecliRad(N)) If X1 < 0 Then CalculoAngulos1 = 0 Exit Function Else If -X1 * X1 + 1 = 0 Then AlturaRad(N, Hora) = PI / 2
101
Else AlturaRad(N, Hora) = Atn(X1 / Sqr(-X1 * X1 + 1)) 'Arcoseno End If End If CalculoAngulos1 = AlturaRad(N, Hora) End Function Function CalculoAngulos2(N As Integer, Hora As Single) Altura = CalculoAngulos1(N, Hora) If Altura = 0 Then CalculoAngulos2 = 0 Exit Function Else X2 = Cos(DecliRad(N)) * Sin(w) / Cos(Altura) X3 = (Sin(L) * Sin(Altura) - Sin(DecliRad(N))) / (Cos(L) * Cos(Altura)) If X2 >= 0 Then If X3 > 0 Then '1er cuadrante If X2 = 1 Then AzimutRad(N, Hora) = PI / 2 Else AzimutRad(N, Hora) = Atn(X2 / Sqr(-X2 * X2 + 1)) 'Arcoseno End If Else '2º cuadrante AzimutRad(N, Hora) = Atn(-X3 / Sqr(-X3 * X3 + 1)) + 2 * Atn(1) 'Arcocoseno End If ElseIf X3 > 0 Then '4º Cuadrante AzimutRad(N, Hora) = Atn(X2 / Sqr(-X2 * X2 + 1)) 'Arcoseno Else '3º cuadrante If X2 = -1 Then AzimutRad(N, Hora) = -PI / 2 Else AzimutRad(N, Hora) = Atn(X2 / Sqr(-X2 * X2 + 1)) - (PI / 2) 'Arcoseno End If End If End If If Hora <= 12 Then CalculoAngulos2 = AzimutRad(N, Hora) Else CalculoAngulos2 = -AzimutRad(N, Hora) End If AnguloNormalRad(N, Hora) = (PI / 2) - AlturaRad(N, Hora) AlturaGrad(N, Hora) = AlturaRad(N, Hora) * 180 / PI AzimutGrad(N, Hora) = AzimutRad(N, Hora) * 180 / PI
102
AnguloNormalGrad(N, Hora) = AnguloNormalRad(N, Hora) * 180 / PI DecliGrad(N) = DecliRad(N) * 180 / PI End Function 'CÁLCULO DE d, DISTANCIA DE LA SOMBRA Function DistanciaSombra1(N As Integer, Hora As Single, h As Single, AngMax As Single) Altura = CalculoAngulos1(N, Hora) If Altura < AngMax Then AlturaSeg = AngMax Else AlturaSeg = Altura End If If Altura = 0 Then d1(N, Hora) = 0 Else h1(N, Hora) = h - (AlturaP * Sin((PI / 2) - AlturaSeg) / 2) d1(N, Hora) = h1(N, Hora) / Tan(Altura) End If DistanciaSombra1 = d1(N, Hora) End Function Function DistanciaSombra2(N As Integer, Hora As Single, h As Single, AngMax As Single) Altura = CalculoAngulos1(N, Hora) If Altura < AngMax Then AlturaSeg = AngMax Else AlturaSeg = Altura End If If Altura = 0 Then d2(N, Hora) = 0 Else h2(N, Hora) = h + (AlturaP * Sin((PI / 2) - AlturaSeg) / 2) d2(N, Hora) = h2(N, Hora) / Tan(Altura) End If DistanciaSombra2 = d2(N, Hora) End Function Function LocalesAGlobales(N As Integer, Hora As Single, Coord As Integer, Punto As Integer, Sombra As Integer, h As Single, AngMax As Single) Azimut = CalculoAngulos2(N, Hora) If Coord = 1 Then XL = XLSeguidor(Punto) YL = YLSeguidor(N, Hora, Punto, Sombra, h, AngMax) G = XL * Cos(Azimut) - YL * Sin(Azimut) ElseIf Coord = 2 Then XL = XLSeguidor(Punto) YL = YLSeguidor(N, Hora, Punto, Sombra, h, AngMax) G = XL * Sin(Azimut) + YL * Cos(Azimut) Else G = ZLSeguidor(N, Hora, Punto, h)
103
End If LocalesAGlobales = G End Function Function XLSeguidor(Punto As Integer) Select Case Punto Case 1, 2 XL = BaseP / 2 Case 3, 4 XL = -BaseP / 2 End Select XLSeguidor = XL End Function Function YLSeguidor(N As Integer, Hora As Single, Punto As Integer, Sombra As Integer, h As Single, AngMax As Single) Altura = CalculoAngulos1(N, Hora) If Altura < AngMax Then AlturaSeg = AngMax Else AlturaSeg = Altura End If AnguloNormalSeg = (PI / 2) - AlturaSeg If Sombra = 0 Then Select Case Punto Case 1, 4 YL = AlturaP * Cos(AnguloNormalSeg) / 2 Case 2, 3 YL = -(AlturaP * Cos(AnguloNormalSeg) / 2) End Select ElseIf Sombra = 1 Then Select Case Punto Case 1, 4 YL = (AlturaP / 2) - DistanciaSombra1(N, Hora, h, AngMax) * Cos(AnguloNormalSeg) Case 2, 3 YL = -((AlturaP / 2) + DistanciaSombra2(N, Hora, h, AngMax)) * Cos(AnguloNormalSeg) End Select End If YLSeguidor = YL End Function Function ZLSeguidor(N As Integer, Hora As Single, Punto As Integer, h As Single) Altura = CalculoAngulos1(N, Hora) If Altura < AngMax Then AlturaSeg = AngMax Else AlturaSeg = Altura
104
End If Select Case Punto Case 1, 4 ZL = h - (AlturaP * Cos(AlturaSeg) / 2) Case 2, 3 ZL = h + (AlturaP * Cos(AlturaSeg) / 2) End Select ZLSeguidor = ZL End Function Function DistanciaMinNS(Sombra As Integer, h As Single, AngMax As Single) Dim Dia As Integer: Dim HoraDia As Single Dia = 355 HoraDia = 8 Dim ko As Single Dim ZG3 As Single: Dim ZG4 As Single: Dim DistNS As Single: Dim LNS As Single ko = 4 * PI / 180 Altura = CalculoAngulos1(Dia, HoraDia) Azimut = CalculoAngulos2(Dia, HoraDia) If Altura < AngMax Then AlturaSeg = AngMax Else AlturaSeg = Altura End If ZG3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, h, AngMax) ZG4 = LocalesAGlobales(Dia, HoraDia, 3, 4, 0, h, AngMax) LNS = ZG3 - ZG4 DistNS = ((LNS / Tan(Altura)) + AlturaP * Cos(AlturaSeg)) * Cos(Azimut) DistanciaMinNS = DistNS End Function Function DistanciaMinEO(Sombra As Integer, h As Single, AngMax As Single) Dim Dia As Integer: Dim HoraDia As Single Dia = 355 HoraDia = 8 Dim ko As Single Dim ZG1 As Single: Dim ZG2 As Single: Dim DistEO As Single: Dim LEO As Single ko = 4 * PI / 180 Altura = CalculoAngulos1(Dia, HoraDia) Azimut = CalculoAngulos2(Dia, HoraDia) If Altura < AngMax Then AlturaSeg = AngMax Else AlturaSeg = Altura End If ZG2 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, h, AngMax) ZG1 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, h, AngMax) LEO = ZG2 - ZG1 DistEO = ((LEO / Tan(Altura)) + BaseP * Cos(AlturaSeg)) * Sin(Azimut) DistanciaMinEO = DistEO
105
End Function Private Sub cmdBuscar_Click() CommonDialog1.Filter = "(*.dxf)|*.dxf" 'Abrimos el Commondialog con ShowOpen CommonDialog1.ShowOpen 'Si seleccionamos un archivo mostramos la ruta If CommonDialog1.FileName <> "" Then TxtPath.Text = CommonDialog1.FileName Dibujoname = CommonDialog1.FileName Else 'Si no mostramos un texto de advertencia de que no se seleccionó _ ninguno, ya que FileName devuelve una cadena vacía TxtPath.Text = "No se seleccionó ningún archivo" End If End Sub Private Sub cmdCalcular_Click() Dim Dibujoobj Dim Dibujo Dim xDibujo() As String: Dim yDibujo() As String: Dim zDibujo() As String Dim Etiqueta As String: Dim linea As String Dim comparador As String: Dim i As Long Dim XX As Boolean: Dim YY As Boolean: Dim ZZ As Boolean Dim Filas As Long: Dim cont As Long: Dim j As Long 'f06name = Application.GetOpenFilename("Autocad output(*.dxf),*.dxf",) Set Dibujoobj = CreateObject("Scripting.FileSystemObject") Set Dibujo = Dibujoobj.OpenTextFile(Dibujoname, 1) 'Dibujo.skipline 'Text1.Text = Dibujo.readline Do While StrComp(Dibujo.readline, "EOF") <> 0 Filas = Filas + 1 Loop Dibujo.Close Dim NumerodeSeguidores As Integer Dim fin As Integer Dim Numseguidores As Integer
106
Dim Dia As Integer Dim HoraDia As Single NumerodeSeguidores = txtNSeguidores.Text Numseguidores = NumerodeSeguidores Dim ApExcel1 As Variant Set ApExcel1 = CreateObject("Excel.application") ApExcel1.workbooks.open ("C:\Documents and Settings\Paula Calles\My Documents\Proyecto\Tablas para el proyecto.xls") 'VARIABLES PARA INTERCAMBIO DINAMICO DE DATOS(COMUNIDAD==LATITUD) Dim Columna As String Dim ColumnaA As String Dim Fila As Integer 'COMUNIDAD==LATITUD For Fila = 72 To 123 Latitud.LinkMode = 0 Latitud.LinkTopic = "Excel|Hoja1" Latitud.LinkItem = "F" & Fila & "C1" Latitud.LinkMode = 1 ColumnaA = "F" & CStr(Fila) & "C1" Latitud.LinkItem = ColumnaA If Left(Latitud.Text, Len(cmbComunidad)) = cmbComunidad Then Latitud.LinkMode = 0 Latitud.LinkTopic = "Excel|Hoja1" Latitud.LinkItem = "F" & Fila & "C3" Latitud.LinkMode = 1 ColumnaA = "F" & CStr(Fila) & "C3" Latitud.LinkItem = ColumnaA Exit For End If Next L = (Latitud.Text) * PI / 180 ApExcel1.workbooks("Tablas para el proyecto.xls").Close savechanges:=False Do Set Dibujoobj = CreateObject("Scripting.FileSystemObject") Set Dibujo = Dibujoobj.OpenTextFile(Dibujoname, 1) For cont = 1 To Filas Do linea = Dibujo.readline j = j + 1 If j > Filas Then
107
Exit For End If Loop While StrComp(linea, "SEGUIDORES") <> 0 Do linea = Dibujo.readline j = j + 1 Loop While StrComp(linea, " 10") <> 0 i = i + 1 ReDim Preserve xDibujo(i) ReDim Preserve yDibujo(i) ReDim Preserve zDibujo(i) xDibujo(i) = Dibujo.readline Dibujo.skipline yDibujo(i) = Dibujo.readline Dibujo.skipline zDibujo(i) = Dibujo.readline j = j + 5 Next Dibujo.Close 'Text1.Text = i Dim posicion As Integer Dim ii As Integer Dim xSeg() As Single: Dim ySeg() As Single: Dim zSeg() As Single Dim XSEGUIDOR() As Single: Dim YSEGUIDOR() As Single Dim compara As Double ii = 0 ReDim xSeg(1 To Numseguidores) ReDim ySeg(1 To Numseguidores) ReDim zSeg(1 To Numseguidores) ReDim XSEGUIDOR(1 To Numseguidores) ReDim YSEGUIDOR(1 To Numseguidores) For posicion = (i - (Numseguidores - 1)) To i ii = ii + 1 zSeg(ii) = Val(zDibujo(posicion)) xSeg(ii) = Val(xDibujo(posicion)) ySeg(ii) = Val(yDibujo(posicion)) Next
108
XSEGUIDOR() = xSeg() YSEGUIDOR() = ySeg() 'Text1.Text = ySeg(NumSeguidores) Dim ORDENX() As Single: Dim POSICIONX() As Integer ReDim ORDENX(1 To Numseguidores) ReDim POSICIONX(1 To Numseguidores) compara = 0.1 j = 0 For j = 1 To Numseguidores compara = 0.1 For i = 1 To Numseguidores If xSeg(i) > compara Then compara = xSeg(i) posicion = i End If Next ORDENX(j) = compara POSICIONX(j) = posicion xSeg(posicion) = 0 Next 'Text1.Text = ORDENX(83) Dim ORDENY() As Single: Dim POSICIONY() As Integer ReDim ORDENY(1 To Numseguidores) ReDim POSICIONY(1 To Numseguidores) compara = 0.1 j = 0 For j = 1 To Numseguidores
109
compara = 0.1 For i = 1 To Numseguidores If ySeg(i) > compara Then compara = ySeg(i) posicion = i End If Next ORDENY(j) = compara POSICIONY(j) = posicion ySeg(posicion) = 0 Next xSeg() = ORDENX() ii = 0 For j = 1 To Numseguidores If xSeg(j) <> 0 Then compara = xSeg(j) ii = ii + 1 For i = 1 To Numseguidores If xSeg(i) = compara Then xSeg(i) = 0 End If Next End If Next 'Text1.Text = ii Dim jj As Integer
110
ySeg() = ORDENY() jj = 0 For j = 1 To Numseguidores If ySeg(j) <> 0 Then compara = ySeg(j) jj = jj + 1 For i = 1 To Numseguidores If ySeg(i) = compara Then ySeg(i) = 0 End If Next End If Next 'Text1.Text = ORDENX(3) Dim PoscSegX1() As Single: Dim PoscSegY1() As Single: Dim PoscSegZ1() As Single Dim a As Integer: Dim b As Integer Dim posx() As Integer: Dim posy() As Integer ReDim posx(1 To Numseguidores) b = 0 a = 0 xSeg() = ORDENX() For i = 1 To Numseguidores If xSeg(i) <> 0 Then b = b + 1 compara = xSeg(i) For j = 1 To Numseguidores If xSeg(j) = compara Then a = POSICIONX(j) posx(a) = b xSeg(j) = 0 End If
111
Next End If Next ReDim posy(1 To Numseguidores) b = 0 a = 0 ySeg() = ORDENY() For i = 1 To Numseguidores If ySeg(i) <> 0 Then b = b + 1 compara = ySeg(i) For j = 1 To Numseguidores If ySeg(j) = compara Then a = POSICIONY(j) posy(a) = b ySeg(j) = 0 End If Next End If Next 'Text1.Text = posx(15) Dim c As Integer ReDim PoscSegX1(1 To ii, 1 To jj): ReDim PoscSegY1(1 To ii, 1 To jj): ReDim PoscSegZ1(1 To ii, 1 To jj) For i = 1 To Numseguidores For j = 1 To Numseguidores If POSICIONX(j) = i Then a = posx(i) b = posy(i) c = POSICIONX(j)
112
PoscSegX1(a, b) = XSEGUIDOR(c) PoscSegY1(a, b) = YSEGUIDOR(c) PoscSegZ1(a, b) = zSeg(c) End If Next Next ' Text1.Text = PoscSegX1(ii, jj) Dim PoscSegX() As Single: Dim PoscSegY() As Single: Dim PoscSegZ() As Single ReDim PoscSegX(ii, jj): ReDim PoscSegY(ii, jj): ReDim PoscSegZ(ii, jj) i = 0 j = 0 For a = ii To 1 Step -1 i = i + 1 For b = jj To 1 Step -1 j = j + 1 PoscSegX(i, j) = PoscSegX1(a, b) PoscSegY(i, j) = PoscSegY1(a, b) PoscSegZ(i, j) = PoscSegZ1(a, b) Next j = 0 Next Dim Distancia1 As Single: Dim Distancia2 As Single Dim AlturaColumna As Single AlturaP = txtAltura.Text BaseP = txtBase.Text AlturaColumna = txtAltColumna.Text AngMax = (90 - txtAngMax.Text) * PI / 180 Dim XG1 As Single Dim DNS As Single: Dim DEO As Single 'VARIABLES PARA CÁLCULO DEL ÁREA DE LA SOMBRA
113
Dim r1 As Single: Dim r2 As Single: Dim r3 As Single Dim s1 As Single: Dim s2 As Single: Dim s3 As Single Dim t1 As Single: Dim t2 As Single: Dim t3 As Single Dim v1 As Single: Dim v2 As Single: Dim v3 As Single Dim w1 As Single: Dim w2 As Single: Dim w3 As Single Dim u1 As Single: Dim u2 As Single: Dim u3 As Single Dim d As Single: Dim e As Single: Dim f As Single Dim a1 As Double: Dim b1 As Single: Dim a3 As Single Dim a2 As Single: Dim b2 As Single: Dim b3 As Single Dim X: Dim Y As Single: Dim z As Single Dim basex As Single: Dim basey As Single: Dim Area As Single Dim sy As Single: Dim sx As Single Dim XLFilas As Single: Dim YLFilas As Single Dim XLCOlumnas As Single: Dim YLColumnas As Single Dim NumColumnas As Integer: Dim NumFilas As Integer: Dim SeparacionFilas As Single: Dim SeparacionColumnas As Single Dim Perdidas As Single: Dim rep As Integer Dim pasos As Integer 'Dia = txtDia.Text 'HoraDia = txtHora.Text Dim zrecta As Single Dim RA1 As Single: Dim RB1 As Single: Dim RC1 As Single Dim RA2 As Single: Dim RB2 As Single: Dim RC2 As Single Dim PerdidasNS As Single: Dim GananciasNS As Single Dim PerdidasEO As Single: Dim GananciasEO As Single Dim PerdidasNSprov As Single: Dim GananciasNSprov As Single Dim PerdidasEOprov As Single: Dim GananciasEOprov As Single PerdidasNS = 0 PerdidasEO = 0 'GananciasNS = 1 'GananciasEO = 1 Dia = 0 Dim Seguidor As Integer: Dim sc As Single: Dim AlturaPreal As Single Dim AreaPerdidas As Single: Dim AreaPerdidasTotal As Single: Dim AreaTotal As Single Dim DiaMes As Integer: Dim Mes As Integer: Dim FinMes As Integer Dim SeguidorNumero As Integer Dim XSEGFijo As Single: Dim YSEGFijo As Single Dim ApExcel As Variant Dim PorcPerdidas As Single
114
Set ApExcel = CreateObject("Excel.application") ' Hace que Excel se vea ApExcel.Visible = True 'Agrega un nuevo Libro ApExcel.workbooks.Add ApExcel.cells(1, 2).formula = "Enero" ApExcel.cells(1, 3).formula = "Febrero" ApExcel.cells(1, 4).formula = "Marzo" ApExcel.cells(1, 5).formula = "Abril" ApExcel.cells(1, 6).formula = "Mayo" ApExcel.cells(1, 7).formula = "Junio" ApExcel.cells(1, 8).formula = "Julio" ApExcel.cells(1, 9).formula = "Agosto" ApExcel.cells(1, 10).formula = "Septiembre" ApExcel.cells(1, 11).formula = "Octubre" ApExcel.cells(1, 12).formula = "Noviembre" ApExcel.cells(1, 13).formula = "Diciembre" ApExcel.range("b1:m1").Font.Size = 10 ApExcel.range("b1:m1").Font.Bold = True SeguidorNumero = 0 For a = 1 To ii For b = 1 To jj XSEGFijo = PoscSegX(a, b) YSEGFijo = PoscSegY(a, b) If XSEGFijo <> 0 Then SeguidorNumero = SeguidorNumero + 1 For Mes = 1 To 12 Select Case Mes Case 4, 6, 9, 11
115
FinMes = 30 Case 1, 3, 5, 7, 8, 10, 12 FinMes = 31 Case 2 FinMes = 28 End Select For DiaMes = 1 To FinMes Dia = Dia + 1 For Seguidor = 1 To 8 For HoraDia = 0 To 24 Step 0.5 Azimut = CalculoAngulos2(Dia, HoraDia) Altura = CalculoAngulos1(Dia, HoraDia) If Altura = 0 Then AreaPerdidas = 0 Area = 0 ElseIf HoraDia = 12 Then AreaPerdidas = 0 Area = BaseP * AlturaP Else If Seguidor = 5 Or Seguidor = 7 Then If a = ii Then basex = 0 basey = 0 ElseIf b = jj And Seguidor = 5 Then basex = 0 basey = 0 ElseIf b = 1 And Seguidor = 7 Then basex = 0 basey = 0 Else If Seguidor = 5 And Azimut < PI / 2 Then
116
basex = 0 basey = 0 ElseIf Seguidor = 7 And Azimut > PI / 2 Then basex = 0 basey = 0 Else If Seguidor = 5 Then sx = -PoscSegX(a + 1, b + 1) + XSEGFijo sy = -PoscSegY(a + 1, b + 1) + YSEGFijo ElseIf Seguidor = 7 Then sx = -PoscSegX(a + 1, b - 1) + XSEGFijo sy = -PoscSegY(a + 1, b - 1) + YSEGFijo End If If sx = 0 Then basex = 0 basey = 0 Else r1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) + sy t3 = 0 'El plano va a ser de la forma: v1*x+v2*y+v3*z+d=0 a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 v1 = (a2 * b3) - (a3 * b2) v2 = -((a1 * b3) - (a3 * b1)) v3 = (a1 * b2) - (a2 * b1) d = -s1 * v1 - s2 * v2 - s3 * v3
117
'vuelvo a definir 3 puntos 'R=(r1, r2, r3) S=(s1, s2, s3) T=(t1, t2, t3) r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) 'Este plano corresponde al segundo seguidor r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) 'donde sf será la distancia de separación entre filas r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) t3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 'El plano va a ser de la forma: w1*x+w2*y+w3*z+e=0 w1 = (a2 * b3) - (a3 * b2) w2 = -((a1 * b3) - (a3 * b1)) w3 = (a1 * b2) - (a2 * b1) e = -s1 * w1 - s2 * w2 - s3 * w3 'Luego la recta intersección vendrá definida por: v1*x+v2*y+v3*z+d=0 y w1*x+w2*y+w3*z+e=0 'voy a comprobar que la sombra de un seguidor interseca con el otro 'para ello, voy a comparar alturas. X = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) z = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) zrecta = -(((v1 - (w1 * v2 / w2)) * X) + (d - (e * v2 / w2))) / (v3 - (w3 * v2 / w2)) If zrecta < z Then basex = 0 basey = 0 Else If Azimut > PI / 2 And Seguidor = 5 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 1, AlturaColumna, AngMax) + sy t3 = 0 ElseIf Azimut < PI / 4 And Seguidor = 7 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) + sx
118
r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 1, AlturaColumna, AngMax) + sy t3 = 0 ElseIf PI / 2 > Azimut And Seguidor = 7 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 4, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 4, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 4, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) + sy t3 = 0 End If a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 u1 = (a2 * b3) - (a3 * b2) u2 = -((a1 * b3) - (a3 * b1)) u3 = (a1 * b2) - (a2 * b1) f = -s1 * u1 - s2 * u2 - s3 * u3 'Luego la recta intersección vendrá definida por: u1*x+u2*y+u3*z+f=0 y w1*x+w2*y+w3*z+e=0 RA1 = v1 - (v3 * w1 / w3): RB1 = v2 - (v3 * w2 / w3): RC1 = d - (v3 * e / w3) RA2 = u1 - (u3 * w1 / w3): RB2 = u2 - (u3 * w2 / w3): RC2 = f - (u3 * e / w3) 'hallo x e y de la intersección X = ((RB1 * RC2 / RB2) - RC1) / (RA1 - (RB1 * RA2 / RB2)) Y = -(((RA2 * X) + RC2) / RB2) 'Dim XLFilas As Single: Dim YLFilas As Single: Dim basex As Single: Dim basey As Single XLFilas = (X * Cos(Azimut)) + (Y * Sin(Azimut)) YLFilas = (-X * Sin(Azimut)) + (Y * Cos(Azimut)) AlturaPreal = YLSeguidor(Dia, HoraDia, 1, 0, AlturaColumna, AngMax) If BaseP / 2 > XLFilas And XLFilas > -BaseP / 2 Then
119
If AlturaPreal > YLFilas And YLFilas > -AlturaPreal Then If Azimut > PI / 2 And Seguidor = 5 Then basex = BaseP / 2 + XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) ElseIf Azimut < PI / 4 And Seguidor = 7 Then basex = BaseP / 2 + XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) ElseIf PI / 2 > Azimut And Seguidor = 7 Then basex = BaseP / 2 - XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) End If Else basex = 0 basey = 0 End If Else basex = 0 basey = 0 End If End If End If End If End If End If If Seguidor = 8 Then If b = 1 Then basex = 0 basey = 0 ElseIf PoscSegX(a, b - 1) = 0 Then basex = 0 basey = 0 Else sx = -PoscSegX(a, b - 1) + XSEGFijo sy = -PoscSegY(a, b - 1) + YSEGFijo
120
r1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) r2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) + sy t3 = 0 'El plano va a ser de la forma: v1*x+v2*y+v3*z+d=0 a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 v1 = (a2 * b3) - (a3 * b2) v2 = -((a1 * b3) - (a3 * b1)) v3 = (a1 * b2) - (a2 * b1) d = -s1 * v1 - s2 * v2 - s3 * v3 'vuelvo a definir 3 puntos 'R=(r1, r2, r3) S=(s1, s2, s3) T=(t1, t2, t3) r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) 'Este plano corresponde al segundo seguidor r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) 'donde sf será la distancia de separación entre filas r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) t3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 'El plano va a ser de la forma: w1*x+w2*y+w3*z+e=0 w1 = (a2 * b3) - (a3 * b2) w2 = -((a1 * b3) - (a3 * b1)) w3 = (a1 * b2) - (a2 * b1) e = -s1 * w1 - s2 * w2 - s3 * w3 'Luego la recta intersección vendrá definida por: v1*x+v2*y+v3*z+d=0 y w1*x+w2*y+w3*z+e=0 'voy a comprobar que la sombra de un seguidor interseca con el otro 'para ello, voy a comparar alturas.
121
X = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) z = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) zrecta = -(((v1 - (w1 * v2 / w2)) * X) + (d - (e * v2 / w2))) / (v3 - (w3 * v2 / w2)) If zrecta > z Then If Azimut >= 0 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 4, 0, AlturaColumna, AngMax) r2 = LocalesAGlobales(Dia, HoraDia, 2, 4, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 4, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) + sy t3 = 0 ElseIf Azimut < 0 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 1, AlturaColumna, AngMax) t2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 1, AlturaColumna, AngMax) + sy t3 = 0 End If 'El plano va a ser de la forma: u1*x+u2*y+u3*z+f=0 a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 u1 = (a2 * b3) - (a3 * b2) u2 = -((a1 * b3) - (a3 * b1)) u3 = (a1 * b2) - (a2 * b1) f = -s1 * u1 - s2 * u2 - s3 * u3 'Luego la recta intersección vendrá definida por: u1*x+u2*y+u3*z+f=0 y w1*x+w2*y+w3*z+e=0 RA1 = v1 - (v3 * w1 / w3): RB1 = v2 - (v3 * w2 / w3): RC1 = d - (v3 * e / w3) RA2 = u1 - (u3 * w1 / w3): RB2 = u2 - (u3 * w2 / w3): RC2 = f - (u3 * e / w3) 'hallo x e y de la intersección
122
X = ((RB1 * RC2 / RB2) - RC1) / (RA1 - (RB1 * RA2 / RB2)) Y = -(((RA2 * X) + RC2) / RB2) 'Dim XLFilas As Single: Dim YLFilas As Single: Dim basex As Single: Dim basey As Single XLFilas = (X * Cos(Azimut)) + (Y * Sin(Azimut)) YLFilas = (-X * Sin(Azimut)) + (Y * Cos(Azimut)) AlturaPreal = YLSeguidor(Dia, HoraDia, 1, 0, AlturaColumna, AngMax) If BaseP / 2 > XLFilas And XLFilas > -BaseP / 2 Then If AlturaPreal > YLFilas And YLFilas > -AlturaPreal Then If Azimut >= 0 Then basex = BaseP / 2 - XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) ElseIf Azimut < 0 Then basex = BaseP / 2 + XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) End If Else basex = 0 basey = 0 End If Else basex = 0 basey = 0 End If Else basex = 0 basey = 0 End If End If End If If Seguidor = 6 Then If a = ii Then basex = 0 basey = 0 ElseIf PoscSegX(a + 1, b) = 0 Then basex = 0
123
basey = 0 Else sx = -PoscSegX(a + 1, b) + XSEGFijo sy = -PoscSegY(a + 1, b) + YSEGFijo r1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) r3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) t3 = 0 'El plano va a ser de la forma: v1*x+v2*y+v3*z+d=0 a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 v1 = (a2 * b3) - (a3 * b2) v2 = -((a1 * b3) - (a3 * b1)) v3 = (a1 * b2) - (a2 * b1) d = -s1 * v1 - s2 * v2 - s3 * v3 'vuelvo a definir 3 puntos 'R=(r1, r2, r3) S=(s1, s2, s3) T=(t1, t2, t3) r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) 'Este plano corresponde al segundo seguidor r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) 'donde sf será la distancia de separación entre filas r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) t3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 'El plano va a ser de la forma: w1*x+w2*y+w3*z+e=0 w1 = (a2 * b3) - (a3 * b2) w2 = -((a1 * b3) - (a3 * b1)) w3 = (a1 * b2) - (a2 * b1) e = -s1 * w1 - s2 * w2 - s3 * w3
124
'Luego la recta intersección vendrá definida por: v1*x+v2*y+v3*z+d=0 y w1*x+w2*y+w3*z+e=0 'voy a comprobar que la sombra de un seguidor interseca con el otro 'para ello, voy a comparar alturas. X = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) z = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) zrecta = -(((v1 - (w1 * v2 / w2)) * X) + (d - (e * v2 / w2))) / (v3 - (w3 * v2 / w2)) If zrecta > z Then If Azimut < PI / 2 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 1, AlturaColumna, AngMax) t3 = 0 ElseIf Azimut >= PI / 2 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 4, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 4, 0, AlturaColumna, AngMax) r3 = LocalesAGlobales(Dia, HoraDia, 3, 4, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) t3 = 0 End If 'El plano va a ser de la forma: u1*x+u2*y+u3*z+f=0 a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 u1 = (a2 * b3) - (a3 * b2) u2 = -((a1 * b3) - (a3 * b1)) u3 = (a1 * b2) - (a2 * b1) f = -s1 * u1 - s2 * u2 - s3 * u3 'Luego la recta intersección vendrá definida por: u1*x+u2*y+u3*z+f=0 y w1*x+w2*y+w3*z+e=0
125
RA1 = v1 - (v3 * w1 / w3): RB1 = v2 - (v3 * w2 / w3): RC1 = d - (v3 * e / w3) RA2 = u1 - (u3 * w1 / w3): RB2 = u2 - (u3 * w2 / w3): RC2 = f - (u3 * e / w3) 'hallo x e y de la intersección X = ((RB1 * RC2 / RB2) - RC1) / (RA1 - (RB1 * RA2 / RB2)) Y = -(((RA2 * X) + RC2) / RB2) XLFilas = (X * Cos(Azimut)) + (Y * Sin(Azimut)) YLFilas = (-X * Sin(Azimut)) + (Y * Cos(Azimut)) AlturaPreal = YLSeguidor(Dia, HoraDia, 1, 0, AlturaColumna, AngMax) If BaseP / 2 > XLFilas And XLFilas > -BaseP / 2 Then If AlturaPreal > YLFilas And YLFilas > -AlturaPreal Then If Azimut >= PI / 2 Then basex = BaseP / 2 - XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) ElseIf Azimut < PI / 2 Then basex = BaseP / 2 + XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) End If Else basex = 0 basey = 0 End If Else basex = 0 basey = 0 End If Else basex = 0 basey = 0 End If End If End If If Seguidor = 2 Then If a = 1 Then basex = 0 basey = 0 ElseIf PoscSegX(a - 1, b) = 0 Then basex = 0
126
basey = 0 Else sx = -PoscSegX(a - 1, b) + XSEGFijo sy = -PoscSegY(a - 1, b) + YSEGFijo 'INTERSECCIÓN ENTRE 2 PLANOS 'ECUACIÓN DEL PLANO '3 PUNTOS 'R=(r1, r2, r3) S=(s1, s2, s3) T=(t1, t2, t3) r1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) r3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) t3 = 0 'El plano va a ser de la forma: v1*x+v2*y+v3*z+d=0 a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 v1 = ((a2 * b3) - (a3 * b2)) v2 = -((a1 * b3) - (a3 * b1)) v3 = ((a1 * b2) - (a2 * b1)) d = -s1 * v1 - s2 * v2 - s3 * v3 'vuelvo a definir 3 puntos 'R=(r1, r2, r3) S=(s1, s2, s3) T=(t1, t2, t3) r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) 'Este plano corresponde al segundo seguidor r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) 'donde sf será la distancia de separación entre filas r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) t3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 'El plano va a ser de la forma: w1*x+w2*y+w3*z+e=0
127
w1 = ((a2 * b3) - (a3 * b2)) w2 = -((a1 * b3) - (a3 * b1)) w3 = ((a1 * b2) - (a2 * b1)) e = -s1 * w1 - s2 * w2 - s3 * w3 'Luego la recta intersección vendrá definida por: v1*x+v2*y+v3*z+d=0 y w1*x+w2*y+w3*z+e=0 'voy a comprobar que la sombra de un seguidor interseca con el otro 'para ello, voy a comparar alturas. X = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) z = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) zrecta = -(((v1 - (w1 * v2 / w2)) * X) + (d - (e * v2 / w2))) / (v3 - (w3 * v2 / w2)) If zrecta > z Then If Azimut > -PI / 2 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 4, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 4, 0, AlturaColumna, AngMax) r3 = LocalesAGlobales(Dia, HoraDia, 3, 4, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) t3 = 0 ElseIf Azimut <= -PI / 2 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 1, AlturaColumna, AngMax) t3 = 0 End If 'El plano va a ser de la forma: u1*x+u2*y+u3*z+f=0 a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 u1 = (a2 * b3) - (a3 * b2)
128
u2 = -((a1 * b3) - (a3 * b1)) u3 = (a1 * b2) - (a2 * b1) f = -s1 * u1 - s2 * u2 - s3 * u3 'Luego la recta intersección vendrá definida por: u1*x+u2*y+u3*z+f=0 y w1*x+w2*y+w3*z+e=0 RA1 = v1 - (v3 * w1 / w3): RB1 = v2 - (v3 * w2 / w3): RC1 = d - (v3 * e / w3) RA2 = u1 - (u3 * w1 / w3): RB2 = u2 - (u3 * w2 / w3): RC2 = f - (u3 * e / w3) 'hallo x e y de la intersección X = ((RB1 * RC2 / RB2) - RC1) / (RA1 - (RB1 * RA2 / RB2)) Y = -(((RA2 * X) + RC2) / RB2) XLFilas = (X * Cos(-Azimut)) + (Y * Sin(-Azimut)) YLFilas = (-X * Sin(-Azimut)) + (Y * Cos(-Azimut)) AlturaPreal = YLSeguidor(Dia, HoraDia, 1, 0, AlturaColumna, AngMax) If BaseP / 2 > XLFilas And XLFilas > -BaseP / 2 Then If AlturaPreal > YLFilas And YLFilas > -AlturaPreal Then If Azimut > -PI / 2 Then basex = BaseP / 2 - XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) ElseIf Azimut <= -PI / 2 Then basex = BaseP / 2 + XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) End If Else basex = 0 basey = 0 End If Else basex = 0 basey = 0 End If Else basex = 0 basey = 0 End If End If End If If Seguidor = 3 Or Seguidor = 1 Then
129
If a = 1 Then basex = 0 basey = 0 ElseIf b = 1 And Seguidor = 1 Then basex = 0 basey = 0 ElseIf b = jj And Seguidor = 3 Then basex = 0 basey = 0 Else If Seguidor = 3 And Azimut > -PI / 2 Then basex = 0 basey = 0 ElseIf Seguidor = 1 And Azimut < -PI / 2 Then basex = 0 basey = 0 Else If Seguidor = 3 Then sx = -PoscSegX(a - 1, b + 1) + XSEGFijo sy = -PoscSegY(a - 1, b + 1) + YSEGFijo ElseIf Seguidor = 1 Then sx = -PoscSegX(a - 1, b - 1) + XSEGFijo sy = -PoscSegY(a - 1, b - 1) + YSEGFijo End If If sx = 0 Then basex = 0 basey = 0 Else r1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) + sx
130
s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) + sy t3 = 0 'El plano va a ser de la forma: v1*x+v2*y+v3*z+d=0 a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 v1 = (a2 * b3) - (a3 * b2) v2 = -((a1 * b3) - (a3 * b1)) v3 = (a1 * b2) - (a2 * b1) d = -s1 * v1 - s2 * v2 - s3 * v3 'vuelvo a definir 3 puntos 'R=(r1, r2, r3) S=(s1, s2, s3) T=(t1, t2, t3) r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) 'Este plano corresponde al segundo seguidor r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) 'donde sf será la distancia de separación entre filas r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) t3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 'El plano va a ser de la forma: w1*x+w2*y+w3*z+e=0 w1 = (a2 * b3) - (a3 * b2) w2 = -((a1 * b3) - (a3 * b1)) w3 = (a1 * b2) - (a2 * b1) e = -s1 * w1 - s2 * w2 - s3 * w3 'Luego la recta intersección vendrá definida por: v1*x+v2*y+v3*z+d=0 y w1*x+w2*y+w3*z+e=0 'voy a comprobar que la sombra de un seguidor interseca con el otro 'para ello, voy a comparar alturas. X = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) z = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) zrecta = -(((v1 - (w1 * v2 / w2)) * X) + (d - (e * v2 / w2))) / (v3 - (w3 * v2 / w2)) If zrecta < z Then
131
'AreaPerdidas = 0 basex = 0 basey = 0 Else If Azimut < -PI / 2 And Seguidor = 3 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 4, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 4, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 4, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) + sy t3 = 0 ElseIf Azimut > -PI / 4 And Seguidor = 1 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 4, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 4, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 4, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) + sy t3 = 0 ElseIf -PI / 2 < Azimut And Seguidor = 1 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) + sx r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) + sx s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 1, AlturaColumna, AngMax) + sx t2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 1, AlturaColumna, AngMax) + sy t3 = 0 End If a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3
132
u1 = (a2 * b3) - (a3 * b2) u2 = -((a1 * b3) - (a3 * b1)) u3 = (a1 * b2) - (a2 * b1) f = -s1 * u1 - s2 * u2 - s3 * u3 'Luego la recta intersección vendrá definida por: u1*x+u2*y+u3*z+f=0 y w1*x+w2*y+w3*z+e=0 RA1 = v1 - (v3 * w1 / w3): RB1 = v2 - (v3 * w2 / w3): RC1 = d - (v3 * e / w3) RA2 = u1 - (u3 * w1 / w3): RB2 = u2 - (u3 * w2 / w3): RC2 = f - (u3 * e / w3) 'hallo x e y de la intersección X = ((RB1 * RC2 / RB2) - RC1) / (RA1 - (RB1 * RA2 / RB2)) Y = -(((RA2 * X) + RC2) / RB2) 'Dim XLFilas As Single: Dim YLFilas As Single: Dim basex As Single: Dim basey As Single XLFilas = (X * Cos(Azimut)) + (Y * Sin(Azimut)) YLFilas = (-X * Sin(Azimut)) + (Y * Cos(Azimut)) AlturaPreal = YLSeguidor(Dia, HoraDia, 1, 0, AlturaColumna, AngMax) If BaseP / 2 > XLFilas And XLFilas > -BaseP / 2 Then If AlturaPreal > YLFilas And YLFilas > -AlturaPreal Then If Azimut < -PI / 2 And Seguidor = 3 Then basex = BaseP / 2 - XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) ElseIf Azimut > -PI / 4 And Seguidor = 1 Then basex = BaseP / 2 - XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) ElseIf -PI / 2 < -Azimut And Seguidor = 1 Then basex = BaseP / 2 + XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) End If Else basex = 0 basey = 0 End If Else basex = 0 basey = 0
133
End If End If End If End If End If End If If Seguidor = 4 Then If b = jj Then basex = 0 basey = 0 ElseIf PoscSegX(a, b + 1) = 0 Then basex = 0 basey = 0 Else sx = -PoscSegX(a, b + 1) + XSEGFijo sy = -PoscSegY(a, b + 1) + YSEGFijo r1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) r2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) + sy t3 = 0 'El plano va a ser de la forma: v1*x+v2*y+v3*z+d=0 a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 v1 = (a2 * b3) - (a3 * b2) v2 = -((a1 * b3) - (a3 * b1)) v3 = (a1 * b2) - (a2 * b1) d = -s1 * v1 - s2 * v2 - s3 * v3 'vuelvo a definir 3 puntos 'R=(r1, r2, r3) S=(s1, s2, s3) T=(t1, t2, t3) r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) 'Este plano corresponde al segundo seguidor r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) 'donde sf será la distancia de separación entre filas
134
r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) t3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 'El plano va a ser de la forma: w1*x+w2*y+w3*z+e=0 w1 = (a2 * b3) - (a3 * b2) w2 = -((a1 * b3) - (a3 * b1)) w3 = (a1 * b2) - (a2 * b1) e = -s1 * w1 - s2 * w2 - s3 * w3 'Luego la recta intersección vendrá definida por: v1*x+v2*y+v3*z+d=0 y w1*x+w2*y+w3*z+e=0 'voy a comprobar que la sombra de un seguidor interseca con el otro 'para ello, voy a comparar alturas. X = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) z = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) zrecta = -(((v1 - (w1 * v2 / w2)) * X) + (d - (e * v2 / w2))) / (v3 - (w3 * v2 / w2)) If zrecta > z Then If Azimut < 0 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 1, 0, AlturaColumna, AngMax) r2 = LocalesAGlobales(Dia, HoraDia, 2, 1, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 1, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 0, AlturaColumna, AngMax) s2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 2, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 2, 1, AlturaColumna, AngMax) t2 = LocalesAGlobales(Dia, HoraDia, 2, 2, 1, AlturaColumna, AngMax) + sy t3 = 0 ElseIf Azimut >= 0 Then r1 = LocalesAGlobales(Dia, HoraDia, 1, 4, 0, AlturaColumna, AngMax) r2 = LocalesAGlobales(Dia, HoraDia, 2, 4, 0, AlturaColumna, AngMax) + sy r3 = LocalesAGlobales(Dia, HoraDia, 3, 4, 0, AlturaColumna, AngMax) s1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 0, AlturaColumna, AngMax) s2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 0, AlturaColumna, AngMax) + sy s3 = LocalesAGlobales(Dia, HoraDia, 3, 3, 0, AlturaColumna, AngMax) t1 = LocalesAGlobales(Dia, HoraDia, 1, 3, 1, AlturaColumna, AngMax) t2 = LocalesAGlobales(Dia, HoraDia, 2, 3, 1, AlturaColumna, AngMax) + sy
135
t3 = 0 End If 'El plano va a ser de la forma: u1*x+u2*y+u3*z+f=0 a1 = s1 - t1: a2 = s2 - t2: a3 = s3 - t3 b1 = t1 - r1: b2 = t2 - r2: b3 = t3 - r3 u1 = (a2 * b3) - (a3 * b2) u2 = -((a1 * b3) - (a3 * b1)) u3 = (a1 * b2) - (a2 * b1) f = -s1 * u1 - s2 * u2 - s3 * u3 'Luego la recta intersección vendrá definida por: u1*x+u2*y+u3*z+f=0 y w1*x+w2*y+w3*z+e=0 RA1 = v1 - (v3 * w1 / w3): RB1 = v2 - (v3 * w2 / w3): RC1 = d - (v3 * e / w3) RA2 = u1 - (u3 * w1 / w3): RB2 = u2 - (u3 * w2 / w3): RC2 = f - (u3 * e / w3) 'hallo x e y de la intersección X = ((RB1 * RC2 / RB2) - RC1) / (RA1 - (RB1 * RA2 / RB2)) Y = -(((RA2 * X) + RC2) / RB2) 'Dim XLFilas As Single: Dim YLFilas As Single: Dim basex As Single: Dim basey As Single XLFilas = (X * Cos(Azimut)) + (Y * Sin(Azimut)) YLFilas = (-X * Sin(Azimut)) + (Y * Cos(Azimut)) AlturaPreal = YLSeguidor(Dia, HoraDia, 1, 0, AlturaColumna, AngMax) If BaseP / 2 > XLFilas And XLFilas > -BaseP / 2 Then If AlturaPreal > YLFilas And YLFilas > -AlturaPreal Then If Azimut < 0 Then basex = BaseP / 2 + XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) ElseIf Azimut >= 0 Then basex = BaseP / 2 - XLFilas basey = (AlturaP / 2) - ((YLFilas) / Cos(AnguloNormal)) End If Else basex = 0 basey = 0 End If
136
Else basex = 0 basey = 0 End If Else basex = 0 basey = 0 End If End If End If AreaPerdidas = basex * basey Area = BaseP * AlturaP AreaPerdidasTotal = AreaPerdidasTotal + AreaPerdidas AreaTotal = AreaTotal + Area End If Next Next Next PorcPerdidas = (AreaPerdidasTotal / AreaTotal) ApExcel.cells(SeguidorNumero + 1, 1).formula = "Seguidor" & SeguidorNumero ApExcel.cells(SeguidorNumero + 1, 1).Font.Size = 10 ApExcel.cells(SeguidorNumero + 1, 1).Font.Bold = True ApExcel.cells(SeguidorNumero + 1, Mes + 1).formula = PorcPerdidas ApExcel.cells(SeguidorNumero + 1, Mes + 1).Style = "Percent" ApExcel.cells(SeguidorNumero + 1, Mes + 1).NumberFormat = "0.00%" AreaPerdidasTotal = 0 AreaTotal = 0 Next Dia = 0 End If Next Next Set ApExcel = Nothing If NumerodeSeguidores = SeguidorNumero Then fin = 1 Else fin = 0 Numseguidores = Numseguidores + 1 ApExcel.workbooks.Close savechanges:=False
137
End If Loop Until fin = 1 End Sub Private Sub Form_Load() cmbComunidad.AddItem "Alava" cmbComunidad.AddItem "Albacete" cmbComunidad.AddItem "Alicante" cmbComunidad.AddItem "Almería" cmbComunidad.AddItem "Asturias" cmbComunidad.AddItem "Avila" cmbComunidad.AddItem "Badajoz" cmbComunidad.AddItem "Baleares" cmbComunidad.AddItem "Barcelona" cmbComunidad.AddItem "Burgos" cmbComunidad.AddItem "Cáceres" cmbComunidad.AddItem "Cádiz" cmbComunidad.AddItem "Cantabria" cmbComunidad.AddItem "Castellón" cmbComunidad.AddItem "Ceuta" cmbComunidad.AddItem "Ciudad Real" cmbComunidad.AddItem "Córdoba" cmbComunidad.AddItem "La Coruña" cmbComunidad.AddItem "Cuenca" cmbComunidad.AddItem "Gerona" cmbComunidad.AddItem "Granada" cmbComunidad.AddItem "Guadalajara" cmbComunidad.AddItem "Guipuzcoa" cmbComunidad.AddItem "Huelva" cmbComunidad.AddItem "Huesca"
138
cmbComunidad.AddItem "Jaén" cmbComunidad.AddItem "León" cmbComunidad.AddItem "Lérida" cmbComunidad.AddItem "Lugo" cmbComunidad.AddItem "Madrid" cmbComunidad.AddItem "Málaga" cmbComunidad.AddItem "Melilla" cmbComunidad.AddItem "Murcia" cmbComunidad.AddItem "Navarra" cmbComunidad.AddItem "Orense" cmbComunidad.AddItem "Palencia" cmbComunidad.AddItem "Las Palmas" cmbComunidad.AddItem "Pontevedra" cmbComunidad.AddItem "La Rioja" cmbComunidad.AddItem "Salamanca" cmbComunidad.AddItem "Sta. Cruz de Tenerife" cmbComunidad.AddItem "Segovia" cmbComunidad.AddItem "Sevilla" cmbComunidad.AddItem "Soria" cmbComunidad.AddItem "Tarragona" cmbComunidad.AddItem "Teruel" cmbComunidad.AddItem "Toledo" cmbComunidad.AddItem "Valencia" cmbComunidad.AddItem "Valladolid" cmbComunidad.AddItem "Vizcaya" cmbComunidad.AddItem "Zamora" cmbComunidad.AddItem "Zaragoza" End Sub
139