Umschalte und Sendewert

Programmierung der FHZ-Zentralen mit contronics homeputer Standard / homeputer Studio & WEB-Server

Moderator: Co-Administratoren

mfreye
Beiträge: 237
Registriert: 22.12.2007, 08:01

Umschalte und Sendewert

Beitrag von mfreye » 18.02.2009, 18:07

Hallo zusammen!

Ich habe den folgenden CODE:

Code: Alles auswählen

wenn EM_SC_BI_1114 eingeschaltet und EM_SC_BI_1114.EIN_AUS eingeschaltet dann

    ** Variable rücksetzen
        EM_SC_BI_1114.EIN_AUS ausschalten
       warte("00:00:01")
        sendewert(EM_SC_BI_1114)

    ** Befehl senden
        EM_SC_BI_1114 ausschalten

endewenn


wenn EM_SC_BI_1114 ausgeschaltet und EM_SC_BI_1114.EIN_AUS eingeschaltet dann

    ** Variable rücksetzen
        EM_SC_BI_1114.EIN_AUS ausschalten
       warte("00:00:01")
        sendewert(EM_SC_BI_1114)

    ** Befehl senden
        EM_SC_BI_1114 einschalten

endewenn
Also es wird eine Lampe eingeschaltet bzw. ausgeschaltet. Soweit funktioniert das ganze auch. Da der Empfang jedoch sehr schlecht ist, möchte ich den Werte dreimal senden.
Jetzt könnte ich den CODE einfach erweitern:

Code: Alles auswählen

       warte("00:00:01")
        sendewert(EM_SC_BI_1114)
       warte("00:00:01")
        sendewert(EM_SC_BI_1114)
       warte("00:00:01")
        sendewert(EM_SC_BI_1114)
Dann würde der Wert dreimal gesendet.

Jetzt kommt es aber vor, dass das Makro öfters ausgeführt wird, d.h. die Lampe ist schon an, aber dennoch wird das Makro neugestartet und es würde wieder dreimal der Zustand gesendet.

Damit jetzt nicht unnötig viele Befehle gesendet werden, möchte ich gerne, dass nur dann gesendet wird, wenn sich der Zustand ändert.

Also dachte ich an die Anweisung "umschalten", leider finde ich dazu aber nichts in der Hilfe?!

Code: Alles auswählen

wenn EM_SC_BI_1114 umschaltet dann
        sendewert(EM_SC_BI_1114)
       warte("00:00:01")
        sendewert(EM_SC_BI_1114)
       warte("00:00:01")
        sendewert(EM_SC_BI_1114)
endewenn
Würde das so gehen?

MfG
MFreye

buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: Umschalte und Sendewert

Beitrag von buempi » 18.02.2009, 18:39

Hallo MFreye

Nehmen wir mal nur den ersten Block deines Makros: Du sendest den SENDEWERT() an an Aktor ja noch im Zustand, wo er EINgeschaltet ist und schaltest ihn erst nachher aus! Also: Reiner Leerlauf? Dazu kommt, dass meines Wissens Homeputer je Makro-Durchgang nur 1x sendet bzw. nur bei jedem WARTE(). Wenn das zutrifft, hat dein SENDEWERT überhaupt keine physische Auswirkung.

Das, was du erreichen möchtest, kannst du mit UMSCHALTEN nicht besser zuwege bringen; du musst wie folgt programmieren:

Code: Alles auswählen

wenn EM_SC_BI_1114 eingeschaltet und EM_SC_BI_1114.EIN_AUS eingeschaltet dann

    ** Variable rücksetzen
       EM_SC_BI_1114.EIN_AUS ausschalten

    ** Befehl senden
       EM_SC_BI_1114 ausschalten
       warte("00:00:01")
       sendewert(EM_SC_BI_1114)
       warte("00:00:01")
       sendewert(EM_SC_BI_1114)

endewenn
Aufgrund der WENN-Bedingung ist es gar nicht möglich, dass die SENDEWERT() bei jedem Durchgang des Makros ausgeführt werden; es sei denn (theoretisch), das Makro läuft permanent ab, dann werden die SENDEWERT() gar nie ausgeführt, weil beim nächsten Durchgang der Aktor ja schon AUS ist.

Um zu verhindern, dass in einem vergleichbaren Fall (wenn also nicht schon durch das WENN ein mehrfaches Ausführen verhindert wird) nicht laufend gesendet wird, kann man das wie folgt abfangen:

Code: Alles auswählen

wenn Uhrzeit > "23:00:00" dann
   EM_SC_BI_1114 ausschalten
endewenn

wenn geschaltet(EM_SC_BI_1114)
   warte("00:00:01")
   sendewert(EM_SC_BI_1114)
   warte("00:00:01")
   sendewert(EM_SC_BI_1114)

   ** Hat zur Folge, dass die nächste Abfrage nach
   ** "GESCHALTET()" NEIN zurückgibt
   erledigt(EM_SC_BI_1114)

endewenn
Vermutlich hast du UMSCHALTET() mit GESCHALTET() verwechselt. Zu Letzerem findest du sicher was in der Hilfe.

Viele Grüsse
Bümpi

mfreye
Beiträge: 237
Registriert: 22.12.2007, 08:01

Re: Umschalte und Sendewert

Beitrag von mfreye » 18.02.2009, 19:17

Hallo Bümpi,

erstmal wieder Danke für deine schnelle Hilfe!

Code: Alles auswählen

wenn geschaltet(EM_SC_BI_1114)
   warte("00:00:01")
   sendewert(EM_SC_BI_1114)
   warte("00:00:01")
   sendewert(EM_SC_BI_1114)

   ** Hat zur Folge, dass die nächste Abfrage nach
   ** "GESCHALTET()" NEIN zurückgibt
   erledigt(EM_SC_BI_1114)

endewenn
Verstehe ich das richtig, dass wenn der Schalter geschaltet wurde (also der Zustand sich geändert hat) der Befehl dreimal gesendet wird. Hat sich der Zustand nicht geändert wird das Makro übergangen?
Das würde dann auch bei Dimmern zutreffen, die ihren Wert von 4 auf z.B. 12 ändern, oder?

Schönen Abend Dir noch und den anderen.

MfG
MFreye

buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: Umschalte und Sendewert

Beitrag von buempi » 18.02.2009, 19:43

mfreye hat geschrieben:Verstehe ich das richtig, dass wenn der Schalter geschaltet wurde (also der Zustand sich geändert hat) der Befehl dreimal gesendet wird. Hat sich der Zustand nicht geändert wird das Makro übergangen?
Das würde dann auch bei Dimmern zutreffen, die ihren Wert von 4 auf z.B. 12 ändern, oder?
Ja, genau so ist es. Selbst z.B. bei einem HMS-Temperatur-Sensor würde es so ablaufen, sobald sich die empfangene Temperatur verändert. (Wobei sich SENDEWERT() dann natürlich auf irgend einen Aktor beziehen müsste, und nicht auf den HMS!)

Viele Grüsse
Bümpi

mfreye
Beiträge: 237
Registriert: 22.12.2007, 08:01

Re: Umschalte und Sendewert

Beitrag von mfreye » 18.02.2009, 20:46

Danke!

MfG
MFreye

mfreye
Beiträge: 237
Registriert: 22.12.2007, 08:01

Re: Umschalte und Sendewert

Beitrag von mfreye » 19.02.2009, 17:16

Hey Bümpi,

nochmal dazu eine Frage.

Wie verhält es sich denn, wenn man den folgenden Code hat:

Code: Alles auswählen

einschalten für "00:22:00"
Wird jetzt jedesmal neu gesendet, da die Zeit ja neu beginnen muss oder wir der Zeitwert nicht neu gesendet, da die Zeiten identisch sind?

Gruß
Maik

buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: Umschalte und Sendewert

Beitrag von buempi » 19.02.2009, 18:01

Hallo Maik

Gut, dass du diese Frage stellst! - In diesem Fall funktioniert SENDEWERT() nämlich nicht richtig: Es sendet nicht ein «einschalten für "00:22:00"», sondern ein ganz gewöhnliches EIN!

Man kann also in diesem Fall nicht mit SENDEWERT() allein arbeiten. Es bleibt nichts anderes übrig, als die Zeitdauer selber zu programmieren. Also: EIN + 2 SENDEWERT(), dann WARTE("00:22:00") und dann AUS + 2 SENDEWERT().

Das Ganze darf aber nicht in einem Makro stehen, welches periodisch abläuft, weil dadurch ja das WARTE() bei jedem Durchgang abgebrochen wird. In diesem Fall muss man es in ein separates Makro ausquartieren. - Wie man das macht, hängt von der jeweiligen Aufgabenstellung ab.

Wenn man jedoch will, dass die Zeit immer neu beginnt, ist es sogar richtig, wenn das WARTE() abgebrochen wird. Je nachdem kann man dann auch mit "Senden auch bei Zuweisung ohne Änderung" und 3 x «einschalten für "00:22:00"» arbeiten. Muss aber natürlich aufpassen dass man so nicht (ev. bei anderen Anweisungen im gleichen Makro) einen Dauersender bastelt.

Viele Grüsse
Bümpi

mfreye
Beiträge: 237
Registriert: 22.12.2007, 08:01

Re: Umschalte und Sendewert

Beitrag von mfreye » 19.02.2009, 19:22

Hallo Bümpi,
In diesem Fall funktioniert SENDEWERT() nämlich nicht richtig: Es sendet nicht ein «einschalten für "00:22:00"», sondern ein ganz gewöhnliches EIN!
Bis Du Dir da sicher? Wahrscheinlich wirst Du aber wie immer Recht haben.

Ich habe folgende Code (Auszug)

Code: Alles auswählen

** -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
** EIN_BE

wenn EM_SC_AU_5_4221.EIN_BE eingeschaltet dann

   ** Variable setzen
      EM_SC_AU_5_4221.EIN_BE ausschalten

   ** Empfänger setzen
      EM_SC_AU_5_4221 einschalten für "00:10:00"

   ** Loggen
      SchreibeText := "'" + Datum + " '" + Uhrzeit + " 'Modul:" + " 'EM_SC_AU_5_4221" + "	 'Zustand:" + " '" + EM_SC_AU_5_4221 + "	 'Befehl:" + " 'EIN_BE" + "       'Information:" + " 'keine"
      Schreibedatei("C:\Programme\contronics\homeputer Studio\loggen\Aussenbeleuchtung\EM_SC_AU_5_4221.txt",SchreibeText)

endewenn
Die Aussenlampe wird über den Bewegungsmelder eingeschaltet für 10 Minuten.

Am Ende wird mit Sendewert der Behl noch zweimal wiederholt.

Code: Alles auswählen

** -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
** Zustände wiederholt senden (sendewert)

   ** Zustand senden
      warte("00:00:03")
      sendewert(EM_SC_AU_5_4221)
      warte("00:00:07")
      sendewert(EM_SC_AU_5_4221)
Wenn es jetzt so ist, wie Du sagst, dann müsste die Lampe ja nicht wieder ausgehen. Richtig?

Aber die Lampe geht nach 10 Minuten aus.

Habe ich Dich jetzt falsch verstanden?

Gruß
Maik

mfreye
Beiträge: 237
Registriert: 22.12.2007, 08:01

Re: Umschalte und Sendewert

Beitrag von mfreye » 19.02.2009, 19:33

Anbei der ganze CODE, evt. mache ich ja etwas falsch. Ausgeführt wird der durch Aufrufen, also nicht je x Minute oder der gleichen.

Code: Alles auswählen

** -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
** Aussenbeleuchtung "Garagentor 1" - Stand: 12.01.2008


** -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
** EIN

wenn EM_SC_AU_5_4221.EIN eingeschaltet dann

   ** Variable setzen
      EM_SC_AU_5_4221.EIN ausschalten

   ** Empfänger setzen
      EM_SC_AU_5_4221 einschalten für "02:00:00"

   ** Loggen
      SchreibeText := "'" + Datum + " '" + Uhrzeit + " 'Modul:" + " 'EM_SC_AU_5_4221" + "	 'Zustand:" + " '" + EM_SC_AU_5_4221 + "	 'Befehl:" + " 'EIN" + "          'Information:" + " 'keine"
      Schreibedatei("C:\Programme\contronics\homeputer Studio\loggen\Aussenbeleuchtung\EM_SC_AU_5_4221.txt",SchreibeText)

endewenn


** -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
** AUS

wenn EM_SC_AU_5_4221.AUS eingeschaltet dann

   ** Variable setzen
      EM_SC_AU_5_4221.AUS ausschalten

   ** Empfänger setzen
      EM_SC_AU_5_4221 ausschalten

   ** Loggen
      SchreibeText := "'" + Datum + " '" + Uhrzeit + " 'Modul:" + " 'EM_SC_AU_5_4221" + "	 'Zustand:" + " '" + EM_SC_AU_5_4221 + "	 'Befehl:" + " 'AUS" + "          'Information:" + " 'keine"
      Schreibedatei("C:\Programme\contronics\homeputer Studio\loggen\Aussenbeleuchtung\EM_SC_AU_5_4221.txt",SchreibeText)

endewenn


** -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
** EIN / AUS

wenn EM_SC_AU_5_4221.EIN_AUS eingeschaltet und EM_SC_AU_5_4221 eingeschaltet dann

   ** Variable setzen
      EM_SC_AU_5_4221.EIN_AUS ausschalten

   ** Empfänger setzen
      EM_SC_AU_5_4221 ausschalten

   ** Loggen
      SchreibeText := "'" + Datum + " '" + Uhrzeit + " 'Modul:" + " 'EM_SC_AU_5_4221" + "	 'Zustand:" + " '" + EM_SC_AU_5_4221 + "	 'Befehl:" + " 'EIN/AUS" + "      'Information:" + " 'keine"
      Schreibedatei("C:\Programme\contronics\homeputer Studio\loggen\Aussenbeleuchtung\EM_SC_AU_5_4221.txt",SchreibeText)

endewenn

wenn EM_SC_AU_5_4221.EIN_AUS eingeschaltet und EM_SC_AU_5_4221 ausgeschaltet dann

   ** Variable setzen
      EM_SC_AU_5_4221.EIN_AUS ausschalten

   ** Empfänger setzen
      warte("00:00:01")
      EM_SC_AU_5_4221 einschalten für "02:00:00"

   ** Loggen
      SchreibeText := "'" + Datum + " '" + Uhrzeit + " 'Modul:" + " 'EM_SC_AU_5_4221" + "	 'Zustand:" + " '" + EM_SC_AU_5_4221 + "	 'Befehl:" + " 'EIN/AUS" + "      'Information:" + " 'keine"
      Schreibedatei("C:\Programme\contronics\homeputer Studio\loggen\Aussenbeleuchtung\EM_SC_AU_5_4221.txt",SchreibeText)

endewenn


** -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
** EIN_BE

wenn EM_SC_AU_5_4221.EIN_BE eingeschaltet dann

   ** Variable setzen
      EM_SC_AU_5_4221.EIN_BE ausschalten

   ** Empfänger setzen
      EM_SC_AU_5_4221 einschalten für "00:01:00"

   ** Loggen
      SchreibeText := "'" + Datum + " '" + Uhrzeit + " 'Modul:" + " 'EM_SC_AU_5_4221" + "	 'Zustand:" + " '" + EM_SC_AU_5_4221 + "	 'Befehl:" + " 'EIN_BE" + "       'Information:" + " 'keine"
      Schreibedatei("C:\Programme\contronics\homeputer Studio\loggen\Aussenbeleuchtung\EM_SC_AU_5_4221.txt",SchreibeText)

endewenn


** -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
** EIN_GA

wenn EM_SC_AU_5_4221.EIN_GA eingeschaltet dann

   ** Variable setzen
      EM_SC_AU_5_4221.EIN_GA ausschalten

   ** Empfänger setzen
      EM_SC_AU_5_4221 einschalten für "00:20:00"

   ** Loggen
      SchreibeText := "'" + Datum + " '" + Uhrzeit + " 'Modul:" + " 'EM_SC_AU_5_4221" + "	 'Zustand:" + " '" + EM_SC_AU_5_4221 + "	 'Befehl:" + " 'EIN_GA" + "       'Information:" + " 'keine"
      Schreibedatei("C:\Programme\contronics\homeputer Studio\loggen\Aussenbeleuchtung\EM_SC_AU_5_4221.txt",SchreibeText)

endewenn


** -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
** TIME_RANGE

wenn Automodus_Aussenbeleuchtung.TIME_RANGE_1 eingeschaltet dann

   ** Empfänger setzen
      EM_SC_AU_5_4221 einschalten für "00:30:00"

   ** Loggen
      SchreibeText := "'" + Datum + " '" + Uhrzeit + " 'Modul:" + " 'EM_SC_AU_5_4221" + "	 'Zustand:" + " '" + EM_SC_AU_5_4221 + "	 'Befehl:" + " 'TIME_RANGE_1" + " 'Information:" + " 'keine"
      Schreibedatei("C:\Programme\contronics\homeputer Studio\loggen\Aussenbeleuchtung\EM_SC_AU_5_4221.txt",SchreibeText)

endewenn

wenn Automodus_Aussenbeleuchtung.TIME_RANGE_2 eingeschaltet dann

   ** Empfänger setzen
      EM_SC_AU_5_4221 einschalten für "00:30:00"

   ** Loggen
      SchreibeText := "'" + Datum + " '" + Uhrzeit + " 'Modul:" + " 'EM_SC_AU_5_4221" + "	 'Zustand:" + " '" + EM_SC_AU_5_4221 + "	 'Befehl:" + " 'TIME_RANGE_2" + " 'Information:" + " 'keine"
      Schreibedatei("C:\Programme\contronics\homeputer Studio\loggen\Aussenbeleuchtung\EM_SC_AU_5_4221.txt",SchreibeText)

endewenn


** -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
** Zustände wiederholt senden (sendewert)

   ** Zustand senden
      warte("00:00:03")
      sendewert(EM_SC_AU_5_4221)
      warte("00:00:07")
      sendewert(EM_SC_AU_5_4221)



buempi
Ehrenmitglied
Beiträge: 12194
Registriert: 29.07.2006, 15:58
Wohnort: Schweiz
Danksagung erhalten: 5 Mal

Re: Umschalte und Sendewert

Beitrag von buempi » 19.02.2009, 20:17

Hallo Maik

Nein, du hast mich nicht falsch verstanden. Wenn du also z.B. EM_SC_AU_5_4221.EIN_GA einschaltest und nachher nichts mehr passiert, was den Aktor EM_SC_AU_5_4221 beeinflusst, müsste das Licht - nach dem, was ich oben geschrieben habe - dauerhaft EIN bleiben - wegen den SENDEWERT() am Schluss des Makros.

Aber ich habe ganz bestimmt nicht immer Recht!!! Habe das nämlich schon vor längerer Zeit (ca. 1½ Jahre) mal getestet. Und da war es - wenn meine Tests nicht irgendwie irreführend waren - jedenfalls so. Vielleicht wurde das inzwischen geändert? Die Versions-History von Homeputer ist ja in solchen Dingen nicht sehr aussagekräftig. Und alles, was man mal ausprobiert hat, bei jedem neuen Release überprüfen...?

Damals war es z.B. auch so, das - wenn "Senden auch bei Zuweisung ohne Änderung" NICHT aktiviert war, und man sendete «einschalten für "00:22:00"» nicht das passierte, was man erwarten würde. In diesem Fall wurde nämlich GAR NICHTS gesendet, falls der Aktor schon EIN war. Egal, ob man vorher ein DAUER-EIN, ein EIN mit gleicher Laufzeit, oder eines mit anderer Laufzeit gesendet hatte.

Also musste man "Senden auch bei Zuweisung ohne Änderung" aktivieren, die identische Anweisung 3 x senden [natürlich mit WARTE("00:00:01") dazwischen], wenn man wollte, dass die Laufzeit neu beginnen sollte. - Und selbstverständlich - wie oben gesagt - höllisch aufpassen, nicht (gegebenenfalls in einem andern Teil des Makros) zu viele Sendebefehle zu generieren.

Leider lässt sich das Ganze nicht als "Trockenübung" (ohne Schnittstelle) testen. Und bei dieser kalten Witterung (heute früh -10°) ist meine Schnittstelle nicht für "Spielereien" verfügbar.

Es reizt mich aber schon, das Ganze möglichst bald mal mit alten und neuen Releases von Homeputer nochmals zu testen...

Viele Grüsse
Bümpi

Antworten

Zurück zu „homeputer Studio / Standard: Programmierbeispiele“