NEWS
Low/High/Low Durchgänge zählen - Wo ist der Denkfehler?
-
Hallo zusammen,
mit dem Blockly will ich bei meiner Spülmaschine die Durchgänge zählen (s.Diagramm): Ein Durchgang wäre dann Low --> High --> Low (wobei Low & High natürlich Zahlenwerte sind).
Exemplarisch habe ich erstmal eine Testvariable (Example State) genommen um die Durchgänge zu simulieren. Diese werden dann durch eine interne Variable (Zähler) gezählt und sollten am Ende per Debug ausgegeben werden.
Wenn ich jetzt z. B. für Example State 99 --> 101 --> 99 eingebe steht der Zähler auf 1 anstatt auf 2.
Wo ist der Denkfehler? Stehe gerade auf dem Schlauch
<xml xmlns="https://developers.google.com/blockly/xml"> <variables> <variable id="]J4u-SZ|Op@y3;6/F#9p">Semaphor</variable> <variable id="w?2J9;8w#u;O01y_~LvX">Zähler</variable> <variable type="interval" id="Intervall">Intervall</variable> </variables> <block type="variables_set" id="cXQW,Ma[_m_0nKx1gM]!" x="-912" y="12"> <field name="VAR" id="]J4u-SZ|Op@y3;6/F#9p">Semaphor</field> <value name="VALUE"> <block type="logic_boolean" id="]}N:KMi@/m63{P%`Q2R@"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="variables_set" id="+5D[c;+Aa~[||)ZfCw|p"> <field name="VAR" id="w?2J9;8w#u;O01y_~LvX">Zähler</field> <value name="VALUE"> <block type="math_number" id="HyPuonhr-ZTnYkf_Utm-"> <field name="NUM">0</field> </block> </value> <next> <block type="on" id="r25Ft/_.BXH_b^.e]A2V"> <field name="OID">0_userdata.0.example_state</field> <field name="CONDITION">any</field> <field name="ACK_CONDITION"></field> <statement name="STATEMENT"> <block type="controls_if" id="0kRkMm+6Yz5)#,3C/.[."> <value name="IF0"> <block type="logic_operation" id="3)6HydkV|~PMF-`lv20}"> <field name="OP">AND</field> <value name="A"> <block type="logic_compare" id="7yw{3I;l^DFiZAOe#qW%"> <field name="OP">GT</field> <value name="A"> <block type="on_source" id="yEW)-z:~Fm~4!{$7u*Z`"> <field name="ATTR">state.val</field> </block> </value> <value name="B"> <block type="math_number" id="DT4L!@e`Nb|s[3y1Dy7X"> <field name="NUM">100</field> </block> </value> </block> </value> <value name="B"> <block type="variables_get" id="Z,S(kV05**c0%Zz|QpW`"> <field name="VAR" id="]J4u-SZ|Op@y3;6/F#9p">Semaphor</field> </block> </value> </block> </value> <statement name="DO0"> <block type="math_change" id="GuF3Ll,HHLSzt`i~uyB0"> <field name="VAR" id="w?2J9;8w#u;O01y_~LvX">Zähler</field> <value name="DELTA"> <shadow type="math_number" id=";GkR$oslgHDr$6%3?Zw}"> <field name="NUM">1</field> </shadow> </value> <next> <block type="variables_set" id="ZCy2PfYRHjVw7X5`sGYT"> <field name="VAR" id="]J4u-SZ|Op@y3;6/F#9p">Semaphor</field> <value name="VALUE"> <block type="logic_boolean" id="RkhAf|M|fCm0jfVD3Pzl"> <field name="BOOL">FALSE</field> </block> </value> <next> <block type="timeouts_setinterval" id="+F(=`c:07x;Ags(qq7eJ"> <field name="NAME">Intervall</field> <field name="INTERVAL">1</field> <field name="UNIT">sec</field> <statement name="STATEMENT"> <block type="controls_if" id="-f}e|WC3ugmMPi;2Y|Hj"> <value name="IF0"> <block type="logic_compare" id="BusTEFs1+b((z(_D!8PG"> <field name="OP">LT</field> <value name="A"> <block type="get_value" id="1r`]yZXtsQVE`0r;N!i]"> <field name="ATTR">val</field> <field name="OID">0_userdata.0.example_state</field> </block> </value> <value name="B"> <block type="math_number" id="RG.d76oA6?:3+ZafMvw("> <field name="NUM">100</field> </block> </value> </block> </value> <statement name="DO0"> <block type="math_change" id="1YU89;i/(9bk.H(,mFNE"> <field name="VAR" id="w?2J9;8w#u;O01y_~LvX">Zähler</field> <value name="DELTA"> <shadow type="math_number" id="3G4+6%sy7)$5l,*pbpX!"> <field name="NUM">1</field> </shadow> </value> <next> <block type="variables_set" id="i0Pu.q~5tJw]doY$gv=^"> <field name="VAR" id="]J4u-SZ|Op@y3;6/F#9p">Semaphor</field> <value name="VALUE"> <block type="logic_boolean" id="4|7k/%X-D~^Bk{`L%Xkz"> <field name="BOOL">TRUE</field> </block> </value> <next> <block type="timeouts_clearinterval" id="kzqn:GwZ^u|0xySKcC@Q"> <field name="NAME">Intervall</field> </block> </next> </block> </next> </block> </statement> </block> </statement> <next> <block type="debug" id="=pT*^!-(5^mB~~A4[Go;"> <field name="Severity">log</field> <value name="TEXT"> <shadow type="text"> <field name="TEXT">test</field> </shadow> <block type="variables_get" id="sTj.D^WPJ_m9oz5?x7~~"> <field name="VAR" id="w?2J9;8w#u;O01y_~LvX">Zähler</field> </block> </value> </block> </next> </block> </next> </block> </next> </block> </statement> </block> </statement> </block> </next> </block> </next> </block> </xml>
-
Fehler gefunden. Lag an der internen Variable. Wenn ich den Zähler an eine externe Variable übergebe (0_userdata.0.xxx), funktioniert es korrekt; wobei mir immer noch nicht ganz klar ist, warum die interne Variable verkehrt angezeigt wird.
-
@qqolli
Ich mache es immer so: -
Super! Das ist auf jeden Fall wesentlich eleganter und vor allem kürzer. Kannte das mit dem "vorherigen Wert" noch nicht.
Vielen Dank, wieder was gelernt
-
@qqolli sagte in Low/High/Low Durchgänge zählen - Wo ist der Denkfehler?:
wobei mir immer noch nicht ganz klar ist, warum die interne Variable verkehrt angezeigt wird.
Dein Blockly löst über einen Trigger aus und die "innere" Variable ist eine LOKALE Variable, die du im Blockly definiert und mit 0 initialisiert hast.
Wenn der Trigger wieder auslöst kann in der Variable "irgendwas" stehen, weil sie lokal definiert ist, sprich wenn das Blockly-Script durchgelaufen ist gibts die Variable nicht mehr. Und genau deshalb brauchst du eine GLOBALE Variable (z.B. 0.userdata.0.xxx) und deshalb funktioniert es damit auch. -
@amg_666 sagte in Low/High/Low Durchgänge zählen - Wo ist der Denkfehler?:
@qqolliWenn der Trigger wieder auslöst kann in der Variable "irgendwas" stehen, weil sie lokal definiert ist, sprich wenn das Blockly-Script durchgelaufen ist gibts die Variable nicht mehr. Und genau deshalb brauchst du eine GLOBALE Variable (z.B. 0.userdata.0.xxx) und deshalb funktioniert es damit auch.
Ich glaube nicht, dass das ganz richtig ist, denn dann könnte man Variablen in Blockly nur sehr eingeschränkt nutzen.
Die Ausführungsreihenfolge im Trigger ist:
Block1, Block3 wird gestartet, Block2, Block3, Block3 (sekündlich wiederholend) ... -
@amg_666 sagte: die "innere" Variable ist eine LOKALE Variable, die du im Blockly definiert und mit 0 initialisiert hast.
Wenn der Trigger wieder auslöst kann in der Variable "irgendwas" stehen, weil sie lokal definiert ist, sprich wenn das Blockly-Script durchgelaufen ist gibts die Variable nicht mehr.Die Variable Zähler ist eine globale Variable, deren Werte bis zum nächsten Skript-Start erhalten bleiben.
-
@qqolli sagte: Wo ist der Denkfehler?
Der "debug output" gehört in das Intervall.
Wozu ein "Polling" jede Sekunde, wenn der Datenpunkt ohnehin triggert ?