Makroablauf Verständnisfrage

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

Moderator: Co-Administratoren

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

Makroablauf Verständnisfrage

Beitrag von mfreye » 24.01.2011, 21:33

Hallo zusammen!

Einen Schalter / Lampe

Code: Alles auswählen

**! ============================================================
**! OBJEKT EM_SC_AU_1_4211
**! ============================================================
**! OBJEKT-TYP              : Licht
**! BEZEICHNUNG             : Aussenbeleuchtung Terasse hinten
**! STARTWERT               :
**! ------------------------------------------------------------
**! AUSFÜHRUNGSINTERVALL    : nein
**! AUSFÜHRUNG BEI EINGABE  : nein
**! AUSFÜHRUNG BEI ÄNDERUNG : nein
**!
**! ============================================================
**! VARIABLENDEFINITIONEN
**! ============================================================
**! NAME                TYP                 STARTWERT
**! ------------------------------------------------------------
**! Zustand             Zeichen
**! Standardzeit        Zeichen
**! TimeSpeicher        Uhr
**! Restzeit            Zeichen


**Restzeit
Restzeit := TimeSpeicher  - STOPPZEIT(EM_SC_AU_1_4211.ct)

**Standardzeit festlegen
Standardzeit := "01:00:00"

**jetzt prüfen
wenn nicht EM_SC_AU_1_4211.Zustand = "0" dann

	wenn EM_SC_AU_1_4211.Zustand = 1 oder EM_SC_AU_1_4211.Zustand = "um" dann

		wenn Restzeit > Standardzeit dann

			verlassen

		endewenn

	sonst

		wenn Restzeit > EM_SC_AU_1_4211.Zustand dann

			verlassen

		endewenn

	endewenn

endewenn

**Jetzt Aktor setzen
wenn EM_SC_AU_1_4211.Zustand = "um" dann

	wenn EM_SC_AU_1_4211 = 0 dann

		EM_SC_AU_1_4211.Zustand := Standardzeit

		EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
		warte("00:00:01")
		EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
		gehezu a

	sonst

		EM_SC_AU_1_4211 ausschalten
		warte("00:00:01")
		EM_SC_AU_1_4211 ausschalten
		warte("00:00:01")
		EM_SC_AU_1_4211 ausschalten
		warte("00:00:03")
		EM_SC_AU_1_4211 ausschalten
		gehezu b

	endewenn

sonst

	wenn EM_SC_AU_1_4211.Zustand = "0" dann

		EM_SC_AU_1_4211 ausschalten
		warte("00:00:01")
		EM_SC_AU_1_4211 ausschalten
		warte("00:00:01")
		EM_SC_AU_1_4211 ausschalten
		warte("00:00:03")
		EM_SC_AU_1_4211 ausschalten
		gehezu c

	sonst

		wenn EM_SC_AU_1_4211.Zustand = "1" dann

			EM_SC_AU_1_4211.Zustand := Standardzeit

			EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
			warte("00:00:01")
			EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
			gehezu d

		sonst

			EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
			warte("00:00:01")
			EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
			gehezu e

		endewenn

	endewenn

endewenn

**WERT = "um" / ein
a:
TimeSpeicher := EM_SC_AU_1_4211.Zustand
gehezu ende

**WERT = "um" / aus
b:
TimeSpeicher := "00:00:00"
gehezu ende

**WERT = "0" / aus
c:
TimeSpeicher := "00:00:00"
gehezu ende

**WERT = "1" / ein
d:
TimeSpeicher := EM_SC_AU_1_4211.Zustand
gehezu ende

**WERT ="Zustand" / ein
e:
TimeSpeicher := EM_SC_AU_1_4211.Zustand
gehezu ende


**Programmende
ende:
und eine Schalteroption

Code: Alles auswählen

**! ============================================================
**! OBJEKT SE_SC_AU_1_4211
**! ============================================================
**! OBJEKT-TYP              : Schalter
**! BEZEICHNUNG             : Aussenbeleuchtung Terasse hinten
**! STARTWERT               :
**! ------------------------------------------------------------
**! AUSFÜHRUNGSINTERVALL    : nein
**! AUSFÜHRUNG BEI EINGABE  : ja
**! AUSFÜHRUNG BEI EMPFANG  : ja
**!
**! ============================================================
**! VARIABLENDEFINITIONEN
**! ============================================================
**! NAME                TYP                 STARTWERT
**! ------------------------------------------------------------


**Jetzt Empfänger initialisieren
EM_SC_AU_1_4211.Zustand := "um"
starte(EM_SC_AU_1_4211)
Und einen Bewegungsmelder

Code: Alles auswählen

**! ============================================================
**! OBJEKT SE_BE_AU_S311_T1
**! ============================================================
**! OBJEKT-TYP              : EAGeraet
**! BEZEICHNUNG             : Bewegungsmelder S311 T1 Garage 2
**! STARTWERT               :
**! ------------------------------------------------------------
**! AUSFÜHRUNGSINTERVALL    : nein
**! AUSFÜHRUNG BEI EINGABE  : ja
**! AUSFÜHRUNG BEI EMPFANG  : ja
**!
**! ============================================================
**! VARIABLENDEFINITIONEN
**! ============================================================
**! NAME                TYP                 STARTWERT
**! ------------------------------------------------------------


wenn uhrzeit =# "00:00:**" oder EM_SC_SA_SU_DA eingeschaltet dann

	SE_BE_AU_S311_T1 ausschalten
	SE_BE_AU_S311_T2 ausschalten
	verlassen

endewenn

wenn Uhrzeit zwischen "06:00:00" und "23:00:00" dann

	**Jetzt Empfänger initialisieren
	EM_SC_AU_5_4221.Zustand := "00:11:00"
	starte(EM_SC_AU_5_4221)

endewenn

**Jetzt Empfänger initialisieren
EM_SC_AU_4_4214.Zustand := "00:11:00"
starte(EM_SC_AU_4_4214)

**Jetzt Empfänger initialisieren
EM_SC_AU_6_4222.Zustand := "00:11:00"
starte(EM_SC_AU_6_4222)

SE_BE_AU_S311_T1 ausschalten
SE_BE_AU_S311_T2 ausschalten
Und einen Schalter um alle Lampen auszuschalten

Code: Alles auswählen

**! ============================================================
**! OBJEKT SE_SC_AU_ALL_AUS
**! ============================================================
**! OBJEKT-TYP              : Schalter
**! BEZEICHNUNG             : Alle Aussenlampen ausschalten
**! STARTWERT               :
**! ------------------------------------------------------------
**! AUSFÜHRUNGSINTERVALL    : nein
**! AUSFÜHRUNG BEI EINGABE  : ja
**! AUSFÜHRUNG BEI EMPFANG  : ja
**!
**! ============================================================
**! VARIABLENDEFINITIONEN
**! ============================================================
**! NAME                TYP                 STARTWERT
**! ------------------------------------------------------------


**Jetzt Empfänger initialisieren
EM_SC_AU_1_4211.Zustand := 0
EM_SC_AU_1_4211.TimeSpeicher := "00:00:00"
EM_SC_AU_1_4211.Restzeit := "00:00:00"
starte(EM_SC_AU_1_4211)

**Jetzt Empfänger initialisieren
EM_SC_AU_2_4212.Zustand := 0
EM_SC_AU_2_4212.TimeSpeicher := "00:00:00"
EM_SC_AU_2_4212.Restzeit := "00:00:00"
starte(EM_SC_AU_2_4212)

**Jetzt Empfänger initialisieren
EM_SC_AU_3_4213.Zustand := 0
EM_SC_AU_3_4213.TimeSpeicher := "00:00:00"
EM_SC_AU_3_4213.Restzeit := "00:00:00"
starte(EM_SC_AU_3_4213)

**Jetzt Empfänger initialisieren
EM_SC_AU_4_4214.Zustand := 0
EM_SC_AU_4_4214.TimeSpeicher := "00:00:00"
EM_SC_AU_4_4214.Restzeit := "00:00:00"
starte(EM_SC_AU_4_4214)

**Jetzt Empfänger initialisieren
EM_SC_AU_5_4221.Zustand := 0
EM_SC_AU_5_4221.TimeSpeicher := "00:00:00"
EM_SC_AU_5_4221.Restzeit := "00:00:00"
starte(EM_SC_AU_5_4221)

**Jetzt Empfänger initialisieren
EM_SC_AU_6_4222.Zustand := 0
EM_SC_AU_6_4222.TimeSpeicher := "00:00:00"
EM_SC_AU_6_4222.Restzeit := "00:00:00"
starte(EM_SC_AU_6_4222)
So nun zu mein Problem bzw. zu meiner Frage.

Wenn ich den Schalter "alle aus" schaltet, werden alle Lampen sofort ausgeschaltet. Wird jetzt aber über einen Bewegungsmelder die Lampe wieder eingeschaltet, so muss ich immer kurz warten (ca. 2Sek.) bis ich darüber die Lampen wieder einschalten kann.
Bei dem Schalter habe ich ja warte drin, kann es damit zu tun haben. Aber eigentlich ist es ja so, das wenn ein Makro neu aufgerufen wird, das aktuelle Makro sofort beendet wird, oder?

Danke für die Hilfe!

MfG
Maik

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

Re: Makroablauf Verständnisfrage

Beitrag von buempi » 25.01.2011, 11:35

Hallo Maik

Ich sehe da nirgends, dass der EM_SC_AU_1_4211 durch einen Bewegungsmelder eingeschaltet würde. Wenn es gleich abläuft wie die Beispiele im SE_BE_AU_S311_TI müsste eigentlich ein Auslösen des BM sofort nach Betätigung des Schalters ALL_AUS auch zum sofortigen Einschalten des Lichts führen, weil die 3 WARTE() abgebrochen werden. - Hast du das falsche Set gepostet?

Trotzdem zum Makro im EM_SC_AU_1_4211 eine Bemerkung: Dadurch, dass "Restzeit" vom Typ Zeichen ist, mit welchem man nicht rechnen kann, steht nach der Anweisung

Code: Alles auswählen

Restzeit := TimeSpeicher - STOPPZEIT(EM_SC_AU_1_4211.ct)
immer der Wert von TimeSpeicher in der Variablen Restzeit. Die Vergleiche mit Restzeit am Anfang des Makros kommen damit gar nie zum Tragen. Würdest du den Typ aber in UHR ändern, käme erstrecht alles falsch, weil bei der obigen Subtraktion ein sehr hoher Wert herauskäme! - 00:00:00 - 00:00:01 ergibt nämlich 23:59:59...

Liesse sich das Ganze nicht VIEL einfacher lösen? Wenn ich es richtig verstehe, geht es doch darum, den Bewegungsmelder übersteuern und das Licht dauerhaft (oder für eine bestimmte Zeitdauer) EIN bzw. AUS zu schalten? Das könnte man doch mit einem einzigen Block im BM erledigen:

Code: Alles auswählen

wenn Handschaltung = 1 dann
   verlassen
endewenn
Oder habe ich was übersehen?

Viele Grüsse
Bümpi

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

Re: Makroablauf Verständnisfrage

Beitrag von mfreye » 25.01.2011, 20:14

Hallo Bümpi.
Liesse sich das Ganze nicht VIEL einfacher lösen? Wenn ich es richtig verstehe, geht es doch darum, den Bewegungsmelder übersteuern und das Licht dauerhaft (oder für eine bestimmte Zeitdauer) EIN bzw. AUS zu schalten? Das könnte man doch mit einem einzigen Block im BM erledigen:
Also das ganze hat folgenden Hintergrund. Ich übergebe immer eine Zeit nach dem der Empfänger ausgeschaltet wird. Wenn diese Zeit aber größer ist, als die neue Zeit, dann soll die alte Zeit erhalten bleiben.

Beispiel, eine Lampe wird mit 60 Minuten eingeschaltet. Jetzt löst der Bewegungsmelder aus und über gibt die Zeit 10 Minuten, aber es ist noch eine Restzeit von 40 Minuten über, dann wird die neue Zeit nicht über geben.
Ich sehe da nirgends, dass der EM_SC_AU_1_4211 durch einen Bewegungsmelder eingeschaltet würde. Wenn es gleich abläuft wie die Beispiele im SE_BE_AU_S311_TI müsste eigentlich ein Auslösen des BM sofort nach Betätigung des Schalters ALL_AUS auch zum sofortigen Einschalten des Lichts führen, weil die 3 WARTE() abgebrochen werden. - Hast du das falsche Set gepostet?
Es gibt EM_SC_AU_1..., EM_SC_AU_2..., EM_SC_AU_3..., EM_SC_AU_4..., EM_SC_AU_5... und EM_SC_AU_6. EM_SC_AU_1_4211 war ein Beispiel, ein schlechtes.

Gruß
Maik

PS Danke für die schnelle Hilfe :)

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

Re: Makroablauf Verständnisfrage

Beitrag von buempi » 26.01.2011, 08:13

mfreye hat geschrieben:Beispiel, eine Lampe wird mit 60 Minuten eingeschaltet. Jetzt löst der Bewegungsmelder aus und über gibt die Zeit 10 Minuten, aber es ist noch eine Restzeit von 40 Minuten über, dann wird die neue Zeit nicht über geben.
Das kann dann aber so, wie du es gelöst hast, nicht funktionieren. Wie schon gesagt: Restzeit muss vom Typ Uhr sein, damit man damit rechnen kann. Und - weil CT auch beim Ausschalten aktualisiert wird - musst du mindestens noch auf EINGESCHALTET abfragen.

Aber warum das Pferd beim Schwanz aufzäumen? - Schau dir mal diesen Vorschlag an:

Du benötigst im Licht-Objekt 2 Variablen vom Typ Zeit "Endzeit" und "Hilfsvariable" sowie eine Zahlenvariable "Handschaltung"

Im Bewegungsmelder oder einem Schalter, der z.B. für 60 Minuten einschaltet (senden auch bei Zuweisung ohne Änderung aktiviert):

Code: Alles auswählen

wenn Aussenlicht.Handschaltung = 1 dann
   verlassen
endewenn

Aussenlicht.Hilfsvariable := Zeit + "00:11:00"

wenn Aussenlicht.Hilfsvariable > Aussenlicht.Endzeit dann
   Aussenlicht einschalten für "00:11:00"
   Aussenlicht.Endzeit := Aussenlicht.Hilfsvariable
endewenn
In den Dauerschaltern:

Code: Alles auswählen

** für EIN
wenn DauerEIN eingeschaltet dann
   Aussenlicht.Handschaltung := 1
   Aussenlicht einschalten
   DauerAus ausschalten
sonst
   Aussenlicht.Handschaltung := 0
   ** vielleicht auch für eine gewisse Zeit weiter eingeschaltet lassen?
   Aussenlicht ausschalten
   Aussenlicht.Endzeit := Zeit
endewenn

** für AUS
wenn DauerAUS eingeschaltet dann
   Aussenlicht.Handschaltung := 1
   Aussenlicht ausschalten
   Aussenlicht.Endzeit := Zeit
   DauerEIN ausschalten
sonst
   Aussenlicht.Handschaltung := 0
endewenn
In ALLE_AUS:

Code: Alles auswählen

Aussenlicht ausschalten
Aussenlicht.Endzeit := Zeit
** vielleicht:
DauerEIN ausschalten
DauerAUS ausschalten
Aussenlicht.Handschaltung := 0
Viele Grüsse
Bümpi

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

Re: Makroablauf Verständnisfrage

Beitrag von mfreye » 26.01.2011, 18:50

Hey Bümpi,

ja das würde gehen. Aber ich möchte gerne halt von überall her, die Lampen mit einer Zeit einschalten können. Wenn Bewegungsmelder vorne da nur 5Minuten, wenn hinten dann 15Minuten, usw...
weil CT auch beim Ausschalten aktualisiert wird -
Deshalb habe ich ja die 0 (Null) eingeführt, gleich was passiert immer ausschalten wenn ich das will. Dadurch sollte das mit dem CT gleich sein?!

MfG
Maik

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

Re: Makroablauf Verständnisfrage

Beitrag von buempi » 27.01.2011, 09:03

Hallo Maik
mfreye hat geschrieben:Wenn Bewegungsmelder vorne da nur 5Minuten, wenn hinten dann 15Minuten, usw...
Genau das geht doch mit meinem Vorschlag auch! Du setzst einfach bei jedem Bewegungsmelder eine andere Laufzeit in meinen Makro-Vorschlag ein.
mfreye hat geschrieben:Deshalb habe ich ja die 0 (Null) eingeführt, gleich was passiert immer ausschalten wenn ich das will. Dadurch sollte das mit dem CT gleich sein?!
Ausschalten schon. - Aber einschalten? Nehmen wir an, dass Licht wurde von einem BM für 15 Minuten eingeschaltet. Nachem diese 15 Minuten abgelaufen sind, ist das Licht ausgegangen. In TimeSpeicher stehen diese 15 Minuten, in CT die aktuelle (Ausschalt)-Zeit. Gleich darauf schaltet ein anderer BM mit 11 Minuten Laufzeit. Die Formel

Code: Alles auswählen

Restzeit := TimeSpeicher - STOPPZEIT(EM_SC_AU_1_4211.ct)
ergibt nun irgendwas von 14 Minuten x Sekunden, also mehr als 11 Minuten, also ->> verlassen! ->> Das Licht bleibt aus. - Deshalb habe ich geschrieben, dass du auch noch auf EINGESCHALTET abfragen musst. Das Ganze bleibt dann aber so unübersichtlich (und nur mühsam nachzuvollziehen) wie es jetzt ist.

Und das kommt aus meiner Sicht daher, dass du das Pferd 2x beim Schwanz aufzäumst:

1. Die Endzeit wird rückwärts ermittelt, statt sogleich beim Einschalten vorgemerkt zu werden.

2. Die Schaltungen werden im einen Makro ausgelöst (Bewegungsmelder usw.) und führen im andern (Aussenbeleuchtung) dann zu unterschiedlichen Reaktionen, wobei jedes Mal anhand ominöser Codes ("Zustand" ist mal Zeitdauer mal Code) zuerst festgestellt werden muss, was NICHT zu tun ist.

Du kannst auch versuchen, im jetzigen Makro jedes Mal, wenn du das Licht einschaltest bzw. verlängerst eine Zeitvariable für die Endzeit zu setzen. Dann entfällt wenigstens die umständliche Rückrechnung.

Viele Grüsse
Bümpi

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

Re: Makroablauf Verständnisfrage

Beitrag von mfreye » 28.01.2011, 20:16

Hey Bümpi.

Also möchte Dir Erklären warum ich das so haben möchte. Das Problem ist, dass Du wahrscheinlich wieder einmal recht hast und deine Vorgehensweise die besser ist. Aber ich versuche es nochmal und lasse mich sonst eines besseren Belehren.

Hoffe Du hast Verständnis dafür :roll:

Ich möchte wenn Möglich den ganzen Code in den Empfängern haben. Da alle Empfänger bei mir den gleichen Code haben, außer Dimmer.

Bei meiner Überlegung war es so, dass ich nur zwei Zeile, an der Stelle brauche, wo ich etwas mit den Empfängern machen möchte.

Also z.B.:
EM_SC_AU_1_4211.Zustand := "um"
starte(EM_SC_AU_1_4211)

Fertig, gleich ob von den Bewegungsmelder, von einem Schalter, von meinen Wecker, von meinem Garagentor, komme mit Fahrrad nach Hause, von meine......

Wichtig ist es mir nur, dass wenn eine längere Zeit im Empfänger ist, diese nicht zu verkürzen.

mmmh ist das jetzt ne dumme Idee gewesen?!

Zur der CT Zeit, hatte mehrmals aus Probiert und es ging. Da Du aber schreibst dass es nicht gehen kann, wird es wohl so sein... :oops:

Werde, wenn ich am WE Zeit habe, mal einen neuen Code zusammen basteln und evt. schaust Du dann nochmal drüber :roll:

Gruß
Maik

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

Re: Makroablauf Verständnisfrage

Beitrag von buempi » 29.01.2011, 10:04

Hallo Maik
mfreye hat geschrieben:Hoffe Du hast Verständnis dafür
...ganz bestimmt!

Jeder hat eine andere Philosophie oder Logik in solchen Dingen. Für mich ist es logisch, dass ein Taster z.B. übermittelt "Hallo Licht: Einschalten!" und nicht "Hallo Licht: Ich wurde gedrückt; schau doch mal, was da zu tun ist!". Schlussendlich könnte man ja so weit gehen, dass man allen Aktoren zuruft "Hallo Welt: Ich wurde gedrückt; schaut mal, ob ihr mit dieser Info was anfangen könnt!" 8)

Wichtig ist am Ende, dass es funktioniert! Und da kann man ganz bestimmt auch mit deinem Konzept zum Ziel kommen. Da würde ich dann aber konsequenterweise so weit gehen, dass nicht ein verschlüsselter "Zustand" mit bruchstückhaften Schaltanweisungen, sondern tatsächlich nur der Name des auslösenden Sensors übermittelt wird:

Code: Alles auswählen

Aussenlicht.AufgerufenVon := "BM_vorne"
starte(Aussenlicht)
Und dann im Aktor eine Art "do case" mit lauter WENN's:

Code: Alles auswählen

wenn AufgerufenVon = "BM_vorne" dann
...
endewenn

wenn AufgerufenVon = "BM_hinten" dann
...
endewenn

wenn AufgerufenVon = "Taster1" oder AufgerufenVon = "Taster2" dann
...
endewenn

AufgerufenVon := ""
So wird das auch bei einer Wartung in einem oder zwei Jahren noch nachvollziehbar. - Aber vielleicht ist das auch schon wieder zu sehr aus meiner Philosophie abgeleitet...

Und nichts hindert dich daran, auch bei Abhandlung der ganzen Schaltungen im Aktor anstelle der Rückrechnung von SOLL-Laufzeit minus zurückgelegter IST-Laufzeit eine Zeitvariable "Endzeit" zu verwenden.
mfreye hat geschrieben:Zur der CT Zeit, hatte mehrmals aus Probiert und es ging. Da Du aber schreibst dass es nicht gehen kann, wird es wohl so sein...
Das kommt wohl daher, dass bisher die Variable "Restzeit" nicht vom Typ Uhr war. Weil so einfach der Wert von "TimeSpeicher" drin stand, ergab sich wenigstens ein vernünftiger (aber nie der richtige) Wert für die Restlaufzeit.

Weiter hat es wohl einen Zusammenhang damit, dass das eingestellte Set nicht zusammenpasst. Beim eingestellten Set ist es jedenfalls so: Schaltet ein BM für z.B. 15 Minuten ein und 20 Minuten später ein anderer für 11 Minuten, geht das Licht gar nicht an.
mfreye hat geschrieben:Werde, wenn ich am WE Zeit habe, mal einen neuen Code zusammen basteln und evt. schaust Du dann nochmal drüber
Mach ich selbstverständlich gerne :P

Viele Grüsse
Bümpi

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

Re: Makroablauf Verständnisfrage

Beitrag von mfreye » 02.02.2011, 19:29

Hallo Bümpi,

so jetzt mal meine Idee ;(

Lampe:

Code: Alles auswählen

**! ============================================================
**! OBJEKT EM_SC_AU_1_4211
**! ============================================================
**! OBJEKT-TYP              : Licht
**! BEZEICHNUNG             : Aussenbeleuchtung Terasse hinten
**! STARTWERT               :
**! ------------------------------------------------------------
**! AUSFÜHRUNGSINTERVALL    : nein
**! AUSFÜHRUNG BEI EINGABE  : nein
**! AUSFÜHRUNG BEI ÄNDERUNG : nein
**!
**! ============================================================
**! VARIABLENDEFINITIONEN
**! ============================================================
**! NAME                TYP                 STARTWERT
**! ------------------------------------------------------------
**! Zustand             Zeichen
**! Standardzeit        Zeichen
**! Timerzeit           Uhr
**! AuszeitNeu          Uhr


**Standardzeit festlegen
Standardzeit := "01:00:00"

**wenn ausgeschaltet werden soll, dann gehezu "weiter"
wenn EM_SC_AU_1_4211.Zustand = "0" dann

	gehezu weiter

endewenn


**wenn die Lampe ausgeschaltet ist, dann gehezu "weiter"
wenn EM_SC_AU_1_4211 ausgeschaltet dann

	gehezu weiter

endewenn


**wenn die Lampe eingeschaltet ist
wenn EM_SC_AU_1_4211 eingeschaltet dann

	**neue Ausschaltzeit berrechnen
	AuszeitNeu := Uhrzeit + Zustand

	**prüfen ob die neue Zeit länger ist als die alte Zeit
	wenn AuszeitNeu <= STOPPZEIT(EM_SC_AU_1_4211.ct) dann

		verlassen

	endewenn

endewenn


**ab hier mit dem Standard Code weiter
weiter:


**Aktor setzen
wenn EM_SC_AU_1_4211.Zustand = "um" dann

   wenn EM_SC_AU_1_4211 = 0 dann

      EM_SC_AU_1_4211.Zustand := Standardzeit

      EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
      warte("00:00:01")
      EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
      gehezu a

   sonst

      EM_SC_AU_1_4211 ausschalten
      warte("00:00:01")
      EM_SC_AU_1_4211 ausschalten
      warte("00:00:01")
      EM_SC_AU_1_4211 ausschalten
      warte("00:00:03")
      EM_SC_AU_1_4211 ausschalten
      gehezu b

   endewenn

sonst

   wenn EM_SC_AU_1_4211.Zustand = "0" dann

      EM_SC_AU_1_4211 ausschalten
      warte("00:00:01")
      EM_SC_AU_1_4211 ausschalten
      warte("00:00:01")
      EM_SC_AU_1_4211 ausschalten
      warte("00:00:03")
      EM_SC_AU_1_4211 ausschalten
      gehezu c

   sonst

      wenn EM_SC_AU_1_4211.Zustand = "1" dann

         EM_SC_AU_1_4211.Zustand := Standardzeit

         EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
         warte("00:00:01")
         EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
         gehezu d

      sonst

         EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
         warte("00:00:01")
         EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
         gehezu e

      endewenn

   endewenn

endewenn

**WERT = "um" / ein
a:
Timerzeit := EM_SC_AU_1_4211.Zustand
gehezu ende

**WERT = "um" / aus
b:
Timerzeit := "00:00:00"
gehezu ende

**WERT = "0" / aus
c:
Timerzeit := "00:00:00"
gehezu ende

**WERT = "1" / ein
d:
Timerzeit := EM_SC_AU_1_4211.Zustand
gehezu ende

**WERT ="Zustand" / ein
e:
Timerzeit := EM_SC_AU_1_4211.Zustand
gehezu ende


**Programmende
ende:
Einschalten der Lampe dann wie:

Code: Alles auswählen

	**Jetzt Empfänger initialisieren
	 EM_SC_AU_1_4211.Zustand := "00:11:00"
	starte(EM_SC_AU_1_4211)
Ist das jetzt totaler Müll?

Danke für deine Hilfe!

Gruß
Maik

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

Re: Makroablauf Verständnisfrage

Beitrag von buempi » 02.02.2011, 20:37

mfreye hat geschrieben:Ist das jetzt totaler Müll?
Natürlich nicht! - Aber so ganz durchschaut hast du meinen Vorschlag noch nicht. Der folgende Abschnitt wird nicht richtig funktionieren:

Code: Alles auswählen

**wenn die Lampe eingeschaltet ist
wenn EM_SC_AU_1_4211 eingeschaltet dann

   **neue Ausschaltzeit berrechnen
   AuszeitNeu := Uhrzeit + Zustand

   **prüfen ob die neue Zeit länger ist als die alte Zeit
   wenn AuszeitNeu <= STOPPZEIT(EM_SC_AU_1_4211.ct) dann

      verlassen

   endewenn

endewenn
Hier vergleichst du ja die Ausschaltzeit (Zukunft/ZeitPUNKT) mit der bereits zurückgelegten Laufzeit (Vergangenheit/ZeitDAUER) des Aktors und nicht mit der (momentan noch) verbleibenden künftigen Laufzeit. Damit das "aufgeht" müsstest du irgendwas verwenden wie:

Code: Alles auswählen

AuszeitAlt := Zeit + Timerzeit - STOPPZEIT(EM_SC_AU_1_4211.ct)
Also wieder "von hinten her"; ob das dann aber in jedem Fall zuverlässig ist? EDIT: Geht nicht - sobald das Licht mal brennt, wird CT beim Senden eines neuen "Einschalten für" nicht aktualisiert!

Viel einfacher (und transparenter) ist, immer dort, wo du an das Licht eine Einschaltdauer sendest auch gleich die Auszeit zu berechnen; also:

Code: Alles auswählen

EM_SC_AU_1_4211 einschalten für EM_SC_AU_1_4211.Zustand
Auszeit := Zeit + EM_SC_AU_1_4211.Zustand

** Nicht zwingend nötig aber der "guten Ordnung halber" beim Ausschalten:
EM_SC_AU_1_4211 ausschalten
Auszeit := Zeit
Dann kannst du vergleichen:

Code: Alles auswählen

**wenn die Lampe eingeschaltet ist
wenn EM_SC_AU_1_4211 eingeschaltet dann

   **neue Ausschaltzeit berrechnen
   AuszeitNeu := Zeit + Zustand

   **prüfen ob die neue Zeit länger ist als die alte Zeit
   wenn AuszeitNeu <= Auszeit dann

      verlassen

   endewenn

endewenn
Damit die Vergleiche auch bei Tageswechsel funktionieren, müssen die beiden Variablen vom Typ ZEIT (nicht Uhr) sein, und die Additionen müssen natürlich auch mit ZEIT und nicht UHRZEIT erfolgen.

Die Variable Timerzeit und die entsprechenden Zuweisungen sind überflüssig geworden. Du könntest sie (entsprechend angepasst) theoretisch für die Auszeit verwenden. Aber nicht erst am Schluss; weil die Zuweisung beim ersten "Einschalten für" (vor den WARTE) erfolgen sollte.

Auch noch abfangen musst du, dass er bei Zustand "um" bei eingeschaltetem Licht auch zu "weiter" geht, da sonst das Licht nicht gelöscht wird.

Viele Grüsse
Bümpi

Antworten

Zurück zu „homeputer Studio / Standard: allgemeine Fragen“