Ankündigung

Einklappen
Keine Ankündigung bisher.

Kurvenberechnung

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

    #16
    Also quasi die "Zwischenbereiche" zwischen zwei Angaben/Punkten sollen schon linear sein.
    Beispiel aus meinem hs:

    Rollo.png

    Kommentar


      #17
      Könnte mir evtl. jemand einen Denkanstoß geben was den LBS angeht? ich hatte wie gesagt bisher mit PHP und LBS selbst schreiben quasi noch gar nichts am Hut....

      Kommentar


        #18
        Ich vermute von einem Denkanstoß wirst du kein PHP lernen. Daher wäre ein Einstieg in PHP vermutlich der beste Weg. Oder einfach das verwenden, was in Post #6 gepostet wurde, denn das ist ja bereits ein kompletter LBS.

        Kommentar


          #19
          Mathematisch solltest du mit der Geradengleichung anfangen und diese dann in PHP umsetzen:

          2019-04-17 14_25_07-Gerade durch zwei Punkte finden.png

          PHP-Code:
          function getZwischenwert($elevation1,$winkel1,$elevation2,$winkel2,$aktuelleElev){
              return (
          $winkel2-$winkel1)/($elevation2-$elevation1)*$aktuelleElev+($elevation2*$winkel1-$elevation1*$winkel2)/($elevation2-$elevation1);

          Gruß
          Stefan

          Kommentar


            #20
            Zitat von LeFreak Beitrag anzeigen
            Könnte mir evtl. jemand einen Denkanstoß geben was den LBS angeht? ich hatte wie gesagt bisher mit PHP und LBS selbst schreiben quasi noch gar nichts am Hut....


            Mal so ganz profan heruntergeschrieben. Ohne Prüfung der Eingabewerte und sonstigen Schnickschnack.
            Sobald ein Wert an E1 ankommt, triggert der Baustein. Ist E1<E10 wird der Wert aus E11 ausgegeben, ist E1>E40 wird der Wert aus E41 ausgegeben, also alles außerhalb der Definitionsmenge wird abgefangen. Werte dazwischen werden als gerundetes arithmetisches Mittel zurückgegeben.

            Selbst ohne PHP sollte man die Logik dahinter im Script erkennen können. Einzig die Berechnung ist vielleicht nicht so einfach zu lesen, da ich aus Faulheitsgründen die Formel durch Ausklammern vereinfacht habe:
            y=m*x+n (mit n=y1-m*x1)
            y=m*x+y1-m*x1
            y=m*(x-x1)+y1 (mit m=(y2-y1)/(x2-x1))
            y=(y2-y1)/(x2-x1)*(x-x1)+y1 entspricht der Formel im Script

            Dabei sind P1(x1/y1) und P2(x2/y2) jeweils die Intervallgrenzen unten und oben, sowie P(x/y) der gesuchte Punkt bei bekanntem x (Sonnenhöhe).

            Wenn du nun jahreszeitenabhängig die intervalle anders setzen willst, kannst du ja die Eingänge über andere KOs/Logikausgänge befüllen.


            Code:
            ###[DEF]###
            [name        =Interpolation Lamellenwinkel        ]
            [titel        =Lamellenwinkel berechnen            ]
            
            [e#1 TRIGGER=Sonnenhoehe_aktuell                 ]
            [e#10         =Intervallgrenze_1         #init=5            ]
            [e#11         =Lamellenwinkel_1         #init=10        ]
            [e#20         =Intervallgrenze_2         #init=24            ]
            [e#21         =Lamellenwinkel_2         #init=50        ]
            [e#30         =Intervallgrenze_3         #init=45            ]
            [e#31         =Lamellenwinkel_3         #init=30        ]
            [e#40         =Intervallgrenze_4         #init=65            ]
            [e#41         =Lamellenwinkel_4         #init=10        ]
            
            [a#1        =Lamellenwinkel                        ]
            ###[/DEF]###
            
            
            ###[HELP]###
            Dieser Baustein interpoliert auf linearen Teilstrecken den einzustellenden Lamellenwinkel.
            Eingänge EX0 definieren die Referenzhöhen und Eingänge EX1 die zugehörigen Winkel.
            
            Ausgang A1 gibt den interpolierten Lamellenwinkel als Ganzzahl gerundet zurück.
            ###[/HELP]###
            
            
            ###[LBS]###
            <?
            function LB_LBSID($id) {
                if ($E=logic_getInputs($id)) {
                    if ($E[1]['refresh']==1) {
                        if ($E[1]['value']<=$E[10]['value']) {
                            logic_setOutput($id,1,$E[11]['value']);
                        } elseif ($E[1]['value']<=$E[20]['value'] && $E[1]['value']>$E[10]['value']) {
                            logic_setOutput($id,1,round((($E[21]['value']-$E[11]['value'])/($E[20]['value']-$E[10]['value']))*($E[1]['value']-$E[10]['value'])+$E[11]['value']),0);
                        } elseif ($E[1]['value']<=$E[30]['value'] && $E[1]['value']>$E[20]['value']) {
                            logic_setOutput($id,1,round((($E[31]['value']-$E[21]['value'])/($E[30]['value']-$E[20]['value']))*($E[1]['value']-$E[20]['value'])+$E[21]['value']),0);
                        } elseif ($E[1]['value']<=$E[40]['value'] && $E[1]['value']>$E[30]['value']) {
                            logic_setOutput($id,1,(($E[41]['value']-$E[31]['value'])/($E[40]['value']-$E[30]['value']))*($E[1]['value']-$E[30]['value'])+$E[31]['value']);
                        } elseif ($E[1]['value']>$E[40]['value']) {
                            logic_setOutput($id,1,$E[41]['value']);
                        }
                    }
                }
            }
            ?>
            ###[/LBS]###
            
            
            ###[EXEC]###
            <?
            
            ?>
            ###[/EXEC]###
            Zuletzt geändert von noescape; 17.04.2019, 13:33.

            Kommentar


              #21
              Tausend Dank!!!!!! Wird getestet! Wenn ich irgendwann mal wieder Zeit habe, werde ich mich auf jeden Fall mal mit PHP befassen.

              Kommentar


                #22
                Wie gesagt, großartig PHP muss man dafür nicht können, einfach Vorhandenes kopieren und anpassen. Kannst ja mal versuchen, einen weiteren Zwischenpunkt zu definieren. In Edomi kann man ja sehr einfach einen Schreibtischtest durchführen.

                Edit: Sehe grad, dass ich in einer Zeile gar nicht gerundet hatte.

                Code:
                             } elseif ($E[1]['value']<=$E[40]['value'] && $E[1]['value']>$E[30]['value']) {                
                                 logic_setOutput($id,1,(($E[41]['value']-$E[31]['value'])/($E[40]['value']-$E[30]['value']))*($E[1]['value']-$E[30]['value'])+$E[31]['value']);
                muss ersetzt werden durch

                Code:
                  
                             } elseif ($E[1]['value']<=$E[40]['value'] && $E[1]['value']>$E[30]['value']) {                
                                 logic_setOutput($id,1,[B]round([/B](($E[41]['value']-$E[31]['value'])/($E[40]['value']-$E[30]['value']))*($E[1]['value']-$E[30]['value'])+$E[31]['value'])[B],0)[/B];
                Zuletzt geändert von noescape; 17.04.2019, 17:32.

                Kommentar

                Lädt...
                X