Timer aktivieren über Taster

Hi Neuuser,

zur Frage 1: Ist nur doppelt gemoppelt, verändert natürlich ein "bissle" Deinen Timer da Du nach n µsec nochmals "nachlädst" und damit der quasi neu läuft. Aber ich denke das ist zu vernachlässigen, ist halt nicht schön.

Zu Thema 2: Jetzt frag ich nochmal nach damit ich es auch ganz verstanden habe:
Nun wen ich an meinen Testboard den Poti hochdrehe so das z.B. 13 V am Display erscheinen, sollen die Relais 1u.2 anziehen und es gehen nun auch die Dioden auf den Testboard dafür an.
umgekehrt wen Poti zurückgedreht dann schalltet Relais 1 u.2 bei 11V wieder aus.

so nun soll es, wen ich den Poti wieder auf 13V drehe 1 u.2 nicht sofort angehen sonder erst nach der festgesetzten zeit, 30 Minuten.

Ich hoffe nun hast du mein vorhaben verstanden.

Soll heißen, wenn Relais 1 und 2 wieder ausgeschaltet wurden nachdem sie eingeschaltet waren und die "Einschaltbedingung" wieder vorkommt (Poti auf 13V) dann dürfen sie trotz korrekter Einschaltbedingung zunächst nicht einschalten sondern erst nach 30 Minuten, oder?

Grüße,
Ma
 
Hi Neuuser,

ja sicher bekommt man so etwas hin. Allerdings möchte ich Dir zunächst die Programmierspielwiese überlassen. Ich erzähle Dir aber ein bissle was darüber, wie ich es machen würde. OK?

Alsoooo.....

Du hast zunächst drei Übergänge die wichtig sind.
1. Der gültige "Einschaltvorgang" ohne dass die Relais zuvor ausgeschaltet wurden. z.B. bei Systemstart und bei erstmaligem Ralis 1+2 einschalten.
2. Der Ausschaltvorgang von Relais 1+2 welcher immer und zu jeder Zeit ablaufen kann.
3. Der Wiedereinschaltvorgang von Relais 1+2 nach Ausschalten.

Sooooo, was nun.....

Du kannst folgendes machen. Du kannst Dir eine Hilfsvariable / ein Hilfsflag definieren was Du zunächt aus 0 (= FALSE) setzt. Wenn die Relais angezogen haben dann setzt Du das Flag auf 1 (=TRUE).
Du musst natürlich dann, bervor Du die Relais einschaltest abprüfen, ob das Flag TRUE oder FALSE ist und Du darfst die Relais nur einschalten wenn FALSE.

So, nun ist zunächst das Einschalten abgesichert.

Beim Ausschalten startest Du auch eine Zeitüberwachung z.B. über eine globale Word-Variable in gewohntem Stil: Zielzeit = aktuelleZeit + Wartezeit.
Wenn Die Zielzeit durch einen Vergleich abgelaufen ist dann setzt Du das Flag auf False zurück und damit kann das relais wieder einschalten. Ansonsten ist es ja noch auf TRUE.

Ich selbst gehe da gerne den Weg und definiere ir eine eigene kleine Gosub-Routine die ich - wie schon gesagt - in der Hauptschleife aufrufe und in der ich solche Zeitlichen Steuerungen mache.

Damit die zeitliche Steuerung nicht aktiv wird wenn Du sie garnicht brauchst, z.B. wenn Du stumpf in der Hauptschleife auf Zielzeit = aktuelleZeit abprüfst gehe ich gerne hin und schaffe noch mit einem 2. Flag in dem ich steuere, ob gerade eine Zeitüberwachung gemacht wird oder nicht.


Alles in allem quasi so:

Dim Überwachungsflag=0, Zielzeit, Relaisflag=0
....
Relais 1+2 einschalten aber nur wenn Flag auf FALSE
Flag auf False setzen
...
...
Relais 1+2 ausschalten
Zielzeit = aktuelleZeit+Wartezeit
Überwachung = TRUE
...
...
Ist Überwachung aktiv, dann prüfen ob aktuelleZeit=Zielzeit
Wenn JA dann Überwachung = FALSE und Flag = FALSE
...
...


Was meinst Du? Ich denke diese Gedankengänge sollten Dir zunächst weiterhelfen das Probelm zu lösen. Sicherlich gibt es vielleicht noch andere Wege aber dieses hier ist mir aktuell mal so eingefallen.


Grüße,
Markus
 
Hi Markus,

Hmm, ja das muss ich mir erstmal richtig durch den Kopf gehen lassen und mir da was zusammenreimen wie ich das anfange.
ich werde mich wieder melden ob ich es geschafft habe oder nicht. :rolleyes:

Gruß Neuuser
 
Hallo Markus,

ich komme da nicht wirklich so weiter, hast du ein paar Codeschnipsel deiner definierten zeitlichen Gosub-Routinen, das wäre sehr hilfreich, denke ich.

Gruß Neuuser
 
Hallo Neuuser,

ich bin mir fast sicher, dass Du auch ohne Codeschnipsel und ein bissle Überlegen dahinter kommst, was ich mit meinen Ausführungen gemeint habe. Gerne möchte ich aber die vielleicht etwas abstakten Darstellungen präzisieren.

Also....

1. Scheduler
Mit "zeitlicher Gosub Routine" meine ich im Wesentlichen nix anderes als eine
Code:
Gosub-Routine z.B.
Timer_Scheduler:
     ' mache dies
     ' mache das
Return
welche ich in meiner Hauptschleife (DO-LOOP) mit "GOSUB Timer_scheduler" aufrufe. Damit habe ich ein Konstrukt geschaffen das zyklisch aufgerufen wird, nämlich so schnell es die eigentliche Hauptschleife zulässt.
Der Timer_Scheduler beinhaltet nix anderes als viele viele IF-Abfragen und ggf. auch Case-Verteiler über die ich verschiedene Zustände abprüfe und schaue ob ein von mir erwartetes Ereignis eingetroffen ist um dann z.B. einen Ausgang anzusteuern oder irgendwelche Sensoren zu lesen oder was auch immer.
In Deinem Fall würdest Du in den IF-Abfragen die Relais wieder einschalten bzw. das vielleicht verriegelte Einschalten der Relais wieder zulassen.

Schau Dir mal in meinem Wintergartenprojekt die Funktion "Sw_timer_sequencer" an. vielleicht wird es Dir da klarer.


2. Relaissteuerung zur Wiederholung:
Wir sind uns einig, dass das Einschalten der Relais zunächst aus dem StartUp kein Problem ist, sondern erst wenn Du die Relais eingeschaltet hattest, diese wieder ausschaltest. Erst dann möchtest Du ja warten bis die 30-60 Minuten abgelaufen sind.

Solch eine Steuerung bekommst Du nur durch Bildung einer Hysterese hin. Das bedeutet, Du musst das Einschalten der Relais prinzipiell durch eine Variable mit den Inhalten 0 und 1 zulassen bzw. sperren.


In Verbindung mit meinem letzten Beitrag solltest Du das eigentlich hinbekommen. Schaus Dir bitte an und wenn es immer noch nicht klar ist, dann beiße ich als nächstes in den sauren Abpfel und bau Dir das mal beispielhaft in Deinem Code ein. OK?


Grüße,
Markus
 
Hallo Markus,
ich habe nun noch mal probiert, komme aber nicht auf eine vernünftige Version.es kommt nur Murks raus.

Schau mal das mit geschickte Programm durch, ich habe nun es so weit gehabt, aber wahrscheinlich nicht mal annähernd wie du mir das mitteilen wolltest, aber der Timer zählte, aber in umgekehrte Richtung, wen die Volt unterschritten wurden.
Das Problem ist wieder den Timer auf 0 setzen, Zielzeit=0, wohin damit ?
Ich denke wen ich das erstmal zur funktion gebracht habe dann könnte man das mit der wartezeit, Zielzeit und aktuellezeit integrieren.

Gruß Neuuser
 

Anhänge

  • test1.bas
    9,6 KB · Aufrufe: 2
Meine Testversion

Hallo Neuuser,

leider werde ich aus dem letzten von Dir geposteten Test1.bas nicht ganz so schlau. Sprich, ich sitze wie der Ox vor dem Berg und ich schaffe es nicht ganz nachzuvollziehen, was Du Dir wie gedacht hast.

Aus diesem Grund habe ich mir Deine Version vom 23. hergenommen und dort mal das eingebaut, was ich so gemeint habe. Ich erhebe keinen Anspruch darauf, dass es Fehlerfrei ist da mir das Zieltarget fehlt und ich bei meinen Entwicklungen auch manchmal ausprobieren muss bis es funktioniert.
Im Trockendock ohne HW zu implementieren ist immer schwieriger.

So, nun aber ein paar Worte zu dem Code:



CodeBox Bascom
$regfile = "m8def.dat"
$crystal = 8000000
$framesize = 128
$hwstack = 128
$swstack = 32

Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Lcd = 20 * 2
Initlcd
Waitms 50
Cursor Off Noblink
Cls

Deflcdchar 0 , 6 , 9 , 9 , 6 , 32 , 32 , 32 , 32 ' LCD-Sonderzeichen
Deflcdchar 1 , 32 , 32 , 4 , 2 , 31 , 2 , 4 , 32 ' replace ? with number (0-7)

Const Adc_multi = 0.004887585533
Const Refer = 1.2080 'mit PT 81-210 1.9600 mit PT81-110 '1.2080 Fühler Konstante bei 0°C
Config Adc = Single , Prescaler = Auto , Reference = Avcc ' interen 5V


'##Ma##
Dim Ueberwachungsflag As Byte
Dim Verriegelungsflag As Byte
Dim Ueberwachungscounter As Word
Const Zeitfenster = 60 ' zunächst für eine Minute

Ueberwachungsflag = 0 ' inaktiv
Verriegelungsflag = 0 ' inaktiv
Ueberwachungscounter = 0 ' Vorinitialisieren
'##Ma##



Dim V As Single 'AD Eingang für Temp
Dim Mittelwert As Word
Dim Value(5)as Word 'Array für 10 Werte hier kommen die Werte rein
Dim Index As Byte 'Der index ist ein hilfs zähler und ersetzt die zahlen für
Dim Rettedenmittelwert As Word
Dim Zeit_zaehler As Word
Dim Ready As Bit
Dim I As Word , Ii As Byte , A As Word

Dim Au As Byte
Dim Aus As Single
Dim Ein As Single
Dim Umsch_aus As Single
Dim Umsch_an As Single
Dim Vorkomma As Byte
Dim Nachkomma As Byte
Dim Volt_chk As Single


Dim W0 As Word
Dim W2 As Word
Dim Volt As Single

Config Portb = Output
Config Portd.2 = Output
Config Portd.3 = Output
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Portd.0 = Input
Config Portd.1 = Input
Config Debounce = 50

Tast1 Alias Pind.0 'Taster1
Tast2 Alias Pind.1 'Taster2
Gruen Alias Portd.2 'Diode grün an
Rot Alias Portd.3 'Diode rot aus
Relais1 Alias Portd.6 'Relais für Netz
Relais2 Alias Portd.7 'Relais für Umformer
Irf Alias Portd.4 'irf schaltung für ladegerät, umformer usw.
Licht_an Alias Portd.5 'licht

Ddrc.0 = 0 'AD Eingang für Mess
Ddrc.1 = 0 'AD Eingang für Temp

Portd.0 = 1 'Taster1, schaltet gegen Minus
Portd.1 = 1 'Taster2
Portd.2 = 0 'Diode grün
Portd.3 = 0 'Diode rot
Portd.4 = 0 'IRF schalter
Portd.5 = 0 'licht
Portd.6 = 0 'Relais1
Portd.7 = 0 'Relais2


Config Timer1 = Timer , Prescale = 256 '256
Const Timerwert = 34286 '59391 31250 34286 65535
On Timer1 Timer1_sprung
Enable Timer1
Enable Interrupts
Timer1 = Timerwert

I = 0
A = 0
Mittelwert = 0

Locate 1 , 1
Lcd "Solarumschalter "
Locate 2 , 1
Lcd "Version V1.0"
Waitms 2000
Cls

Umsch_aus = 1

Do
Start Adc
W0 = Getadc(0) ' auslesen des Span ADC0
'W1 = Getadc(1) ' auslesen des Temp ADC1
'W2 = Getadc(2)

If Tast2 = 0 Then
Licht_an = 1
A = 0
End If

Volt = W0 * Adc_multi '5/1023 = 2.73 Volt 10 Bit AD converter
Volt = Volt * 2.911

If Ready = 1 Then Gosub Analog
'If Tast1 = 0 Then Gosub Schritt1 'Taster 1 zum Stellen der
Debounce Tast1 , 0 , Schritt1 , Sub

'Volt_chk = Volt * 10
If Volt_chk > Aus And Umsch_aus = 1 Then Gosub Schritt2
If Volt_chk < Ein And Umsch_aus = 1 Then Gosub Schritt3

If Aus < 115 Then Aus = 125
If Ein < 110 Then Ein = 110

If Umsch_aus = 0 Then 'schaltet komplett aus wen in menue auf 0 gesetzt
Relais1 = 0
Relais2 = 0
End If

'------- LCD ANZEIGE------------------------------------------------------------

Locate 1 , 1
Lcd "Volt " ; Fusing(volt , "##.#")
Waitms 100

Volt_chk = Volt * 10
If Volt_chk < Ein Then
Locate 2 , 1
Lcd "Accu Leer"
Elseif Volt_chk > Aus Then
Locate 2 , 1
Lcd "Accu Voll"
End If

If Umsch_aus = 0 Then
Locate 2 , 13
Lcd ; Chr(1) ; "AUS"
End If

Loop
Stop Adc
End

'-------------------------------------------------------------------------------

Schritt1:
Waitms 100
Cls
Do
Locate 1 , 1
Lcd "ACCU Ueberspann:" 'Stunden setzen
Locate 2 , 8
Au = Int(aus)
Vorkomma = Aus / 10
Nachkomma = Au Mod 10
Locate 2 , 8
Lcd Vorkomma ; "." ; Nachkomma
'lösche Zeilen


If Tast2 = 0 Then
Incr Aus
If Aus > 145 Then Aus = 125
Waitms 100
Au = Int(aus)
Vorkomma = Aus / 10
Nachkomma = Au Mod 10
Locate 2 , 8
Lcd Vorkomma ; "." ; Nachkomma

End If

Loop Until Tast1 = 0 'solange, bis Taster 1 gedrückt

Waitms 200
Cls

Locate 1 , 1
Lcd "ACCU Unterspann:" 'Stunden setzen
Locate 2 , 8
Au = Int(ein)
Vorkomma = Ein / 10
Nachkomma = Au Mod 10
Locate 2 , 8
Lcd Vorkomma ; "." ; Nachkomma 'lösche Zeilen
Do

If Tast2 = 0 Then
Incr Ein 'Mit Taster 2

If Ein > 145 Then Ein = 110
Au = Int(ein)
Vorkomma = Ein / 10
Nachkomma = Au Mod 10
Waitms 100
Locate 2 , 8
Lcd Vorkomma ; "." ; Nachkomma
End If

Loop Until Tast1 = 0 'solange, bis Taster 1 gedrückt
Waitms 200
Cls

Do
Locate 1 , 1
Lcd "Umsch 0-AUS 1-AN"
Locate 2 , 8
Lcd Umsch_aus

If Tast2 = 0 Then
Incr Umsch_aus
If Umsch_aus > 1 Then Umsch_aus = 0
Locate 2 , 8
Lcd Fusing(umsch_aus , "#.")
Waitms 200

End If

Loop Until Tast1 = 0 'solange, bis Taster 1 gedrückt
Waitms 200
Cls

'-------------------------------------------------------------------------------

Schritt2:


Volt_chk = Volt * 10

If Volt_chk > Aus And Volt_chk > Ein Then ' wen die abschalt volt erreischt ist
'##Ma##
' hier muss Du auch noch prüfen ob die verriegelung aktiv ist oder nicht
' wenn Verriegelung aktiv darfst du nicht einschaltne
If Verriegelungsflag = 0 Then
Irf = 0
Waitms 200 ' sachaltet Relais 1 u.2 mit zeitverzögerung ein
Relais1 = 1
Waitms 200
Relais2 = 1
' Zur Sicherheit Verriegelung hier bereits aktiv, somit wird Relais nur einmal angefahren
Verriegelungsflag = 1
End If

Elseif Volt_chk < Ein Then ' an sonsten an

Schritt3:
Relais2 = 0 ' sachaltet Relais 1 u.2 mit zeitverzögerung aus
Waitms 200
Relais1 = 0
Waitms 200
Irf = 1
'##Ma##
' nachdem Du ja nicht sofort wieder einschalten möchtest wenn du ausgeschaltet hast
' würde ich hier die Überwachung starten
Ueberwachungsflag = 1
Ueberwachungscounter = Zeit_zaehler + Zeitfenster


End If

If Relais1 = 1 Then
Gruen = 1
Rot = 0
Elseif Relais1 = 0 Then
Gruen = 0
Rot = 1
End If

Return
'-------------------------------------------------------------------------------
Analog:
Reset Ready
Incr Index
Value(index) = Getadc(1) ' AD-Eingang 1
If Index = 5 Then 'erkennen wann das Array voll ist
For Index = 1 To 5
Mittelwert = Value(index) + Mittelwert 'Die For next schleife zählt alle 5 werte zusammen
Next

Mittelwert = Mittelwert / 5 'Hier werden alle wert durch 5 geteilt.
Rettedenmittelwert = Mittelwert
Index = 0
Mittelwert = 0

V = Rettedenmittelwert * 0.004887585533
V = V - Refer
V = V / 0.0077125
V = V + 2

If V > 100 Then
Locate 1 , 11
Lcd "noTemp"
Else
Locate 1 , 11
Lcd Fusing(v , "#.#") ; Chr(0) ; "C" ' ANZEIGE am LCD= Temperatur
End If
End If

Return

'-------------------------------------------------------------------------------

Timer1_sprung:
Timer1 = 34286 'Dieser Wert bestimmt die Sample Frequenz
Incr Zeit_zaehler ' Jede Sekunde um +1
Incr I
Incr A


Timer1 = Timerwert ' Jede Sekunde um +1
If Zeit_zaehler = 5 Then 'Dieser Wert bestimmt die Sample Frequenz
Set Ready ' 60 = 1 Min -120 = 2 Min usw.
Zeit_zaehler = 0
End If


'##Ma##
' prüfen ob Überwachung aktiv und ob Zaheler abgelaufen
If Ueberwachungsflag = 1 Then
' Ja, Ueberwachung aktiv

' Prüfen ob Zaehler abgelaufen
If Zeit_zaehler = Ueberwachungscounter Then
' JA
Ueberwachungsflag = 0
Verriegelungsflag = 0
End If
End If


'(If I = 30 Then '3600= 1 Stunde in sec.
Incr Ii
I = 0
End If
If Ii = 1 Then = 0 '24 =1 Tag in Stunden 96= 4 tage
')

If A = 30 Then
Licht_an = 0 'Licht in sekunden
A = 0
End If

Return


Ich habe entsprechende Verriegelungsflags und Zeitüberwachungen eingebaut. Habe aber zunächst auf eine Gosubg-Routine in Do-LOOP verzichtet sondern mache die entsprechenden Abprüfungen in der Timer-Routine.

Alle meine Änderungen habe ich mit ##Ma## gekennzeichnet damit Du die Stellen im Code besser sehen kannst.

Was habe ich überhaupt getan:
- Ich habe entsprechende Arbeitsvariablen eingebaut
- In der Routine Schritt2 und Schritt3 habe ich an den Stellen die für das Einschalten / Ausschalten relevant sind die Verriegelunge und Überwachungen eingebaut.
- Beim Einschalten wird eine Verriegelung gegen erneutes Einschalten gesetzt. Ausserdem wird geprüft ob überhaupt erneu eingeschaltet werden darf.
- Beim Ausschalten setzte ich die Zeitüberwachung die aktuell mit einer Minute defineirt ist. Erst danach wird in der Timer-Routine die Verriegelung wieder freigegeben und man kann die Relais erneut einschalten.


Ich hoffe, dass Du damit eine Vorlage erhältst welche dem Entspricht was Du Dir vorgestellt hast. Und ich hoffe, das es auch funktioniert da ich selbst es nicht testen kann.

Grüße,
Markus
 
Hallo Neuuser,

nach unserem Telefongespräch gestern Abend habe ich nochmals ein wenig Hand an den Code angelegt. Leider bin ich aktuell noch im Büro und somit habe ich die MIttagspause zu Modifikationen genutzt. Allerdings nicht auf der Basis die Du mir via Email zugesendet hast sondern auf Basis der letzten hier vorhandenen Version.

Ich habe zunächste die Funktion Schritt2+Schritt3 deaktiviert und auch den Aufruf ausgebaut. Anschließend habe ich eine generalisierte Funktion geschrieben die nun immer in der Hauptschleife aufgerufen werden soll.

Ich hoffe ich habe nun etwas mehr begriffen was Du realisieren wolltest und habe versucht das gehörte umzusetzen. Im Wesentlichen habe ich die Routine so versucht zu schreiben, dass:
- bei Unterspannung die Verbraucher sofort abgeschaltet werden
- bei Überspannung ein Zähler läuft der aktuell über eine Konstante auf 30 Sekunden festgelegt ist
- das Zählen anhält wenn er nicht mehr Überspannung aber noch nicht Unterspannung hat, mit der Option, dass er bei Überspannung wieder weiterzählt.

Schau es Dir mal an und vielleicht funktioniert es so ja schon ansonsten können wir bzgl. meiner Änderungen wieder telefonieren. Melde Dich einfach bei mir!

Grüße,
Markus
 

Anhänge

  • Relais_Neuuser_2009-03-05.bas
    11,9 KB · Aufrufe: 11
Hallo Markus,
da schulde ich dir ja noch ein Mittagessen :) ich hab es soeben probiert und sieht super aus, so wie ich das sehe auch etwas vereinfacht das Programm, schön.
Habe nur noch die Zielzeit = 0 uner der unteren schaltwelle gesetzt, damit er auch da den Zähler auf null setzt, er hatte immer weiter zusammengerechnet auch wen er ausschaltete, nun geht es auch.
Was ich noch gesehen hatte war das ich nun über das Menü nicht ein und aus schalten konnte, aus geht, aber wen die Relais an waren und man schaltet aus und danach wieder ein,gehen sie nicht an.
Aber das bekomme ich bestimmt auch selber noch hin.:D

Danke nochmals Markus

Gruß Neuuser M.
 
Hey M.

da bin ich ja beruhigt. Wie gesagt, das war ein Schnellschuß heute Mittag in meiner Mittagspause weil mich Dein Code echt nicht mehr in Ruhe gelassen hat.
Hätte ich ein System zum Testen gehabt dan hätte ich die restlichen Fehler wahrscheinlich auch noch gefunden aber im Trockendock zu schwimmen ist immer a bissle schwierig.

Freue mich wenn Du mit dem Code soweit zunächst weiter kommst und wenn es wo klemmt da sag bitte Bescheid. Gerne können wir auch nochmal telefonieren.

Grüße,
M.
 
Hallo, guten Abend,

zur Vollständigkeit dokumentiere ich hier nun noch ein paar Dinge nach! Neuuser und ich hatten heute Mittag eine längere Telefon-Session zur Klärung der noch offenen Probleme in der Software.

Ich möchte kurz die dabei entstandenen Modifikationen posten:

1. Modifikation der ISR-Routine für den Timer:


Code:
Timer1_sprung:
   Incr Zeit_zaehler                                        ' Jede Sekunde um   +1

   ' Zielzeit soll nur erhöht werden wenn auch Überspannung existiert
   ' Damit stelle ich sicher, dass die Zeit nur zählt, wenn auch wirklich Leistung ankommt
   ' Auf diese weise hält er an, wenn man zwischen Unterspannung und Ueberspannung ist,
   ' zählt aber weiter wenn man wieder auf Überspannung kommt.
   If Umsch_aus = 1 Then
      If Ueberspannung = 1 And Unterspannung = 0 Then
         If Irf = 1 Then
            Incr Zielzeit
         End If
      End If
   End If

   Incr Wartezeit
   Incr A

   Timer1 = Timerwert                                       ' Jede Sekunde um +1 Timer 34286
   If Zeit_zaehler = 5 Then                                 'Dieser Wert bestimmt die Sample Frequenz
      Set Ready                                             ' 60 = 1 Min -120 = 2 Min usw.
      Zeit_zaehler = 0
   End If

 If A = 30 Then
 Licht_an = 0                                               'Licht in sekunden
 A = 0
 End If

Return


2. Modifikation der Gosub-Routine für die Relaissteuerung
Code:
Relaissteuerung:

   ' Umsch_aus = 0 Relais auf AUS
   ' Umsch_aus = 1 soll Automatik

   If Umsch_aus = 0 Then
      Relais2 = 0
      Waitms 200
      Relais1 = 0
      Waitms 200
      Irf = 1
      If Zielzeit > Zeitkonstante Then
         Zielzeit = Zeitkonstante - 2
      End If
   Else
      ' Spannung berechnen
      Volt_chk = Volt * 10

      ' Zunächst Prüfen ob Spannung auf Unterspannung ist
      If Volt_chk < Ein Then
         ' Ja, wir haben Unterspannung, dann Relais 1 u. 2 zeitverzögert ausschalten
         ' Relais können aber sofort umschalten

         Unterspannung = 1
         Ueberspannung = 0

         Relais2 = 0
         Waitms 200
         Relais1 = 0
         Waitms 200
         Irf = 1
         Zielzeit = 0
      Else
         ' NEIN, wir haben keine Unterspannung, also weiter prüfen

         ' Prüfen ob Überspannung vorhanden
         If Volt_chk > Aus Then
            ' JA, wir haben Überspannung

            ' Beim Übergang von Unterspannung auf Überspannung soll Zähler zurückgesetzt werden
            If Unterspannung = 1 And Ueberspannung = 0 Then
               Zielzeit = 0
            End If

            Ueberspannung = 1
            Unterspannung = 0

            ' Prüfen ob Zeitpunkt für Relaisschaltung erreiche
            If Zielzeit = Zeitkonstante Then
               ' JA, also Relais schalten
               Irf = 0
               Waitms 200                                      ' sachaltet Relais 1 u.2 mit zeitverzögerung ein
               Relais1 = 1
               Waitms 200
               Relais2 = 1

            End If

         Else
            ' Nein, wir haben keine Überspannung, aber auch keine Unterspannung

            Unterspannung = 0
            Ueberspannung = 0

         End If
      End If
   End If

   If Relais1 = 1 Then
      Gruen = 1
      Rot = 0
   Elseif Relais1 = 0 Then
      Gruen = 0
      Rot = 1
   End If

Return


Soweit ich das sehe sollten die Relais nun das machen was sie machen sollten :D

Auf die letzten Testergebnisse warten wir noch. Würd emich aber freuen wenn es dann funktioniert.

@Neuuser: Es wäre doch toll, wenn Du zum Schluss dieser Basutelle den gesamten, funktionierenden Code, vielleicht inkl. eines Schaltplans hier noch fertig einstellen könntest und dann machen wir diesen Thread zu. Was hältst Du von der idee?

Grüße,
Markus
 
Hallo Markus,
naa, doch noch im Forum gewesen ;).
ich denke mal das mit deiner Hilfe der Code im ganzen erst mal so fertig ist und gut funktioniert, werde später aber noch ein Menü zum einstellen der einschaltzeit einfügen.
Eins muss ich noch zum Code sagen, die Anweisung unten am Zähler If Irf = 1 Then, muss raus, da sonst der Zähler nicht weiterzählt, falls vorm automatischen einschalten die Relais, per Hand ausgeschaltet wird, so wie es nun ist, funktioniert es.

Kurz noch zum Projekt, es ist ein Solarumschalter der von Normalstrom zu Umformstrom umschaltet und wieder zurück, die Ruckschaltung erfolgt nach fest eingestellter 30 Minuten, wen die eingestellte höst-Voltzahl überschritten wird.
So wird erreicht, das die Batterie besser nachgeladen und sich wieder erholen kann.

Die Überspannung und die Unterspannung kann über das Menü eingestellt werden.
Volt und Temperatur von der Batterie wird auf LCD Display angezeigt.
Falls noch jemand fragen zu diesem Umschalter hat, kurze Nachricht reicht.

Gruß Neuuser :hello:
 

Anhänge

  • Solarumschalter.bas
    10,5 KB · Aufrufe: 7
  • Schaltbild Umschalter.zip
    75,4 KB · Aufrufe: 13

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)