![]() |
Temperatur steuerung ????????
Hallöle mal wieder,
Ich habe nen Anliegen und komme mal wieder nicht weiter. Ich habe ne USB-Steuerung mit angeschlossenem Thermometer am Analogen eingang. Die Usb-Steuerung steuert eine Relaiskarte, jedes Relais steuert ein seperaten Stromkreis/Steckdose für meine Terrarien. Das Thermometer soll ebenfalls jedes Relais steuern. Das Programm ist soweit geschrieben das es verschiedene Schaltzeiten (Schaltzeituhr) gibt für jedes Relais wenn dieses zum Beispiel das Licht an schalten soll. Das Thermometer soll parallel dazu laufen. Zum Beispiel, das Thermometer misst eine aktuelle Temp von 28grad da soll trotz aktiven Zeitschaltuhr das Licht bei überschreiten der Temp ausschalten. Anhand meiner untenstehenden prozedur funktioniert das auch nur wenn die Temperatur wieder sinkt habe ich nen unschönen nebeneffekt (an, aus, an, aus). Wie kann ich denn das realisieren einen Schwellwert einzufügen wo es wirklich erst wieder an geht wie z.b. bei 28grad soll es aus gehen aber erst bei 26grad wieder an. Hier mal der Code
Delphi-Quellcode:
ich hoffe ihr könnt mir helfen da ich zu diesem thema mix gefunden habe.
procedure TForm1.AutoTimer1Timer(Sender: TObject);
var Start1, Start2, Start3, Ende1, Ende2, Ende3, tmpTime: TDateTime; h,CardAddr,data1,data2:longint; Ini: TIniFile; Thermometer, Temperatur, AktTemp, OFF1: String; i: Single; begin Button12.Enabled:=true; Button13.Enabled:=false; Button14.Enabled:=false; Button15.Enabled:=false; AutoTimer1.Enabled:=true; //Config Programm Ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'PowerControl.ini'); try Start1 :=Ini.ReadTime('Kanal1', 'StartZeit1', StrToTime('00:00:00')); Start2 :=Ini.ReadTime('Kanal1', 'StartZeit2', StrToTime('00:00:00')); Start3 :=Ini.ReadTime('Kanal1', 'StartZeit3', StrToTime('00:00:00')); Ende1 :=Ini.ReadTime('Kanal1', 'EndZeit1', StrToTime('00:00:00')); Ende2 :=Ini.ReadTime('Kanal1', 'EndZeit2', StrToTime('00:00:00')); Ende3 :=Ini.ReadTime('Kanal1', 'EndZeit3', StrToTime('00:00:00')); Ini.WriteString('Kanal1', 'Auto', '1'); Temperatur :=Ini.ReadString('Kanal1', 'Temperatur', ''); Thermometer :=Ini.ReadString('Kanal1', 'Thermometer', ''); //Temperatur1 auslesen h:= OpenDevice(Ini.ReadInteger('Config_System', 'CardAdress', 0)); data1 := ReadAnalogChannel(1); CloseDevice; i := StrToInt('101')*data1/256-23; AktTemp := format('%2.0f',[i]); finally Ini.Free; end; //Startzeit 1 schalten // nehmen wir mal an, Start = '12:00' und Ende = '14:00' tmpTime := Time(); if (tmpTime > Start1) and (tmpTime < Ende1) or (tmpTime > Start2) and (tmpTime < Ende2) or (tmpTime > Start3) and (tmpTime < Ende3) then begin OFF1:= ''; //Thermometer1 ausschalten if (Thermometer = 'OFF') and (AktTemp >= Temperatur) then begin h:= OpenDevice(0); ClearDigitalChannel(1); CloseDevice; Image1.Picture:=nil; OFF1:= '1'; Imagelist1.GetBitmap(1,Image1.Picture.Bitmap); //0=Disable, 1=OFF, 2=ON, 3=Notschalter Label11.Font.Color:= clSilver; Label12.Font.Color:= clSilver; Label13.Font.Color:= clSilver; end; //Startzeit 1 schalten if (tmpTime > Start1) and (tmpTime < Ende1) and (OFF1 = '') then begin h:= OpenDevice(0); SetDigitalChannel(1); CloseDevice; Image1.Picture:=nil; Imagelist1.GetBitmap(2,Image1.Picture.Bitmap); //0=Disable, 1=OFF, 2=ON, 3=Notschalter Label11.Font.Color:= clGreen; end; //Startzeit 2 schalten if (tmpTime > Start2) and (tmpTime < Ende2) and (OFF1 = '') then begin h:= OpenDevice(0); SetDigitalChannel(1); CloseDevice; Image1.Picture:=nil; Imagelist1.GetBitmap(2,Image1.Picture.Bitmap); //0=Disable, 1=OFF, 2=ON, 3=Notschalter Label12.Font.Color:= clGreen; end; //Startzeit 3 schalten if (tmpTime > Start3) and (tmpTime < Ende3) and (OFF1 = '') then begin h:= OpenDevice(0); SetDigitalChannel(1); CloseDevice; Image1.Picture:=nil; Imagelist1.GetBitmap(2,Image1.Picture.Bitmap); //0=Disable, 1=OFF, 2=ON, 3=Notschalter Label13.Font.Color:= clGreen; end; end else begin //nach Ablauf abschalten h:= OpenDevice(0); ClearDigitalChannel(1); CloseDevice; Image1.Picture:=nil; Imagelist1.GetBitmap(1,Image1.Picture.Bitmap); //0=Disable, 1=OFF, 2=ON, 3=Notschalter Label11.Font.Color:= clSilver; Label12.Font.Color:= clSilver; Label13.Font.Color:= clSilver; end; end; Lg Mario |
Re: Temperatur steuerung ????????
Dazu müsstest Du wissen, ob die Temperatur fällt oder steigt, und das geht sehr einfach, indem Du dir die zuletzt gemessene Temperatur merkst.
Durch einen Vergleich zwischen aktueller und vorheriger Temperatur kannst du dann einfach herausbekommen, ob die Temperatur fällt oder sinkt. Und das widerum erleichtert die Steuerung. Allerdings würde ich nicht nur die letzte Temperatur, sondern die letzten Temperaturen merken, es könnten ja kleine Schwankungen auftreten. Über die gemerkten Temperaturen (über die Zeit) kannst du dann eine Ausgleichsgerade legen und dann weisst Du zuverlässig, ob die Temperatur steigt oder sinkt. Bei einem Anschalten der Lampe würde ich diesen Verlauf löschen bzw. eine Verzögerung einbauen, um dem System Zeit zu geben, auf die Steuerung zu reagieren. |
Re: Temperatur steuerung ????????
Evtl so:
Delphi-Quellcode:
//Startzeit 1 schalten
if (tmpTime > Start1) and (tmpTime < Ende1) and (OFF1 = '') and (aktTemp <= 26) then begin h:= OpenDevice(0); SetDigitalChannel(1); CloseDevice; Image1.Picture:=nil; Imagelist1.GetBitmap(2,Image1.Picture.Bitmap); //0=Disable, 1=OFF, 2=ON, 3=Notschalter Label11.Font.Color:= clGreen; end; |
Re: Temperatur steuerung ????????
Hallo,
Das ist ein klassischer ![]() Dabei ist ein Verlauf nicht mal so interessant, wenn die zwei Schwellen nur weit genug auseinander liegen. Während der Zeiten wo die Lampen an sein dürfen:
Delphi-Quellcode:
mfg DerDan
if Temperatur > 28 then
begin Lampe := false; end else if Temperatur < 26 then begin Lampe := true; else begin // Lampe bleibt an oder aus end; |
Re: Temperatur steuerung ????????
Ich habe eine ähnliche Steuerung geschrieben. Aber nicht für Fischsuppe, sondern für einen Hobbybierbrauer :mrgreen:
Da müssen im Maischkessel über bestimmte Zeiträume bestimmte Temperaturen gehalten werden. Das Geräte hat einen Analoge Eingang für die Temperatur und schaltet ein Rührwerk und eine Heizung. Meine Erfahrung, die Dir hoffentlich helfen: Die Temperaturen fallen nicht linear ab. Es kann sein, dass der Fühler immer zwischen zwei Temperaturen schwankt. Wenn das gerade die Schwellentemperatur ist, dann geht die Heizung ständig an und aus. Du musst also eine kleine Verzögerung einbauen. So, dass Du bei abfallender Temperatur nur dann heizt, wenn die Temperatur für einen bestimmten Zeitraum unter dem Soll bleibt. Und dann beim Heizen nicht bei Punkt 28° Grad abschalten, sondern etwas weiter heizen. Bei meiner Anwendung kam noch dazu, dass das Gerät leicht nachheizt, wenn man es ausgeschaltet hat. Wir haben also eine Funktion eingebaut, dass sich das Gerät an die Solltemperatur rantastet. Dazu kommt auch noch, dass wir nicht sofort heizen, wenn die Temperatur abfällt, sondern erst mal versuchen, ob es nicht reicht, das Rührwerk einzuschalten. Und wenn die Temperatur zu hoch ist, dann wirk immer gerührt, bis die Temperatur wieder im Sollrahmen ist. Mach von Anfang an wirklich alles parametrierbar. Alle Zeiten, Verzögerungen und Toleranzen, nichts hartcodieren. Du sparst damit hinterher eine Menge Zeit. Als wir unsere ersten Versuche mit Wasser gemacht haben, waren die Ergebnisse nicht wirklich gut. Aber durch rumspielen mit den ganzen Parametern (Temperaturen, Toleranzen, Tastschritte, etc...) ist das Ergebnis jetzt wirklich gut. Und die Maische selbst verhält sich noch wieder etwas anders, als das Wasser. Sie reagiert träger. Also mussten hier die Parameter wieder etwas geändert werden. HTH! Jens Edit: Dein Code sieht so aus, als würdest Du die selbe USB-Karte wie wir verwenden: K8055D von Vellemann? |
Re: Temperatur steuerung ????????
Ich wollt noch erwähnen,
dass man nicht alles in eine große funktion packen sollte. Refaktorierung wäre hier schon angebracht. Bei deinem Code sieht man den Wald vor lauter Bäumen nicht. mfg |
Re: Temperatur steuerung ????????
Zitat:
|
Re: Temperatur steuerung ????????
Hallo,
Ich denk das mit dem Wasser oder der Maische ist schon anderst. Er heizt ja nur die Luft. größere Totzeiten sind da nicht zu erwarten. Ansonsten gilt immer sich zunächst den zeilichen Verlauf der Regelstrecke anzuschauen ohne aktive Regelung. Ein kleiner Basis Kurs in Regelungstechnik könnt da helfen. mfg DerDan |
Re: Temperatur steuerung ????????
ja ich benutz das Interface K8055D von Vellemann.
Ich kann doch aber ni davon ausgehen das ich immer bei 28grad auschalte und bei 26 wieder an. Die 28grad sind variabel kann auch anders sein da dies je nach einstellung anders ist. Der wert der angegeben wird ist der Maximalwert wo es aus geht und der Wert -2 wenigstens wo es wieder an geht. Ich steh echt irgendwie auf dem schlauch. @DerDan: bei der Schleife schaltet das doch auch nur hin und her. Lg Mario |
Re: Temperatur steuerung ????????
Hallo
mein Quelltext war auch mehr als Schema gemeint. Natürlich muss man das alles verfeineren. durch deine neuen Anforderung, dass die Lampen nicht angehen dürfen, wenn eine gewisse Temperatur bereits vorliegt, ist aus einer reinen Steuerung eine Regelung geworden. Und Regelungstechnik ist nicht ganz einfach. Deshalb wirst du dein Program wahrscheinlich noch einige male abändern. Deshalb würde ich Dir vorschlagen den Quelltext im sinne von Lesbarem Code zu vereinfachen und wie oben schon zu lesen war die Schwellen und ähnliches variabel zu gestalten. mfg DerDan |
Re: Temperatur steuerung ????????
@Nersgatt hast du den code bei dir rumliegen (nur nen ausschnitt in der Abfrage und Übergabe) ist ja eigentlich nix anderes.
Eigentlich kann das doch ni so schwer sein. Es muß doch ne Möglichkeit geben ne Abfrage zu machen wo die Temp gemessen wird wie ich es gemacht habe. Die Ausgabe in ner schleife so verarbeitet wird das eine feste Variable gesetzt wird die nur verändert wird wenn die Abfrage negativ ist und ni nach jedem neuen aufruf durch den Timer. Ich find aber nur keinen Anfang. Lg Mario |
Re: Temperatur steuerung ????????
Der Quellcode würde Dir nicht viel helfen, denn er ist 1. für Dein Anliegen zu komplex und 2. in VB.NET geschrieben.
Ich geb Dir folgenden Rat. Schalte den PC vom Monitor aus, nehm Dir ein Blatt Papier und schreibe sämliche Zustände auf, die auftreten können und wie die Lampe in dem Zustand geschaltet sein soll. Vielleicht in Tabellenform. Und wenn Du das fertig hast, dann setzt Du es in Quellcode um. 10 Minuten nachdenken erspart viele Stunden Fehlersuche. (hatte das hier nicht mal jemand als Signatur?). |
Re: Temperatur steuerung ????????
wenn jemand aber trotzdem noch nen tip haben sollte oder wie ich es umsetzen könnte wäre ich dankbar darüber. :coder2:
Lg Mario |
Re: Temperatur steuerung ????????
Hi,
das Zauberwort heisst Hysterese. Du solltest beim ein bzw ausschalten unterschiedliche Schwellwerte benutzen. Beispiel: Die Lampe soll einschalten bei 17 Grad Der Trick bei der Sache ist dass du bei 17 Grad einschaltest aber bei 15 Grad aus. Du wirst nie einen wie vorab beschriebenen Effekt bekommen. Ausserdem toggelt ein Analogeingang immer, sodass du einen exakten Wert niemals gleichzeitig für ein und ausschalten nutzen kannst. Dazu braucht man keine Regeltechnik sondern nur gesunden Menschenverstand. Viele Grüsse! |
Re: Temperatur steuerung ????????
Zitat:
mit dem kann man auch die Hyserese viel einfacher realisieren als bisher empfohlen: man braucht dazu keinen Temperaturverlauf, sondern muss nur wissen, ob das Heizungsrelais ein ist. Wenn ja, addiert man zur Solltemperatur 2 Grad (oder eben die gewünschte Hysterese). Folglich schaltet die Heizung bei x Grad ein, aber bei erst bei x + 2 Grad wieder aus:
Delphi-Quellcode:
das ist der ganze parametrisierbare Regler.
if HeatIsOn then
if ActualTemp > RefTemp + THysteresis then HeatIsOn := false else if ActualTemp < RefTemp then HeatIsOn := true; Gruss Reinhard |
Re: Temperatur steuerung ????????
wozu muß man da unbedingt wissen, ob es an oder aus ist?
wie es schon richtig gezeigt wurde, reicht dieses doch vollkommen aus:
Delphi-Quellcode:
wobei ich es wohl eher so machen würde und die Schwellenwerte um den gewünschten Sollwert drumrum verteile:
if ActualTemp > RefTemp + Hysteresis then HeatIsOn := false
else if ActualTemp < RefTemp then HeatIsOn := true;
Delphi-Quellcode:
if ActualTemp > RefTemp + (Hysteresis div 2) then HeatIsOn := false
else if ActualTemp < RefTemp - (Hysteresis div 2) then HeatIsOn := true; |
Re: Temperatur steuerung ????????
Zitat:
Hochabschaltung : Genau am eingestellten Punkt, Rückschaltung erst bei dem Einstellwert - Hysterese Tiefabschaltung : Genau am eingestellten Punkt, Rückschaltung erst bei dem Einstellwert + Hysterese |
Re: Temperatur steuerung ????????
nja, aber zumindestens ist für die Auswertung der aktuelle Zustand von HeatIsOn unwichtig :angel2:
|
Re: Temperatur steuerung ????????
Ich habs doch schon immer gesagt.... Delphi braucht eine PID-Komponente (vorinstalliert)! :mrgreen: (am besten mit und/oder Fuzzy ^^)
|
Re: Temperatur steuerung ????????
Zitat:
auch ein PID-Regler ist in Delphi nur ein Einzeiler. Der Trick daran ist die richtigen Parameter einzustellen, das tut Delphi aber auch nicht. Für die Speicherung der Parameter und des Temperaturverlaufs bietet sich natürlich eine Klasse an. Und eine Komponente mit Temperaturanzeige und Einstellpotentiometer wäre auch nicht schlecht, aber dann fängt das Problem wieder an, dass jeder einen anderen Knopf und eine andere Anzeige will (Thermometersäule mit Reaumur, mit glänzendem Quecksilber natürlich). Gruss Reinhard PS wenn man die Erfassung von Differential und Integral dazunimmt, könnten es auch 3 bis 5 Zeilen werden. |
Re: Temperatur steuerung ????????
Zitat:
in der Praxis ist es so, dass bei eingeschalteter Heizung die Temperatur nur steigen kann und bei abgeschalteter nur fallen (ausser Überschwinger, aber da spielt das keine Rolle). Man spart sich also die Differenzierung des Temperaturverlaufs. Alle 3 Algorithmen (RK,himitsu,guiness) sind verschieden, sie stellen aber alle einen 2Punkt-Regler dar, der Unterschied dürfte bloss in der erreichten mittleren Temperatur liegen wegen der unterschiedlichen Offsets. Gruss Reinhard |
Re: Temperatur steuerung ????????
mir ist hier sogar grad ein Fehler aufgefallen :shock:
Zitat:
also so
Delphi-Quellcode:
und so kann die Heizung nur ausgeschaltet werden, denn wenn die Heizung schon aus ist, wird hier nix mehr gemacht :nerd:
if HeatIsOn then
if ActualTemp > RefTemp + THysteresis then HeatIsOn := false else if ActualTemp < RefTemp then HeatIsOn := true; wobei es bestimmt so gedacht war
Delphi-Quellcode:
if HeatIsOn then
begin if ActualTemp > RefTemp + THysteresis then HeatIsOn := false; end else if ActualTemp < RefTemp then HeatIsOn := true; aber das if HeatIsOn then ist hierbei eh "unwichtig", da die so abgekapselten Einzelvergleiche im jeweils anderen Zustand von HeatIsOn eh keine Veränderung hervorufen. |
Re: Temperatur steuerung ????????
Ich habs jetzt soweit gemacht allerdings ohne der vorherigen abfrage IsOn
Delphi-Quellcode:
so funktioniert es auch im Timer über Zeitrutinen wenn das Thermometer deaktiviert ist.
if (Thermometer = 'OFF') and (StrToInt(AktTemp) > StrToInt(Temperatur)+0.1) then
begin IsOn:= false; end; if (Thermometer = 'OFF') and (StrToInt(AktTemp)+1.9 < StrToInt(Temperatur)) then begin IsOn:= true; end; if (Thermometer = 'false') then begin IsOn:= true; end; Danke nochmal Lg Mario |
Re: Temperatur steuerung ????????
Delphi-Quellcode:
0.1 und 1.9 ? :gruebel:
(StrToInt(AktTemp) > StrToInt(Temperatur)+0.1) then
... (StrToInt(AktTemp)+1.9 < StrToInt(Temperatur)) then StrToInt erzeugt doch nur Integer, da haben die Fließkommazahlen dann nicht die Auswirkung, welche geplant ist |
Re: Temperatur steuerung ????????
Zitat:
Schönen Abend noch Klaus |
Re: Temperatur steuerung ????????
Die Klammern sind vollkommen uninteressant ... Was ich meinte ist, daß das Ergebnis der in seiner Funktion diesem entspricht:
(wenn ich jetzt richtig gerundet hab)
Delphi-Quellcode:
Da die Vergleichswerte eh nur ganzzahlig sind, interessiert im Vergleich auch nur der gerundete ganzahlige Wert.
StrToInt(AktTemp) > StrToInt(Temperatur) then
... StrToInt(AktTemp)+1 < StrToInt(Temperatur) then Die Gleitkommaarithmetik ist hier allso vollkommen sinnlos enthalten. |
Re: Temperatur steuerung ????????
habs selbst gemerkt und geändert
|
Re: Temperatur steuerung ????????
Ach übrigens, deine ?-Taste klemmt :mrgreen:
|
Re: Temperatur steuerung ????????
Zitat:
Nicht nur Anfänger machen Anfängerfehler. Gruss Reinhard |
Re: Temperatur steuerung ????????
Statt "Temperatur steuerung ????????" bitte: Terrarium-Temperatursteuerung
|
Re: Temperatur steuerung ????????
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz