Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

Berechnung des Sonnenstandorts

Uploader:Mitgliedotti
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