UPGRADE IP 9 verfügbar!
Timberwolf VISU jetzt mit NEUEM Layout Editor
Freie Anordnung, Reihenfolge und Größe der Widgets - viele weitere Verbesserungen
Infos im Wiki: https://elabnet.atlassian.net/l/cp/06SeuHRJ

NEU! Insider & Leistungsmerkmale FÜR ALLE freigeschaltet
Damit kann nun jeder das Upgrade vornehmen und VISU & IFTTT testen. Alle Info hier: viewtopic.php?f=8&t=5074

[TOP TIPP] Automatische Bewässerungssteuerung

Hier stellen Foristen und Kunden Ihre EIGENEN Logikbausteine vor. Diese Logikbausteine stehen jedem im Rahmen der vom Autor eingeräumten / genannten Lizenz zur Verfügung.
Forumsregeln
  • Denke bitte an aussagekräftige Titel und gebe dort auch die [Firmware] an. Wenn ETS oder CometVisu beteiligt sind, dann auch deren Version
  • Bitte mache vollständige Angaben zu Deinem Server, dessen ID und dem Online-Status in Deiner Signatur. Hilfreich ist oft auch die Beschreibung der angeschlossener Hardware sowie die verwendeten Protokolle
  • Beschreibe Dein Projekt und Dein Problem bitte vollständig. Achte bitte darauf, dass auf Screenshots die Statusleiste sichtbar ist
  • Bitte sei stets freundlich und wohlwollend, bleibe beim Thema und unterschreibe mit deinem Vornamen. Bitte lese alle Regeln, die Du hier findest: https://wiki.timberwolf.io/Forenregeln

Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#61

Beitrag von Robert_Mini »

Hallo Hans-Martin!

Kein Problem, toll wenn du dir die Zeit nimmst.
zu 1) eigentlich sollte "["Limiter","$GlobalFactor","$GlobalFactorLim",0,["$Konst005", "$Konst2"]]," das verhindern. Ich finde deine Vorschlag aber sehr gut, denn mit 0 laufen einfach alle Kreise durch ohne aktiv zu werden. Das finde ich konsequenterweise richtiger als der Limiter.

zu 2) Gibt es beides, aber vielleicht im Screenshot nicht aktiv. Im Code ist es aber drinnen.

zu 3) Finde ich einen guten Vorschlag. Runtime würde ich aber wie umgesetzt belassen, d.h. dem reset des finished wieder auf 0 setzen.
Aber bei time left passt es anders besser, insbesondere um die Gesamt Sequenzzeit zu addieren!!

lg
Robert

PS: Über den Sequenzbaustein reden wir als nächstes :D
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Ersteller
MiniMaxV2
Reactions:
Beiträge: 274
Registriert: Sa Jan 12, 2019 8:41 pm
Wohnort: Bremen
Hat sich bedankt: 342 Mal
Danksagung erhalten: 151 Mal

#62

Beitrag von MiniMaxV2 »

Moin Robert,
Ja das mit dem Limiter nenn ich mal ein undefiniertes Verhalten ;) Ich erwarte da halt was anderes und es passiert "Magie".

Stimmt den 2. Punkt - da hab ich wohl krumm geschaut bei mir. Der ist drinne im optionalen :)

Bei 3 - das ist ja genau wie ich es meine. Runtime geht auf 0 uns left auf xx min. Also in ihre Startzustände :)

Dann lass uns mal sehen, dass wir das die Tage rein bekommen und dann nen haken machen.


Was hast du denn beim Sequenzer so vor bzw. für Wünsche? :) (mhmm vllt kann er ja auch die Zeiten addieren - nen arrray auf einen Polynom müsste ja gehen ;) )
LG
Hans Martin
timberwolf413 (950Q) - VPN offen - reboot erlaubt / timberwolf610 (950Q) - VPN offen - reboot erlaubt

Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#63

Beitrag von Robert_Mini »

Hallo Hans Martin!

Du hast recht, da hab ich ein wenig improvisiert...

Zum Sequenzer: siehe mal Screenshot hier (viewtopic.php?f=65&t=2118&start=50#p39882). Da hab ich schon was geleaked.

Im Prinzip hab ich folgende Dinge eingebaut:
- 2 Eingänge für Global Factor Auto und Manuell
- 1 Ausgang, der Global Factor an die Bewässerungskreise verteilt und zwar GF_Auto, wenn Start Auto Cycle getriggert wird und GF_Man, wenn Start Man Cycle getriggert wird.
- Sequenznummer aus Ausgang

Hintergrund ist der folgende:
- Ich habe eine Automatik am Start, die täglich Auto Cycle triggert und den GF_Auto abhängig von Feuchtigkeit und Regenforecast setzt.
- Manchmal starte ich die Bewässerung aber Manuell und möchte dafür den Wert GF_Man vorgeben können.
- Am liebsten hätte diese Funktion als separater Baustein gebaut. Das geht aber nur schwierig, da man sicherstellen muss, dass der Dispatcher den Kreis noch nicht startet bevor nicht die GF-Werte verteilt sind. Dies bräuchte einen Init-Cycle oder man triggert mit Kreis1 einen Baustein, der diese Funktion übernimmt.

Wie man das im Standard berücksichtigt ohne Support Cases zu erzeugen weiß ich auch nicht ganz.
Ich würde eventuell diese Erweiterungen im Code berücksichtigen, die Eingänge auskommentieren und am Level default 1,0 setzen. Das ist der Fall wo aktivierbare Eingänge einfach notwendig sind...

=> Braucht noch ein wenig Diskussion. Hab aber kein Problem, wenn du der Meinung bist, dass das zu speziell ist.

lg
Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297

Ersteller
MiniMaxV2
Reactions:
Beiträge: 274
Registriert: Sa Jan 12, 2019 8:41 pm
Wohnort: Bremen
Hat sich bedankt: 342 Mal
Danksagung erhalten: 151 Mal

#64

Beitrag von MiniMaxV2 »

Moin Robert,
Stimmt der Screenshot sieht bissel anders aus ;) Prinzipiell finde ich die Idee und die Umsetzung gut. Brauchte einen Augenblick zu kapieren, dass dein "manuell " nicht das Dauer an ist, was ich auf den Kreisen nutze ;) Ich würde mal abstrakt hier von Trigger 1 und Trigger 2 reden welcher jeweils einen TriggerFactor1 und TriggerFactor2.

Ich denk mal ein wenig drauf rum. Einen vorgeschalteten Baustein kann man schon machen - wir haben ja die Systemvorlaufzeit, Bevor die Kreise los laufen. Aber braucht man das wirklich?.. Der Sequenzer ist ja der Steuerbaustein der Kreise. Anders brauchen wir eh noch ne Stelle wo auch die Zeiten wieder zusammenlaufen aus den Kreisen. Gut kann man auch mit im Sequenzer machen.. Ist ne Philosophie Frage ob man große Bausteine baut oder kleine Module die u.U. im Logikeditor unübersichtlicher sind grafisch..
LG
Hans Martin
timberwolf413 (950Q) - VPN offen - reboot erlaubt / timberwolf610 (950Q) - VPN offen - reboot erlaubt

gbglace
Reactions:
Beiträge: 3585
Registriert: So Aug 12, 2018 10:20 am
Hat sich bedankt: 1253 Mal
Danksagung erhalten: 1649 Mal

#65

Beitrag von gbglace »

Robert_Mini hat geschrieben: So Mai 08, 2022 10:21 pm

=> Braucht noch ein wenig Diskussion. Hab aber kein Problem, wenn du der Meinung bist, dass das zu speziell ist.

Ich lese das hier gespannt so aus der Ferne, mangels passender Aufbereitung des Gartens.
Der gesamten Logik passende Schalter für den kompletten Automodus und einen Schalter für jetzt aber einfach mal los manuell, ich weis es besser finde ich schon eine sehr hilfreiche Komponente.

Weil vielleicht hat man ja schon einen guten Turnus gefunden und die Automatik läuft super, dann kommt aber die Zeit wo man ggf mal frisch nachsäht oder was nach pflanzt, da kann man dann gern mal eine Sonderschicht Beregnungszyklus fahren lassen. Hängt man kurz ne ZSU davor die statt einmal am tage einfach immer zweimal am Tag das Programm triggert. Und nach einer Woche geht man einfach wieder auf volle Automatik und lässt es rein bedarfsgesteuert laufen.
Grüße
Göran

#1 Timberwolf 2600 Velvet Red TWS #225 / VPN aktiv / Reboot OK
#2 Timberwolf 2600 Organic Silver TWS #438 / VPN aktiv / Reboot OK
#3 PBM 3 Kanäle, #4 Modbus-Extension
Benutzeravatar

ztjuu
Reactions:
Beiträge: 86
Registriert: Sa Mär 07, 2020 8:49 am
Wohnort: Bleiberg-Nötsch (Kärnten)
Hat sich bedankt: 78 Mal
Danksagung erhalten: 69 Mal

#66

Beitrag von ztjuu »

Hi

Ich teste gerade intensiv die Steuerung. Folgende Funktionen werden genutzt:

Automatik Cycle Start
Manuell Cycle Start
Dauer Ein/Aus
generell Aus
Faktor für die Zeit
Freigabe des Kreises
Ausgangstimer, Ventil, Restzeit, Circle finished

@Robert Kann es sein, dass der Faktor nicht auf beide Cycle-Start Eingängen funktioniert? Wenn ich den 2ten (man Cycle starte) geht es. Wenn die Startflanke vom Sequenc-Baustein kommt wird der Faktor nicht berücksichtigt?
TWS 950Q ID:424 VPN: aktiviert Reboot: (OK)
EFH-Neubau: KNX, 1-Wire, DALI, VPN, CV & in Zukunft Multiroom Sound mit raspberry pi, Ekey-Zugang, ModBus TCP & RTU, MQTT

Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#67

Beitrag von Robert_Mini »

Hallo ztjuu!

Du sprichst vom Baustein für den Bewässerungskreis?
Du hast recht, ich habe das glaube ich so umgesetzt, dass beim manuellen Start eines Kreises der globale Faktor nicht berücksichtigt wird.
Das kommt aber aus der Zeit, wo der Sequenzer noch nicht 2 Faktoren gehandhabt hat (Muss dazu den Code noch teilen).

lg
Robert
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297
Benutzeravatar

ztjuu
Reactions:
Beiträge: 86
Registriert: Sa Mär 07, 2020 8:49 am
Wohnort: Bleiberg-Nötsch (Kärnten)
Hat sich bedankt: 78 Mal
Danksagung erhalten: 69 Mal

#68

Beitrag von ztjuu »

Robert_Mini hat geschrieben: Mi Mai 11, 2022 8:49 am Du sprichst vom Baustein für den Bewässerungskreis?
Du hast recht, ich habe das glaube ich so umgesetzt, dass beim manuellen Start eines Kreises der globale Faktor nicht berücksichtigt wird.
Das kommt aber aus der Zeit, wo der Sequenzer noch nicht 2 Faktoren gehandhabt hat (Muss dazu den Code noch teilen).
Ja genau. Hab gesehen, dass du aus dem Sequenzer die Faktorzeit nimmst. Soweit bin ich noch nicht, aber die Idee mit Man / Auto Faktor finde ich gut. Momentan lauft noch der original Sequenzer von MiniMax und die Gesamtzeit mach ich mit einem eigenen Baustein.
TWS 950Q ID:424 VPN: aktiviert Reboot: (OK)
EFH-Neubau: KNX, 1-Wire, DALI, VPN, CV & in Zukunft Multiroom Sound mit raspberry pi, Ekey-Zugang, ModBus TCP & RTU, MQTT

Ersteller
MiniMaxV2
Reactions:
Beiträge: 274
Registriert: Sa Jan 12, 2019 8:41 pm
Wohnort: Bremen
Hat sich bedankt: 342 Mal
Danksagung erhalten: 151 Mal

#69

Beitrag von MiniMaxV2 »

Moin Zusammen,
ich finde das eindeutiger, wenn beide Auto Eingänge den Faktor berücksichtigen.

Ich hab jetzt mal deine Version bei mir ins repo übernommen und noch paar Änderungen eingepflegt:

Code: Alles auswählen

[TW-Logics Irrigation] Added Version from Robert. Increased Version to V1.1 RC1
[TW-Logics Irrigation] Fixed global factor to be used for any automatic trigger. Fixed runtime to be counted in manual mode. Added remaining time on circuit standby. Added proper handling of factor <= 0.

Code: Alles auswählen

/**
 * File: Irrigation_CircuitControl.twl V1.1 RC 1
 * Logic for Garden irrigation. This module is the Circuit Control which controls one single irrigation circuit 
 * Author: - Hans Martin
 *             - Robert
 * Der Schöpfer dieser Custom Logik überträgt die Nutzungsrechte gemäß der TOLL ("Timberwolf Open Logikblock License") die unter https://wrgt.news/TOLL zum Download zur Verfügung steht.
 */

{
  "Input": [
        ["Trigger Automatic 1", "(RISING) Trigger to start an automatic irrigation cycle", "$TriggerInpAutomaticIn1", "c"],
        ["Trigger Automatic 2", "(RISING) Trigger to start an automatic irrigation cycle", "$TriggerInpAutomaticIn2", "c"],
        ["Trigger Start 1", "(RISING) Activation of irrigation circuit", "$TriggerInpStartIn1", "c"],
        ["Trigger Start 2", "(RISING) Activation of irrigation circuit", "$TriggerInpStartIn2", "c"],
        ["Trigger Stop 1", "(RISING) Stops any active cycle", "$TriggerInpStopIn1", "c"],
        ["Trigger Stop 2", "(RISING) Stops any active cycle", "$TriggerInpStopIn2", "c"],
        ["Automatic Time [min]", "(T_s) Time of one irrigation cycle", "$AutoTime_min", "u"],
        ["Global Factor", "Factor to scale circuit timer", "$GlobalFactor", "c"],
        ["System OK Feedback", "(0/1) Loopback of SystemControl", "$SystemOk", "a"],
        ["Send interval on [s]", "Send outputs with ct periodically during circuit on", "$SendIntervalOn", "u"],
        ["Send interval off [s]", "Send outputs with ct periodically during circuit off", "$SendIntervalOff", "u"],
        ["Inhibit", "", "$VAR<Inhibit?>", "c"]
  ],
  "Output": [
        ["Valve", "(0/1) Output for the valve", "$ValveOut", "c"],
        ["System Request", "(0/1) Request for the SystemControl", "$SystemRequest", "c"],
        ["Circuit State", "(0/1) State indicating whether the circuit is running", "$CircuitState", "c"],
        ["Circuit finished", "(0/1) Flag indicating that the circuit is finished", "$CircuitFinished", "c"],
        ["Runtime [s]", "Time passed since valve opened", "$Time_sec_actual?", "ct"],
        ["Runtime [min]", "Time passed since valve opened", "$Time_min_actual?", "a"],
        ["Time left [s]", "Time left for this cycle", "$Time_sec_remaining?", "ct"],
        ["Time left [min]", "Time left for this cycle", "$Time_min_remaining?", "ct"],
        ["State", "Current state 0=off/1=request systemOK/2=circuit on/3=finishing", "$State?", "c"]
  ],
  "Level": [
        // Inputs
        ["$VAR<Inhibit?>","bool",false],
        ["$TriggerInpAutomaticIn1", "bool", false],
        ["$TriggerInpAutomaticIn2", "bool", false],
        ["$TriggerInpStartIn1", "bool", false],
        ["$TriggerInpStartIn2", "bool", false],
        ["$TriggerInpStopIn1", "bool", false],
        ["$TriggerInpStopIn2", "bool", false],
        ["$AutoTime", "float", 0],
        ["$SystemOk", "bool", false],

        // Output
        ["$ValveOut", "bool", false],
        ["$SystemRequest", "bool", false],
        ["$CircuitState", "bool", false],
        ["$CircuitFinished", "bool", false],

        // Constants
        ["$Konst1", "int", 1],
        ["$Konst2", "int", 2],
        ["$KonstFalse", "bool", false],
        ["$KonstTrue", "bool", true],

        // Internals
        ["$State","integer",0],
        ["$Inhibit","bool",false],
        ["$Cancel","bool",false],
        ["$ShouldRun", "bool", false],
        ["$LastShouldRun", "bool", false],
        ["$LastShouldRunOrAutoRising", "bool", false],
        ["$ShouldRunAndSysOk", "bool", false],
        ["$TimerActive", "bool", false],
        ["$AutoTime_min", "float", 0.0],
        ["$AutoTime_sec", "float", 0.0],
        ["$AutoTime_global", "float", 0.0],
        ["$LastTimerActive", "bool", false],
        ["$Timeout", "float", 5.0],
        ["$Time_sec_actual", "float", 0.0],
        ["$Time_min_actual", "float", 0.0],
        ["$Time_sec_remaining", "float", 0.0],
        ["$Time_min_remaining", "float", 0.0],
        ["$Konst0", "float", 0.0],
        ["$Konst60", "float", 60.0],
        ["$Konst005", "float", 0.05],
        ["$SendIntervalOn", "float", 5.0],
        ["$SendIntervalOff", "float", 60.0],
        ["$SendInterval", "float", 5.0],
        ["$Clk", "bool", false],
        ["$GlobalFactor", "float", 1.0],   // Global factor on circuit time, used if triggered manually or by auto2
        ["$GlobalFactorLim", "float", 1.0], 
        ["$GlobalFactorValid", "bool", false],
        ["$TriggerNoFactor", "bool", false],
        ["$TriggerWithFactor", "bool", false],
        ["$TriggerAutomaticSaved", "bool", false],
        ["$TimerShouldRun", "bool", false],
        ["$CancelFinished", "bool", false],
        ["$TriggerInpStartRising","bool",false],
        ["$TriggerInpStopRising","bool",false],
        ["$TriggerInpAutomaticRising","bool",false],
        ["$ManualOn","bool",false],
        ["$SetOutputs","bool",false],
        ["$AutomaticModeActive","bool",false],
        ["$AutomaticModeActiveOrRequested","bool",false],
        ["$CancelAndAutoActive","bool",false]
  ],
  "Module": [
        // calculate time in seconds
        ["Polynomial", "$Konst60", "$AutoTime_sec",["$Konst0", "$AutoTime_min"]],
        // Limit factor
        ["Limiter","$GlobalFactor","$GlobalFactorLim","$GlobalFactorValid",["$Konst005", "$Konst2"]],
        // calculate time with global factor
        ["Polynomial", "$GlobalFactorLim", "$AutoTime_global",["$Konst0", "$AutoTime_sec"]],
        
        // take over current circuit time
        ["Or", ["$TriggerInpStartIn1","$TriggerInpStartIn2"], "$TriggerNoFactor"],
        ["And", ["$TriggerNoFactor","-$State"], "$TriggerNoFactor"],
        ["Latch","$AutoTime_sec","$AutoTime","$TriggerNoFactor",1],

        ["Or", ["$TriggerInpAutomaticIn1", "$TriggerInpAutomaticIn2"],"$TriggerWithFactor"],
        ["And", ["$TriggerWithFactor","-$State"], "$TriggerWithFactor"],
        ["Latch","$AutoTime_global","$AutoTime","$TriggerWithFactor",1],

        // calculate inputs
        ["Or", ["$TriggerInpAutomaticIn1","$TriggerInpAutomaticIn2"], "$TriggerInpAutomaticRising"],
        ["Or", ["$TriggerInpStartIn1","$TriggerInpStartIn2"], "$TriggerInpStartRising"],
        ["Or", ["$TriggerInpStopIn1","$TriggerInpStopIn2"], "$TriggerInpStopRising"],
      
        // calculate cancel state
        ["Or", ["$VAR<Inhibit?>"], "$Inhibit"],
        ["Or", ["$Inhibit", "$TriggerInpStopRising", "-$GlobalFactorValid"], "$Cancel"],

        // calculate manual state
        ["Or",["$TriggerInpStartRising", "$ManualOn"],"$ManualOn"],
        ["And", ["$ManualOn", "-$TimerActive", "-$Cancel"], "$ManualOn"], // if automatic mode was triggered, cancel manual mode

        // calculate start of system
        ["Or", ["$TriggerAutomaticSaved", "$TriggerInpAutomaticRising"], "$TriggerAutomaticSaved"], // save trigger
        ["And", ["$TriggerAutomaticSaved", "-$TimerActive", "-$Cancel"], "$TriggerAutomaticSaved"], // reset trigger if timer has taken over control or cancel was issued
 
        // Store last status of timer to detect 
        ["And", ["$TimerActive"], "$LastTimerActive"],

        // Set timer if automatic mode was triggered
        ["And", ["$TriggerAutomaticSaved", "$SystemOk"], "$TimerShouldRun"], // start timer only if also system ok was announced
        ["Monoflop", "$TimerShouldRun", "$Cancel", "$TimerActive", "$AutoTime", 2], // not retriggerable, rising-edge controlled, reset on cancel
     
        // build target state (run or not)
        ["Or", ["$TriggerAutomaticSaved", "$TimerActive"], "$AutomaticModeActive"],

        // $LastTimerActive added to detect cancel properly
        ["Or", ["$AutomaticModeActive", "$TriggerInpAutomaticRising", "$LastTimerActive"], "$AutomaticModeActiveOrRequested"],
        ["Or", ["$ManualOn", "$AutomaticModeActive"], "$ShouldRun"],

        // build state
        ["And", ["$ShouldRun", "$SystemOk"], "$ShouldRunAndSysOk"], //bypass to skip state 1
        ["And", ["$AutomaticModeActiveOrRequested", "$Cancel"], "$CancelAndAutoActive"], // bypass to only announce finished on cancel from state 0, 1 or 2 when automatic mode was active

        ["Statemachine",
            // 0: Circuit Off
            // 1: Requesting for SystemOK
            // 2: Circuit On
            // 3: Finishing
            [
                // [condition , current state, next state, timeout]
                // cancel state transitions
                ["$CancelAndAutoActive", 0, 3, "$Timeout"],
                ["$CancelAndAutoActive", 1, 3, "$Timeout"],
                ["$CancelAndAutoActive", 2, 3, "$Timeout"],
                ["$Cancel", 1, 3, "$Timeout"], // state 1 calls state 3 with timeout when cancel in manual mode is called to handle inhibit during request properly
                ["$Cancel", 2, 3, "$Timeout"], // state 2 calls state 3 with timeout when cancel in manual mode is called.

                // normal operation state transitions
                ["$ShouldRunAndSysOk", 0, 2, 0], // bypass to skip state 1
                ["$ShouldRun", 0, 1, 0], // new request
                ["-$ShouldRun", 1, 0, 0], // cancel request
                ["$SystemOk", 1, 2, 0], // system reported ok
                ["$ShouldRun", 2, 2, 0], // running
                ["-$ShouldRun", 2, 3, "$Timeout"], // finishing
                [0, 3, 0, 0] // end
            ],
            "$State"
        ],

        // set some outputs only if system should run now or was running in last tick
        ["Or", ["$ShouldRun", "$LastShouldRun"], "$SetOutputs"],

        // Map state to outputs
        ["Comparator", "$State", "$CircuitFinished", "$Konst2"], // Finished (only 1 when state > 2)
        ["Comparator", "$State", "$CircuitState", 0], // Circuit State (only 1 when state > 0)
        ["Comparator", "$State", "$SystemRequest", 0], // SystemRequest (only 1 when state > 0)
        ["Multiplexer", [0, 0, "$Konst1", 0], "$ValveOut", "$State"], // Valve (1 only in state 2)

        ["And", ["$SetOutputs", "$CircuitState"], "$CircuitState"],
        ["And", ["$SetOutputs", "$SystemRequest"], "$SystemRequest"],
      
        // announce finished when canceld or automatic finished
        ["Or", ["$LastShouldRun",  "$TriggerInpAutomaticRising"], "$LastShouldRunOrAutoRising"], // announce also when auto was triggered
        ["And", ["$Cancel", "$LastShouldRunOrAutoRising"], "$CancelFinished"],
        ["Or", ["$CancelFinished", "$CircuitFinished"], "$CircuitFinished"],

        // Cyclic trigger with different intervall for on/off-phase
        ["Multiplexer", ["$SendIntervalOff", "$SendIntervalOn"], "$SendInterval", "$ValveOut"],    // Select Interval
        ["Clocksignal","$KonstTrue","$Clk","$SendInterval"],

        // Start stopwatch to provide runtime and remaining time of circuit     
        ["Stopwatch", "$ValveOut", "$Time_sec_actual"],
        ["Polynomial", "$Konst1", "$Time_sec_remaining",["$AutoTime", "-$Time_sec_actual"]],
        ["Multiplexer", [0,"$Time_sec_remaining"], "$Time_sec_remaining", "$AutomaticModeActive"], // set to remaining to zero to not irritate user when running manual

        // Set remaining time to automatic time, when off. 
        ["Latch","$AutoTime_global","$Time_sec_remaining","-$CircuitState",0],

        // convert to minutes
        ["Ratio", "$Time_sec_actual", "$Time_min_actual", "$Konst60"],
        ["Ratio", "$Time_sec_remaining", "$Time_min_remaining", "$Konst60"],

        // Reset Trigger
        ["Multiplexer", [0, "$TriggerAutomaticSaved", "$TriggerAutomaticSaved", "$TriggerAutomaticSaved"], "$TriggerAutomaticSaved", "$State"],

        // set last variables
        ["And", ["$ShouldRun"], "$LastShouldRun"],

        // Reset Inputs
        ["Latch", "$KonstFalse", "$TriggerInpAutomaticIn1", "$KonstTrue", 0],
        ["Latch", "$KonstFalse", "$TriggerInpAutomaticIn2", "$KonstTrue", 0],
        ["Latch", "$KonstFalse", "$TriggerInpStartIn1", "$KonstTrue", 0],
        ["Latch", "$KonstFalse", "$TriggerInpStartIn2", "$KonstTrue", 0],
        ["Latch", "$KonstFalse", "$TriggerInpStopIn1", "$KonstTrue", 0],
        ["Latch", "$KonstFalse", "$TriggerInpStopIn2", "$KonstTrue", 0]
  ]
}

DIFF für die Anpassungen zu deiner Version Robert:

Code: Alles auswählen

Index: Irrigation_CircuitControl.twl
===================================================================
--- Irrigation_CircuitControl.twl	(revision 78)
+++ Irrigation_CircuitControl.twl	(revision 79)
@@ -15,7 +15,7 @@
         ["Trigger Stop 1", "(RISING) Stops any active cycle", "$TriggerInpStopIn1", "c"],
         ["Trigger Stop 2", "(RISING) Stops any active cycle", "$TriggerInpStopIn2", "c"],
         ["Automatic Time [min]", "(T_s) Time of one irrigation cycle", "$AutoTime_min", "u"],
-        ["Global Factor", "Factor to scale circuit timer", "$GlobalFactor", "u"],
+        ["Global Factor", "Factor to scale circuit timer", "$GlobalFactor", "c"],
         ["System OK Feedback", "(0/1) Loopback of SystemControl", "$SystemOk", "a"],
         ["Send interval on [s]", "Send outputs with ct periodically during circuit on", "$SendIntervalOn", "u"],
         ["Send interval off [s]", "Send outputs with ct periodically during circuit off", "$SendIntervalOff", "u"],
@@ -83,6 +83,7 @@
         ["$Clk", "bool", false],
         ["$GlobalFactor", "float", 1.0],   // Global factor on circuit time, used if triggered manually or by auto2
         ["$GlobalFactorLim", "float", 1.0], 
+        ["$GlobalFactorValid", "bool", false],
         ["$TriggerNoFactor", "bool", false],
         ["$TriggerWithFactor", "bool", false],
         ["$TriggerAutomaticSaved", "bool", false],
@@ -101,15 +102,17 @@
         // calculate time in seconds
         ["Polynomial", "$Konst60", "$AutoTime_sec",["$Konst0", "$AutoTime_min"]],
         // Limit factor
-        ["Limiter","$GlobalFactor","$GlobalFactorLim",0,["$Konst005", "$Konst2"]],
+        ["Limiter","$GlobalFactor","$GlobalFactorLim","$GlobalFactorValid",["$Konst005", "$Konst2"]],
         // calculate time with global factor
         ["Polynomial", "$GlobalFactorLim", "$AutoTime_global",["$Konst0", "$AutoTime_sec"]],
         
         // take over current circuit time
-        ["Or", ["$TriggerInpStartIn1","$TriggerInpStartIn2","$TriggerInpAutomaticIn2"], "$TriggerNoFactor"],
+        ["Or", ["$TriggerInpStartIn1","$TriggerInpStartIn2"], "$TriggerNoFactor"],
         ["And", ["$TriggerNoFactor","-$State"], "$TriggerNoFactor"],
         ["Latch","$AutoTime_sec","$AutoTime","$TriggerNoFactor",1],
-        ["And", ["$TriggerInpAutomaticIn1","-$State"], "$TriggerWithFactor"],
+
+        ["Or", ["$TriggerInpAutomaticIn1", "$TriggerInpAutomaticIn2"],"$TriggerWithFactor"],
+        ["And", ["$TriggerWithFactor","-$State"], "$TriggerWithFactor"],
         ["Latch","$AutoTime_global","$AutoTime","$TriggerWithFactor",1],
 
         // calculate inputs
@@ -119,7 +122,7 @@
       
         // calculate cancel state
         ["Or", ["$VAR<Inhibit?>"], "$Inhibit"],
-        ["Or", ["$Inhibit", "$TriggerInpStopRising"], "$Cancel"],
+        ["Or", ["$Inhibit", "$TriggerInpStopRising", "-$GlobalFactorValid"], "$Cancel"],
 
         // calculate manual state
         ["Or",["$TriggerInpStartRising", "$ManualOn"],"$ManualOn"],
@@ -135,13 +138,6 @@
         // Set timer if automatic mode was triggered
         ["And", ["$TriggerAutomaticSaved", "$SystemOk"], "$TimerShouldRun"], // start timer only if also system ok was announced
         ["Monoflop", "$TimerShouldRun", "$Cancel", "$TimerActive", "$AutoTime", 2], // not retriggerable, rising-edge controlled, reset on cancel
-
-        // Start stopwatch to provide runtime and remaining time of circuit     
-        ["Stopwatch", "$TimerActive", "$Time_sec_actual"],
-        ["Polynomial", "$Konst1", "$Time_sec_remaining",["$AutoTime", "-$Time_sec_actual"]],
-        // convert to minutes
-        ["Ratio", "$Time_sec_actual", "$Time_min_actual", "$Konst60"],
-        ["Ratio", "$Time_sec_remaining", "$Time_min_remaining", "$Konst60"],
      
         // build target state (run or not)
         ["Or", ["$TriggerAutomaticSaved", "$TimerActive"], "$AutomaticModeActive"],
@@ -201,10 +197,18 @@
         ["Multiplexer", ["$SendIntervalOff", "$SendIntervalOn"], "$SendInterval", "$ValveOut"],    // Select Interval
         ["Clocksignal","$KonstTrue","$Clk","$SendInterval"],
 
-        // Set remaining time zero, when off. 
-        ["Latch","$Konst0","$Time_sec_remaining","-$CircuitState",0],
-        ["Latch","$Konst0","$Time_min_remaining","-$CircuitState",0],
+        // Start stopwatch to provide runtime and remaining time of circuit     
+        ["Stopwatch", "$ValveOut", "$Time_sec_actual"],
+        ["Polynomial", "$Konst1", "$Time_sec_remaining",["$AutoTime", "-$Time_sec_actual"]],
+        ["Multiplexer", [0,"$Time_sec_remaining"], "$Time_sec_remaining", "$AutomaticModeActive"], // set to remaining to zero to not irritate user when running manual
 
+        // Set remaining time to automatic time, when off. 
+        ["Latch","$AutoTime_global","$Time_sec_remaining","-$CircuitState",0],
+
+        // convert to minutes
+        ["Ratio", "$Time_sec_actual", "$Time_min_actual", "$Konst60"],
+        ["Ratio", "$Time_sec_remaining", "$Time_min_remaining", "$Konst60"],
+
         // Reset Trigger
         ["Multiplexer", [0, "$TriggerAutomaticSaved", "$TriggerAutomaticSaved", "$TriggerAutomaticSaved"], "$TriggerAutomaticSaved", "$State"],
 


Fällt euch noch was ein was wir da anpassen wollen? :)
Zuletzt geändert von MiniMaxV2 am Mi Mai 11, 2022 8:35 pm, insgesamt 1-mal geändert.
LG
Hans Martin
timberwolf413 (950Q) - VPN offen - reboot erlaubt / timberwolf610 (950Q) - VPN offen - reboot erlaubt

Robert_Mini
Reactions:
Beiträge: 3741
Registriert: So Aug 12, 2018 8:44 am
Hat sich bedankt: 1164 Mal
Danksagung erhalten: 2058 Mal

#70

Beitrag von Robert_Mini »

Hallo Hans Martin!

Ich glaube jetzt wird's ein wenig kompliziert. Dazu unten ein Bild von der Visualisierung.

Bisher war das Verhalten bei mir wie folgt:
- GlobalFactor_Auto und GF_Manuell, beide über den Sequenzer geschleift
- Beim manuellen Trigger eines einzelnen Kreises wurde KEIN Factor berücksichtigt = Faktor 1.

Ich kann dem Wunsch aber durchaus was abgewinnen, dass der Factor immer berücksichtigt wird. Das bedeutet aber:
- Der Faktor darf nicht über den Sequencer geschleift werden
- Der Circuit Baustein braucht 2 Eingänge für Faktoren Auto/Man (Factor1 und Factor2)
- Beim Start mit TriggerAutomaticIn1 wird Factor1 verwendet, bei TriggerAutomaticIn2 wird Factor 2 verwendet

Ich finde das durchaus eine gute Lösung: man hat nur 1 manuellen Faktor auf der Visu und dieser wird in Man-Sequenz und Man-Trigger eines Kreises verwendet.

lg
Robert
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Robert_Mini am Mi Mai 11, 2022 9:41 pm, insgesamt 1-mal geändert.
Timberwolf Server 2500 / #117 (VPN offen + reboot nach Rückfrage) / zusätzlich: 3500M/#935, 3500L/#1297
Antworten

Zurück zu „Zusätzliche Logikbausteine“