Makro wird nicht abgewartet?

Programmierung der HomeMatic CCU mittels contronics homeputer CL

Moderator: Co-Administratoren

Antworten
schnoger
Beiträge: 5
Registriert: 21.07.2017, 21:57

Makro wird nicht abgewartet?

Beitrag von schnoger » 22.07.2017, 13:07

Hi,

hab meine CCU2 vor einer Woche frisch erhalten und mal mit ein paar Schaltaktoren und Tastern in Betrieb gesetzt. Die Standard-Funktionen laufen mal ganz gut, auch die ersten kleinen Makros laufen anstandsfrei (simple Abfolgen - ein Taster bedient unterschiedliche Aktoren usw.).
Jetzt will ich etwas tiefer in die Makroprogrammierung abtauchen und hab mal zum Testen die Engine lokal am PC laufen ohne Hardware-Verbindung mit VisuWin zum testen.

Dann hab ich mir von meinem 6-fach-Taster die Tasten 1 und 6 genommen, und die sollen ein Testmakro aufrufen, wo dann später einiges an Logik reinkommen soll (Wert über WebURL abfragen und entsprechend unterschiedliche Lichter anschalten), und einen TextFeld "Infotext" für ein paar Statusmeldungen. Zum Testen hab ich mal einen ganz simplen Aufbau erstellt:

Taste1:

Code: Alles auswählen

Infotext setzen auf "Taste 1"
Makro aufrufen Testmakro
Infotext setzen auf "Taste 1 fertig"
und im neu erstellen Makro "Testmakro" läuft das:

Code: Alles auswählen

Infotext setzen auf "los"
warte 3 Sekunden
Infotext setzen auf "hier passiert was"
warte 2 Sekunden
Infotext setzen auf "und noch was"
warte 2 Sekunden
Infotext setzen auf "bin fertig"
Laut der Doku sollte ja "makro aufrufen" (oder auch mit aufrufen()) das Testmakro durchgeführt werden und erst danach der Rest vom Tasterprogramm weitergemacht werden, oder? Der Infotext zeigt jetzt jedenfalls vorher noch "Taste 1 fertig" an, und erst danach sieht man "hier passiert was"... "und noch was"..."bin fertig". Das Testmakro wird jedenfalls nicht abgewartet.

Was mache ich falsch? Ich hab auch schon versucht, das Makro als "Taster" zu definieren und so aufzurufen - selbes Ergebnis.
Bitte um Hilfe!

Besten Dank!

Benutzeravatar
Herbert_Testmann
Beiträge: 11062
Registriert: 17.01.2009, 11:30
Danksagung erhalten: 7 Mal

Re: Makro wird nicht abgewartet?

Beitrag von Herbert_Testmann » 22.07.2017, 13:26

Hallo

ich habe jetzt grade die Hilfe zu HPCL nicht hier. Es gibt 2 Möglichkeiten das zweite Makro zu starten. Ich nehme an Du hast die richtige gewählt, wenn Du Dich auf die Hilfedatei beziehst.

Eine Idee wäre, aus den zweiten Makro mal die "warte" raus zu nehmen.
Meine Vermutung wäre, dass beim ersten Auftreten von "warte" das makro angehalten wird und die Verarbeitung zurück zum aufrufenden Makro springt.
---
Dieses Schreiben wurde maschinell erstellt und ist ohne Unterschrift gültig

schnoger
Beiträge: 5
Registriert: 21.07.2017, 21:57

Re: Makro wird nicht abgewartet?

Beitrag von schnoger » 22.07.2017, 13:37

Ja genau - es gibt das STARTE (http://contronics-software.de/manuals/C ... mc4x7q.htm), dass die Ausführung "in die Warteschlange stellt" und eben das AUFRUFEN, was es gleich machen sollte.
Aber ich werde u.U. ein paar "warte" im Makro benötigen, darum sollte es auch so durchlaufen.
(Und ohne WARTE passieren die Änderungen beim Test jetzt so schnell, da kann ich nicht genau sagen was zuerst kommt).

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Makro wird nicht abgewartet?

Beitrag von Familienvater » 22.07.2017, 13:42

Hi,

es könnte sein, das Du in eine "retriggern" Falle fällst.
Der Taster sendet einen kurzen Tastendruck das Makro läuft los, "verzweigt", und wartet, dann kommt das Event "Tastendruck aus", aber spätestens dann müsste es eigentlich durchlaufen. Grundsätzlich versuche ich warte in "Unterprogrammen" zu vermeiden, und das immer im Objekt selber zu machen, weil ein Unterprogramm eigentlich nur Sinn macht, wenn man es von verschiedenen Stellen (Objekten) aus nutzt. Wartet das Unterprogramm aber, und ein anderes Objekt ruft das Unterprogramm auch auf, wird das ursprüngliche Warten abgebrochen, ob das ursprünglich aufrufende Objekt danach weiter macht, weiß ich ehrlich gesagt nicht, habe ich noch nie ausprobiert. Wenn man irgendetwas "parallel" laufendes starten möchte, dann nimmt man die Starte()-Anweisung, die läuft aber erst los, wenn aktuell keine weiteren Events mehr abzuarbeiten sind.

Ich schreibe meine Makros selber (in Englisch), das versteht mein Gehirn besser, deswegen kann ich nicht sagen, ob es an syntaktischen Problemen liegen kann, grundsätzlich funktioniert aber das "verschachtelte" Aufrufen mit aufrufen() bzw. call().

Wenn ich lese, das Du auf einen Tastendruck eine Webseite abrufen willst, und in Abhängigkeit des Webseiteninhalts Lichter steuern, dann erwartest Du hoffentlich keine verzögerungsfreie Schaltung der Lampen. Mit einer der "häßlichsten" Befehle ist Getsite, neben GetCCUSysVar und SetCCUSysvar. Diese Befehle verzögern die Makroausführung des Objekts, und zwischendrin macht HPCL andere Dinge. Wenn man das nicht im Hinterkopf hat, fällt man ganz schnell auf die Nase, und weiß nicht warum...

Der Familienvater

schnoger
Beiträge: 5
Registriert: 21.07.2017, 21:57

Re: Makro wird nicht abgewartet?

Beitrag von schnoger » 22.07.2017, 14:35

Hallo,

Retriggern dürfte es glaub ich nicht sein, aber ich werd mal eine Variable raufzählen, dann wird es gleich klar sein. Aber mittlerweile glaub ich auch dass es mit der WARTE-Anweisung zu tun haben wird, die andere Makros (auch das "übergeordnete") weiterlaufen lässt.

Und ja, geplant wäre es, Teile des Programms in Unterprogramme zu packen, die von mehreren Seiten aufgerufen werden (und max. anhand eines Variablenwertes leicht unterschiedlich reagieren). Aber das muss ich jetzt halt mal geistig so umplanen, das sowas auch asynchron zum Auslöser laufen kann, dann wird es egal sein, wann ich es wo aufrufe (hoffentlich :) ).

Dass Webcalls etwas Zeit benötigen und somit keine verzögerungsfreien Schaltungen möglich sind, ist mir klar. Vor allem dass andere Makros weiterlaufen (wie eben hier beim "Warte") kann dann fies werden. Aber Danke für die Warnung, reingetappt wäre ich sicher trotzdem!

ubecker
Beiträge: 569
Registriert: 31.01.2014, 22:53
Wohnort: Duisburg

Re: Makro wird nicht abgewartet?

Beitrag von ubecker » 23.07.2017, 00:29

schnoger hat geschrieben:Hallo,

. Aber mittlerweile glaub ich auch dass es mit der WARTE-Anweisung zu tun haben wird, die andere Makros (auch das "übergeordnete") weiterlaufen lässt.
und so steht es auch in der Hilfe. Ich weiß jetzt nicht mehr den genauen Wortlaut, aber WARTE-Anweisungen haben schon eigenartige Auswirkungen. Meine Makros haben bis auf ganz wenige Ausnahmen keine WARTE mehr.
gruß Udo

contronics-RK
Beiträge: 954
Registriert: 18.07.2006, 15:58

Re: Makro wird nicht abgewartet?

Beitrag von contronics-RK » 24.07.2017, 12:45

Hallo zusammmen,

ich versuche mal zu erklären was hier passiert, hoffe es gelingt verständlich.

Bei einer warte-Anweisung wird das Makro angehalten und es werden alle anderen anstehenden Events bzw. Makros bearbeitet. Eine warte Anweisung ist also wie ein "temporäres" Beenden des Makros. Das Makro mit der warte-Anweisung wird dann erst nach Beendigung der warte-Zeit wieder weiter ausgeführt hinter der warte-Anweisung.

Die Anwesiungen werden also wie folgt ausgeführt:
1. Makro1 -> Infotext setzen auf "Taste 1"
2. Makro1 ->Makro aufrufen Testmakro
3. Testmakro-> Infotext setzen auf "los" -> überschreibt "Taste1", die erste Ausgabe sieht man also gar nicht erst
4. Testmakro-> warte 3 Sekunden -> jetzt wird Testmakro temporär beendet und andere Events bzw. wartende Makros ausgeführt, auch Makro1!
5. Makro1-> Infotext setzen auf "Taste 1 fertig" -> wird ausgeführt da Testmakro temporär beendet wurde und überschreibt den Inhalt "los", den man also auch nicht sieht,
6. Testmakro -> Infotext setzen auf "hier passiert was" -> Anweisung wird nach der ersten Wartezeit von 3 Sekunden ausgeführt.
7....jetzt werden die weiteren Anweisungen von Testmakro ausgeführt

Es ist sicherlich auch richtig zu sagen: Makro1 dürfte aber erst wieder ausgeführt werden nachdem Testmakro mit der letzten Zeile beendet wurde.
Dabei kommt es aber zu einem anderen Problem, nämlich dass Testmakro mehrmals parallel laufen könnte, was unvorhersehbare Folgen haben kann.
Ein mehrmaliger Start kann ja ohne Beeinflussung durch jegliche Programmlogik passieren, wenn das Makro durch Hardwareevents gestartet wird.

Je nach gesamter Wartezeit im Makro könnte es dann auch passieren, dass neue Aufrufe schneller kommen als alte durch Erreichen der letzten Zeile beendet werden und der Stack somit irgendwann überläuft. Ein Fehler der dann kaum zu finden wäre wenn immer nach einiger Zeit das Programm komplett abstürzt.

Um das zu vermeiden wurde auch die Verfahrensweise gewählt warte-Anweisungen abzubrechen, sobald das Makro nochmals aufgerufen wird. So kann das Makro immer nur einmal aktiv sein. Daher muss Makro1 auch nach der ersten Warte-Anweisung weiter laufen, da die letzte Zeile dieses Aufrufs von Testmakro evtl. nie erreicht wird.
Dieses Verfahten ist in der Praxis die sicherste Methode das oben beschriebene Problem zu vermeiden und erfüllt in den meisten Fällen auch die gewünschte Funktionalität.

Hoffe diese Infos helfen weiter.
Mit freundlichem Gruss
CL-control - Ralph Krapoth
http://www.cl-control.de
Bei Fragen bitte keine PMs, sondern mail an technik@cl-control.de
PMs werden nicht regelmässig kontrolliert und und können unbeantwortet bleiben.

schnoger
Beiträge: 5
Registriert: 21.07.2017, 21:57

Re: Makro wird nicht abgewartet?

Beitrag von schnoger » 24.07.2017, 20:36

Vielen Dank für eure Antworten, und Danke für die Erklärung mit den "Hintergrundinfos".
Das mit dem Warte im Testmakro war ja nur testweise statt einem GetSite (was ja ähnlich reagiert - lt. Doku: "Während das passiert werden andere Makros weiter ausgeführt.").
Das heißt für mich, die Funktion fürs GetSite sollte ich nicht in ein eigenes Makro packen, weil es nicht abgewartet wird. Und falls es doch mal unbedingt erforderlich sein sollte, kann man immer noch die unschöne Lösung mit einer Schleife bauen, die eine Variable aus dem Makro abruft (irgendwo ein Stück Code hier im Forum gefunden - versuche ich aber unbedingt zu vermeiden).

Sonst komme ich schon ganz gut voran - die weiteren Problemchen, die aufgetreten sind, wurden hier im Forum schon ganz gut erklärt (wenn man mal weiß wonach man suchen muss :) )

Daimler
Beiträge: 9115
Registriert: 17.11.2012, 10:47
System: Alternative CCU (auf Basis OCCU)
Wohnort: Köln
Hat sich bedankt: 37 Mal
Danksagung erhalten: 283 Mal

Re: Makro wird nicht abgewartet?

Beitrag von Daimler » 24.07.2017, 21:21

Hallo Herr Krapoth,

danke für die Aufklärung - steht ja (jetzt?) in den akttuelleren HPCL-Versionen ziemlich eindeutig in der Hilfe.

Allerdings sollten evtl. die Punkte 'Aufrufen' und 'Makro ausführen' gegenseitig verlinkt oder zusammengelegt werden.
Zumal der Titel bei 'Makro ausführen' ja sowieso bereits 'Anweisung Makro aufrufen' lautet :roll:
Gruß Günter

pivccx mit 3.xx in Produktiv und Testsystem mit HM-, HM-W, HMIP- und HMIP-W Geräten, HPCx Studio 4.1,
L-Gateways, RS-L-Gateways, HAP, Drap, FHZ200x, vereinzelt noch FS2x-Komponenten.
HM / HM-IP: Zur Zeit knapp 300 Komponenten mit ??? Kanälen .

Ich übernehme für alle von mir gegebenen Hinweise, Tipps und Links keine Haftung! Das Befolgen meiner Tipps ist nur für Fachkundige gedacht und erfolgt auf eigene Gefahr!

contronics-RK
Beiträge: 954
Registriert: 18.07.2006, 15:58

Re: Makro wird nicht abgewartet?

Beitrag von contronics-RK » 25.07.2017, 08:01

Hallo,

danke für den Hinweis, werden wir in der Hilfe ändern.
Mit freundlichem Gruss
CL-control - Ralph Krapoth
http://www.cl-control.de
Bei Fragen bitte keine PMs, sondern mail an technik@cl-control.de
PMs werden nicht regelmässig kontrolliert und und können unbeantwortet bleiben.

Antworten

Zurück zu „homeputer CL“