Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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
Ich nutze:
C-Control II Unit, eigenes Board, OSOPT V3.1
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: