If problem ??

Neuuser

Mitglied
11. Aug. 2008
465
0
16
Sprachen
Hallo Leute,
seit einigen Stunden versuche ich eine Anweisung hin zu bekommen die einfach nicht will,
es ist eine Steuerung für eine Solaranlage wo nach Temperatur schalten soll.

Hier nun sind die Fühler V2 Wasserkessel und V3 Solarpanel und Sol_ar die (Pumpe)
nun soll die pumpe erst angehen wen V3-Solarpanel erst bei 60 C ist und aus gehen wen sie unter 55 C ist.

Aber erst auch an gehen wen die Temperatur im V3-Solarpanel höher als beim V2-Wasserkessel ist so das das S-Panel den Speicher nicht wieder abkühlt.
Diese Anweisung unten funktioniert so zu sagen fast, nur wen die Temperatur V3-Solarpanel höher als der Speicher kommt und Speicher hat schon bei 75 abgeschaltet, flackert die Diode auf dem Testboard (Sol_ar) ganz wenig im Dunkeln.
Kann mir jemand helfen wie ich das am bestens mit einer Anweisung doch noch hin bekomme ?

Ich hoffe es versteht jemand was ich hier damit sagen will.

So langsam zweifle ich schon an mir selber :stupido3:

Das Komplette Programm ist im ganzen noch unten dran.

Gruß Neuuser

If V3 > V2 And V3 > 60 Then
Sol_ar = 1
Else
End If

If V2 > 75 Or V3 < 55 Then
Sol_ar = 0
Else
End If
 

Anhänge

  • m168def.bas
    20,3 KB · Aufrufe: 8
Hallo Neuuser!

Du kannst doch die IF-Anweisungen einfach nach "Wahrheit" verschachteln. ;)

Wichtig wäre doch wohl, wenn ich es richtig verstanden habe, dass die Temperatur immer höher sein muss als der Speicher.
Wie groß die Hysterese (Temperaturabstand) dann sein soll, kannst du ja in einer separaten Variable definieren.

Erst wenn dies der Wahrheit entspricht prüfst du, ob das Panel sich zwischen 55 und 60 Grad befindet und schaltest die Pumpe entsprechend ein.

Wie oben schon erwähnt, kannst du die IF-Anweisungen auch verschachteln.

Zum Beispiel:

If V3 > V2 Then

...If V3 > 54 And V3 < 61 Then
...Sol_ar = 1
...Else
...Sol_ar = 0
...End If

Else
Sol_ar = 0
End If


Es wird also erst geprüft, ob auch wirklich V3 höher als V2 ist, sollte dies schon falsch sein, wird der Rest nicht mehr berücksichtigt.
Anhand der versetzten Schreibweise kannst du sehen, welche IF-Anweisungen zusammen gehören.


Hast du das Prinzip verstanden?

Viel Spaß beim Ausprobieren.....

Cassio
 
Hysterese?

Ein anderer Lösungsansatz könnte die Bildung eines Hysterese sein. Das bedeutet Einschaltbedingungen und Ausschaltbedingungen voneinander trennen, eine Trennung durch Zeitverzögerung oder einer Delta-Temperatur bilden und so das ganze entkoppeln.

Das flackern der LED kommt meiner Meinung nach durch ungeeignete Abhängigkeiten und Prüfungen zu stande durch die er gleichzeitig ein- und ausschalten möchte.

Vielleicht hilft das beim Nachdenken weiter. Wollte einfach mal querdenken.

Sag uns einfach ob und wie Du weiter gekommen bis. Wenn's noch Probleme gibt könnte ich auch mal mein BASCOM anwerfen und Dir eine Beispiellösung hacken.

Achtung: Noch eine allgemeine Information. Meiner Meinung nach kommt BASCOM nach wie vor noch nicht vollständig mit verschachtelten / zusammenhängenden IF-Anweisungen zurecht. Hatte hier scon die schönsten Erlebnisse :eek:
Aus diesem Grund zerlege ich gerne die einzelnen Prüfungen in Ihre Einzelteile und baue mir vielleicht etwas aufwändigere einzelne IF-Then-Else-Anweisungen, die dann aber auch funktionieren.

Grüße,
Markus
 
Hallo Cassio und Markus,
danke für den Code Cassio, aber ich glaube den hatte ich auch schon so, daher bin ich ein wenig durch den Wind weil ich habe unzählige Varianten probiert und komme immer auf den einen Punkt wen es "Funtioniert" das die Diode flackert wen v2 abschalten soll.
Ich bekomme balt nee Macke :banghead:
das ist nun wieder das Ergebnis von 2 Stunden Testen aber es kommt nichts wirklich bei raus.

If V3 > V2 Then
Sol_ar = 1
Else
Sol_ar = 0
End If
If V2 > 75 Then Sol_ar = 0

habe auch soweit den Code gekürzt das ich nicht so viel Anweisungen drin habe.

Markus , ja ich weiß das es so ist, unten sagt er abschalten und oben aber sagt er an bleiben.
Ein anderer Lösungsansatz könnte die Bildung eines Hysterese sein. Das bedeutet Einschaltbedingungen und Ausschaltbedingungen voneinander trennen, eine Trennung durch Zeitverzögerung oder einer Delta-Temperatur bilden und so das ganze entkoppeln.

Eine Art Hysterese habe ich schon in mein Programm aber das war kein Problem, damit konnte ich aber für diesen Code nichts ableiten.

Könntest du mir das noch näher erklären, über Hysterese oder die Delta-Temperatur ?

Gruß Neuuser
 
Hallo,
so, mit dieser Anweisung scheint es zu gehen, jedenfalls flackert die Diode jetzt nicht mehr :D habe nur die komplette Anweisung umgedreht zuerst aus, dann an.

If Solar_aus = 1 Then Wasser = 0
If Solar_aus = 1 Then

If V3 < V2 Or V2 > 75 Then
Sol_ar = 0
Else
Sol_ar = 1
End If
End If

wo ich Grade dabei bin, in mein Programm habe ich noch ein Problem mit Variablen zuordnen.
Bei der Nachtabsenkung soll über einer Zeitsteuerung der wert verändert werden das geht auch aber er setzt die Variable nicht wieder nach Zeitablauf zurück.
diese Gleichen Anweisungen habe ich für verschiedene Uhren zum stellen und Schalte genommen, für Port ausgänge, dort funktioniert es gut, aber hier nicht, warum ??

'Nachtabsenkung-----------------------------------------------------------------

Servo(1) = Muesch * 10

If _hour = Std_ein And _min = Min_ein Then Muesch = Nacht 'Einschaltzeit

Das einschalten oben funktioniert !!!


If _hour = Std_aus And _min = Min_aus Then Muesch = Muesch 'Abschaltzeit

Aber das zurückschalten nicht

Gruß Neuuser
 
Guten Abend Neuuser,

hmmmm....

Code:
If _hour = Std_aus And _min = Min_aus Then Muesch = Muesch 'Abschaltzeit

... ich bin mir nicht sicher ob ich richtig verstanden habe was Du machen möchtest aber Muesch ist doch Muesch oder? Ich meine, wie soll sich Muesch ändern wenn Du Muesch wieder auf Muesch setzt. Ich Meine 1 = 1 ist auch 1 und wie soll sich Muesch verändern. Beim Einschalten setzt Du Muesch wenigstens noch auf Nacht. Möchtest Du Muesch vielleicht nicht lieber auf Tag oder auf den richtig Inhalt einer anderen Variable setzen?

Bedeutet doch aktuell, dass die If-Anweisung ohne Funktion ist!

Oder?

Grüße,
Markus
 
Hi Markus,
ja vielleicht habe ich es nicht richtig erläutert,
aber was du sagst stimmt schon ,oben siehst du ja das Muesch = Nacht werden soll, aber nach Ablauf der zeit soll es ja wieder Muesch werden, weg von Nacht, aber wen du meinst das ich dann Nacht = Muesch schreiben soll funktioniert genau so wenig.

Muesch ist ja eigentlich Tag gemein,t die Tagestemperatur und Nacht ist ja klar.

Gruß Neuuser
 
Hmmmm.....

ich glaub jetzt blick ich's immer weniger. Ich verstehe nur noch Muesch.

Alsooooo, wenn Muesch noch was anderes machen soll als Muesch dann solltest Du Muesch mit etwas sinnvollem belegen und nicht wieder mit Muesch.
Wenn das Schalten mittels "Muesch = Nacht" funktioniert dann ist doch Muesch Nacht und Wenn Du Muesch= Muesch setzt ist Muesch immer noch Muesch und damit Nacht wenn Du es zuvor auf Nacht gesetzt hast, oder?

Vielleicht habe ich auch nur einen Knoten im Kopf weil ich nicht Deinen gesamten Code im Kopf haben.

Aber...

Ich stelle mal die Hypothese auf, dass Muesch bevor Du es auf Nacht setzt den richtigen Wert hat. Was immer Du mdamit machst. OK!?!?
Vielleicht solltest Du Muesch in eine temporäre Variable buffern z.B. Temp_byte = Muesch bevor Du Muesch = Nacht setzt. Und wenn Du wieder zurück schalten möchtest dann nimmst Du nicht Muesch sondern Temp_byte und schreibst Muesch = Temp_byte. Nur so hast Du wirklich einen Schaltzustand.

Ich bleibe bei meiner Aussage, mit Muesch = Muesch wirst Du nie und nimmer nicht eine Änderung des Schaltzustandes herbeiführen.

Grüße,
Markus
 
Hi Markus,

st Muesch immer noch Muesch und damit Nacht wenn Du es zuvor auf Nacht gesetzt hast, oder?

ja ist richtig was du sagst, stimmt, den Knoten im Kopf habe ich gehabt nun weiß ich was du meinst.

wen ich das richtig verstanden habe sollte es so aussehen, oder.

Servo(1) = Muesch * 10
Temp_byte = Muesch

If _hour = Std_ein And _min = Min_ein Then Muesch = Nacht
If _hour = Std_aus And _min = Min_aus Then Muesch = Temp_byte

ich kann es jetzt nur noch nicht testen, erst morgen.

Gruß Neuuser
 
Ja, oder so:

Code:
Servo(1) = Muesch * 10

If _hour = Std_ein And _min = Min_ein Then 
     Temp_byte = Muesch
     Muesch = Nacht 
End If

If _hour = Std_aus And _min = Min_aus Then Muesch = Temp_byte

Damit würdest Du erst dann Muesch in eine temp. Vartiable retten, wenn der originale Inhalt von Muesch durch Nacht ersetzt wird.
Du hast damit genau den Muesch Wert vor der Operation Muesch = Nacht.

Grüße,
Markus
 
Hi Markus,
leider geht es so auch nicht, er schaltet einfach nicht zurück.

Ich hab gesehen das die Umschaltung hin zu Nacht, die komplette Einstellung die man über die Taste bei muesch eingegeben hat, auf die von Nacht dann zurück gesetzt wurde, daher kann auch nicht zurückgeschaltet werden weil der wert mit nacht und muesch übereinstimmt.
verstehtest du !

das muss doch noch anders gehen ?!:confused:

Gruß Neuuser
 
Ok, also versuchen wir Dir weiter zu helfen :D

Zunächst habe ich ein paar Fragen zur Logik, nur damit ich das richtig verstanden habe:

- V2 ist Fühler für Temperatur Wasserkessel, richtig?
- V3 ist Fühler für Temperatur Solarpanel, richtig?
- Sol_ar ist die Pumpe, richtig?

Sind die folgenden Bedingungen richtig?
- Die Pumpe soll erst angehen wenn V3-Solarpanel-Temp >= 60 C ist
- Die Pumpe soll ausgehen wenn V3-Solarpanel-Temp < 55 C ist
- Die Pumpe darf aber auch nur angehen wenn V3-Solarpanel-Temp > V2-Wasserkessel

Welche genaue Rolle spielt Muesch?

Kannst Du bitte den aktuellen Code nach Deinen Änderungen nochmals in diesem Thread posten damit ich den aktuellen Stand habe. Danke!

Grüße,
Markus
 
Hi Markus,
am bestens nochmal von vorn.
Also die if Anweisungen von V2 V3 haben damit nichts zu tun, das ist nun schon erledigt, geht alles.

Problem ist die Nachtabsenkung und die zurückschaltung auf Tagestemperatur (Muesch).
Es werden zwei verschiedene werte im Programm über Taster Eingegeben, eine ist Musch für die Temperatur am Tage z.B 35 C und die andere ist Nacht (Nachtabsenkung) die soll zur einer bestimmten zeit erfolgen und schalten z.B auf 32 C.
wen diese zeit wieder von (ca. 22.00 Uhr - 5.00 Uhr) abgelaufen ist soll dann logischerweise die Tagestemperatur einsetzen (Muesch)
Ich hoffe es nun etwas verständlicher erklärt zu haben.
Programm ist mit bei.

Gruß Neuuser
 

Anhänge

  • m168def.bas
    20,4 KB · Aufrufe: 1
Hi Neuuser,

sodala, nun hab ich mir Deinen Code mal angesehen.

Ich glaube, Dein Problem entsteht durch folgende Zusammenhänge:

- du verwendest die Variable Muesch für den Tagbetrieb
- du verwendest gleichzeitig die Variable Muesch um damit Servo(1) zu steuern und die richtigen Inhalte zu setzen. Richtig?

Daraus ergibt sich das Problem, dass Du in der Tat bei Nachabsenkung Muesch = Nacht setzen musst damit Servo(1) den richtigen Datenwert bekommt. Oder?

Damit ist aber das Kind wie Du schon festgestellt hast in den Brunnen gefallen.

So, was könnte man meiner Meinung nach nun tun?

1. Du könntest eine weitere Variable einführen die nur dafür zuständig ist, z.B. Servo(1) = TempVar richtig zu setzen. In Deiner Zeitüberprüfung für den tagbetrieb setzt Du TempVar = Muesch und in der Nachabsenkung setzt Du TempVar = Nacht. Damit bleiben die eigentlichen Variablen die die voreingestellten und im EEPROM abgelegten Werte beinhalten unangetastet.
Du hast recht, bisher überschreibst Du letztednlich Muesch mit Nacht ud damit ist bis zum Neustart, bis Du die Werte wieder aus dem EEPROM holst Muesch = Nacht :eek:

2. Ist es notwendig zyklisch immer Servo(1) = ????? zu setzen. Folgender Gedankengang, wenn Du Servo(1) immer nur bei Änderung neu setzen brauchst:
- Die Zuweisung Servo(1) = Muesch in die If-Schleife für den Tagbetrieb mit aufnehmen. Damit wird Servo(1) = Muesch immer nur dann gesetzt, wenn Du über Zeit wirklich Tagbetrieb hast.
- Die Zuweisung Servo(1) = Nacht in die If-Schleife für den Nachtbetrieb nehmen. Damit wird Servo(1) auf Nacht gesetzt und der Tag bleibt unangetastet.


Was meinst Du, könnte das funktionieren?

Grüße,
Markus
 
Hallo Markus,
Ist es notwendig zyklisch immer Servo(1) = ????? zu setzen.
was meinst du damit.:stupido2:
ich steige da noch nicht wirklich durch was du mir da sagen willst, also soll ich servo1 einmal für Muesch und einmal für Nacht definieren ? oder wie.:eek:

Gruß Neuuser
 
Hallo Markus,

was meinst du damit.:stupido2:
ich steige da noch nicht wirklich durch was du mir da sagen willst, also soll ich servo1 einmal für Muesch und einmal für Nacht definieren ? oder wie.:eek:

Gruß Neuuser

ich glaube es geht so,
Servo(1) = Muesch * 10


If _hour = Std_ein And _min = Min_ein Then
Servo(1) = Nacht
Servo(1) = Nacht * 10
End If

If _hour = Std_aus And _min = Min_aus Then Muesch = Servo(1) = Muesch

er schaltet in Absenkung (denke ich mal) und schaltet dann wieder zurück.

werde morgen prüfen ob er auch wirklich dahin fährt wie die werte eingegeben sind.

Gruß Neuuser
 
Hi,

nein, Du sollst nicht Servo(1) einmal für Muesch und einmal für Nacht definieren. Sondern Du sollst unabhängig voneinander Servo(1) einmal mit Muesch und einmal mit Nacht laden.

So wie ich das verstanden habe ist Servo(1) Dein "Steuerkanal" den Du mit Tag und mit Nacht versorgen musst/möchtest. Oder?
Muesch ist für Tag und Nacht für Nacht, oder?

Muesch = Servo(1) = Muesch wird nicht funktionieren weil Doppelzuweisung!

Code:
If _hour = Std_ein And _min = Min_ein Then
   ' Nachtabsenkung
   Servo(1) = Nacht
Else
   If _hour = Std_aus And _min = Min_aus  Then
      ' Tagbetrieb
      Servo(1) = Muesch * 10
   End If
End If
So oder ähnlich könnte ich mir das vorstellen, wie Du die Abhängigkeiten von Tag und Nach zu Deinen Zeiten auflöst.

Grüße,
Markus
 
Hi Markus,

Then Muesch = Servo(1) = Muesch
ja das habe ich garnicht gesehen war ein Fehler, sollte natürlich nur Servo(1) = Muesch sein.
So wie es unten nun ist geht es, die Anweisung oben Servo(1) = Muesch * 10
braucht er um die Startwerte zu berechnen für den eprom.

Paar mal ausprobiert, funktioniert super nun, dank deiner Hilfe.:wink:


Servo(1) = Muesch * 10 'Servo Berechnung

If _hour = Std_ein And _min = Min_ein Then ' Nachtabsenkung
Servo(1) = Nacht * 10

Else
If _hour = Std_aus And _min = Min_aus Then ' Tagbetrieb
Servo(1) = Muesch * 10

End If
End If

Ich hätte da noch eine Frage zum Timer meines Programmes, soll ich ein neues Treat öffnen damit andere aus was von haben ? :victory:

Gruß Neuuser
 
Hi Neuuser,

ja, wenn Du Fragen zu Timern hat und Dein Thema hier zunächst behoben ist dann mach bitte einen neuen Thread auf, sonst vermischen sich die Themen.

Danke und Grüße,
Markus
 

Ü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)