fb:porticula NoPaste
Berechnung des Sonnenstandorts
Uploader: | otti |
Datum/Zeit: | 22.12.2008 17:29:39 |
'========================================================================
'= Software zur IT-gesteuerten Nachführung einer PV-Zelle ==
'= Erstellt im Rahmen einer Facharbeit im Leistungskurs Physik 07/09 ==
'= Autor: Sebastian Ottinger 2008 ==
'========================================================================
'''-------Deklarierungen-------------------------------------------------------
''----------------Subroutinen
'---Subroutinen Userinterface
declare sub ui_prog ' UserInterface für Hauptprogramm,
declare sub ui_start' ... Startbildschirm,
declare sub ui_input(titel as string,hoehe as integer)' ...Dateneingabe,
declare sub ui_eigenedaten(titel as string)'... und Eingabe eigener Daten
declare sub titelleiste
declare sub windw (zeile as integer, reihe as integer, l_rel as integer,hoehe as integer,win_titel as string,stil as integer)
'---Subroutinen Interface
declare sub output_interface
declare sub grundstellung
'---Subroutinen Prozesse und Programmorganisation
'1.Ebene
declare sub Start_screen
declare sub hauptschleife
'2.Ebene
'..Starteil d. Programms
declare sub ladekonfigdatei
declare sub input_data
declare sub datenabfrage
'..Hauptteil d. Programms
declare sub aenderung_noetig
declare sub aenderung_moegl
declare sub ausgabe_konst
declare sub ausgabe
declare sub output_data
declare sub filt_sync
declare sub zeitvar_trans
'..Schlußteil d. Programms
declare sub werte_speichern
'---Subroutinen_Berechnung
declare sub berechnung
declare sub dat2juldat
declare sub ekl_rekt
declare sub stdwinkel_fp
declare sub dekl_stdwinkel
declare sub azimut
declare sub einfalls_w
''----------------Variablen
'Konfigurationsvariablen
dim shared Schritt_az as double 'Schritt in Grad Azimut
dim shared schritt_ew as double'-"- Einfallswinkel
dim shared lgrad as double 'Längen und Breitengrad
dim shared bgrad as double
dim shared ew_max as double'zulässige Maximal- und Minimalwerte
dim shared ew_min as double
dim shared az_max as double
dim shared az_min as double
dim shared betrieb as integer' Betriebsart 1= Betrieb mit eigenen Daten; 2= Betrieb mit Standartkonfiguration
dim shared debug as integer' Datenprotokollierung: 0=inaktiv ; 1=normal ; 2= erweitert
dim shared pause as integer
'Eingabevariablen
dim shared tim as string 'Zeit
dim shared dat as string 'Datum
dim shared aendern as string
dim shared speichern as string
dim shared neustart as string
dim shared neustart_data as integer
'Übergabe Variablen
dim shared change_ew as integer '1=Änderung nötig;0=Änderung nicht nötig
dim shared change_az as integer ' -"-
dim shared possible_ew as integer'1=Änderung nicht möglich;0=Änderung möglich
dim shared possible_az as integer' -"-
dim shared ew_diff as double ' Differenz EW_aktuell - EW_letzte Änderung
dim shared az_diff as double ' Differenz AZ_aktuell - AZ_letzte Änderung
'Zeitpunkt Variablen
dim shared month as longint
dim shared year as longint
dim shared day as longint
dim shared hour as longint
dim shared min as longint
dim shared sec as longint
dim shared min_alt as longint
'Systemzeitdifferenz
dim shared m_diff as longint
dim shared y_diff as longint
dim shared d_diff as longint
dim shared h_diff as longint
dim shared mi_diff as longint
dim shared s_diff as longint
'Berechnung
dim shared jd0 as double'Julianische Tageszahl JD0 um 0:00 Uhr
dim shared jd as double 'Julianische Tageszahl JD zur angegebenen Uhrzeit
dim shared t0 as double
dim shared o as double 'Stundenwinkel des Frühlingspunktes
dim shared A_ekl as double 'Ekliptikale Länge der Sonne
dim shared E_ekl as double 'Schiefe der Ekleptik
dim shared rekt as double 'Rektaszension
dim shared dekl as double'Deklination
dim shared r as double 'Stundenwinkel
dim shared az as double 'Azimut A
dim shared ew as double 'Einfallswinkel
dim shared az_alt as double'Vergleichsvariable Azimut
dim shared ew_alt as double' -"- Einfallswinkel
'Variablen für die Nachführungsmechanik
dim shared loc_motor_az as double 'Schrittmotor Standort Azimut
dim shared loc_motor_ew as double ' -"- Einfallswinkel
'Laufvariablen
dim shared i as integer
'User Interface Variablen
dim shared zeile as integer
dim shared reihe as integer
dim shared l_rel as integer
dim shared hoehe as integer
dim shared win_titel as string
dim shared stil as integer
dim shared syb1 as integer ' verschiedene Symbole
dim shared syb2 as integer
dim shared syb3 as integer
dim shared syb4 as integer
dim shared syb5 as integer
dim shared syb6 as integer
'''------------Programm-----------------------------------------------------
''-------------Startbildschirm-------------------
start_anfang:
ui_start ' Userinterface aufbauen
start_screen
''------------Hauptprogramm----------------------
start_haupt:
'Bildschirm einstellen
screen 18
color 0,15
cls
'User Interface aufbauen
ui_prog
'Datei zur Archivierung öffnen
open "werte.txt" for output as #4
' Grundlegende Werte der Archivierung in Datei schreiben
if debug>0 then
zeitvar_trans
print #4,"---------Datenarchivierung der Nachfuehrung-----------------"
print #4,"-- Datum:";day;".";month;".";year
print #4,"-- Standort: L";chr(132);"ngengrad=";lgrad;" Breitengrad=";bgrad
print #4,"-----------------------------------------------------------"
print #4,
end if
'Ausgabe konstanter Daten, d.h. von Werten,
'die sich während der Laufzeit nicht mehr verändern
ausgabe_konst
min_alt=min
if min_alt>60 then min_alt=min_alt-60
'------Hauptschleife
hauptschleife
'----------Rückkehr zum Startbildschirm------------------
screen 0
close #1 : close #4 'Schließen der Dateien: konfig.txt und werte.txt
titelleiste
'Speichern der protokollierten Daten in extra Datei?
locate 5,3:input "Protokollierte Daten in einer eigener Datei speichern?(Y/N)",speichern
if speichern="y" then
werte_speichern
locate 6,3:print "...Daten gespeichert!"
end if
'Programm nochmal laufen lassen?
locate 8,3:input "Programm erneut starten?(Y/N)",neustart
if neustart="y" then
locate 9,3:input "Mit (1) Neuen oder den (2)gleichen Daten?",neustart_data
select case neustart_data
case 1:goto start_anfang
case 2:goto start_haupt
case else:exit select
end select
end if
locate 11,3: print " PROGRAMM BEENDET"
locate 16,3:print chr(184);" 2008 Sebastian Ottinger"
sleep
end
'''--------Subroutinen-------------------------------------------------------
'----------Subroutinen Userinterface
sub ui_eigenedaten(titel as string)
cls
'Fenster 1:
windw(9,1,65,3,titel,1)
'Fenster 2:Titelleiste
titelleiste
'Fenster 3: Eingabefenster
windw(16,1,65,3,"Eingabe",2)
'Fenster 4: Überschrift
windw(5,1,65,2,"",1)
locate 6,3:print ">>Eingabe Eigener Daten"
end sub
sub ui_input(titel as string,hoehe as integer)
cls
'Fenster 2: Auswahlmöglichkeiten
windw(5,1,75,hoehe,titel,1)
'Fenster 1: Titelleiste
titelleiste
'Fenster 3: Eingabefenster
windw(13,1,75,3,"Eingabe",2)
end sub
sub ui_prog
'Fenster 1: Titelfenster
'siehe Titelleiste
'Fenster 2:Grundkonfigurationen
windw(4,1,79,3,"",1)
'Fenster 3:Ortsangabe
windw(8,1,38,4,"Ortsangabe",1)
'Fenster 4: Zeitangabe
windw(8,40,40,4,"Zeitangabe",1)
'Fenster 5: Berechnete Daten
windw(13,1,79,5,"Berechnete Daten",1)
'Fenster 6: Interface Status
windw(19,1,79,7,"Interface Status",1)
end sub
sub ui_start
'Bildschirmkonfiguration einstellen
color 0,15 ' Farben
cls
'Fenster 1: Titelleiste
titelleiste
print
print
'Fenster 2: Standartkonfiguration
windw(8,1,42,5,"Standartkonfiguration & Systemzeit",1)
'Fenster 3: Gespeicherte Betriebskonfigurationen
windw(15,1,42,5,"Betriebskonfigurationen",1)
end sub
sub titelleiste
'Titelleiste
'Fenster erzeugen
windw(1,1,79,2,"",2)
'Text
locate 2,3:print "Software zur IT-gesteuerten Nachfuehrung einer PV-Zelle"
end sub
sub windw (zeile as integer, reihe as integer, l_rel as integer,hoehe as integer,win_titel as string,stil as integer)
'Voreinstellung Stil mit verschiedenen Symbolen
select case stil
case 1:
syb1=196
syb2=179
syb3=192
syb4=217
syb5=218
syb6=191
case 2:
syb1=205
syb2=186
syb3=200
syb4=188
syb5=201
syb6=187
end select
'-----Fensteraufbau
'Obere Zeile
locate zeile,reihe:print chr(syb5) 'Ecke oben links
for i=1 to l_rel
locate zeile,i+reihe:print chr(syb1)'Horizontallinie oben
next i
locate zeile,l_rel+reihe:print chr(syb6) ' Ecke oben rechts
'Mittlere Zeile(n): Textzeile
for i= 1 to hoehe
locate zeile+i,reihe:print chr(syb2) ' Vertikallinie links
locate zeile+i,l_rel+reihe:print chr(syb2)' ...&rechts
next i
'Untere Zeile
locate zeile+hoehe,reihe:print chr(syb3)' Ecke unten links
for i=1 to l_rel
locate zeile+hoehe,i+reihe:print chr(syb1)'Horizontallinie unten
next i
locate zeile+hoehe,l_rel+reihe:print chr(syb4) ' Ecke unten rechts
' Fensterbezeichnung
if win_titel<>"" then
locate zeile,reihe+((l_rel/2)-(len(win_titel)/2)): print win_titel
end if
end sub
'------Subroutinen Interface
sub output_interface
if change_ew=1 and possible_ew=0 then ' Änderung nötig und möglich
loc_motor_ew=loc_motor_ew + (int(ew_diff/schritt_ew)*schritt_ew)
ew_alt=ew
end if
if change_az=1 and possible_az=0 then ' Änderung nötig und möglich
loc_motor_az=loc_motor_az+(int(az_diff/schritt_az)*schritt_az)
az_alt=az
end if
'Übergabevariablen entwerten
locate 28:print ew_diff,az_diff' löschen!!!
change_ew=0
change_az=0
possible_ew=0
possible_az=0
end sub
sub Grundstellung
loc_motor_ew=0
loc_motor_az=0
end sub
'---Subroutinen Prozesse und Programmorganisation
'1.Ebene
sub start_screen
'Konfigurationen aus Datei laden
locate 5:print "Konfigurationsdatei ist geladen..."
LadeKonfigDatei
'Apparatur in Grundstellung bringen
locate 6:print "Nachfuehrmechanik ist in Grundstellung gebracht..."
grundstellung
'Anzeige der Standartkonfiguration
zeitvar_trans 'Zeit und Datum zur Anzeige in Variablen transferieren
locate 10,3:print "Laengengrad: ";lgrad;" Breitengrad: ";bgrad
locate 11,3:print "Datum: ";day;".";month;".";year
locate 12,3:print "Uhrzeit(UT): ";hour;":";min;":";sec
'Ausgabe der gespeicherten Einstellungen an den User
output_data
locate 22:input "Beduerfen diese Daten einer Aenderung? (Y/N)",aendern
if aendern ="y" then
input_data
end if
'Bei Betrieb mit eigener Konfiguration erforderliche Daten abfragen
if betrieb=1 then
datenabfrage
end if
cls
titelleiste
locate 7,3:print "PROGRAMM WIRD GESTARTET..."
end sub
sub hauptschleife
do
'voriges Ergebnis speichern
az_alt=az
ew_alt=ew
'Aktuelle Zeit in Variablen transferieren
zeitvar_trans
berechnung'... der Werte von Azimut und Einfallswinkel
'Änderung der Ausrichtung der Nachführmechanik notwendig?
'.. führt routinenintern zu eventueller Änderung
aenderung_noetig
'Ausgabe der berechneten Werte und eventuell veränderten Stellung
'der Mechanik an User
ausgabe
min_alt=min
if min_alt>60 then min_alt=min_alt-59
do
zeitvar_trans
locate 28,3:print "Berechnung erfolgt alle ";pause;" Minute(n) - Naechste Berechnung in ";min_alt-min+1;" Minute(n)"
if min_alt-min+1=0 then locate 28,10:print "Durchlauf beendet. Irgendeine Taste zum Beenden drücken"
loop until min=min_alt+pause
loop until inkey$=" " ' Leertaste beendet Programm
cls
end sub
'2.Ebene
'..Starteil d. Programms
sub LadeKonfigDatei ' Speichert Werte der konfig.txt in Variablen ab
open "konfig.txt" for input as #1
input #1,schritt_az,schritt_ew,lgrad,bgrad,ew_min,ew_max,az_min,az_max,betrieb,debug,pause
end sub
sub input_data ' ermöglicht Änderung der Hauptkonfigurationen durch den User
'--------Betriebsart
ui_input("Betriebsart",4)
locate 6,3:print "W";chr(132);"hlen Sie aus:"
locate 7,3:print chr(16);" Betrieb mit Eigenen Daten (1)"
locate 8,3:print chr(16);" Betrieb mit Standartkonfiguration (2)"
a_start:
locate 14,3:print " "
locate 14,3:input betrieb
if betrieb <> 1 and betrieb <> 2 then
locate 14,3:print "Falsche Eingabe"
sleep 1500
goto a_start
end if
'-------Datenprotokollierung
ui_input("Datenprotokollierung",5)
locate 6,3:print "W";chr(132);"hlen sie aus:"
locate 7,3:print chr(16);" Keine Datenprotokollierung (1)"
locate 8,3:print chr(16);" Normale Datenprotokollierung (2)"
locate 9,3:print chr(16);" Erweiterte Datenprotokollierung (3)"
b_start:
locate 14,3:print " "
locate 14,3:input debug
debug=debug-1
if debug<>0 and debug<>1 and debug <> 2 then
locate 14,3:print "Falsche Eingabe"
sleep 1500
goto b_start
end if
'--------Pause
ui_input("Pause in Minuten",2)
locate 6,3:print "Wie viele Minuten soll das Programm zwischen 2 Berechnungen pausieren?"
c_start:
locate 14,3:print " "
locate 14,3:input pause
if pause<0 then
locate 14,3:print "Falsche Eingabe"
sleep 1500
goto c_start
end if
end sub
sub datenabfrage ' ermöglicht die Eingabe eigener Werte für Berechnung
'Uhrzeit
ui_eigenedaten ("Uhrzeit")
locate 10,3:print "Geben Sie bitte die gewuenschte Uhrzeit(MEZ) ein(hh.mm.ss)"
locate 17,3:input tim
'Datum
ui_eigenedaten ("Datum")
locate 10,3:print "Geben Sie bitte das gewuenschte Datum ein(mm.dd.yyyy)"
locate 17,3:input dat
'Längengrad
ui_eigenedaten ("Laengengrad")
locate 10,3:print "Geben Sie bitte den gewuenschten L";chr(132);"ngengrad ein"
locate 17,3:input lgrad
'Breitengrad
ui_eigenedaten ("Breitengrad")
locate 10,3:print "Geben Sie bitte den gewuenschten Breitengrad ein"
locate 17,3:input bgrad
'Filter und Systemzeitsynchronisation
filt_sync
end sub
'..Hauptteil d. Programms
sub aenderung_noetig ' Prüft anhand von neu errechneten Daten und den
'Motorschritten in Grad ob eine Neuausrichtung der Mechanik nötig ist
'Routineninterne Variablen
dim alt2 as double
dim neu2 as double
dim gross as double
dim klein as double
if ew>0 then '=Sonne scheint
'...für den Einfallswinkel
if ew_alt>ew then
ew_diff=ew_alt-ew 'Differenz in richtige Anordung bringen
else
ew_diff=ew-ew_alt
end if
'Änderung EW nötig?
if ew_diff>=schritt_ew then change_ew=1 'Übergabevariable EW
'...für den Azimut
'Betrag negativer Zahlen erstellen
if az_alt<0 then
alt2=az_alt*(-1)
else
alt2=az_alt
end if
if az<0 then
neu2=az*(-1)
else
neu2=az
end if
'Größenunterscheidung
if alt2>neu2 then
gross=alt2
klein=neu2
else
gross=neu2
klein=alt2
end if
'Differenz
az_diff=gross-klein
'Änderung AZ nötig?
if az_diff >=schritt_az then change_az=1
'Änderung technisch möglich?
if change_az=1 or change_ew=1 then
aenderung_moegl
'Ausgabe an Interface wenn Änderung technisch möglich
if possible_ew=0 or possible_az=0 then
output_interface
end if
end if
else '=Sonne scheint nicht
grundstellung
end if
'eventuelle Datenprotokollierung
if debug>0 then
print #4, ' Leerzeile
print #4,"Position AZ:",loc_motor_az
print #4,"Position EW:",loc_motor_ew
end if
if debug=2 then
print #4,"DIFF(AZ;EW):",az_diff,ew_diff
print #4,"CHANGE(AZ;EW):",change_ew,change_az
print #4, "POSSIBLE (AZ;EW):", possible_az,possible_ew
end if
print #4, ' Leerzeile
end sub
sub aenderung_moegl
'Einfallswinkel
if ew>ew_min and ew<ew_max then
possible_ew=0
else
possible_ew=1
end if
'Azimut
if az>az_min and az<az_max then
possible_az=0
else
possible_az=1
end if
end sub
sub ausgabe_konst
'Anzeige aller konstanten Daten
titelleiste
select case betrieb
case 1
locate 5,15:print "Betrieb mit eigenen Daten"
case 2
locate 5,15:print "Betrieb mit Standartkonfiguration"
end select
select case debug
case 0
locate 6,15:print "Externe Datenprotokollierung: Inaktiv"
case 1
locate 6,15:print "Externe Datenprotokollierung: Normal"
case 2
locate 6,15:print "Externe Datenprotokollierung: Erweitert"
end select
print
'locate 7:print "------Ortsangabe----------------------------------------------------------------"
locate 10,10:print "L";chr(132);"ngengrad: ";lgrad;" Grad"
locate 11,10:print "Breitengrad: ";bgrad;" Grad"
end sub
sub ausgabe
'Zeitangabe
locate 9,44:print "Datum: ";day;".";month;".";year
locate 10,44:print "Universal Time: ";hour;":";min;":";sec
locate 11,44:print "MEZ:";hour+1;":";min;":";sec
'Berechnete Daten
locate 15,15:print "Wert Azimut: ":locate 15,37 :print using "###.###";az:locate 15,45:print" Grad"
locate 16,15:print "Wert Einfallswinkel: ":locate 16,37 :print using "###.###";ew:locate 16,45:print" Grad"
'Interface Status
if ew>0 then
locate 20,3:print "SCHRITT in Grad ";chr(16);" Azimut :";schritt_az
locate 21,3:print " ";chr(16);"Einfallswinkel :";schritt_ew
locate 23,3:print "AUSRICHTUNG Schrittmotor"
locate 24,3:print chr(16);" Azimut in Grad: ";loc_motor_az,"in Schrittanzahl:";loc_motor_az/schritt_az
locate 25,3:print chr(16);" Einfallswinkel in Grad:";loc_motor_ew,"in Schrittanzahl:";loc_motor_ew/schritt_ew
else
locate 21,3:print "Dunkelheit"
grundstellung
locate 24,3:print "Apparatur wurde in Grundstellung gebracht"
end if
end sub
sub output_data
'Betriebsart
locate 17,3
select case betrieb
case 1:print chr(16);" Betrieb mit Eigenen Daten"
case 2:print chr(16);" Betrieb mit Standartkonfiguration"
end select
'Datenarchivierung
locate 18,3
select case debug
case 0:print chr(16);" Keine Datenprotokollierung"
case 1:print chr(16);" Normale Datenprotokollierung"
case 2:print chr(16);" Erweiterte Datenprotokollierung"
end select
'Durchlauf
locate 19,3
print chr(16);pause;" Minute(n) Pause"
end sub
sub filt_sync
'Zeitdifferenz=angegebene Zeit-Systemzeit
m_diff=val(left$(dat,2)) - val(left$(date$,2))
d_diff=val(right$(left$(dat,5),2)) - val(right$(left$(date$,5),2))
y_diff=val(right$(dat,4)) - val(right$(date$,4))
h_diff=val(left$(tim,2))-val(left$(time$,2))
mi_diff=val(right$(left$(tim,5),2))-val(right$(left$(time$,5),2))
s_diff=val(right$(tim,2))-val(right$(time$,2))
end sub
sub zeitvar_trans'Zeit in Variablen transferieren
select case betrieb
case 1 'Eigene Daten
month=m_diff + val(left$(date$,2))
day= d_diff + val(right$(left$(date$,5),2))
year=y_diff+val(right$(date$,4))
hour= h_diff +val(left$(time$,2))
min= mi_diff + val(right$(left$(time$,5),2))
sec= s_diff + val(right$(time$,2))
case 2 'Systemdaten
month=val(left$(date$,2))
day=val(right$(left$(date$,5),2))
year=val(right$(date$,4))
hour=val(left$(time$,2))
min=val(right$(left$(time$,5),2))
sec=val(right$(time$,2))
end select
hour=hour-1 'MEZ ->UT
end sub
'----Schlußteil des Programms
sub werte_speichern
dim file as string
dim b as string * 1
open "werte.txt" for binary as #5
file= "werte "+ ltrim$(str$(day))+"-"+ ltrim$(str$(month))+"-"+ ltrim$(str$(year))+".txt"
'Jedes Bit einzeln aus der Quelldatei in die Zieldatei einlesen
open file for binary as #6
do until loc(5) = lof(5)
get #5, , b
put #6, , b
loop
close #6
close #5
end sub
''----------------Subroutinen Berechnung
sub berechnung
''Sonnenstandsberechnung Routine mit optionaler Datenprotokollierung
'Protokollierung Kopfzeile
if debug>0 then
print #4,"_______________Uhrzeit(UT): ";hour;":";min;":";sec;" ________________"
print #4,
end if
'Berechnung
'-1-Berechnung des Julianischen Datums (um 0:00 Uhr UT)
dat2juldat 'berechnet variable jd0 und jd
if debug=2 then
print #4,"Julianisches Datum:",jd
end if
'-2-Berechnung T0 in julianischen Jahrhunderten
t0=(jd0-2451545)/36525
if debug=2 then
print #4,"t0:",t0
end if
'-3-Berechnung des Stundenwinkels des Frühlingspunktes
stdwinkel_fp'berechnet variable o
if debug=2 then
print #4,"Stundenwinkel des Frühlingspunktes:",o
end if
'-4-Berechnung ekliptikale Länge A ,Ekliptikschiefe & Rektaszension
ekl_rekt
if debug=2 then
print #4,"ekliptikale Länge:",a_ekl
print #4,"Ekliptikschiefe:",e_ekl
print #4,"Rektaszension:",rekt
end if
'-5-Berechnung Deklination und Stundenwinkel r
dekl_stdwinkel
if debug=2 then
print #4,"Deklination:",dekl
print #4,"Stundenwinkel:",r
end if
'-6-Berechnung des Azimuts
azimut
if debug>0 then
print #4,"Azimut:",az
end if
'-7-Berechnung des Einfallswinkel
einfalls_w
if debug>0 then
print #4,"Einfallswinkel:",ew
end if
print #4,
print #4,
end sub
sub dat2juldat
'Routineninterne Variablen
dim h as double
dim a as longint
dim b as longint
''Berechnung des Julianischen Datums
'(Methode entnommen von http://www.greier-greiner.at/hc/juldat_flash.htm
'Umnummerierung für Rechnung
if month>2 then
year=year
month=month
elseif month<2 then ' bei Jan & Feb
year=year-1
month=month+12
end if
'Zwischenwerte
a=365*year-679004
b= int(year/400)-int(year/100)+ int(year/4)
'Modifiziertes Julianisches Datum um 00:00 Uhr UT
jd0=(a+b+int(30.6001*(month+1))+day)
'Julianisches Datum um 00:00 Uhr UT
jd0=jd0+2400000.5
'
'JulDat zur angegebenen Uhrzeit
h=((hour)/24)+(min/1440)'+(sec/86.400)
jd=jd0+h
end sub
sub stdwinkel_fp
'Routineninterne Variablen
dim Ogh as double 'mittl.Sternzeit in Greenwich für bestimmt. Zeitpunkt
dim og as double ' -"- im Gradmaß
''Berechnung mittlere Sternzeit in Greenwich für ges. Zeitpunkt (in Stundenbruchteilen)
Ogh=6.697376+(2400.05134*t0)+(1.002738*(hour+(min/60)))
'Ganzahlige Vielfache von 24 h abziehen
ogh=ogh-(int(ogh/24)*24)
'Umrechnung in Grad(1h=15grad)
og=ogh*15
'in Abhängigkeit vom Längengrad
o=og+lgrad
'Ganzahlige Vielfache von 360° abziehen
o=o-(int(o/360)*360)
end sub
sub ekl_rekt
'Routineinterne Variablen
dim n as double
dim l as double
dim g as double
''Berechnung
'Zeitvariable
n=jd-2451545
'mittl.ekliptikale Länge
l=280.46 + 0.9856474 * n
'mittlere Anomalie g
g=357.528 + 0.9856003 * n
'Ganzzahlige Vielfache von 360 abziehen bei l und g
l=l-(int(l/360)*360)
g=g-(int(g/360)*360)
''ekliptikale Länge A_ekl der Sonne
'g von Gradmaß->Bogenmaß
g= g/ 360 * 2*3.14159265358979
'Berechnung A
A_ekl=l + 1.915 *sin (g) + 0.02 *sin (2*g)
'g von Bogenmaß->Gradmaß
g = (g * 360) / (2*3.14159265358979)
''Schiefe der Ekliptik E_ekl
e_ekl=23.439-0.0000004*n
''Rektaszension rekt
'e_ekl und a_ekl von Gradmaß->Bogenmaß
e_ekl= e_ekl/ 360 * 2*3.14159265358979
a_ekl= a_ekl/ 360 * 2*3.14159265358979
'Berechnung rekt
rekt=atn((cos(e_ekl)*sin(A_ekl))/cos(A_ekl))
'e_ekl, a_ekl und rekt von Bogenmaß->Gradmaß
e_ekl = (e_ekl * 360) / (2*3.14159265358979)
a_ekl = (a_ekl * 360) / (2*3.14159265358979)
rekt = (rekt * 360) / (2*3.14159265358979)
'rekt in gleichen Quadranten bringen wie A_ekl
if cos(A_ekl)< 0 then rekt=rekt+180
end sub
sub dekl_stdwinkel
'Routineninterne Variablen
dim z as double 'Zwischenwert
'''Berechnung
''..der Deklination
'e_ekl und a_ekl von Gradmaß->Bogenmaß
e_ekl= e_ekl/ 360 * 2*3.14159265358979
a_ekl= a_ekl/ 360 * 2*3.14159265358979
'Zwischenwert
z=sin(e_ekl)*sin(a_ekl)
'Berechnung
dekl=atn(z/sqr(-z*z + 1))
'e_ekl, a_ekl und dekl von Bogenmaß->Gradmaß
e_ekl = (e_ekl * 360) / (2*3.14159265358979)
a_ekl = (a_ekl * 360) / (2*3.14159265358979)
dekl = (dekl * 360) / (2*3.14159265358979)
''.. des Stundenwinkels r der Sonne für den angegebenen Ort
r=o-rekt
end sub
sub azimut
'Routineninterne Variablen
dim z as double 'Zwischenwert
'''Berechnung
'Umrechnung von Gradmaß -> Bogenmaß
r= r/ 360 * 2*3.14159265358979
dekl= dekl/ 360 * 2*3.14159265358979
bgrad= bgrad/ 360 * 2*3.14159265358979
'Zwischenwert
z=(cos(r)*sin(bgrad))-(tan(dekl)*cos(bgrad))
'Hauptformel
az=atn((sin(r))/z)
'Umrechnung von Bogenmaß->Gradmaß
r = (r * 360) / (2*3.14159265358979)
dekl = (dekl * 360) / (2*3.14159265358979)
bgrad = (bgrad * 360) / (2*3.14159265358979)
az = (az * 360) / (2*3.14159265358979)
'Winkel in richtigen Quadranten bringen
if z<0 then az=az+180
'if az>180 then az=az-360
end sub
sub einfalls_w
'Routineninterne Variable
dim z as double 'Zwischenwert
'umrechnung von Gradmaß->Bogenmaß
dekl= dekl/ 360 * 2*3.14159265358979
r= r/ 360 * 2*3.14159265358979
bgrad= bgrad/ 360 * 2*3.14159265358979
'Hauptformel
z=((cos(bgrad)*cos(dekl)*cos(r))+(sin(bgrad)*sin(dekl)))
ew = ATN(z/SQR(-z*z + 1))
'Umrechnung von Bogenmaß->Gradmaß
r = (r * 360) / (2*3.14159265358979)
dekl = (dekl * 360) / (2*3.14159265358979)
bgrad = (bgrad * 360) / (2*3.14159265358979)
ew = (ew * 360) / (2*3.14159265358979)
end sub