DOIF schalten solange Bedingung erfüllt ist

Begonnen von JMW, 20 April 2016, 23:58:18

Vorheriges Thema - Nächstes Thema

JMW

#15
Es scheint so, als ob das Problem der Wechsel des Triggers ist.

Ich lasse mir nun zusätzlich die Events ausgeben (z.B. SOLL = IST = 3 -> SOLL = 4):

define tdi_Lueftung_schalten DOIF ([tdf_LueftungsStufe_Ist] < [tdf_LueftungsStufe_Soll]) ( set tdf_LueftungsStufe_Ist {([tdf_LueftungsStufe_Ist] + 1)}, { Log 3, "Events from device $DEVICE:$EVENTS : test Soll > Ist: ".[tdf_LueftungsStufe_Ist] } ) \
                            DOELSEIF ([tdf_LueftungsStufe_Ist] > [tdf_LueftungsStufe_Soll]) ( set tdf_LueftungsStufe_Ist {([tdf_LueftungsStufe_Ist] - 1)}, { Log 3, "Events from device $DEVICE:$EVENTS : test Soll < Ist: ".[tdf_LueftungsStufe_Ist] } ) \
                            DOELSEIF ([tdf_LueftungsStufe_Ist] == [tdf_LueftungsStufe_Soll]) ( { Log 3, "test Soll = Ist: ".[tdf_LueftungsStufe_Ist] } ) \
                            DOELSE ( { Log 3, "Soll ? Ist: ".[tdf_LueftungsStufe_Ist] } )


2016.04.21 22:16:48 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 3
2016.04.21 22:16:50 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 4
2016.04.21 22:16:52 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 5
2016.04.21 22:16:54 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 6
2016.04.21 22:16:56 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 7
2016.04.21 22:16:58 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 8
2016.04.21 22:17:00 3: Events from device tdf_LueftungsStufe_Soll:4 : test Soll > Ist: 9


Wenn sich der Sollwert vom Istwert ändert, so wird der Trigger verwendet, um den Istwert zu ändern.
Hier soll dann der Trigger auf den Wechsel des Istwerts ausgelöst werden.
Durch den repeatsame wird jedoch weiterhin der Trigger des inital geänderten Sollwertes benutzt und
der geht nicht weg.

Kann man das mit DOIF überhaupt lösen? Mir scheint es, als ob DOIF nicht mit geänderten Werten zurechtkommt,
die es selbst geändert hat.


Per

Zitat von: JMW am 21 April 2016, 20:51:37Wieso soll ich in der Logausgabe die LueftungsStufe nochmals um 1 addiert ausgeben.
Weil ich unterwegs war und nicht wusste, ob die aktuelle oder die beim Start vorhandenen Werte genommen werden. Wenn es so passt, ist es ja ok.

Ich bin mal einem Verdacht nachgegangen und habe was Interessantes festgestellt (aber dazu muss Damian mithelfen):
Als Parameter habe ich neben wait und do always (alles andere rausgehauen) noch selftrigger (!) probiert und siehe da, es klappt (inkl. Halt bei Gleichheit). ABER nur in eine Richtung. Nämlich die im DOIF-Zweig, die im DOELSE nimmt er nicht.
Dabei war auch egal, ob ich DOELSEIF (soll == ist) oder DOELSE verwende.
Getrixt mit selftrigger 1:1 oder 1,1 hat auch nicht funktioniert.

Per

So, eine funktionierende Lösung :
([soll] ne [ist]) (set ist {([ist] + (([soll] > [ist]) ? 1 : -1))})
DOELSE ()
wait 1|1
do always
selftrigger 1

JMW