Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS 128 Zufälle, oder ein LBS ohne Ausgangsboxen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    LBS 128 Zufälle, oder ein LBS ohne Ausgangsboxen



    Was macht der LBS
    Erstmal stupide bei einem Trigger an E1 128 Zufallszahlen berechnen Soweit nichts Spektakuläres. Trägt man jedoch an E3 eine iKO ID ein, die noch nicht existiert und E7 ist 1, dann legt der Baustein 129 iKo mit den Namen des Ausganges mit Präfix und Suffix (die sind optional) an. Ab sofort schreibt der LBS direkt auf diese iKO. Ausgangsboxen sind nicht notwendig. Nur der Ausgang 129 schreibt zwangsläufig auf den Ausgang, so wie wir es gewohnt sind.
    Die iKO des LBS können dann an weitere LBS am Eingang übergeben werden, und triggern diese folgenden LBS.

    Wie funktioniert der LBS?
    Der LBS prüft ob ein iKO im Projekt mit der Start ID von E3 im Projekt existiert, und ob es den gleichen Namen hat. (Präfix + Name Ausgang A1 + Suffix). Schlägt diese Prüfung fehl, wird direct conect deaktiviert, und der LBS schreibt normal auf die Ausgänge.
    Ist die IKO ID noch nicht im Projekt, werden die notwendigen iKO angelegt.
    Dabei wird geprüft, ob die Folder ID existiert, und ob die folder ID ein Unterordner von „Interne Ko’s“ ist. Wenn nicht, werden die iKO im Ordner „Interne Ko’s“ angelegt.

    Was kann man falsch machen?
    Den Eingang E3 zur Laufzeit ändern. Dann schlägt die Prüfung, ob das iKO existiert fehl, und der LBS deaktiviert direct conect. Wenn man eine iKO ID einträgt, die noch nicht existiert, legt der LBS die IKO erneut an.
    E5 / E6 zur Laufzeit ändern. Dann schlägt die Prüfung, ob das iKO existiert fehl, und der LBS deaktiviert direct conect.
    Die Bausteinnummer muss in der Variable 101 eingetragen sein.

    Als Hilfe gibt es dann folgenden LBS, der das letzte genutzte iKO im Projekt ermittelt, und an A1 ausgibt. Die nächste freie ID wird an A2 ausgegeben. A2 von diesen LBS nicht mit dem LBS mit direct conect verbinden.
    Code:
    ###[DEF]###
    [name                  =             check iko]
    
    [e#1                      =             trigger]
    
    [a#1                      =             last IKO]
    [a#2                      =             next IKO]
    ###[/DEF]###
    
    
    ###[HELP]###
    Letztes benutztes IKO an A1
    nächstes freies IKO an A2
    ###[/HELP]###
    
    
    ###[LBS]###
    <?
    function LB_LBSID($id) {
                    if ($E=logic_getInputs($id)) {
                                   if ($E[1]['refresh']==1) {
                                                   $mysqli = new mysqli('localhost', 'root', '', 'edomiProject');
                                                   $query = "Select id,ga From editKo";
                                                   $result = $mysqli->query($query);
                                                   mysqli_close($mysqli);
                                                   while ($row = $result->fetch_array(MYSQLI_ASSOC)){
                                                                   $iko[$row['id']] = $row['ga'];
                                                   }
                                                   $key = max(array_keys($iko));
                                                   //$max = $iko[$key];
                                                   logic_setOutput($id,1,$key);
                                                   logic_setOutput($id,2,$key+1);
                                   }
                    }
    }
    ?>
    ###[/LBS]###
    
    
    ###[EXEC]###
    <?
    ?>
    ###[/EXEC]###
    Und hier der eigentliche Baustein: Der LBS hat eine fiktive Nummer (19099975) zum testen.
    Code:
    ###[DEF]###
    [name        = 128 Zufälle    ]
    
    [e#1        =Trigger    ]
    [e#2        =Config        #init=0        ]
    [e#3        =start IKO                ]
    [e#4        =folderid    #init=31    ]
    [e#5        =Präfix                    ]
    [e#6        =Suffix                    ]
    [e#7        =directconect #init=1    ]
    
    
    [a#1        =Ausg.  1         ]
    [a#2        =Ausg.  2        ]
    [a#3        =Ausg.  3        ]
    [a#4        =Ausg.  4        ]
    [a#5        =Ausg.  5        ]
    [a#6        =Ausg.  6        ]
    [a#7        =Ausg.  7        ]
    [a#8        =Ausg.  8        ]
    [a#9        =Ausg.  9        ]
    [a#10        =Ausg.  10        ]
    [a#11        =Ausg.  11        ]
    [a#12        =Ausg.  12        ]
    [a#13        =Ausg.  13        ]
    [a#14        =Ausg.  14        ]
    [a#15        =Ausg.  15        ]
    [a#16        =Ausg.  16        ]
    [a#17        =Ausg.  17        ]
    [a#18        =Ausg.  18        ]
    [a#19        =Ausg.  19        ]
    [a#20        =Ausg.  20        ]
    [a#21        =Ausg.  21        ]
    [a#22        =Ausg.  22        ]
    [a#23        =Ausg.  23        ]
    [a#24        =Ausg.  24        ]
    [a#25        =Ausg.  25        ]
    [a#26        =Ausg.  26        ]
    [a#27        =Ausg.  27        ]
    [a#28        =Ausg.  28        ]
    [a#29        =Ausg.  29        ]
    [a#30        =Ausg.  30        ]
    [a#31        =Ausg.  31        ]
    [a#32        =Ausg.  32        ]
    [a#33        =Ausg.  33        ]
    [a#34        =Ausg.  34        ]
    [a#35        =Ausg.  35        ]
    [a#36        =Ausg.  36        ]
    [a#37        =Ausg.  37        ]
    [a#38        =Ausg.  38        ]
    [a#39        =Ausg.  39        ]
    [a#40        =Ausg.  40        ]
    [a#41        =Ausg.  41        ]
    [a#42        =Ausg.  42        ]
    [a#43        =Ausg.  43        ]
    [a#44        =Ausg.  44        ]
    [a#45        =Ausg.  45        ]
    [a#46        =Ausg.  46        ]
    [a#47        =Ausg.  47        ]
    [a#48        =Ausg.  48        ]
    [a#49        =Ausg.  49        ]
    [a#50        =Ausg.  50        ]
    [a#51        =Ausg.  51        ]
    [a#52        =Ausg.  52        ]
    [a#53        =Ausg.  53        ]
    [a#54        =Ausg.  54        ]
    [a#55        =Ausg.  55        ]
    [a#56        =Ausg.  56        ]
    [a#57        =Ausg.  57        ]
    [a#58        =Ausg.  58        ]
    [a#59        =Ausg.  59        ]
    [a#60        =Ausg.  60        ]
    [a#61        =Ausg.  61        ]
    [a#62        =Ausg.  62        ]
    [a#63        =Ausg.  63        ]
    [a#64        =Ausg.  64        ]
    [a#65        =Ausg.  65        ]
    [a#66        =Ausg.  66        ]
    [a#67        =Ausg.  67        ]
    [a#68        =Ausg.  68        ]
    [a#69        =Ausg.  69        ]
    [a#70        =Ausg.  70        ]
    [a#71        =Ausg.  71        ]
    [a#72        =Ausg.  72        ]
    [a#73        =Ausg.  73        ]
    [a#74        =Ausg.  74        ]
    [a#75        =Ausg.  75        ]
    [a#76        =Ausg.  76        ]
    [a#77        =Ausg.  77        ]
    [a#78        =Ausg.  78        ]
    [a#79        =Ausg.  79        ]
    [a#80        =Ausg.  80        ]
    [a#81        =Ausg.  81        ]
    [a#82        =Ausg.  82        ]
    [a#83        =Ausg.  83        ]
    [a#84        =Ausg.  84        ]
    [a#85        =Ausg.  85        ]
    [a#86        =Ausg.  86        ]
    [a#87        =Ausg.  87        ]
    [a#88        =Ausg.  88        ]
    [a#89        =Ausg.  89        ]
    [a#90        =Ausg.  90        ]
    [a#91        =Ausg.  91        ]
    [a#92        =Ausg.  92        ]
    [a#93        =Ausg.  93        ]
    [a#94        =Ausg.  94        ]
    [a#95        =Ausg.  95        ]
    [a#96        =Ausg.  96        ]
    [a#97        =Ausg.  97        ]
    [a#98        =Ausg.  98        ]
    [a#99        =Ausg.  99        ]
    [a#100        =Ausg.  100        ]
    [a#101        =Ausg.  101        ]
    [a#102        =Ausg.  102        ]
    [a#103        =Ausg.  103        ]
    [a#104        =Ausg.  104        ]
    [a#105        =Ausg.  105        ]
    [a#106        =Ausg.  106        ]
    [a#107        =Ausg.  107        ]
    [a#108        =Ausg.  108        ]
    [a#109        =Ausg.  109        ]
    [a#110        =Ausg.  110        ]
    [a#111        =Ausg.  111        ]
    [a#112        =Ausg.  112        ]
    [a#113        =Ausg.  113        ]
    [a#114        =Ausg.  114        ]
    [a#115        =Ausg.  115        ]
    [a#116        =Ausg.  116        ]
    [a#117        =Ausg.  117        ]
    [a#118        =Ausg.  118        ]
    [a#119        =Ausg.  119        ]
    [a#120        =Ausg.  120        ]
    [a#121        =Ausg.  121        ]
    [a#122        =Ausg.  122        ]
    [a#123        =Ausg.  123        ]
    [a#124        =Ausg.  124        ]
    [a#125        =Ausg.  125        ]
    [a#126        =Ausg.  126        ]
    [a#127        =Ausg.  127        ]
    [a#128        =Ausg.  128        ]
    [a#129        =Status dc    ]
    
    [v#1        =0            ]    //Wert des Einganges vom letzten Durchlauf
    
    [v#100=1.0                ]    //Version (noch nicht verwendet)
    [v#101=19099975            ]    //LBS ID
    
    [v#200        =0            ]    //id des Start-IKO
    [v#201        =0            ]    //erstes erstelltes IKO
    [v#202        =0            ]    //letztes erstelltes IKO
    
    ###[/DEF]###
    
    
    ###[HELP]###
    E2 = 0 LBS schreibt wenn möglich auf IKO, sonst konventionell auf Ausgang
    E2 = 1 LBS schreibt auf Ausgang und IKO gleichzeitig
    
    A129 schreibt nicht auf DC sondern nur auf Ausgangsbox (test)
    ###[/HELP]###
    
    
    ###[LBS]###
    <?
    function LB_LBSID($id) {
        if ($E=logic_getInputs($id)) {
            $bs = getLogicElementVar($id,101);
            $ikoNr = $E[3]['value'] ;
            $folderid = $E[4]['value']; //default 31        
            $prä = $E[5]['value'];
            $suff = $E[6]['value'];
            $dc = $E[7]['value'];
    
            // Startbedingungen für LBS
            if ($E[1]['refresh']==1 ) {
    
                //Die check IKO Routine
                ##################################################################################################################################
                if($ikoNr !='' || $dc == 1){
                        $mysqli = new mysqli('localhost', 'root', '', 'edomiProject');
                        //Ausgangsbezeichner aus DB holen:
                        $query = "Select defout,id From editLogicElementDef Where id =" .$bs;
                                $result = $mysqli->query($query);
                                mysqli_close($mysqli);
                                    while ($row = $result->fetch_array(MYSQLI_ASSOC))
                                    {
                                        $out = $row['defout'];
                                        }
                                        if (count($out)<1)
                                        {
                                            //LBS Nummer nicht bekannt > error => Abbruch;
                                            $dc = 1;
                                            goto lbs;
                                            }
                                            //Ausgänge Namen auftrennen
                                            $teile = explode(chr(29), $out); //chr(29) Start
                                            $teile = array_filter($teile);
                                            foreach($teile as $n){
                                                $Ausg = explode(chr(30), $n); //chr(30) Trenner Eingangnummer / Bezeichner
                                                $arr[$Ausg[0]] = $Ausg[1]; // Array mit Key = Ausgangsnummer / Value = Bezeichner
                                                }
                                                $mysqli = new mysqli('localhost', 'root', '', 'edomiProject');
                                                $query = "Select id,ga,name From editKo ORDER BY ga ASC";
                                                $result = $mysqli->query($query);
                                                mysqli_close($mysqli);
                                                $name = $arr[1];
                                                if ($prä != '') $name = $prä ." " .$name;
                                                if ($suff != '') $name = $name . " ".$suff ;
                                                while ($row = $result->fetch_array(MYSQLI_ASSOC)){
                                                    if ($row['ga'] == $ikoNr && $row['name'] != $name){
                                                        //IKO existiert, hat aber andere Bezeichnung => dc deaktivieren
                                                        $dc = 0;
                                                        goto lbs;
                                                        }
                                                        if ($row['ga'] == $ikoNr && $row['name'] == $name){
                                                            // ID erstes verwendetes IKO in Variable
                                                            setLogicElementVar($id,200,$row['id']);
                                                            goto lbs; //LBS-Teil ausführen
                                                            }
                                                }
                                                //folder ID Prüfen wenn folderid nicht existiert IKO in "interne KO's" (id31) erstellen
                                                $mysqli = new mysqli('localhost', 'root', '', 'edomiProject');
                                                $query = "Select path,id From editRoot Where path Like '/30/31%'";
                                                $result = $mysqli->query($query);
                                                mysqli_close($mysqli);
                                                while ($row = $result->fetch_array(MYSQLI_ASSOC)){
                                                    $folder[] = $row['id'];
                                                    }
                                                    if(in_array($folderid,$folder)){
                                                        $folderid = $folderid;
                                                        }else{$folderid = 31;}
    
                                                //iko existiert nicht => erstellen
                                                $mysqli = new mysqli('localhost', 'root', '', 'edomiProject');
                                                foreach($arr as $nr => $bez){
                                                    if ($bez == '')$bez = 'A'.$nr;
                                                    if ($prä != '') $bez = $prä ." " .$bez;
                                                    if ($suff != '') $bez = $bez . " ".$suff ;
                                                    $query = "INSERT INTO `editKo` (`id`,`name`, `folderid`, `ga`, `gatyp`, `valuetyp`, `value`, `defaultvalue`, `initscan`, `initsend`, `requestable`, `remanent`, `vmin`, `vmax`, `vstep`, `vlist`, `vcsv`, `text`) VALUES  ('$ikoNr','$bez', '$folderid', '$ikoNr', 2, 0, NULL, NULL, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL)";
                                                    mysqli_query($mysqli, $query);
                                                    $pool[]= $ikoNr;
                                                    $ikoNr++;
                                                    }
                                                    mysqli_close($mysqli);
    
                                                    setLogicElementVar($id,201,min($pool));// Ausgabe erstes erstelltes IKO
                                                    setLogicElementVar($id,202,max($pool));// Ausgabe letztes erstelltes IKO
                } else {$dc=0;}
    
                                                    ##################################################################################################################################
    
                                                    lbs:
                                                    //Der eigentliche Teil des LBS:
    
                                                    $startiko = getLogicElementVar($id,200); //die IKO weden über die ID angesprochen (ga Bezeichner und id können unterschiedlich sein)
                                                    if ($E[2]['value'] == 1){ //LBS schreibt auf Ausgang und iKO gleichzeitig (wenn die iKO Prüfung fehlschlägt, wird nur der Ausgang gesetzt)
                                                        for ($x = 0 ; $x <= 127 ; $x ++){
                                                            //Direktes ansprechen der iKO
                                                            //A1 = $startiko A2 = $startiko +1 usw
                                                            $dummy = rand(0,500);
                                                            if($dc==1){writeGA($startiko,$dummy);
                                                            $startiko++;}
                                                            logic_setOutput($id,$x+1,$dummy);
                                                        }
    
                                                    }else{ // LBS schreibt vorrangig auf iKO. Schlägt die iKO Routine fehl (iKO existiert, jedoch anderer Name als erwartet) schreibt der LBS auf die Ausgänge
                                                        for ($x = 0 ; $x <= 127 ; $x ++){ // Hier wird entweder auf das iKo geschrieben (dc = 1) oder auf den Ausgang
                                                            $dummy = rand(0,500);
                                                            if ($dc == 1){ //schreibe direkt auf IKO
                                                                writeGA($startiko,$dummy);
                                                                $startiko++;
                                                                }else{ //schreibe konventionell auf Ausgang
                                                                    logic_setOutput($id,$x+1,$dummy);
                                                                    }
                                                        }
                                                    }
                                                    logic_setOutput($id,129,$dc); //Status dc auf Ausgang
                                                    ende:
                                                    //Abbruch
            }
        }
    }
    
    ?>
    ###[/LBS]###
    
    
    ###[EXEC]###
    <?
    
    ?>
    ###[/EXEC]###
    Falls jetzt noch jemand den Code optimieren möchte,gerne.
    Sonst könnte der LBS in ähnlicher Form als Vorlage für Comunity LBS dienen, die eine ansehnliche Anzahl an Ausgängen besitzen.
    Zuletzt geändert von vento66; 26.02.2017, 08:46.

    #2
    Erstmal interessantes Konzept
    Ich habe mal 2 Fragen...

    1. Wozu brauchst du die 128 Zufälle?! Mir fällt spontan nichts ein...

    2. Hast du die einfach die DB angeschaut um rauszufinden in welche Tabellen du schreiben must oder gibts da irgendwo Doku für?

    Gruß
    Michael
    Gruß
    Michael

    Kommentar


      #3
      Der LBS dient nur zu Demozwecken, wie ein LBS direkt auf ein IKO schreiben kann. Die Doku gibt es noch nicht, ist aber in der Datenbank selbsterklärend.

      Kommentar

      Lädt...
      X