Utilizamos cookies propias y de terceros. [Más información sobre las cookies].
Política de cookies
Proyecto AjpdSoft

· Inicio
· Buscar
· Contactar
· Cookies
· Descargas
· Foros
· Historia
· Nosotros
· Temas
· Top 10
· Trucos
· Tutoriales
· Wiki

Delphi: AjpdSoft Cálculo de los parámetros de radiación
AjpdSoft


Añadida a la sección Descargas la aplicación AjpdSoft Cálculo de los parámetros de radiación: este programa ha sido desarrollado para el cálculo de la declinación solar así como para calcular la posición del Sol en cualquier día del año. Permite calcular, para una latitud dada, la radiación solar sobre superficie plana o inclinada en la capa exterior de la atmósfera. Los resultados se pueden guardar en fichero de texto, consultar en pantalla o copiar al portapapeles). Liberamos el código fuente - source code en Borland Delphi 6 100% Open Source.



 

Información del cálculo de los parámetros de radiación solar

Con el programa pueden obtener datos de radiación para cualquier día del año. Se ha de introducir la latitud del lugar del que se quieren obtener dichos datos, así como la inclinación de la superficie si es que la tuviera, y el día que del que se quiere obtener los resultados.

Pulsando el botón Calcular una vez introducidos los datos se obtendrá la DECLINACIÓN SOLAR proveniente de la expresión propuesta por Spencer:


 AjpdSoft Cálculo de los parámetros de radiaciónAjpdSoft Cálculo de los parámetros de radiación

 

De la posición del Sol, los datos obtenidos hacen referencia a la siguiente figura:

AjpdSoft Cálculo de los parámetros de radiación

 

  • α es la altura solar.
  • Ψ es el azimut.
  • θz es el ángulo cenital.
  • W, es el ángulo solar y corresponde a la trayectoria del sol, 0º al mediodía.
  • La hora del lugar será aproximadamente una hora más en verano y dos en invierno de la hora solar.

La radiación solar en el espacio se mide en valor diario medio resultante de la expresión donde Isc es la constante solar y E0, la corrección de la órbita de la tierra:

AjpdSoft Cálculo de los parámetros de radiación 

Con el programa también se obtiene el valor de radiación difusa a partir de datos mensuales de radiación global. El programa incluye los datos de  tres localidades y se usa para ello el índice de transparencia diario, que relaciona estas radiaciones, (Kd=Gd/Ids) y se aplica la correlación del Método de Page: D/G=1.00-1.13Kd.

 

Características más importantes de AjpdSoft Cálculo de los parámetros de radiación

  • Aplicación de muy sencillo manejo, muy fácil e intuitiva, todas las opciones están en una misma ventana.
  • La aplicación ha sido desarrollada en el lenguaje de programación Borland Delphi 6.
  • No necesita instalación, es suficiente con ejecutar el fichero calculosradiacion.exe.
  • Calcula la declinación solar, posición del Sol en cualquier día del año, calcula la radiación solar sobre superficie plana y sobre superficie inclinada.
  • Muestra gráficas de los valores medios mensuales de radiación difusa y global de las localidades elegidas.
  • Muestra los cálculos obtenidos en pantalla y permite guardarlos en fichero de texto.

 

AjpdSoft Cálculo de los parámetros de radiación en funcionamiento

Esta aplicación o programa informático permite calcular la declinación solar según la posición del Sol en cualquier día del año. Se obtiene así mismo para una latitud dada (gadros, minutos y segundos) la radiación solar sobre una superficie plana en la capa exterior de la atmósfera, medida en vatios hora por metro cuadrado. También puede calcular la radiación para una superficie inclinada (según los grados de inclinación).

AjpdSoft Cálculo de los parámetros de radiación calcula, para una hora solar dada, la posición del sol según sus ángulos. La aplicación incluye los datos de los valores emdios mensuales de radiación difusa para tres localidades de las que se disponen datos de radiación global: Almería, Madrid y Santander. Calcula para estas localidades la componente difusa de dicha radiación, basado en el Método de Page, y en función de la radiación total que se recibe para esas localidades, de donde dichas radiaciones extraterrestres se han calculado con el propio programa.

En primer lugar, para introducir los datos conocidos marcaremos el chec "Introducir Datos", introduciremos latitud norte (que la aplicación podrá calcular automáticamente en función de los grados, minutos y segundos), los grados de inclinación, el día del año (podremos obtener los días automáticamente para determinadas fechas:

  • Solsticio de Verano: el 21 de junio (día 172 en fecha juliana).
  • Equinoccio de Otoño: el 23 de septiembre (día 266 en fecha juliana).
  • Solsticio de Invierno: el 21 de diciembre (día 355 en fecha juliana).
  • Equinoccio de Primavera: el 31 de marzo (día 80 en fecha juliana).

O bien pulsamos los botones para cada uno de estos días del año o bien pulsamos en el desplegable del calendario y seleccionamos el día que deseemos, pulsaremos el botón "Añadir Fecha Indicada" para calcular el día del año de la fecha indicada (fecha juliana).

Una vez introducidos los datos conocidos pulsaremos "Calcular" para que la aplicación realice los cálculos automáticos de: declinación en grados, altura solar al mediodía, ángulo cenital, ángulo de salida del sol, salida para superficie inclinada, amanecer, duración del día, anochecer, radiación solar diaria extraterreste (Mh/m2), radiación diaria sobre la superficie inclinada (Wh/m2):

AjpdSoft Cálculo de los parámetros de radiación

Seleccionando en "Valores demdios mensuales de radiación difusa" la localidad (Almería, Madrid o Santander) y pulsando en "Hallar" la aplicación calculará los valores medios de radiación difusa por cada mes:

AjpdSoft Cálculo de los parámetros de radiación

Pulsando el botón "Mostrar gráfica" podremos ver una gráfica comparativa de según los distintos valores de radiación media mensual tanto global cómo difusa por localidad:

AjpdSoft Cálculo de los parámetros de radiación

La aplicación permite exportar el gráfico a bmp (imagen), mostrar una vista previa para seleccionar las opciones antes de la impresión (impresora, márgenes, posición, etc.) o imprimirlo directamente en la impresora predeterminada.

En "Posición del Sol", introduciendo la hora, los minutos y los segundos, la aplicación calculará el ángulo horario, el azimut y la altura solar:

AjpdSoft Cálculo de los parámetros de radiación

Pulsando en el botón "Informe Cálculos" podremos ver los cálculos realizados en el cuadro de texto para copiarlos al portapapeles o bien, pulsando en el botón "Guardar Informe" podremos guardarlos en fichero de texto:

AjpdSoft Cálculo de los parámetros de radiación

Seleccionando una carpeta y un nombre de fichero se guardarán los datos de los cálculos de radiación:

AjpdSoft Cálculo de los parámetros de radiación

Ejemplo de cálculos resultantes tras pulsar en "Informe Cálculos".

 

Instalación y configuración de AjpdSoft Cálculo de los parámetros de radiación

Podéis descargar el programa con el código fuente (freeware, gratuito) desde esta URL:

Descarga gratuita (freeware) de AjpdSoft Cálculo de los parámetros de radiación

Para el correcto funcionamiento sólo es necesario el fichero calculosradiacion.exe, el resto de ficheros corresponden al código fuente y no son necesarios para su ejecución.

La aplicación no necesita instalación, el fichero calculosradiacion.exe se puede ejecutar directamente.

 

Datos técnicos de AjpdSoft Cálculo de los parámetros de radiación

Esta aplicación ha sido desarrollada en el lenguaje de programación Borland Delphi 6. Guarda los cálculos realizados en un fichero de texto plano sin formato (txt).

Si eres desarrollador de software y te has registrado en nuestra web (si aún no te has registrado puedes hacerlo desde aquí gratuitamente) puedes descargar el código fuente 100% Open Source (completo y totalmente gratuito) en Borland (ahora Codegear) Delphi 6:

AjpdSoft Cálculo de los parámetros de radiación (Código fuente Open Source en Borland Delphi 6)

AjpdSoft Cálculo de los parámetros de radiación ha sido testeada y funciona correctamente en equipos con sistemas operativos: Windows 98, Windows XP, Windows 2000 Server, Windows Server 2003, Windows Vista y Windows Seven (7).

 

A quién va dirigida AjpdSoft Cálculo de los parámetros de radiación

La aplicación va dirigida a ingenieros y trabajadores que quieran montar placas solares, permite calcular determinados parámetros útiles para el correcto montaje de las placas solares.

 

Anexo

  • Ejemplo de cálculos resultantes tras pulsar en "Informe Cálculos":

IMFORME DE CÁLCULOS:

FECHA: 25/12/2009
Número de día del año: 359
Latitud del lugar: 3.06806 Grados Latitud Norte
Superficie plana y superficie inclinada 2 grados
Declinación del día -23.398 grados
ALTURA SOLAR AL MEDIODIA: 63.534 GRADOS
Ángulo cenital: 26.466 grados
ÁNGULO DE SALIDA DEL SOL: 88.671 GRADOS
Salida sol para superfie inclinada: 88.671 grados
AMANECER: 6.09 Horas antes del mediodía
DURACIÓN DEL DÍA: 11.82 Horas
ANOCHECER: 17.91 Horas desde el mediodía
Radiación solar diaria extraterrestre de 9530.39 Wh/m2
Radiación solar diaria extraterrestre sobre superficie inclinada de 9774.15 Wh/m2

  • Código fuente (source code) de la aplicación completa:

unit radiacion;
  {$R WinXP.res}


interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,shellapi, StdCtrls, ComCtrls, Buttons, dateutils, ExtCtrls, Math,
  jpeg, series, ThemeMgr;

type
  TF_Radiacion = class(TForm)
    Notas: TPageControl;
    TabSheet1: TTabSheet;
    TabSheet2: TTabSheet;
    gb_Radiacion: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label8: TLabel;
    Label16: TLabel;
    E_1: TEdit;
    E_2: TEdit;
    E_3: TEdit;
    E_4: TEdit;
    E_5: TEdit;
    E_6: TEdit;
    E_12: TEdit;
    E_11: TEdit;
    E_10: TEdit;
    E_9: TEdit;
    E_8: TEdit;
    E_7: TEdit;
    E_24: TEdit;
    E_23: TEdit;
    E_22: TEdit;
    E_21: TEdit;
    E_20: TEdit;
    E_19: TEdit;
    RB_almeria: TRadioButton;
    RB_madrid: TRadioButton;
    RB_santander: TRadioButton;
    Button1: TButton;
    E_18: TEdit;
    E_17: TEdit;
    E_16: TEdit;
    E_15: TEdit;
    E_14: TEdit;
    E_13: TEdit;
    B_informe: TButton;
    B_Guardar: TButton;
    B_salir: TButton;
    M_resultados: TMemo;
    GB_datos: TGroupBox;
    B_calcular: TButton;
    P_fecha: TPanel;
    L_dia: TLabel;
    E_numeroDedia: TEdit;
    DTP_fecha: TDateTimePicker;
    B_anadirFecha: TButton;
    B_solsticioVerano: TButton;
    B_equinoccioOtono: TButton;
    B_SolsticioInvierno: TButton;
    B_EquinoccioPrimavera: TButton;
    P_latitud: TPanel;
    LE_Latitud: TLabeledEdit;
    LE_grados: TLabeledEdit;
    LE_minutos: TLabeledEdit;
    LE_Segundos: TLabeledEdit;
    CB_grados: TCheckBox;
    B_convertirLatitud: TButton;
    LE_Inclinacion: TLabeledEdit;
    CB_datos: TCheckBox;
    P_resultados: TGroupBox;
    L_alturaSolar: TLabel;
    L_alturaCenital: TLabel;
    L_resultado: TLabel;
    L_angulosalidaSol: TLabel;
    L_DuracionDia: TLabel;
    L_fecha: TLabel;
    L_horaSalidaSol: TLabel;
    L_horaPuestasol: TLabel;
    L_anguloSalidaInclinada: TLabel;
    L_radiacionInclinada: TLabel;
    L_radiacionExtra: TLabel;
    E_declinacion: TEdit;
    E_radiacionInclinada: TEdit;
    E_radiacion: TEdit;
    GB_posicionSol: TGroupBox;
    L_azimut: TLabel;
    L_alturaDelSol: TLabel;
    L_anguloSolar: TLabel;
    L_segundos: TLabel;
    L_hora: TLabel;
    L_minutos: TLabel;
    E_segundos: TEdit;
    CB_posicionDelSol: TCheckBox;
    B_Posicion: TButton;
    LE_azimut: TLabeledEdit;
    LE_alturaSolar: TLabeledEdit;
    LE_anguloSolar: TLabeledEdit;
    E_Hora: TEdit;
    E_minutos: TEdit;
    SaveDialog1: TSaveDialog;
    Image1: TImage;
    Image2: TImage;
    btGrafica: TButton;
    LWEB: TLabel;
    ThemeManager1: TThemeManager;
    procedure B_calcularClick(Sender: TObject);
    procedure CB_gradosClick(Sender: TObject);
    procedure B_convertirLatitudClick(Sender: TObject);
    procedure CB_datosClick(Sender: TObject);
    procedure B_anadirFechaClick(Sender: TObject);
    procedure B_solsticioVeranoClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure B_equinoccioOtonoClick(Sender: TObject);
    procedure B_SolsticioInviernoClick(Sender: TObject);
    procedure B_EquinoccioPrimaveraClick(Sender: TObject);
    procedure CB_posicionDelSolClick(Sender: TObject);
    procedure B_PosicionClick(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure RB_almeriaClick(Sender: TObject);
    procedure RB_madridClick(Sender: TObject);
    procedure RB_santanderClick(Sender: TObject);
    procedure B_salirClick(Sender: TObject);
    procedure B_informeClick(Sender: TObject);
    procedure B_GuardarClick(Sender: TObject);
    procedure btGraficaClick(Sender: TObject);
    procedure LWEBClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  F_Radiacion: TF_Radiacion;

implementation

uses grafica;

{$R *.dfm}

procedure TF_Radiacion.B_calcularClick(Sender: TObject);
var
  i,j,k,di,numerodeldia : integer;
  t,de,dec,w,l,Lrad,wgrad,DurDia,alfa,alfaGrad,altCen,salSol,finSol,beta,w2,
  w2grad,betaRad, E0,Iod,Iod2: real;
  declinacion,anguloSolar,angulosolargrados,duracionDia,alturaSol,
  alturaCenital,salidaSolar,puestasol,AngulosolarInclinacion,radiaciondiaria,
  radiacionDiariaInclinada : string;
begin
  val(LE_Latitud.text,l,i);
  val(E_numeroDedia.Text,di,j);
  val(LE_Inclinacion.text,beta,k);
  if (i<>0) or (j<>0) or (k<>0) then
  begin
    if i<>0 then
    begin
      showmessage('Introduzca correctamente la latitud del lugar');
      LE_Latitud.clear;
      LE_Latitud.setfocus;
    end;
    if j<>0 then
    begin
      Showmessage('Introduzca el día del año deseado');
      B_anadirFecha.setfocus;
    end;
    if k<>0 then
    begin
      showmessage('Introduzca un valor correcto');
      LE_Inclinacion.setfocus;
    end;
  end
  else
  begin
    if (l>90) or (l<0) then
    begin
      showmessage('El valor de latitud ha de estar comprendido entre 0º y 90º');
      LE_Latitud.Clear;
      LE_Latitud.setfocus;
    end
    else
    begin
      B_informe.Enabled := true;
      numerodeldia := dayoftheyear(DTP_fecha.date);
      E_numeroDedia.text := inttostr(numerodeldia);
      L_fecha.caption := 'FECHA: '+datetostr(dtp_fecha.DateTime);
      t := 2*pi*((di-1)/365);     //es el número de día del año
      de := 0.006918-0.399912*cos(t)+0.070257*sin(t)-0.006758*cos(2*t)+0.000907*sin(2*t)
          -0.002697*cos(3*t)+0.00148*sin(3*t);   // da el valor de la declinacion en el día pedido
      dec := de*(180/pi);       // pasa de radianes a grados
      str(dec:6:3,declinacion);
      E_declinacion.Text := declinacion;
      CB_posicionDelSol.Enabled := true;
      B_calcular.setfocus;

      Lrad := ((l*pi)/180); //pone la latitud en radianes
      w := arcCos(-tan(Lrad)*tan(de)); //angulo solar para la salida del sol cuando alfa = 0
      wgrad := w*180/pi;      // pone el ángulo de salida del sol en grados
      str(w:6:3,angulosolar);
      str(wgrad:6:3,angulosolargrados);
      L_angulosalidaSol.Caption := 'ÁNGULO DE SALIDA DEL SOL: '+
      anguloSolarGrados+' GRADOS';
      if (beta<0) or (beta>90) then
      begin
        showmessage('La inclinación ha de estar comprendida entre 0 y 90 grados');
        LE_Inclinacion.text := '0';
      end;
      betaRad := (beta*pi)/180;
      w2 := arcCos(-tan(Lrad-betaRad)*tan(de)); //angulo de salida para una superficie inclinada
      w2grad :=w2*180/pi;
      str(w2grad:6:3,AngulosolarInclinacion);
      if (w2 <= w) then     // El angulo de salida para sup. inclinada será el mínimo entre w2 y w
        L_anguloSalidaInclinada.Caption := 'Salida para superfie inclinada: ' +
            anguloSolarInclinacion+' grados';
      if (w2 > w) then
        L_anguloSalidaInclinada.Caption := 'Salida sol para superfie inclinada: '+
            anguloSolarGrados+' grados';

      Durdia := (wgrad*2)/15; //duración de un día, 2veces el ángulo salida del sol entre 15 grados que dura cada hora
      str(durdia:6:2,duracionDia);
      L_DuracionDia.caption := 'DURACIÓN DEL DÍA: '+duracionDia+' Horas';

      SalSol := 12-(durDia/2);
      str(salsol:6:2,salidaSolar);
      L_horaSalidaSol.caption := 'AMANECER: '+salidasolar+' Hora Solar';
      finSol:= 12+(durDia/2);
      str(finsol:6:2,puestaSol);
      L_horaPuestaSol.caption := 'ANOCHECER: '+puestasol+' Hora Solar';

      alfa := arcSin(sin(Lrad)*sin(de)+cos(Lrad)*cos(de)*1);  //altura solar al mediodía, cosw=1
      alfaGrad := alfa*180/pi;
      str(alfagrad:8:3,alturaSol);
      L_alturaSolar.Caption := 'ALTURA SOLAR AL MEDIODIA: '+alturaSol+' GRADOS';
      altCen := 90-alfaGrad;        //el ángulo cenital es complementario de la altura solar
      str(altCen:8:3,alturacenital);
      L_alturaCenital.Caption := 'Ángulo cenital: '+alturaCenital+' grados';

      E0 :=  1+0.03333*cos(2*pi*numerodeldia/365);

      //radiación global diaria exterior de la admosfera.
      Iod := (24/pi)*1367*E0*(w*sin(de)*sin(Lrad)+cos(de)*cos(Lrad)*sin(w));
      str(Iod:6:2,radiaciondiaria);
      E_radiacion.text := radiaciondiaria;
      if (w2 <= w) then             //para superficie inclinada se usa el mínimo entre w y w2
        Iod2 := (24/pi)*1367*E0*(w2*sin(de)*sin(Lrad-betaRad)+cos(de)*cos(Lrad-betaRad)*sin(w2));
      str(Iod2:6:2,radiacionDiariaInclinada);
        E_radiacionInclinada.text := radiacionDiariaInclinada;
      if (w2 > w) then
        Iod2 := (24/pi)*1367*E0*(w*sin(de)*sin(Lrad-betaRad)+cos(de)*cos(Lrad-betaRad)*sin(w));
      str(Iod2:6:2,radiacionDiariaInclinada);
        E_radiacionInclinada.text := radiacionDiariaInclinada;
    end;
  end;
end;

procedure TF_Radiacion.CB_gradosClick(Sender: TObject);
begin
  If CB_grados.checked then
    begin
      LE_Latitud.clear;
      LE_grados.enabled := true;
      LE_grados.setfocus;
      LE_minutos.enabled := true;
      LE_Segundos.enabled := true;
      B_convertirlatitud.Enabled := true;
    end
  else
    begin
      LE_grados.enabled := false;
      LE_minutos.enabled := false;
      LE_Segundos.enabled := false;
      B_convertirlatitud.Enabled := false;
      LE_grados.clear;
      LE_minutos.clear;
      LE_Segundos.clear;
    end;
end;

procedure TF_Radiacion.B_convertirLatitudClick(Sender: TObject);
var
  g,s,m : integer;
  r : real;
  resultado : string;
  i,j,k : integer;
begin
  val(LE_grados.text,g,i);
  val(LE_minutos.text,m,j);
  val(LE_Segundos.Text,s,k);
    if (i<>0) or (j<>0) or (k<>0) then
      begin
         showmessage('Introduzca valores válidos');
         LE_grados.setfocus;
      end
    else
      begin
        r := g+(m/60)+(s/3600);
        str(r:8:5,resultado);
        LE_Latitud.Text := resultado;
      end;
end;

procedure TF_Radiacion.CB_datosClick(Sender: TObject);
begin
  If CB_datos.checked then
     begin
       LE_Inclinacion.Enabled := true;
       B_calcular.Enabled := true;
       CB_grados.enabled := true;
       LE_Latitud.enabled := true;
       L_dia.Enabled := true;
       DTP_fecha.enabled := true;
       B_anadirFecha.enabled := true;
       B_solsticioVerano.enabled := true;
       B_SolsticioInvierno.enabled := true;
       B_equinoccioOtono.enabled := true;
       B_EquinoccioPrimavera.enabled := true;
     end
   else
     begin
       LE_Inclinacion.enabled := false;
       B_calcular.Enabled := false;
       CB_grados.enabled := false;
       LE_Latitud.enabled := false;
       DTP_fecha.enabled := false;
       B_anadirFecha.enabled := false;
       B_solsticioVerano.enabled := false;
       B_SolsticioInvierno.enabled := false;
       B_equinoccioOtono.enabled := false;
       B_EquinoccioPrimavera.enabled := false;
       CB_posicionDelSol.enabled := false;
       L_dia.Enabled := false;
       CB_posicionDelSol.Checked := false;
     end;

end;

procedure TF_Radiacion.B_anadirFechaClick(Sender: TObject);
var
  dia : TDatetime;
  d : integer;
begin
  dia := DTP_fecha.date;
  d := DayOfTheYear(dia);
  E_numeroDedia.Text := inttostr(d);
  B_calcular.setfocus;
end;

procedure TF_Radiacion.B_solsticioVeranoClick(Sender: TObject);
var
  solsticioVer : TDatetime;
  d : integer;
begin
 solsticioVer := strtodate('21/06/2009');
 DTP_fecha.date := solsticioVer;
 d := dayoftheyear(solsticioVer);
 E_numeroDedia.Text := inttostr(d);
end;

procedure TF_Radiacion.FormCreate(Sender: TObject);
begin
 DTP_fecha.date := now;
end;

procedure TF_Radiacion.B_equinoccioOtonoClick(Sender: TObject);
var
  equinoccioOto : TDatetime;
  d : integer;
begin
 equinoccioOto := strtodate('23/09/2009');
 DTP_fecha.date := equinoccioOto;
 d := dayoftheyear(equinoccioOto);
 E_numeroDedia.Text := inttostr(d);
end;


procedure TF_Radiacion.B_SolsticioInviernoClick(Sender: TObject);
var
  solsticioInv : TDatetime;
  d : integer;
begin
 solsticioInv := strtodate('21/12/2009');
 DTP_fecha.date := solsticioInv;
 d := dayoftheyear(solsticioInv);
 E_numeroDedia.Text := inttostr(d);
end;

procedure TF_Radiacion.B_EquinoccioPrimaveraClick(Sender: TObject);
var
  equinoccioPri : TDatetime;
  d : integer;
begin
 equinoccioPri := strtodate('21/03/2009');
 DTP_fecha.date := equinoccioPri;
 d := dayoftheyear(equinoccioPri);
 E_numeroDedia.Text := inttostr(d);
end;


procedure TF_Radiacion.CB_posicionDelSolClick(Sender: TObject);
begin
  if CB_posicionDelSol.Checked then
    begin
      B_Posicion.enabled := true;
      E_segundos.enabled := true;
      E_hora.enabled := true;
      E_minutos.enabled := true;
      L_azimut.Enabled := true;
      L_alturaDelSol.enabled := true;
      L_anguloSolar.enabled:= true;
      L_segundos.Enabled := true;
      L_hora.Enabled := true;
      L_minutos.Enabled := true;
      E_Hora.setfocus;
    end
  else
    begin
      E_Hora.enabled := false;
      E_segundos.enabled := false;
      E_minutos.enabled := false;
      B_Posicion.enabled := false;
      L_segundos.Enabled := false;
      L_azimut.Enabled := false;
      L_alturaDelSol.enabled := false;
      L_anguloSolar.enabled := false;
      L_hora.Enabled := false;
      L_minutos.Enabled := false;
    end;
end;

procedure TF_Radiacion.B_PosicionClick(Sender: TObject);
var
  h,m,s,hs,w,wgrad,alfa,alfaGrad,L,Lrad,de,deRad,azi,aziGrad : real;
  i,j,k: integer;
  angulosolar,azimut,alturaSolar : string;
begin
  val(E_Hora.text,h,i);
  val(E_minutos.text,m,j);
  val(E_segundos.text,s,k);
  if (i<>0) or (j<>0) or (k<>0) then
    begin
      showmessage('Introduzca valores horarios correctos');
      E_hora.setfocus;
    end
  else
    begin
      if (E_declinacion.text = '') then
        begin
          showmessage('Debe introducir el día en que desea calcular la posicion del sol');
          B_anadirFecha.SetFocus;
        end
      else
        begin
          if (h<0) or (h>23) or (m<0)or (m>59) or (s<0) or (s>59) then
            begin
              showmessage('Introduzca valores adecuados: hora entre 0 y 23; '+
              'minutos y segundos entre 0 y 59');
               E_hora.SetFocus;
            end
          else
            begin
              Hs := h+m/60+s/3600; // nos da la hora solar en decimal
              w := (hs-12)*pi/12; // ángulo solar en radianes
              wgrad := (hs-12)*180/12; // ángulo solar en grados: 1 hora = 15 grados
              str(wgrad:6:2,angulosolar);
              LE_anguloSolar.Text := angulosolar;

              val(E_declinacion.text,de,i); // coge el valor de la declinacion para ese día
              val(LE_Latitud.text,l,i);     // coge el valor de la latidud del lugar
              Lrad := l*pi/180;  // latitud en radianes
              DeRad := de*pi/180;  // declinacion en radianes

              //calcula altura solar a cualquier hora
              alfa := arcSin(sin(Lrad)*sin(DeRad)+cos(Lrad)*cos(DeRad)*cos(w));
              alfaGrad := alfa*180/pi;
              str(alfagrad:8:3,alturaSolar);
              LE_alturaSolar.Text := alturaSolar;

              if (Hs = 12) then
                LE_azimut.text := '0.00'
              else
                begin
                  // calcula el azimut en radianes
                  Azi := arcCos((sin(alfa)*sin(LRad)-sin(deRad))/(cos(alfa)*cos(LRad)));
                  AziGrad := azi*180/pi; // azimut en grados
                  str(azigrad:6:2,azimut);
                  LE_azimut.text := azimut;
                end;
            end;
        end;
  end;

end;






procedure TF_Radiacion.Button1Click(Sender: TObject);
var
  e,f,m,a,ma,j,ju,ag,s,o,n,di,e2,f2,m2,a2,ma2,j2,ju2,ag2,s2,o2,n2,di2,
  k1,k2,k3,k4,k5,k6,k7,k8,k9,k19,k10,k11,k12,d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12 : real;
begin
  if RB_almeria.Checked then
    begin
      e := 2800;   //valores medios mensuales de radiacion global
      E_1.text := floattostr(e);
      f := 3600;
      E_2.text := floattostr(f);
      m := 5100;
      E_3.Text := floattostr(m);
      a := 5700;
      E_4.Text := floattostr(a);
      ma := 6600;
      E_5.text := floattostr(ma);
      j := 7200;
      E_6.text := floattostr(j);
      ju := 7100;
      E_7.text := floattostr(ju);
      ag := 6500;
      E_8.text := floattostr(ag);
      s := 5500;
      E_9.text := floattostr(s);
      o := 4200;
      E_10.text:= floattostr(o);
      n := 3000;
      E_11.text := floattostr(n);
      di := 2500;
      E_12.text := floattostr(di);

      e2 := 4700; //valores de radiacion en la atmosfera para el día 15 de cada mes
      f2 := 6204;
      m2 := 8014;
      a2 := 9851;
      ma2 := 11064;
      j2 := 11585;
      ju2 := 11364;
      ag2 := 10420;
      s2 := 8846;
      o2 := 6971;
      n2 := 5211;
      di2 := 4338;

      k1 := e/e2;      // k es el cociente entre radiacion global y la extraterrestre: k=Go/Ioc
      k2 := f/f2;
      k3 := m/m2;
      k4 := a/a2;
      k5 := ma/ma2;
      k6 := j/j2;
      k7 := ju/ju2;
      k8 := ag/ag2;
      k9 := s/s2;
      k10 := o/o2;
      k11 := n/n2;
      k12 := di/di2;

      D1 := e*(1-1.13*k1);   //   se halla el valor de la radiacion difusa por el método de Page
      E_13.Text := floattostr(d1);
      D2 := f*(1-1.13*k2);
      E_14.Text := floattostr(d2);
      D3 := m*(1-1.13*k3);
      E_15.Text := floattostr(d3);
      D4 := a*(1-1.13*k4);
      E_16.Text := floattostr(d4);
      D5 := ma*(1-1.13*k5);
      E_17.Text := floattostr(d5);
      D6 := j*(1-1.13*k6);
      E_18.Text := floattostr(d6);
      D7 := ju*(1-1.13*k7);
      E_19.Text := floattostr(d7);
      D8 := ag*(1-1.13*k8);
      E_20.Text := floattostr(d8);
      D9 := s*(1-1.13*k9);
      E_21.Text := floattostr(d9);
      D10 := o*(1-1.13*k10);
      E_22.Text := floattostr(d10);
      D11 := n*(1-1.13*k11);
      E_23.Text := floattostr(d11);
      D12 := di*(1-1.13*k12);
      E_24.Text := floattostr(d12);
    end;
  if RB_madrid.Checked then
    begin
      e := 2000;   //valores medios mensuales de radiacion global
      E_1.text := floattostr(e);
      f := 2900;
      E_2.text := floattostr(f);
      m := 4300;
      E_3.Text := floattostr(m);
      a := 5400;
      E_4.Text := floattostr(a);
      ma := 6500;
      E_5.text := floattostr(ma);
      j := 7300;
      E_6.text := floattostr(j);
      ju := 7600;
      E_7.text := floattostr(ju);
      ag := 6700;
      E_8.text := floattostr(ag);
      s := 5300;
      E_9.text := floattostr(s);
      o := 3600;
      E_10.text:= floattostr(o);
      n := 2400;
      E_11.text := floattostr(n);
      di := 1800;
      E_12.text := floattostr(di);

      e2 := 4089; //valores de radiacion en la atmosfera para el día 15 de cada mes
      f2 := 5642;
      m2 := 7569;
      a2 := 9598;
      ma2 := 10995;
      j2 := 11620;
      ju2 := 11362;
      ag2 := 10261;
      s2 := 8490;
      o2 := 6460;
      n2 := 4615;
      di2 := 3222;

      k1 := e/e2;      // k es el cociente entre radiacion global y la extraterrestre: k=Go/Ioc
      k2 := f/f2;
      k3 := m/m2;
      k4 := a/a2;
      k5 := ma/ma2;
      k6 := j/j2;
      k7 := ju/ju2;
      k8 := ag/ag2;
      k9 := s/s2;
      k10 := o/o2;
      k11 := n/n2;
      k12 := di/di2;

      D1 := e*(1-1.13*k1);   //   se halla el valor de la radiacion difusa por el método de Page
      E_13.Text := floattostr(d1);
      D2 := f*(1-1.13*k2);
      E_14.Text := floattostr(d2);
      D3 := m*(1-1.13*k3);
      E_15.Text := floattostr(d3);
      D4 := a*(1-1.13*k4);
      E_16.Text := floattostr(d4);
      D5 := ma*(1-1.13*k5);
      E_17.Text := floattostr(d5);
      D6 := j*(1-1.13*k6);
      E_18.Text := floattostr(d6);
      D7 := ju*(1-1.13*k7);
      E_19.Text := floattostr(d7);
      D8 := ag*(1-1.13*k8);
      E_20.Text := floattostr(d8);
      D9 := s*(1-1.13*k9);
      E_21.Text := floattostr(d9);
      D10 := o*(1-1.13*k10);
      E_22.Text := floattostr(d10);
      D11 := n*(1-1.13*k11);
      E_23.Text := floattostr(d11);
      D12 := di*(1-1.13*k12);
      E_24.Text := floattostr(d12);
    end;
  if RB_santander.Checked then
    begin
      e := 1300;   //valores medios mensuales de radiacion global
      E_1.text := floattostr(e);
      f := 1900;
      E_2.text := floattostr(f);
      m := 2900;
      E_3.Text := floattostr(m);
      a := 3900;
      E_4.Text := floattostr(a);
      ma := 4500;
      E_5.text := floattostr(ma);
      j := 5100;
      E_6.text := floattostr(j);
      ju := 5200;
      E_7.text := floattostr(ju);
      ag := 4400;
      E_8.text := floattostr(ag);
      s := 3800;
      E_9.text := floattostr(s);
      o := 2400;
      E_10.text:= floattostr(o);
      n := 1600;
      E_11.text := floattostr(n);
      di := 1100;

      e2 := 3567; //valores de radiacion en la atmosfera para el día 15 de cada mes
      f2 := 5152;
      m2 := 7169;
      a2 := 9355;
      ma2 := 10911;
      j2 := 11627;
      ju2 := 11336;
      ag2 := 10099;
      s2 := 8163;
      o2 := 6008;
      n2 := 4103;
      di2 := 3200;

      k1 := e/e2;      // k es el cociente entre radiacion global y la extraterrestre: k=Go/Ioc
      k2 := f/f2;
      k3 := m/m2;
      k4 := a/a2;
      k5 := ma/ma2;
      k6 := j/j2;
      k7 := ju/ju2;
      k8 := ag/ag2;
      k9 := s/s2;
      k10 := o/o2;
      k11 := n/n2;
      k12 := di/di2;

      D1 := e*(1-1.13*k1);   //   se halla el valor de la radiacion difusa por el método de Page
      E_13.Text := floattostr(d1);
      D2 := f*(1-1.13*k2);
      E_14.Text := floattostr(d2);
      D3 := m*(1-1.13*k3);
      E_15.Text := floattostr(d3);
      D4 := a*(1-1.13*k4);
      E_16.Text := floattostr(d4);
      D5 := ma*(1-1.13*k5);
      E_17.Text := floattostr(d5);
      D6 := j*(1-1.13*k6);
      E_18.Text := floattostr(d6);
      D7 := ju*(1-1.13*k7);
      E_19.Text := floattostr(d7);
      D8 := ag*(1-1.13*k8);
      E_20.Text := floattostr(d8);
      D9 := s*(1-1.13*k9);
      E_21.Text := floattostr(d9);
      D10 := o*(1-1.13*k10);
      E_22.Text := floattostr(d10);
      D11 := n*(1-1.13*k11);
      E_23.Text := floattostr(d11);
      D12 := di*(1-1.13*k12);
      E_24.Text := floattostr(d12);
    end;

end;

procedure TF_Radiacion.RB_almeriaClick(Sender: TObject);
var
  e,f,m,a,ma,j,ju,ag,s,o,n,di : real;
begin
      e := 2800;   //valores medios mensuales de radiacion global
      E_1.text := floattostr(e);
      f := 3600;
      E_2.text := floattostr(f);
      m := 5100;
      E_3.Text := floattostr(m);
      a := 5700;
      E_4.Text := floattostr(a);
      ma := 6600;
      E_5.text := floattostr(ma);
      j := 7200;
      E_6.text := floattostr(j);
      ju := 7100;
      E_7.text := floattostr(ju);
      ag := 6500;
      E_8.text := floattostr(ag);
      s := 5500;
      E_9.text := floattostr(s);
      o := 4200;
      E_10.text:= floattostr(o);
      n := 3000;
      E_11.text := floattostr(n);
      di := 2500;
      E_12.text := floattostr(di);
      E_13.clear;
      E_14.clear;
      E_15.clear;
      E_16.clear;
      E_17.clear;
      E_18.clear;
      E_19.clear;
      E_20.clear;
      E_21.Clear;
      E_22.clear;
      E_23.Clear;
      E_24.Clear;
end;

procedure TF_Radiacion.RB_madridClick(Sender: TObject);
var
  e,f,m,a,ma,j,ju,ag,s,o,n,di : real;
begin
      e := 2000;   //valores medios mensuales de radiacion global
      E_1.text := floattostr(e);
      f := 2900;
      E_2.text := floattostr(f);
      m := 4300;
      E_3.Text := floattostr(m);
      a := 5400;
      E_4.Text := floattostr(a);
      ma := 6500;
      E_5.text := floattostr(ma);
      j := 7300;
      E_6.text := floattostr(j);
      ju := 7600;
      E_7.text := floattostr(ju);
      ag := 6700;
      E_8.text := floattostr(ag);
      s := 5300;
      E_9.text := floattostr(s);
      o := 3600;
      E_10.text:= floattostr(o);
      n := 2400;
      E_11.text := floattostr(n);
      di := 1800;
      E_12.text := floattostr(di);
      E_13.clear;
      E_14.clear;
      E_15.clear;
      E_16.clear;
      E_17.clear;
      E_18.clear;
      E_19.clear;
      E_20.clear;
      E_21.Clear;
      E_22.clear;
      E_23.Clear;
      E_24.Clear;
end;

procedure TF_Radiacion.RB_santanderClick(Sender: TObject);
var
  e,f,m,a,ma,j,ju,ag,s,o,n,di : real;
begin
      e := 1300;   //valores medios mensuales de radiacion global
      E_1.text := floattostr(e);
      f := 1900;
      E_2.text := floattostr(f);
      m := 2900;
      E_3.Text := floattostr(m);
      a := 3900;
      E_4.Text := floattostr(a);
      ma := 4500;
      E_5.text := floattostr(ma);
      j := 5100;
      E_6.text := floattostr(j);
      ju := 5200;
      E_7.text := floattostr(ju);
      ag := 4400;
      E_8.text := floattostr(ag);
      s := 3800;
      E_9.text := floattostr(s);
      o := 2400;
      E_10.text:= floattostr(o);
      n := 1600;
      E_11.text := floattostr(n);
      di := 1100;
      E_12.text := floattostr(di);
      E_13.clear;
      E_14.clear;
      E_15.clear;
      E_16.clear;
      E_17.clear;
      E_18.clear;
      E_19.clear;
      E_20.clear;
      E_21.Clear;
      E_22.clear;
      E_23.Clear;
      E_24.Clear;
end;


procedure TF_Radiacion.B_salirClick(Sender: TObject);
begin
  Close;
end;

procedure TF_Radiacion.B_informeClick(Sender: TObject);
begin
  M_resultados.lines.Add('IMFORME DE CÁLCULOS: ');
  M_resultados.lines.Add('');
  M_resultados.lines.Add(L_fecha.caption);
  M_resultados.lines.Add('Número de día del año: '+E_numeroDedia.text);
  M_resultados.lines.Add('Latitud del lugar: '+LE_latitud.Text+' Grados Latitud Norte');
  M_resultados.lines.Add('Superficie plana y superficie inclinada '+LE_Inclinacion.Text+' grados');
  M_resultados.lines.Add('Declinación del día '+E_declinacion.text+' grados');
  M_resultados.lines.Add(L_alturaSolar.caption);
  M_resultados.lines.Add(L_alturaCenital.caption);
  M_resultados.lines.Add(L_angulosalidaSol.caption);
  M_resultados.lines.Add(L_anguloSalidaInclinada.caption);
  M_resultados.lines.Add(L_horaSalidaSol.caption);
  M_resultados.lines.Add(L_DuracionDia.caption);
  M_resultados.lines.Add(L_horaPuestasol.caption);
  M_resultados.lines.Add('Radiación solar diaria extraterrestre de '+E_radiacion.Text+' Wh/m2');
  M_resultados.lines.Add('Radiación solar diaria extraterrestre sobre superficie inclinada de '
      + E_radiacionInclinada.text+' Wh/m2');
  B_informe.Enabled := false;
  B_Guardar.enabled := true;

end;


procedure TF_Radiacion.B_GuardarClick(Sender: TObject);
begin
  savedialog1.Title := 'Guardar cálculos realizados';
  savedialog1.DefaultExt := 'txt';
  savedialog1.filter := 'Archivos de texto (*.txt)|*.txt| Todos los archivos|*.*';
  If savedialog1.execute then
    begin
      M_resultados.Lines.SaveToFile(savedialog1.filename);
      M_resultados.Clear;
      B_Guardar.enabled := false;
    end
  else
    showmessage('Los datos NO han sido salvados');
end;

procedure TF_Radiacion.btGraficaClick(Sender: TObject);
var
  serieG : TFastLineSeries;
  serieDifusa : TFastLineSeries;
  formulario : TformGrafica;
begin
  if E_13.Text = '' then
    MessageDlg('Debe seleccionar la localidad y pulsar en "Hallar".',
        mtWarning, [mbok], 0)
  else
  begin
    formulario := TformGrafica.Create(Application);
    try
      formulario.cGrafico.Title.Text.Clear;

      if RB_almeria.Checked then
        formulario.cGrafico.Title.Text.Add ('Valores medios mensuales de radiación difusa de Almería');
      if RB_madrid.Checked then
        formulario.cGrafico.Title.Text.Add ('Valores medios mensuales de radiación difusa de Madrid');
      if RB_santander.Checked then
        formulario.cGrafico.Title.Text.Add ('Valores medios mensuales de radiación difusa de Santander');
      formulario.cGrafico.LeftAxis.Title.Caption := 'Radiación (Wh/m2)';
      serieG := TFastLineSeries.Create(Self);
      With serieG do
      begin
        ParentChart := formulario.cGrafico;
        Title := 'Global';
        AddXY(1, StrToFloat(E_1.Text), 'Enero', clRed);
        AddXY(2, StrToFloat(E_2.Text), 'Febrero', clRed);
        AddXY(3, StrToFloat(E_3.Text), 'Marzo', clRed);
        AddXY(4, StrToFloat(E_4.Text), 'Abril', clRed);
        AddXY(5, StrToFloat(E_5.Text), 'Mayo', clRed);
        AddXY(6, StrToFloat(E_6.Text), 'Junio', clRed);
        AddXY(7, StrToFloat(E_7.Text), 'Julio', clRed);
        AddXY(8, StrToFloat(E_8.Text), 'Agosto', clRed);
        AddXY(9, StrToFloat(E_9.Text), 'Septiembre', clRed);
        AddXY(10, StrToFloat(E_10.Text), 'Octubre', clRed);
        AddXY(11, StrToFloat(E_11.Text), 'Noviembre', clRed);
        AddXY(12, StrToFloat(E_12.Text), 'Diciembre', clRed);
      end;

      serieDifusa := TFastLineSeries.Create(Self);
      With serieDifusa do
      begin
        ParentChart := formulario.cGrafico;
        Title := 'Difusa';
        AddXY(1, StrToFloat(E_13.Text), 'Enero', clBlue);
        AddXY(2, StrToFloat(E_14.Text), 'Febrero', clBlue);
        AddXY(3, StrToFloat(E_15.Text), 'Marzo', clBlue);
        AddXY(4, StrToFloat(E_16.Text), 'Abril', clBlue);
        AddXY(5, StrToFloat(E_17.Text), 'Mayo', clRed);
        AddXY(6, StrToFloat(E_18.Text), 'Junio', clRed);
        AddXY(7, StrToFloat(E_19.Text), 'Julio', clRed);
        AddXY(8, StrToFloat(E_20.Text), 'Agosto', clRed);
        AddXY(9, StrToFloat(E_21.Text), 'Septiembre', clRed);
        AddXY(10, StrToFloat(E_22.Text), 'Octubre', clRed);
        AddXY(11, StrToFloat(E_23.Text), 'Noviembre', clRed);
        AddXY(12, StrToFloat(E_24.Text), 'Diciembre', clRed);
      end;
      formulario.ShowModal;
    finally
      formulario.Free;
    end;
  end;

end;

procedure TF_Radiacion.LWEBClick(Sender: TObject);
begin
  ShellExecute(Handle, Nil, PChar('http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=443'),
      Nil, Nil, SW_SHOWNORMAL);
end;

end.
 

Artículos relacionados

 

Créditos

Artículo realizado íntegramente por Alino (Ingeniero Industrial) miembro del proyecto AjpdSoft.

Otros programas desarrollados por Alino:



Nota: Revisado por AjpdSoft el 27-12-2009.
Anuncios


Enviado el Viernes, 25 diciembre a las 16:58:33 por ajpdsoft
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A