Re: Solar-Pumpen Regelung ( Grundfos Alpha 2) Kategorie: Sonstige Hardware (von nitraM - 19.10.2007 14:57) | ||
Als Antwort auf Re: Solar-Pumpen Regelung ( Grundfos Alpha 2) von Markus P. - 19.10.2007 13:26 | ||
| ||
Hallo Markus, im Bereich "Programme C2" findest du ein Zip zum Thema Heizungssteuerung. Darin befindet sich auch eine gute Vorlage für die Mischeransterung: Da habe auch ich meine ersten Denkanstö�e her.... /**********************************************************************/ /* Modul zur Ansteuerung eines Mischermotors */ /* Autor : Malte Alpers (malte.alpers@gmx.de) */ /* Version : 0.9 */ /* Datum : 20.06.2005 */ /* Geändert : */ /**********************************************************************/ /* Es wird ein Proportionalbereich definiert. Innerhalb des Bereichs */ /* wird das Laufzeit-/Pausenverhältnis abhängig von der Abweichung von*/ /* Tist von Tsoll berechnet. Die Ein-/Ausschaltdauer ist dabei ab- */ /* hängig von der Periodendauer. Es wird ein neutraler Bereich defi- */ /* niert, in dem nicht geregelt wird (tolerierte Abweichung von Tsoll)*/ /* Au�erhalb des Bereichs wird für die Dauer der Periode eingeschaltet*/ /* und dann die Mindestpause gewartet. */ /* Durch diese Regelung soll ein �bersteuern und Regelschwingungen */ /* verhindert werden. */ /* Beim Initialisieren des threads wird der Mischer sicher zugefahren,*/ /* um einen definierten Startpunkt zu erhalten. Die Endlagenerkennung */ /* erfolgt dann über eine Laufzeitberechnung. */ /**********************************************************************/ /* WICHTIG: */ /* - Nur für Mischer mit (fast) linearer Temperaturkennlinie geeignet.*/ /* - Relais für Mischer AUF/ZU kontrollieren und ggf. ändern. */ /* - Sensor für 'Tist' muss zugewiesen werden (am Anfang der 'loop'- */ /* Schleife). */ /* - 'Tsoll' in 1/10°C (z.B. 64°C = 640)! */ /* - Wird Tsoll in einem anderen thread/function definiert, muss hier */ /* die Wertzuweisung für Tsoll entfernt weden. */ /* - für Mischer mit langer Laufzeit (>> ca. 2 min.) oder für schnel- */ /* leres reagieren bei gro�en Abweichungen von Tsoll sollte die max.*/ /* Laufzeit pro Durchlauf erhöht werden (siehe Hinweis im Quelltext)*/ /**********************************************************************/ thread mischer1 { byte Rzu, Rauf, tzu, i; int P, dt, tein, taus, tamin, temin, offset, z, Tist; long p, lz, LZ; int Tsoll; // Wenn Tsoll als Festwert Rzu = 2; // Relais Mischer ZU, '0'-basiert! (Relais 3 = 2) Rauf = 1; // Relais Mischer AUF, '0'-basiert! (Relais 2 = 1) P = 120; // Proportionalbereich in 1/10 K (z.B. 12 K = 120) p = 20000; // Periodendauer in Millisekunden (z.B. 20s = 20000, max. 32767 !) tamin = 10000; // Mindestpause (zul. Schaltspiele des Motors beachten) temin = 2000; // Mindesteinschaltdauer LZ = 120000; // Laufzeit des Mischermotors in Millisekunden offset = -10000; // Für sicheres Zufahren; in Millisekunden (muss negativ sein!) z = 10; // zul. Abweichung von TSoll in 1/10 K (z.B. +/- 1 K = 10) Tsoll = 640; // Nur wenn Tsoll als Festwert, in 1/10°C (z.B. 64°C = 640) // Mischer sicher zufahren sleep 3000; rbports.set(Rzu,-1); tzu=LZ/60000+1; for i=0...<tzu sleep -5536; // -5536 entspricht 1 Minute sleep 20000; rbports.set(Rzu,0); lz=offset; sleep 10000; loop { Tist = temp.T[1]; // Sensor für 'Tist' zuweisen // Bedingung Mischer AUF if Tsoll-z > Tist and rbports.get(Rzu)==0 and lz < LZ { dt=(Tsoll - Tist); if dt >= P { tein = p; /* max. Laufzeit pro Durchlauf, evtl. grö�eren Wert setzen (Wertebereich für sleep beachten!) */ taus = 0; } else { tein = (dt * p) / P; taus = p - tein; } if taus < tamin taus=tamin; if tein < temin tein=temin; rbports.set(Rauf,-1); sleep tein; rbports.set(Rauf,0); lz=lz+tein; // Laufzeitberechnung if lz > LZ lz=LZ; // Laufzeit rücksetzen sleep taus; } else // Bedingung Mischer ZU if Tsoll+z < Tist and rbports.get(Rauf)==0 and lz > offset { dt=(Tist - Tsoll); if dt >= P { tein = p; /* max. Laufzeit pro Durchlauf, evtl. grö�eren Wert setzen (Wertebereich für sleep beachten!) */ taus = 0; } else { tein = (dt * p) / P; taus = p - tein; } if taus < tamin taus=tamin; if tein < temin tein=temin; rbports.set(Rzu,-1); sleep tein; rbports.set(Rzu,0); lz=lz-tein; // Laufzeitberechnung if lz < offset lz=offset; // Laufzeit rücksetzen sleep taus; } } } | ||
Antwort schreiben Antworten: |