Regelung schaltet nach Temperaturänderung nicht mehr richtig

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Regelung schaltet nach Temperaturänderung nicht mehr richtig

      Brauche wieder eure Hilfe!!!
      Habe ein neues Thema erstellt da es in meine "alten" nicht wirklich passt.
      Vor einigen Tagen habe ich wieder einen kleinen Bug in meiner Temperaturregelung entdeckt. Nicht wirklich schlimm aber mir lässt so ein Fehler einfach keine Ruhe a_27_b277ca12
      Mit der Standard Soll-Temp arbeitet die Regelung einwandfrei.
      Wenn ich die Soll-Temp. z.B. um 0,2 °C senke dann bleibt die Heizung auch bei erreichen der neuen Soll-Temp. eingeschaltet und wird erst abgeschaltet wenn die Soll-Temp. überschritten wird.
      Im Detail:
      Standardbetrieb: Standard Soll-Temp 25,6 °C = Heizung aus bei 25,6 °C / ein bei 25,5 °C
      Soll-Temp um 0,1 °C gesenkt: Soll-Temp. 25,4 °C = Heizung aus bei 25,5 °C /ein bei 25,4 °C???
      Bei einer Erhöhung der Standard Soll-Temp. ist alles wie es sein soll!
      Suche nun den Fehler schon seit Tagen, komme aber einfach nicht drauf wo der Hund begraben ist.

      Hat jemand eine Idee warum das nicht klappt?

      Danke
      Alfred

      Heizen_Kuehlen_2011.bas
    • In deinem Code hast du die Sub Messen

      BASCOM-Quellcode

      1. 'Temperaturmessung
      2. '=======================================================================
      3. Sub Messen
      4. If Neue_sekunde = 1 Then
      5. Neue_sekunde = 0
      6. Gosub Vergleich 'ist die standard Soll-Temperatur geaendert worden?
      7. Call Messen_b
      8. Call Messen_a
      9. Reset Watchdog
      10. End If
      11. End Sub
      Alles anzeigen

      die ja die Änderung der Soll-Temp überwachen soll.
      WIeso fragst du dort aber die Sekunden ab?
      Besser wäre es, wenn du die neue und die alte Soll-Temp in der Hauptscheife vergleichst und erst bei Änderung die neue übernimmst.


      BASCOM-Quellcode

      1. Do
      2. ...andere Anweisungen
      3. If Soll_alt <> Soll_neu Then
      4. Gosub Vergleich 'ist die standard Soll-Temperatur geaendert worden?
      5. Call Messen_b
      6. Call Messen_a
      7. Soll_alt = Soll_neu
      8. End If
      9. ...andere Anweisungen
      10. End
      11. Loop
      Alles anzeigen
      Edit: Ich hab mich in der Sub vertan.
      In der Sub Vergleich liest du jedes mal die im EEprom gespeicherte Temp neu ein. Es reicht wenn du das ein mal an Anfang vom Programm machst.
      Als nächtes wird die neue Soll-Temp nicht übernommen da du auch in der Sub Regeleung wieder die Soll-Temp aus dem EEprom liest.
      Übrigens der EEprom ist nicht so schnell wie der SRam, also lieber am Anfang alles aus dem EEprom in die Variablen einlesen und dann nur noch damit arbeiten.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von djmsc ()

    • djmsc schrieb:

      In der Sub Vergleich liest du jedes mal die im EEprom gespeicherte Temp neu ein. Es reicht wenn du das ein mal an Anfang vom Programm machst.
      OK - das macht Sinn!

      djmsc schrieb:

      Als nächtes wird die neue Soll-Temp nicht übernommen da du auch in der Sub Regeleung wieder die Soll-Temp aus dem EEprom liest.
      Warum wird sie neue Soll-Temp nicht übernommen?
      Die neue Soll-Temp wird ja übernommen! Wird auch richtig angezeigt und bei Erhöhung auch weiterhin richtig geregelt!
      Du meinst also in der Sub Regelung die neue Soll-Temp nicht mehr aus dem EEprom lesen ist des Rätsels Lösung?
    • Also ich denke mal das du generell zu viele Zugriffe auf den EEprom im Programm hast. Besser nur einmal am Programmanfang einlesen und nur bei einer Änderung im EEprom speichern. Die SRam Variablen die du im EEprom ablegst bleiben ja auch danach noch mit den aktuellen Werten erhalten und müssen nicht neu eingelesen werden.
      Eine Lösung habe ich nicht, aber mir gefällt Ihr Problem.
    • djmsc schrieb:

      Also ich denke mal das du generell zu viele Zugriffe auf den EEprom im Programm hast. Besser nur einmal am Programmanfang einlesen und nur bei einer Änderung im EEprom speichern. Die SRam Variablen die du im EEprom ablegst bleiben ja auch danach noch mit den aktuellen Werten erhalten und müssen nicht neu eingelesen werden.
      Diesen Hinweis solltest du sehr ernst nehmen, in einem MSR- Projekt steht die Zuverlässigkeit an erster stelle.

      avralfred schrieb:

      Danke - werde das Programm dahingehend überarbeiten!
      Um nicht missverstanden zu werden. Dein Code ist interessant und zeigt die praktischen Erfahrungen was gemessen, angezeigt und natürlich geregelt werden soll und alles Wichtige zeitlich an richtiger Stelle.
      Nun habe ich mal alles auf Zuverlässigkeit der Softwareseite analysiert.
      Eeprom kann nach Herstellerangaben 100.000 mal beschrieben werden. Da dies auf Zellen bezogen ist, rechne mal nach ab wann es Probleme geben könnte.
      Diese könnten hier schon ein Chaos erzeugen. Sind ja die wichtigen Startbedingungen hier hinterlegt.
      Nun erlaube ich mich gleich noch dein ständigen Aufruf des Watchdog – Timer als riskant einzustufen. An einem kritischen Punkt z.B. Sensorabfrage (wenn man diesen nicht traut) ist es okay. Aber ansonsten würde ich darauf verzichten. Bei einer kleinen Zeitüberschreidung in deinem Code wird der „Stecker gezogen“. Ist im MSR- Bereich das übelste was nur passieren kann. Auch eine USV nützt nichts, denn du hast ja ein CPU- Reset gewollt erzwungen.

      Nun noch die Sub’s. Ja mit @ tschoeatsch vor kurz hier im Forum diskutiert wie man einen Sub-Aufruf beenden muss.
      Erkenntnis: In Bascom wird jeder Aufrufpunkt im Stack abgelegt und wird nur mit Return gelöscht, ansonsten wird hochgezählt. War mir auch neu, ist aber so.
      Soll heißen, obwohl du schon für Stack einen gewaltigen Bereich reservierst hast, kommt garantiert, mit Goto die Sub zu beenden, ein CPU- Chaos. Die vielen Rücksprungadressen werden dann im Dim Bereich geschrieben. Was schlimmeres geht wohl kaum.
      Ich finde Goto auch in Bascom nicht schlecht, aber niemals innerhalb einer Sub verwenden um diese zu verlassen.
      Mit deiner Temperatur- Messgenauigkeit hätte ich auch noch einige bedenken.
      Als anerkannter Forum-Troll möchte ich hier erst mal schließen.

      Mit freundlichen Grüßen
    • fredred schrieb:

      Diesen Hinweis solltest du sehr ernst nehmen, in einem MSR- Projekt steht die Zuverlässigkeit an erster stelle.
      Danke für eure bisherigen Bemühungen!
      Als erstes habe ich den eher unnötigen WDT entfernt! Diesen hätte ich nur als zusätzliches Sicherheit vorgesehen gehabt. Macht aber anscheinend mehr Probleme als er nützt.
      Dann habe ich, glaub ich zumindest, das ständige Speichen im EEprom entfernt. Speichert nur einmal die neuen Werte wennn ich die Soll-Temp. ändere!
      Das erneute Auslesen der EEprom-Werte in der Sub Regelung habe ich ebenfalls entfernt!
      Das Programm funktioniert genau wie vorher!!!
      Sprich der Fehler in der Regelung (wie im ersten Post beschrieben) ist noch immer da.
      Nun noch die neusete Version:
      Heizen_Kuehlen_2111.bas
    • Du schreibst 'um 0,1 gesenkt' der Soll ist aber anfangs 25,6 und danach 25,4 ??
      Könnte es sein, dass du an verschiedenen Stellen Rundungsfehler hast? Das die Anzeige anders rundet als die Regelung?
      Wie verhält es sich, wenn du den Soll erhöhst?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • tschoeatsch schrieb:

      Du schreibst 'um 0,1 gesenkt' der Soll ist aber anfangs 25,6 und danach 25,4 ??
      Könnte es sein, dass du an verschiedenen Stellen Rundungsfehler hast? Das die Anzeige anders rundet als die Regelung?
      Wie verhält es sich, wenn du den Soll erhöhst?
      Hallo tschoeatsch!
      sorry - die 0,1 sind ein Tippfehler. Soll 0,2 heissen!
      Wenn ich die Soll-Temp erhöhe ist alles OK! D.h. bei erreichen der Soll-Temp schaltet die Heizung ab.
    • Ist dann der Fehler nur bei dieser Temperatur? 0,4° oder 0,6° weniger, was ist dann?

      Oder statt den 25°, wenn du das mit 26° und den entsprechenden Kommastellen machst?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hab jetzt Soll-Temp 25,0 eingestellt - Heizung wird bei 25,1 abgeschaltet.
      Bei 25,2 wird bei 25,3 abgeschaltet.

      Hingegen bei 26,0 Soll-Temp wird bei 26,0 abgeschaltet!
      Nun hab ich auch noch 26,8 Soll-Temp probiert - auch hier wird die Heizung genau bei 26,8 abgeschaltet!

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von avralfred ()

    • Wie tschoeatsch schon geschrieben hat, das sind deine Single-Vergleiche.
      Warum überhaupt Single? Die Temperatur vom Sensor kommt als Integer.
      Wenn du intern in Zehntelgrad rechnest, dann kommst du genau dahin, wo dein Hirn denkt ;)
      Zur Ausgabe aufs LCD dann einfach durch 10 teilen und den Rest (Mod 10) dahinter schreiben.
      P.S.: du blockierst dein Programm beim Abdimmen des Lcd über 2 Sekunden lang.
    • avralfred schrieb:

      Durch 10 teilen kapier ich noch, aber was meinst du mit "den Rest (Mod 10) dahinter schreiben genau?

      BASCOM-Quellcode

      1. T = 345
      2. Temp = T / 10 'Temp hat jetzt den Wert 34
      3. Lcd Temp ; ","
      4. Temp = T Mod 10 'Temp hat jetzt den Rest der Teilung = 5
      5. Lcd Temp ; "°C"
      6. 'Ergebnis auf dem Lcd: 34,5°C


      avralfred schrieb:

      Gibt es eine Möglichkeit das Lcd abzudimmen und das Programm dabei nicht zu blockieren?
      In der Hauptschleife fragst du die neue Sekunde ab (nicht im Unterprogramm) und verzweigst entsprechend zum Messen.
      Wenn sonst nichts passiert, zählst du eine Variable abwärts, die du bei sonstigen Aktionen (z.B. Tastendruck) auffüllst.
      Die Variable wird auch gefüllt, wenn die 10-Sekunden Leuchtzeit noch > 0 ist.
      (Eine If-Abfrage verhindert das Unterschreiten der Null)
      Die Variable wird direkt ins PWM-Register geschrieben (alles in der Hauptschleife)
      Wenn du deine Hauptschleife mit z.B. Waitms 8 beendest, und deine Variable anfangs den Wert 255 hat (volle Helligkeit), dann ist es nach 2 Sekunden dunkel