Habe gerade mein Posting oben nochmal editiert, nachdem ich das nochmal im LE analysiert habe. Damit kommen wir nun dem Ziel schon sehr nahe.
Nachstehend noch die Umsetzung des Sequenzers (mit der Verteilung des GlobalFactors).
Code: Alles auswählen
/**
* File: Irrigation_Sequencer.twl V1.0 BETA 1
* Logic for Garden irrigation. This module is the sequencer which controls an automatic run of all circuits
* Author: Hans Martin
* 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": [
["Start Cycle", "(RISING) Trigger to start an automatic irrigation cycle", "$TriggerInpStart", "c"],
["Start Man Cycle", "(RISING) Trigger to start an automatic irrigation cycle", "$TriggerInpMan", "c"],
["Stop", "(RISING) Trigger to stop an automatic irrigation cycle", "$TriggerInpStop", "c"],
["Next Circuit", "(RISING) Trigger to step to next circuit", "$TriggerInpNext", "a"],
["Number of Circuits", "(0-20) Configure the number of active circuits", "$NumberOfSteps", "u"],
["Global Factor Auto", "Global Factor in Automatic Mode", "$GlobalFactorAuto", "u"],
["Global Factor Man", "Global Factor in Manual Mode", "$GlobalFactorMan", "u"],
["Inhibit", "", "$VAR<Inhibit?>", "c"]
],
"Output": [
["Global Factor", "Global scale factor for circuit time", "$GlobalFactorOut", "c"],
["Sequencer Active", "(0/1) State of sequencer", "$SequencerActive", "c"],
["Sequencer Number", "(R+) Current active output number", "$SequencerNumber", "c"],
["Stop", "(RISING) Signal to stop all irrigation circuits", "$SequencerStop", "c"],
// repeat as many time as desired irrigation circuits
["Channel 1", "(0/1) Trigger for irrigation circuit", "$Circuit_1_?", "c"],
["Channel 2", "(0/1) Trigger for irrigation circuit", "$Circuit_2_?", "c"],
["Channel 3", "(0/1) Trigger for irrigation circuit", "$Circuit_3_?", "c"],
["Channel 4", "(0/1) Trigger for irrigation circuit", "$Circuit_4_?", "c"],
["Channel 5", "(0/1) Trigger for irrigation circuit", "$Circuit_5_?", "c"],
["Channel 6", "(0/1) Trigger for irrigation circuit", "$Circuit_6_?", "c"],
["Channel 7", "(0/1) Trigger for irrigation circuit", "$Circuit_7_?", "c"],
["Channel 8", "(0/1) Trigger for irrigation circuit", "$Circuit_8_?", "c"],
["Channel 9", "(0/1) Trigger for irrigation circuit", "$Circuit_9_?", "c"],
["Channel 10", "(0/1) Trigger for irrigation circuit", "$Circuit_10_?", "c"],
["Channel 11", "(0/1) Trigger for irrigation circuit", "$Circuit_11_?", "c"],
["Channel 12", "(0/1) Trigger for irrigation circuit", "$Circuit_12_?", "c"],
["Channel 13", "(0/1) Trigger for irrigation circuit", "$Circuit_13_?", "c"],
["Channel 14", "(0/1) Trigger for irrigation circuit", "$Circuit_14_?", "c"],
["Channel 15", "(0/1) Trigger for irrigation circuit", "$Circuit_15_?", "c"],
["Channel 16", "(0/1) Trigger for irrigation circuit", "$Circuit_16_?", "c"],
["Channel 17", "(0/1) Trigger for irrigation circuit", "$Circuit_17_?", "c"],
["Channel 18", "(0/1) Trigger for irrigation circuit", "$Circuit_18_?", "c"],
["Channel 19", "(0/1) Trigger for irrigation circuit", "$Circuit_19_?", "c"],
["Channel 20", "(0/1) Trigger for irrigation circuit", "$Circuit_20_?", "c"]
],
"Level": [
// Inputs
["$VAR<Inhibit?>","bool",false],
["$TriggerInpStart","bool",false],
["$TriggerInpMan","bool",false],
["$TriggerInpStop","bool",false],
["$TriggerInpNext","bool",false],
// *MR*:
["$GlobalFactorAuto","float",1.0],
["$GlobalFactorMan","float",1.0],
["$GlobalFactorOut","float",1.0],
// Outputs
["$SequencerActive","bool",false], // also used as internal state
["$SequencerNumber","int",0],
["$SequencerStop","bool",false],
// Channels
// Configure number of circuits
["$NumberOfSteps","int",0],
// channel outs - repeat as many irrigation circuits are configured above
["$Circuit_1_","bool",false],
["$Circuit_2_","bool",false],
["$Circuit_3_","bool",false],
["$Circuit_4_","bool",false],
["$Circuit_5_","bool",false],
["$Circuit_6_","bool",false],
["$Circuit_7_","bool",false],
["$Circuit_8_","bool",false],
["$Circuit_9_","bool",false],
["$Circuit_10_","bool",false],
["$Circuit_11_","bool",false],
["$Circuit_12_","bool",false],
["$Circuit_13_","bool",false],
["$Circuit_14_","bool",false],
["$Circuit_15_","bool",false],
["$Circuit_16_","bool",false],
["$Circuit_17_","bool",false],
["$Circuit_18_","bool",false],
["$Circuit_19_","bool",false],
["$Circuit_20_","bool",false],
// Constants
["$Konst1", "int", 1],
["$KonstFalse", "bool", false],
["$KonstTrue", "bool", true],
["$Timeout", "int", 10],
// Internals
["$CurrentStep","int",0],
["$NextStep","int",0],
["$StepOverflow", "bool", false],
["$ResetSystem", "bool", false],
["$Inhibit","bool",false],
["$TriggerInpStartRisingAuto","bool",false],
["$TriggerInpStartRisingMan","bool",false],
["$TriggerInpStartRising","bool",false],
["$TriggerInpStopRising","bool",false],
["$TriggerInpNextRising","bool",false],
// *RM*:
["$TriggerSaveStartMode","bool",false],
["$TriggerNext","bool",false],
["$TriggerNextMan","bool",false],
["$TriggerNextAuto","bool",false]
],
"Module": [
["Or", ["$VAR<Inhibit?>"], "$Inhibit"],
// calculate rising edges
["And", ["$TriggerInpStart", "-$SequencerActive"], "$TriggerInpStartRisingAuto"],
["And", ["$TriggerInpMan", "-$SequencerActive"], "$TriggerInpStartRisingMan"],
["Or", ["$TriggerInpStartRisingAuto", "$TriggerInpStartRisingMan"], "$TriggerInpStartRising"],
["And", ["$TriggerInpStop", "$SequencerActive"], "$TriggerInpStopRising"],
["And", ["$TriggerInpNext", "$SequencerActive"], "$TriggerInpNextRising"],
// *MR*: Save manual trigger
["Latch", "$KonstTrue", "$TriggerSaveStartMode", "$TriggerInpStartRisingMan", 1],
["Latch", "$KonstFalse", "$TriggerSaveStartMode", "$TriggerInpStartRisingAuto", 1],
// calculate start of system
["Multiplexer", ["$SequencerActive", "$Konst1"], "$SequencerActive", "$TriggerInpStartRising"],
// calculate next step
["Polynomial", "$Konst1", "$NextStep", ["$CurrentStep", "$Konst1"] ], // ++$CurrentStep
["Comparator", "$NextStep", "$StepOverflow", "$NumberOfSteps"],
["Multiplexer", ["$NextStep", 0], "$NextStep", "$StepOverflow"],
// set next step when next was triggered or system was started
["Multiplexer", ["$CurrentStep","$NextStep"], "$CurrentStep", "$TriggerInpNextRising"],
["Multiplexer", ["$CurrentStep","$NextStep"], "$CurrentStep", "$TriggerInpStartRising"],
// *MR*: Map factor to output
["Or", ["$TriggerInpNextRising", "$TriggerInpStartRising"], "$TriggerNext"],
["And", ["$TriggerNext", "$TriggerSaveStartMode"], "$TriggerNextMan"],
["And", ["$TriggerNext", "-$TriggerSaveStartMode"], "$TriggerNextAuto"],
["Latch", "$GlobalFactorAuto", "$GlobalFactorOut", "$TriggerNextAuto", 0],
["Latch", "$GlobalFactorMan", "$GlobalFactorOut", "$TriggerNextMan", 0],
// reset current step when stop was issued or inhibit was set
["Or", ["$TriggerInpStopRising", "$Inhibit"], "$ResetSystem"],
["And", ["$ResetSystem", "$SequencerActive"], "$ResetSystem"], // only reset when system runs
["Multiplexer", ["$CurrentStep",0], "$CurrentStep", "$ResetSystem"],
// start timer to reset stop output later on
["Monoflop","$ResetSystem", 0, 0,"$Timeout",2],
// write common outputs
["Polynomial", 0, "$SequencerNumber", ["$CurrentStep"]],
["Multiplexer", [0, "$Konst1"], "$SequencerStop", "$ResetSystem"],
["Multiplexer", [0, "$SequencerActive"], "$SequencerActive", "$CurrentStep"],
// Reset Inputs
["Latch", "$KonstFalse", "$TriggerInpStart", "$KonstTrue", 0],
["Latch", "$KonstFalse", "$TriggerInpMan", "$KonstTrue", 0],
["Latch", "$KonstFalse", "$TriggerInpStop", "$KonstTrue", 0],
["Latch", "$KonstFalse", "$TriggerInpNext", "$KonstTrue", 0],
// write circuit outputs
// copy as many circuit exists. Put a zero in front of $Konst1 for each new step.
["Multiplexer", [0, "$Konst1", 0], "$Circuit_1_", "$CurrentStep"],
["Multiplexer", [0, 0, "$Konst1", 0], "$Circuit_2_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, "$Konst1", 0], "$Circuit_3_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, "$Konst1", 0], "$Circuit_4_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_5_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_6_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_7_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_8_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_9_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_10_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_11_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_12_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_13_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_14_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_15_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_16_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_17_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_18_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_19_", "$CurrentStep"],
["Multiplexer", [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "$Konst1", 0], "$Circuit_20_", "$CurrentStep"]
]
}