Die Programmierung des eibPCs erscheint mit zunehmender Komplexität der Logiken immer unverständlicher.
Für mich liegt der Grund klar in der SPS-artigen, eventgetriebenen Abarbeitung des Codes. D.h. Abfragen werden nur dann erneut bewertet, wenn sich eine Eingangsgröße 'geändert' hat.
z.B.
Hier wird z.B. die Deklaration 'Zeit = AUS' aus Zeile 04 nur direkt nach Programmstart ausgeführt, da sich ja das 'AUS' nicht mehr ändert.
'Zeit' wird auf 'EIN' gesetzt, wenn es Werktags genau 5:30 bzw. am WE genau 8:30 ist, wobei 'Werktags' exakt zur gleichen Zeit (5:30) wochentags (für ca. 1ms) auf 1b01 geht. 'Sommer' ist 1b01 von April bis inkl. Oktober.
Nun kann man sich da durchbeissen, welcher Event bzw. welche Änderung wann kommen muss, damit da der Rolladen fährt.
Für mich würde hier ein eval() getauftes Kommando helfen, das die angegebene Bedingung immer prüft, also nicht nur, wenn sich ein Parameter ändert. Entsprechend soll die if-Anweisung dann immer ausgeführt werden, wenn 1b01 heraus kommt bzw. der else Zweig bei 0b01. Dies würde ich übrigens einem neuen if-Kommando vorziehen.
Hier das Beispiel mit eval(), wobei der Rolladen nur fährt, wenn um 5:30 werktags die Helligkeit im Sommer 200.0 bzw. im Winter 20.0 übersteigt.
('Zeit' wird übrigens nicht benötigt oder 'Werktags' ist falsch)
Es geht nicht um den Sinn des Beispieles (das ist geklaut, danke an redstar), sondern die Funktionsweise des eval(), das immer einen Event auslösen soll und den entsprechenden Wert des Ausdruckes für die if-Abfrage liefert.
Werbetrommel: Wer sich vorstellen kann, dieses Kommando (oder eine analoge Implementierung von Michael) einsetzen zu wollen/können, melde sich bitte hier im Thread, damit der tatsächliche Bedarf ersichtlich wird.
Für mich liegt der Grund klar in der SPS-artigen, eventgetriebenen Abarbeitung des Codes. D.h. Abfragen werden nur dann erneut bewertet, wenn sich eine Eingangsgröße 'geändert' hat.
z.B.
Code:
01: //Steuerung Rollo Essen EG 02: Sommer = month(01,04) and !month(31,10) 03: Hoch = ( ("Helligkeit.Süd-1/0/22">200.0) and Zeit) and Sommer ) \\ or ( ("Helligkeit.Süd-1/0/22">20.0) and Zeit) and !Sommer ) 04: Zeit = AUS 05: if wtime(08,30,00,WOCHENENDE) then Zeit=EIN endif 06: if wtime(05,30,00,WERKTAGS) then Zeit=EIN endif 07: Werktags = wtime(5,30,00,MONTAG) \\ or wtime(5,30,00,DIENSTAG) \\ or wtime(5,30,00,MITTWOCH)\\ or wtime(5,30,00,DONNERSTAG) \\ or wtime(5,30,00,FREITAG)\\ 08: if Hoch and Sommer and Werktags then \\ 09: write("%Pos.anfahren Rollo Essen Ost OG-3/2/105",0%); \\ 10: write("%Pos.anfahren Rollo Essen Süd OG-3/2/115",0%); \\ 11: write("%Pos.anfahren Rollo Essen West OG-3/2/125",0%); \\ 12: Zeit=AUS \\ 13: endif
'Zeit' wird auf 'EIN' gesetzt, wenn es Werktags genau 5:30 bzw. am WE genau 8:30 ist, wobei 'Werktags' exakt zur gleichen Zeit (5:30) wochentags (für ca. 1ms) auf 1b01 geht. 'Sommer' ist 1b01 von April bis inkl. Oktober.
Nun kann man sich da durchbeissen, welcher Event bzw. welche Änderung wann kommen muss, damit da der Rolladen fährt.
Für mich würde hier ein eval() getauftes Kommando helfen, das die angegebene Bedingung immer prüft, also nicht nur, wenn sich ein Parameter ändert. Entsprechend soll die if-Anweisung dann immer ausgeführt werden, wenn 1b01 heraus kommt bzw. der else Zweig bei 0b01. Dies würde ich übrigens einem neuen if-Kommando vorziehen.
Hier das Beispiel mit eval(), wobei der Rolladen nur fährt, wenn um 5:30 werktags die Helligkeit im Sommer 200.0 bzw. im Winter 20.0 übersteigt.
('Zeit' wird übrigens nicht benötigt oder 'Werktags' ist falsch)
Code:
01: //Steuerung Rollo Essen EG 02: Zeit = AUS 03: Werktags = wtime(5,30,00,MONTAG) \\ or wtime(5,30,00,DIENSTAG) \\ or wtime(5,30,00,MITTWOCH)\\ or wtime(5,30,00,DONNERSTAG) \\ or wtime(5,30,00,FREITAG)\\ 04: if wtime(08,30,00,WOCHENENDE) then Zeit=EIN endif 05: if wtime(05,30,00,WERKTAGS) then Zeit=EIN endif 06: if [B][COLOR=red]eval[/COLOR][COLOR=red]([/COLOR][/B] month(01,04) and !month(31,10) [B][COLOR=red])[/COLOR][/B] then 07: // Sommer 08: if ( "Helligkeit.Süd-1/0/22">200.0 ) and Zeit and Werktags then 09: write("%Pos.anfahren Rollo Essen Ost OG-3/2/105",0%); \\ 10: write("%Pos.anfahren Rollo Essen Süd OG-3/2/115",0%); \\ 11: write("%Pos.anfahren Rollo Essen West OG-3/2/125",0%); \\ 12: Zeit=AUS \\ 13: endif 14: else 15: // Winter 16: if ( "Helligkeit.Süd-1/0/22">20.0 ) and Zeit and Werktags then 17: write("%Pos.anfahren Rollo Essen Ost OG-3/2/105",0%); \\ 18: write("%Pos.anfahren Rollo Essen Süd OG-3/2/115",0%); \\ 19: write("%Pos.anfahren Rollo Essen West OG-3/2/125",0%); \\ 20: Zeit=AUS \\ 21: endif 22: endif
Werbetrommel: Wer sich vorstellen kann, dieses Kommando (oder eine analoge Implementierung von Michael) einsetzen zu wollen/können, melde sich bitte hier im Thread, damit der tatsächliche Bedarf ersichtlich wird.
Kommentar