Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 26

Thema: HS - zyklischer Differenzbaustein mit alter Wertausgabe

  1. #1
    Registriert seit
    Dec 2002
    Ort
    Dresden
    Beiträge
    179

    Frage HS - zyklischer Differenzbaustein mit alter Wertausgabe

    Hallo liebe HS'ler,

    nachdem ich erfolglos versucht habe einen Baustein zu schreiben bzw. anzupassen, poste ich hier mal den Code und beschreibe, was der Baustein machen soll.

    Der Baustein speichert sich einen Wert, nach einer vorgebbaren Zeit X wird ein neuer Wert an den Baustein gesendet. Damit soll die Differenz zwischen alten und neuen Wert gebildet und ausgegeben werden. Zu Kontrollzwecken soll auch der alte Wert mit angezeigt werden.

    Habe den Baustein geladen und einiges simuliert, leider klappt es jedoch nicht immer fehlerfrei:
    - Habe immer 20 addiert. Klappt in positive Richtung 1A, geht ich rückwärt 60, 40, 20 ist alles i.O. dann von 20 auf 0 kommt als Differenz -40.
    - Starte ich aber bei 0 geht auf 20 und wieder zurück ist auch alles in Ordnung.
    - Negativ kann er gar nicht.
    - Ausgabe des Speichers (alter Wert) klappt auch nicht!

    Vielen Dank für die hoffentlichen hilfreichen Hinweise

    PepsiMox

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

    5001|2|2|1|6|1
    # Eingänge EN[x]
    5002|1|0|0 # Wert (Aktuell)
    5002|2|1|0 # Zyklus Neuberechnung (sec.)
    # Ausgänge
    5004|1|0|0|1|0 # Differenz (nach jeder Berechnung gesendet!)
    5004|2|0|0|1|0 # Wert (Alt) (nach jeder Berechnung gesendet!)
    # Speichervariablen SN[x]
    5003|1|0|0 # lastcounter
    5003|2|0|0 # store counter 1
    5003|3|0|0 # store counter 2
    5003|4|0|0 # store time 1
    5003|5|0|0 # store time 2
    5003|6|0|0 # timediff
    # timer anwerfen
    5012|0|"(EI==1 and EN[2]) or OC[1]"|""|"EN[2]"|0|1|0|0
    # wenn keine änderung, dann abbruch
    5012|1|"EC[1] and EN[2]==0 and EN[1]==SN[1]"|""|""|0|0|0|0
    5012|0|"EC[1] and EN[1]!=SN[1]"|"EN[1]"|""|0|0|1|0
    # store 1 aus store 2 übernehmen
    5012|0|"SC[1] and SN[1]"|"SN[3]"|""|0|0|2|0
    5012|0|"SC[1] and SN[1]"|"SN[5]"|""|0|0|4|0
    # store 2 füllen
    5012|0|"SC[1] and SN[1]"|"EN[1]"|""|0|0|3|0
    5012|0|"SC[1] and SN[1]"|"__import__('time').time()"|""|0|0|5|0
    5012|0|"SN[2]"|"float(__import__('time').time())-float(SN[4])"|""|0|0|6|0
    # alten Wert auf Ausgang schreiben
    5012|0|"SN[2] and SN[6]"|"(EN[1]-SN[2])"|""|1|0|0|0
    # Differenz bilden und auf Ausgang schreiben
    5012|0|"SN[2] and SN[6]"|"(EN[1]-SN[2])"|""|1|0|0|0

  2. #2
    Registriert seit
    Apr 2002
    Ort
    Radevormwald
    Beiträge
    2.363
    Zitat Zitat von PepsiMox
    # alten Wert auf Ausgang schreiben
    5012|0|"SN[2] and SN[6]"|"(EN[1]-SN[2])"|""|1|0|0|0
    # Differenz bilden und auf Ausgang schreiben
    5012|0|"SN[2] and SN[6]"|"(EN[1]-SN[2])"|""|1|0|0|0
    Jetzt mal so auf die Schnelle:
    Ich sehe zwischen diesen beiden Zeilen keinen Unterschíed .

    Wolltest du nicht auch was auf Ausgang 2 senden?
    Gruss aus Radevormwald
    Michel
    .
    Hier bin ich jetzt zu finden: knx-user-forum.de

  3. #3
    Registriert seit
    Dec 2002
    Ort
    Dresden
    Beiträge
    179
    Zitat Zitat von Michel
    Jetzt mal so auf die Schnelle:
    Ich sehe zwischen diesen beiden Zeilen keinen Unterschíed .

    Wolltest du nicht auch was auf Ausgang 2 senden?
    Danke.

    Kannst du mich bitte wissen lassen, wie der richtige Code lauten müsste?

    PepsiMox

  4. #4
    Registriert seit
    Mar 2006
    Ort
    --
    Beiträge
    67
    Hi zum Ausgang (alter Wert):

    Code:
    # alten Wert auf Ausgang schreiben
    5012|0|"(eventuell noch Bedingung)"|"SN[1]"|""|2|0|0|0
    Bin jetzt nicht ganz sicher welchen Wert du mit ALTER Wert meinst, wenn es Store1 ist, dann gibst halt SN[2] aus.

    noch was:
    Wegen dem Sprucng von 20 auf 0:
    Du frägst mal ab mit "SC[1] and SN[1]". wenn du da am Eingang 0 anlegst, dann füllst du ne NULL in Store 2 und in der nächsten Zeile steht dann als Bedingung "SN[2]". Dort ist dann nach erneutem Durchlauf die Bedingung unwahr, und die Formelzeile wird nicht ausgeführt.
    Korrigiert mich, wenn ich mich verdacht habe.


    Gruß
    Ralf
    Geändert von Benutzer (10.05.06 um 14:33 Uhr)

  5. #5
    Registriert seit
    Dec 2002
    Ort
    Dresden
    Beiträge
    179
    Zitat Zitat von Ralf Häusler
    Hi zum Ausgang (alter Wert):

    Code:
    # alten Wert auf Ausgang schreiben
    5012|0|"(eventuell noch Bedingung)"|"SN[1]"|""|2|0|0|0
    Bin jetzt nicht ganz sicher welchen Wert du mit ALTER Wert meinst, wenn es Store1 ist, dann gibst halt SN[2] aus.

    noch was:
    Wegen dem Sprucng von 20 auf 0:
    Du frägst mal ab mit "SC[1] and SN[1]". wenn du da am Eingang 0 anlegst, dann füllst du ne NULL in Store 2 und in der nächsten Zeile steht dann als Bedingung "SN[2]". Dort ist dann nach erneutem Durchlauf die Bedingung unwahr, und die Formelzeile wird nicht ausgeführt.
    Korrigiert mich, wenn ich mich verdacht habe.


    Gruß
    Ralf
    Hallo Ralf,

    alter Wert ist der Wert der mit dem letzte Berechnung durchgeführt worden ist. Aktueller Wert - Alter Wert = Differenz.

    In den Baustein funktioniert aber noch mehr nicht, die zeitliche Steuerung liegt auch noch im Argen.

    PepsiMox

  6. #6
    Registriert seit
    Mar 2006
    Ort
    --
    Beiträge
    67
    Dann keist die Ausgabe so
    Code:
    # alten Wert auf Ausgang schreiben
    5012|0|"(eventuell noch Bedingung)"|"SN[2]"|""|2|0|0|0

    Zu der Zeit:
    Code:
    # timer anwerfen
    5012|0|"(EI==1 and EN[2]) or OC[1]"|""|"EN[2]"|0|1|0|0
    Du sagts:
    Wenn INITIALISIERUNGSPHASE und der AKTUELLE WERT DES EINGANGS = 1 (größer 1?!?)ist, ODER TIMER ABLÄUFT, dann Lade den AKTUELLEN WERT von EINGANG 2 in den Zeitspeicher.

    Ich könnt mich vorstellen, dass das EN[2] dumm tut, lass es mal zum test weg. Es reicht auch wenn du nur EI statt EI==1 schreibst.

    Ich mach es so:
    Code:
    #Neuberechnen nach X Minuten
    5012|1|"(EI or OC[1])"|""|"(EN[3]*60)"|0|1|0|0
    Und bei mir funktioniert es.

    Soweit mal
    Gruß
    Ralf

  7. #7
    Gaston ist offline Registrierter Benutzer
    Registriert seit
    Jul 2001
    Ort
    Aspelt (Luxemburg)
    Alter
    56
    Beiträge
    973
    Hallo,

    Mal was anderes, beim design von Modulen sollte man darauf achten so wenig wie möglich Speichervariabeln und Timer zu verwenden.

    In diesem Fall, soweit ich den Baustein bis jetzt verstanden habe, könnte dieser ohne eine einzige Speichervariable auskommen. Allerdings sind mir noch einige Sachen schleierhaft:

    Was genau willst Du dass der Baustein tut wenn die Zykluszeit 0 ist, also der Timer ausgeschaltet ist ? Denn zum einen testest Du dann am Anfang ob der Wert verschieden ist, ansonsten brichst Du ab, aber ganz am Schluss gibst Du nur Werte aus wenn der Timereingang (Eingang 2) nicht 0 ist

    Und warum testest Du die Zeitdifferenz ? Diese kann abhängig vom system immer gegeben sein. time() kann bei jedem Aufruf einen anderen Wert haben oder aber nur jede Sekunde. Dies ist Systemabhängig (oder Versionsabhängig) und kann nicht vorausgesezt werden.

    Gruss,
    Gaston

  8. #8
    Registriert seit
    Dec 2002
    Ort
    Dresden
    Beiträge
    179

    Mein erster Baustein .... :-((

    Hallo den Leuten,

    zur Erklärung warum der Baustein vielleicht umständlich oder kompliziert aussieht. Als vorlage hatte ich einfach den Baustein 19969_Momentenverbrauch_Strom.hsl von Thilo Kühn (www.eib4fun.de) verwendet.

    Wie man sieht, ist es noch nicht so weit her mit meinen Kenntnissen in dieser Programmiersprache.

    Was will ich eigentlich:

    Einen Baustein der zyklisch die Differenz zwischen einem altem Wert und einem neuen Wert berechnet und ausgibt.

    Eingabe: Zykluszeit, Aktueller Wert
    Ausgabe: Alter Wert, Differenz.

    Ist die Zykluszeit 0 soll nichts passieren, ändern sich die Werte am Eingang soll auch nichts passieren. Wirklich nur alle x-Sekunden soll die Berechnung erfolgen.

    Danke für die Unterstützung

    PepsiMox

    Im Winter wird mehr Zeit sein, sich mit der Programmierung eigener Logikbausteine zu beschäftigen, jetzt brauche ich das Teil aber dringend für diverse Aufgaben!

  9. #9
    blue ist offline Registrierter Benutzer
    Registriert seit
    Jul 2003
    Ort
    Ball.-Dottingen/Freiburg
    Beiträge
    596
    Zitat Zitat von PepsiMox
    Was will ich eigentlich:

    Einen Baustein der zyklisch die Differenz zwischen einem altem Wert und einem neuen Wert berechnet und ausgibt.

    Eingabe: Zykluszeit, Aktueller Wert
    Ausgabe: Alter Wert, Differenz.

    Ist die Zykluszeit 0 soll nichts passieren, ändern sich die Werte am Eingang soll auch nichts passieren. Wirklich nur alle x-Sekunden soll die Berechnung erfolgen.

    hallo,

    ich blick es zwar auch nicht so richtig, was du genau machen willst,
    aber zyklische abfragen könntest du mit dem telegrammgenerator
    machen und dahinter einen vergleicher. am ausgang dann, "setze wert
    auf wert von".

    gruss

    günther

  10. #10
    Registriert seit
    Dec 2002
    Ort
    Dresden
    Beiträge
    179
    Zitat Zitat von blue
    hallo,

    ich blick es zwar auch nicht so richtig, was du genau machen willst,
    aber zyklische abfragen könntest du mit dem telegrammgenerator
    machen und dahinter einen vergleicher. am ausgang dann, "setze wert
    auf wert von".

    gruss

    günther
    Hallo Blue,

    mein Problem ist doch, dass ich den alten Wert irgendwo zwischenspeichern muss um die Differenz bilden zu können oder gibt es da in der Logik eine Möglichkeit zum Speichern von Variablen?

    Was ich machen will:
    Z.B. die Feuchtigkeit im Bad messen.
    Ändert sich der Wert innerhalb von z.B. 10s zu stark, bedeutet dies, es nimmt entweder jemand ein Bad oder die Dusche ist an. Wenn dem so ist, dann soll automatisch die Lüftung eingeschaltet werden.
    Ich kann nicht mit absoluten Werten arbeiten, da sich ja die L-Feuchtigkeit sowieso immer wieder ändert, allerdings niemals so extrem und schnell wie im Falle der Badnutzung!

    PepsiMox

    PepsiMox

  11. #11
    Gaston ist offline Registrierter Benutzer
    Registriert seit
    Jul 2001
    Ort
    Aspelt (Luxemburg)
    Alter
    56
    Beiträge
    973
    Obwohl mir nicht einleuchtet warum eine differenz von 0 nie zustande kommen kann (aber ich kenne ja auch das einsatztgebiet des Moduls nicht ), habe ich das Modul mal vereinfacht. Allerdings auf die schnelle und ohne Test, hoofe ich hab mir keine Schnitzer erlaubt

    P.S.: Mein Post sollt ekein Vorwurfsein, wollte nur mein Verständnis des Moduls verbessern

    5000|"Meine Bausteine\Differenzbilder"|0|2|"Wert"|"Zykl.(sek.)"|2|"Differenz (t0)"|"Differenz (t-1)"
    5001|2|2|1|1|1
    # Eingänge EN[x]
    5002|1|0|0 # Wert (Aktuell)
    5002|2|1|0 # Zyklus Neuberechnung (sec.)
    # Ausgänge
    5004|1|0|0|1|0 # Differenz (nach jeder Berechnung gesendet!)
    5004|2|0|0|1|0 # Wert (Alt) (nach jeder Berechnung gesendet!)

    # Speichervariablen SN[x]
    5003|1|0|0 # lastcounter

    5012|0|"EI==1"|"EN[1]"|""|0|0|1|0 # Speichern des Initialwertes

    # timer anwerfen
    5012|0|"(EI==1 and EN[2]>0) or OC[1]"|""|"EN[2]"|0|1|0|0

    # Wenn nicht Timer, oder Wert sich nicht geändert hat dann abbruch
    5012|1|"(OC[1]==0) or (EN[1]==SN[1])"|""|""|0|0|0|0

    # alten Wert auf Ausgang schreiben
    5012|0|""|"AA[1]"|""|2|0|0|0

    # Differenz bilden und auf Ausgang schreiben
    5012|0|""|"(EN[1]-SN[1])"|""|1|0|0|0


    # Neuen Wert als referenz übernehmen
    5012|0|""|"EN[1]"|""|0|0|1|0

  12. #12
    Registriert seit
    Apr 2002
    Ort
    Radevormwald
    Beiträge
    2.363
    Zitat Zitat von PepsiMox
    Hallo Blue,

    mein Problem ist doch, dass ich den alten Wert irgendwo zwischenspeichern muss um die Differenz bilden zu können oder gibt es da in der Logik eine Möglichkeit zum Speichern von Variablen?
    Warum legst du für diesen Zweck nicht einfach ein internes KO an und verfährst wie von blue beschrieben? Am Ausgang dann den alten Wert in das KO schreiben und fertig.

    Natürlich geht´s auch mit einem neuen Logikbaustein.
    Gruss aus Radevormwald
    Michel
    .
    Hier bin ich jetzt zu finden: knx-user-forum.de

  13. #13
    blue ist offline Registrierter Benutzer
    Registriert seit
    Jul 2003
    Ort
    Ball.-Dottingen/Freiburg
    Beiträge
    596
    Zitat Zitat von PepsiMox
    Hallo Blue,

    Was ich machen will:
    Z.B. die Feuchtigkeit im Bad messen.
    Ändert sich der Wert innerhalb von z.B. 10s zu stark, bedeutet dies, es nimmt entweder jemand ein Bad oder die Dusche ist an. Wenn dem so ist, dann soll automatisch die Lüftung eingeschaltet werden.

    PepsiMox
    in diesem fall würde ich mit dem schwellwert baustein arbeiten.

    sobald der überschritten wird...lüftung an.

    beispiel. unterer schwellwert 50 % luftfeuchtigkeit, oberer schwellwert
    60 % luftfeuchtigkeit. zwischen 50 und 60 passiert nichts, darüber wird
    die lüftung eingeschaltet.

    aber ich sehe gerade, gaston war fleissig.

    gruss

    günther

  14. #14
    Gaston ist offline Registrierter Benutzer
    Registriert seit
    Jul 2001
    Ort
    Aspelt (Luxemburg)
    Alter
    56
    Beiträge
    973
    Zitat Zitat von PepsiMox
    Ich kann nicht mit absoluten Werten arbeiten, da sich ja die L-Feuchtigkeit sowieso immer wieder ändert, allerdings niemals so extrem und schnell wie im Falle der Badnutzung!
    Das ist so als würdest Du keinen Absolutwert (sprich Sollwert) bei der Heizungsregelung einstellen wollen weil sich die Temperatur ja immer mal ändert.

    Also wieso nur bei Benutzung (also schneller änderung) Lüften ? Was Du doch eigentlich willst, ist Feuchtigkeit abziehene, also wäre der Schwellwertbaustein wie von Günther beschrieben doch die beste Lösung.

    Was schaltest Du denn hinter den Differenzialausgang ? Einen Vergleicher mit Treppenhausschaltung ? Denn die Lüftung nur Anhand der Differenz betreiben geht nicht, da die Differenz bei Sätigung und/oder Lüftung ja abnehmen wird.

    Und Auch bei Treppenhausschaltung bleibt eine Unsicherheit im System das dazu führen kann dass eine hohe Luftfeuchtigkeit unsichtbar für den Differenzbaustein ist, wenn sie sich nicht schnell ändert.

    Gruss,
    Gaston

  15. #15
    Registriert seit
    Feb 2001
    Ort
    Nordbayern
    Beiträge
    3.830
    Hallo Pepsimox,

    ich habe die gleiche Aufgabenstellung wie bei dir mit konv. Logik gelöst. Offensichtlich geht es darum, die Größe der Wertänderung innerhalb einer bestimmten Zeit zu erfassen. Ich nutze das, um zu erkennen, ob gebadet wird und vergleiche zyklisch die Temp meines Warmwasserspeichers. Läßt einer die Badewanne ein. sinkt die Temp kurzfristig stark.


    m..myhome
    Integriertes Multimediasystem ohne Grenzen


Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •