Ankündigung

Einklappen
Keine Ankündigung bisher.

PI-Regler (einfach)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [WireGate-Plugin] PI-Regler (einfach)

    Im folgenden ein Beispiel-Plugin für einen einfachen PI-Regler im WireGate:
    Edit: V1.1 mit Sollwert vom Bus (optional)
    1.11: Fix aktivieren vom Bus


    Code:
    # Demo-Plugin PI-Regler (einfach)
    # V1.11 2010-12-14
    
    ### Definitionen 
    ### Hier werden die Werte/Gruppenadressen definiert
    my $aktiv_ga = "14/5/50"; 
    my $sollwert = 24.0;             # statischer Sollwert, nur falls nicht von sollwert_ga lesbar!
    my $sollwert_ga = "3/2/57";       # Gruppenadresse für Temperatur-Sollwert DPT9 - leer für statischen
    my $istwert_ga = "3/2/56";       # Gruppenadresse für Temperatur-Istwert DPT9
    my $ventil_ga_8bit = "14/5/63";  # Gruppenadresse für Stellantrieb 8bit/1Byte
    my $taktzeit = 15;               # Taktzeit in Minuten für schaltenden Stellantrieb-Regler
    my $proportional = 50;             # Proportionalbereich (P)
    my $nachstellzeit = 240;         # Nachstellzeit in Minuten; Standard 50/240 für FBH
    ### Ende Definitionen
    
    
    # Eigenen Aufruf-Zyklus auf 60 Sekunden setzen
    # der Aufrufzyklus ist unabhängig von der Taktzeit und muss kürzer sein!
    $plugin_info{$plugname.'_cycle'} = 60;
    
    my $aktiviert = knx_read($aktiv_ga) || 1; # aktiv falls Adresse nicht lesbar
    if (!int($aktiviert)) {
       if (knx_read($ventil_ga_8bit) ne 0) { # nur wenn nicht bereits 0 
          knx_write($ventil_ga_8bit,0,5); # Ventilstellung als DPT5 auf den Bus schreiben
       } 
       $plugin_info{$plugname.'_esum1'} = 0;
       $plugin_info{$plugname.'_stellung1'} = 0;  # Reset
       return;
    }
    
    if ($sollwert_ga) {
      # Plugin an Gruppenadresse "anmelden"
      $plugin_subscribe{$sollwert_ga}{$plugname} = 1;
      
      if ($msg{'apci'} eq "A_GroupValue_Write" and $msg{'dst'} eq $sollwert_ga) {
         #sollwert vom bus
         if (!defined $msg{'value'}) { 
            # falls GA/DPT nicht importiert
            $msg{'value'} = decode_dpt9($msg{'data'}); 
         } 
         $plugin_info{$plugname.'_sollwert'} = $msg{'value'};
    
         #Wenn sollwert alt ungleich neu: reset
         if ($msg{'value'} != $plugin_info{$plugname.'_sollwert'}) {
    	     $plugin_info{$plugname.'_esum1'} = 0;
    	     $plugin_info{$plugname.'_stellung1'} = 0;
    	}
      }
    } else {
      $plugin_info{$plugname.'_sollwert'} = $sollwert;
    }
      
    if (time() - $plugin_info{$plugname.'_tlast'} > $taktzeit*60) {   # Aktualisierung nur nach taktzeit
      $plugin_info{$plugname.'_tlast'} = time(); 
      my $istwert = knx_read($istwert_ga,300,9); # gecached lesen, max. 300s alt, DPT9
      my $stellungalt1 = $plugin_info{$plugname.'_stellung1'};
      
      # Reglerstellung berechnen
      my $kp = (1000/$proportional);
      my $e = ($plugin_info{$plugname.'_sollwert'} - $istwert);
      if ($stellungalt1 <= 100 and $stellungalt1 >=0) { 
          $plugin_info{$plugname.'_esum1'} = $plugin_info{$plugname.'_esum1'} + $e;
      } 
      my $v4 = ($plugin_info{$plugname.'_esum1'} * $kp * $taktzeit / $nachstellzeit);
      $plugin_info{$plugname.'_stellung1'} = ($e * $kp) + $v4;
      
      if ($plugin_info{$plugname.'_stellung1'} >100) {
          $plugin_info{$plugname.'_stellung1'}=100;
          $plugin_info{$plugname.'_esum1'} = ($stellungalt1 - $e * $kp) * $nachstellzeit / $kp / $taktzeit;
      } 
      if ($plugin_info{$plugname.'_stellung1'} <0 or $plugin_info{$plugname.'_esum1'} <0) {
          $plugin_info{$plugname.'_esum1'} = 0;
          $plugin_info{$plugname.'_stellung1'} = 0 if $plugin_info{$plugname.'_stellung1'} <0;
      }
      $plugin_info{$plugname.'_stellung1'} = round($plugin_info{$plugname.'_stellung1'});
      if ($ventil_ga_8bit) {
          knx_write($ventil_ga_8bit,$plugin_info{$plugname.'_stellung1'},5);  # Ventilstellung als DPT5 auf den Bus schreiben
      }
    #  Logeintrag auskommentiert
    #return "Soll $plugin_info{$plugname.'_sollwert'} Ist $istwert P $proportional I $plugin_info{$plugname.'_esum1'} Stell $plugin_info{$plugname.'_stellung1'}"; 
    }
    
    return 0; # Kein Logeintrag
    EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
    -> Bitte KEINE PNs!

    #2
    habe die Version 1.1 in Betrieb und heute bemerkt, dass der Sollwert nicht gelesen wird:

    2010-08-02 23:24:43.967,PI-Regler (einfach) - Heizung Büro,Soll Ist 23.24 P 50 I 0 Stell 0,0s,

    Der Sollwert wird vom HS (iKO) bereit gestellt. Muss nebst dem plugin noch was anderes konfiguriert werden, damit der Wert gelesen werden kann?

    im HS-Monitor ist der Sollwert ersichtlich.

    Danke
    Gruss
    Marcel
    seit: 11'08 KNX / 04'09 HS3 / 12'09 WG mit 21 Temp & 4 Feuchtesensoren / 10'10 Enocean mit 15 Fenstergriffe Hoppe / 02'11 MBus2Serial Gas-Wasserzähler
    HS3: 99% / VISU: PV 99%, iPad 99%
    60 Akt. Linie1 / 14 Akt. Linie2

    Kommentar


      #3
      Also Sollwert ist auf einer KNX-GA 0-14/x/y ? andere iKOs können ja so direkt nicht via KNX gelesen werden.. Und lesen-Flag gesetzt ?

      Ich könnte jetzt noch fragen, warum Du dann den PI-Regler nicht gleich im HS machst, der ist nicht schlechter, tue ich aber nicht

      Makki
      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
      -> Bitte KEINE PNs!

      Kommentar


        #4
        Hallo makki,

        deine Glaskugel ist einfach fantastisch

        Ich hatte eine 114/er Adresse verwendet. Da habe ich wohl eine wichtige Info verpasst.
        Wieso werden denn diese Adressen trotzdem im HS Monitor angezeigt?

        Den PI-Regler wollte ich im Wiregate laufen lassen, damit ich die Regelung der Heizung unabhängig vom HS betreiben kann (Temperaturmessung und PI-Regler).

        Gruss
        Marcel
        seit: 11'08 KNX / 04'09 HS3 / 12'09 WG mit 21 Temp & 4 Feuchtesensoren / 10'10 Enocean mit 15 Fenstergriffe Hoppe / 02'11 MBus2Serial Gas-Wasserzähler
        HS3: 99% / VISU: PV 99%, iPad 99%
        60 Akt. Linie1 / 14 Akt. Linie2

        Kommentar


          #5
          Das ist eben der Unterschied KNX Adressen 1-14 / Interne HS KO 100 aufwärts. Die IKO sind zum Debugen natürlich im HS Monitor sichtbar. Nur eben halt HS intern.

          Kommentar


            #6
            Noch eine kurze Ergänzungs-Empfehlung:
            Bei mir kommt es vor, dass die Ist-Temperatur nicht gelesen wird. In diesem Fall wird der Stellwert auf 100% gesetzt, was bei der nächsten Berechnung dann wieder in den nächsten Stellwer einfließt. So muss sich der zutreffende Stellwert erst wieder einpendeln...

            Daher will ich heute abend den code so ergänzen, dass das plugin bei (!$istwert) aussteigt.


            ....oder hab ich da einen Gedankenfehler?

            Kommentar


              #7
              @A-L: spricht natürlich nicht dagegen, allerding sollte auch die Ursache betrachtet werden, warum der Wert nicht gelesen werden kann, weil sowas ja in einer perfekten Welt nicht passiert..

              Und ausser die Ist-Temp kann 0.00 erreichen, das ist dann genauso "false" wie kein Wert..
              Besser:
              Code:
              (!($istwert = knx_read($istwert_ga,300,9)+0))
              Klingt zwar komisch, ist aber so

              Makki
              EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
              -> Bitte KEINE PNs!

              Kommentar


                #8
                Code:
                my $aktiviert = knx_read($aktiv_ga) || 1; # aktiv falls Adresse nicht lesbar
                Wie interpretiert Perl an der Stelle denn eine vom Bus kommende "0"? Soweit ich den Code verstehe müsste dann $aktiviert = 1 werden ... man könnte das Plugin also nicht deaktivieren.

                Grüße,
                Julian

                Kommentar


                  #9
                  An dieser Stelle funktioniert das, weil knx_read den String "00" zurückliefert.

                  Allerdings ist der Fehler eine Zeile weiter:
                  Code:
                  if (!$aktiviert) {
                  habe ich oben in
                  Code:
                  if (!int($aktiviert)) {
                  geändert (int($WERT) sorgt ebenso wie ($WERT+0) für eine interpretation als Zahl)

                  Makki
                  EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                  -> Bitte KEINE PNs!

                  Kommentar


                    #10
                    Mal eine ganz blöde Frage... Wenn ich mehrere Heizkreise damit steuere muss ich das Plugin doch auch entsprechend oft installieren, oder?

                    Eine Möglichkeit, den SourceCode einmalig zu halten und dann nur aufzurufen mit verschiedenen Parametern gibt es nicht, oder?

                    Gruß
                    Reinhard
                    Unser Hausbaublog

                    Kommentar


                      #11
                      Ja und Jein.
                      Am einfachsten und Zukunftssichersten ist es, einfach mehrere Plugins anzulegen. Oder das Plugin auf mehrere GA's umstricken. Unterschiedliche Namen, fertig..
                      Aktuell gäbe es auch einfache Möglichkeiten, Code wiederzuverwenden aber nachdem ich weiss das das zukünftig nicht funktionieren *könnte* sage ich lieber: "Nein"

                      Makki
                      EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                      -> Bitte KEINE PNs!

                      Kommentar


                        #12
                        @makki: So was wie Funktionen oder Makros wäre toll!

                        Aber was anderes:

                        Zitat von A-L Beitrag anzeigen
                        Noch eine kurze Ergänzungs-Empfehlung:
                        Bei mir kommt es vor, dass die Ist-Temperatur nicht gelesen wird. In diesem Fall wird der Stellwert auf 100% gesetzt, was bei der nächsten Berechnung dann wieder in den nächsten Stellwer einfließt. So muss sich der zutreffende Stellwert erst wieder einpendeln...
                        Konntest du heraus finden, warum der Ist Wert manchmal nicht gelesen wird. Ich habe nämlich das gleiche Problem.

                        Auf dem GruppenMonitor der ETS kann ich sehen, dass die Leseanforderung für den Ist Wert kommt und in der Regel direkt von der Antwort gefolgt wird. Manchmal dauerts aber ein paar Milisekunden länger, dann kommt die Veränderung des Stellwertes auf besagte 100 und die Antwort des Ist Wertes kommt erst danach.

                        Jemand eine Idee?

                        Gruß
                        Reinhard
                        Unser Hausbaublog

                        Kommentar


                          #13
                          Istwert lesen:
                          Am mit Abstand besten, sichersten und einfachsten ist folgendes: Den Istwert zyklisch auf den KNX senden lassen und mit einem Wert grösser diesem Zyklus (hier 300sek) aus dem eibd-cache holen
                          Code:
                          .. knx_read($istwert_ga,[B]300[/B],9) ..
                          -> Kein Lesetelegramm notwendig, ausser der Wert ist wegen restart nicht im Cache. an dieser stelle vorsichthalber nochmal: das lesen per KNX-Telegramm vom lokalen WG selbst - leider etwas ungeschickt - so nicht möglich! (aber aus dem eibd-Cache)

                          Rein interessehalber: von wo kommt der Istwert denn? Das könnte man ja abfangen, das der PI-Regler wild gefahren wird..
                          Sowas wie (ungetestet, nach dem my $istwert = ..)
                          Code:
                          if ($istwert eq "") { return "Fehler beim lesen des Istwerts"; }
                          Makki
                          EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                          -> Bitte KEINE PNs!

                          Kommentar


                            #14
                            Ich denke ich habe es jetzt.

                            Ich lasse nun alle Temperaturen, für die eine Gruppenadresse im WG gesetzt wurde zyklisch auf den Bus schreiben (über die globale Einstellung). Dann sehe ich auch kein Lese Telegramm mehr für die IstWert Abfrage.
                            Vorher hatte ich ein zyklisches Schreiben jeweils einzeln bei den Sensoren eingetragen, das hat irgendwie nicht funktioniert. (Also wert wurde geschrieben, aber nicht aus dem cache gelesen...)
                            Hab das WG auch mal neu gestartet, das hat geholfen denke ich, manchmal klappt der Neustart vom Dienst nicht so recht, wenn ich was an den Sensoren verändere.

                            Wie auch immer, jetzt scheint es jedenfalls gut zu funktionieren, fehlt nur noch, dass es kalt wird, damit ich auch merken kann obs läuft.

                            Aber eine Frage noch, der Cache, zu wem gehört der? Zum eibd?
                            Unser Hausbaublog

                            Kommentar


                              #15
                              Ja, zum eibd. Kommt natürlich drauf an wie man ihn anspricht, da jeder Eintrag ein "Alter" hat aber grundsätzlich machts ja Sinn weils Telegrammverkehr spart..

                              Makki
                              EIB/KNX & WireGate & HS3, Russound,mpd,vdr,DM8000, DALI, DMX
                              -> Bitte KEINE PNs!

                              Kommentar

                              Lädt...
                              X