Seite 2 von 6

Re: [V4 IP5] Taupunkt berechnen

Verfasst: Di Dez 26, 2023 9:27 pm
von Robert_Mini
Achso:
Du musst beide Berechnungen ausführen, für >=0 das Ergebnis auf $td1 und für <0 auf $td2 schreiben.
Der Multiplexer wählt nur aus.

In Einzellogikzellwn könnte man das nur selektiv berechnen, in CustomLogiken kann man nicht einzelne Module überspringen!

Lg
Robert

Re: [V4 IP5] Taupunkt berechnen

Verfasst: Di Dez 26, 2023 9:30 pm
von blaubaerli
Hallo Hans,

da gibt es schon ein paar Hinweise im Forum :-) die habe ich mir gebookmarked:

Knowledge Base - 4.6.7.7_ CUSTOM: IF-THEN (ELSE) Lösungen

und

viewtopic.php?f=24&t=1585&p=16639#p16638

Beste Grüße
Jens

PS: Ich bekomme da auch regemäßig Kringel in den Hirnwindungen. Robert ist da schlicht der Foren-Guru :handgestures-thumbsup: :handgestures-thumbsup: :bow-yellow:

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Mi Dez 27, 2023 7:32 am
von gbglace
Ich bin ja immer noch dabei eher dieses Wertepärchen je nach größer oder kleiner 0° in je eine Variable zu packen.
Ob die Auswahl nun durch einen Multiplexer oder einem Ausdruck in einer freien Formel passiert ist Geschmackssache.
Wichtig ist ja eher, dass nach dieser Auswahl zwei Variablen existieren, wodurch die 4 Formeln nur einmal in der gesamten Customlogik notiert sein müssen und berechnet werden müssen.
Das macht die Wartung der Customlogik einfacher.

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Mi Dez 27, 2023 8:18 am
von Robert_Mini
Hallo Göran!

Danke für den Hinweis, macht speziell in diesem Fall Sinn, da die Formeln dient und komplex sind.
Wenn es eine Fallunterscheidung wäre, die anders behandelt wird, ginge es nur so wie dargestellt.

Lg
Robert

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Mi Dez 27, 2023 11:14 pm
von hans4711
@Robert_Mini irgendwie klappt es nicht ganz:
* Ich kann den Comperator Ausgang nicht mit dem mulitplexer Selektor koppeln weil der Multiplexer ein integer erwartet, der Comperator aber Bool ausgibt.
* Ich dachte ich Mappe true/false in 1/0 über eine Freie Formel (X1==true?1:0). Die Freie Formel erwartet aber einen Float als Eingang und kein Bool
* Ich habe die Abfolge mit Standardlogiken nachgebaut, daher habe ich auch die Fehlermeldungen der falschen Casts

Hast du dafür eine Lösung?
So sieht der Code aktuell aus, ich habe die Formel jetzt zu einer zusammengefasst

Code: Alles auswählen

/**
 * New custom logic
 *
 * 
 */

{
  "_Meta": { // Optional
    "Description": "",
    "Version": "1.00",
    "Icon": "" // format: "data:image/svg+xml;base64,ENCODED_FILE"
  },
  "Input": [
    ["Temperatur","Temperatur","$temp","c" ],
    ["Luftfeuchte","Luftfeuchte","$luft","c" ]
  ],
  "Output": [
    ["Taupunkt","Berechneter Taupunkt","$taupunkt","a"],
    ["Comperator","True postiv, False, negativ","$comp","a"],
    //Zur Fehlersuche
    ["Multi","True postiv, False, negativ","$multi","a"],
    ["IFElse","True postiv, False, negativ","$schwellwertueberschreitungint","a"]
    
  ],
  "Level": [
      //Ein/Ausgänge
    ["$temp","float",0.0],
    ["$luft","float",0.0],
    ["$taupunkt","float",0.0],
    
    //Formeln
    ["$formelminusgrade","string","((240.7*(log10(((6.1078 * (10^(7.6*X1)/(240.7+X1))) * (X1/100))/6.1078))) / (7.6-(log10(((6.1078 * (10^(7.6*X2)/(240.7+X2))) * (X2/100))/6.1078))))*100/100"],
    ["$formelplusgrade","string","((237.3*(log10(((6.1078 * (10^(7.5*X1)/(237.3+X1))) * (X1/100))/6.1078))) / (7.5-(log10(((6.1078 * (10^(7.5*X2)/(237.3+X2))) * (X2/100))/6.1078))))*100/100"],
    ["$formelinbenutzung","string",""],
    ["$formeltointeger","string","(X1==true)?1:0"],
    
    //Variablen für die Berechnungen
    ["$schwellwert","float",0.0],
    ["$schwellwertueberschreitung","bool",false],
    ["$schwellwertueberschreitungint","integer",0],
    
    //Troubleshooting
    ["$comp","bool",false],
    ["$multi","bool",false]
    
    
      
  ],
  "Module": [
      //Comparator, prüft ob die Temp postiv oder negativ ist, True bei Plusgraden, False bei Minusgraden
      ["Comparator" , "$luft" , "$comp" , "$schwellwert"], //nur für Fehlersuche
      ["Comparator" , "$luft" , "$schwellwertueberschreitung" , "$schwellwert"],
      ["CalcFormula",["$schwellwertueberschreitung"], "$schwellwertueberschreitungint", "$formeltointeger"],
      
      //Mulitplexer, speichert die richtige Formel in der Variable "formelinbenutzung", diese soll dann der freien Berechnung übergeben werden
      ["Multiplexer", ["$formelminusgrade", "$formelplusgrade"],"$multi","$schwellwertueberschreitung"], //nur für Fehlersuche
      ["Multiplexer", ["$formelminusgrade", "$formelplusgrade"],"$formelinbenutzung","$schwellwertueberschreitung"],
      
      
      //Berechnung des Taupunkts
      ["CalcFormula",["$temp","$luft"], "$taupunkt", "$formelinbenutzung"]
      
  ]
}
Bild
Bild

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Mi Dez 27, 2023 11:55 pm
von Robert_Mini
Hallo Hans!

Göran hatte das zwar etwas anders gemeint (Umschalter der Parameter), ich finde den Ansatz mit Umschalten der Formel aber ziemlich elegant :-).

Hab das bei mir nun getestet und im Wesentlichen einen Fehler in den Formel gefunden. Daher hab ich mal einfach "X1+X2" und "X1-X2" hinterlegt und dann funktioniert es auch schon. $temp statt $luft am comperator war auch falsch.

In Customlogiken kann man sehr wohl bool auf int und umgekehrt schreiben, man muss eben wissen was man tut. Insbesondere bei float auf bool kommt da schnell MIST raus....

Code: Alles auswählen

/**
 * New custom logic
 *
 * 
 */

{
  "_Meta": { // Optional
    "Description": "",
    "Version": "1.00",
    "Icon": "" // format: "data:image/svg+xml;base64,ENCODED_FILE"
  },
  "Input": [
    ["Temperatur","Temperatur","$temp","c" ],
    ["Luftfeuchte","Luftfeuchte","$luft","c" ]
  ],
  "Output": [
    ["Taupunkt","Berechneter Taupunkt","$taupunkt","a"],
    ["Comperator","True postiv, False, negativ","$comp","a"],
    //Zur Fehlersuche
    ["Multi","True postiv, False, negativ","$multi","a"],
    ["IFElse","True postiv, False, negativ","$schwellwertueberschreitungint","a"]
    
  ],
  "Level": [
      //Ein/Ausgänge
    ["$temp","float",0.0],
    ["$luft","float",0.0],
    ["$taupunkt","float",0.0],
    
    //Formeln
   // ["$formelminusgrade","string","((240.7*(log10(((6.1078 * (10^(7.6*X1)/(240.7+X1))) * (X1/100))/6.1078))) / (7.6-(log10(((6.1078 * (10^(7.6*X2)/(240.7+X2))) * (X2/100))/6.1078))))*100/100"],
   // ["$formelplusgrade","string","((237.3*(log10(((6.1078 * (10^(7.5*X1)/(237.3+X1))) * (X1/100))/6.1078))) / (7.5-(log10(((6.1078 * (10^(7.5*X2)/(237.3+X2))) * (X2/100))/6.1078))))*100/100"],
   
    ["$formelminusgrade","string","X1+X2"],
    ["$formelplusgrade","string","X1-X2"],
    ["$formelinbenutzung","string",""],
   // ["$formeltointeger","string","(X1==true)?1:0"],
    
    //Variablen für die Berechnungen
    ["$schwellwert","float",0.0],
    ["$schwellwertueberschreitung","bool",false],
    ["$schwellwertueberschreitungint","integer",0],
    
    //Troubleshooting
    ["$comp","bool",false],
    ["$multi","bool",false]
    
    
  ],
  "Module": [
      //Comparator, prüft ob die Temp postiv oder negativ ist, True bei Plusgraden, False bei Minusgraden
      ["Comparator" , "$temp" , "$comp" , "$schwellwert"], //nur für Fehlersuche
      ["Comparator" , "$temp" , "$schwellwertueberschreitung" , "$schwellwert"],
      //["CalcFormula",["$schwellwertueberschreitung"], "$schwellwertueberschreitungint", "$formeltointeger"],
      
      //Mulitplexer, speichert die richtige Formel in der Variable "formelinbenutzung", diese soll dann der freien Berechnung übergeben werden
      ["Multiplexer", ["$formelminusgrade", "$formelplusgrade"],"$multi","$schwellwertueberschreitung"], //nur für Fehlersuche
      ["Multiplexer", ["$formelminusgrade", "$formelplusgrade"],"$formelinbenutzung","$schwellwertueberschreitung"],
      
      
      //Berechnung des Taupunkts
      ["CalcFormula",["$temp","$luft"], "$taupunkt", "$formelinbenutzung"]
      
  ]
}
Zum Standardbaustein melde ich mich noch.

lg
Robert

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 12:06 am
von Robert_Mini
Bool als Selektor beim Multiplexer im Standardbaustein geht tatsächlich nicht.

@Stefan: hier ist aus meiner Sicht die Prüfung zu streng und es gibt keinen Eingangsmodifizierer, der Bool auf Int erlaubt. Ich wüsste da jetzt auch keinen einfachen Workaround...

Auch der MouseOver Text ist da aus meiner Sicht falsch: Ganzzahl (INT) passt, aber Ziel Datentyp sollte auch INT sein vermute ich mal.

lg
Robert

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 12:35 am
von Robert_Mini
Für den Formelfehler gebe ich auf, hab's in 1/2h nicht gefunden...

lg
Robert

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 10:43 am
von hans4711
Vielen Dank für Eure Hilfe!!!

Jetzt bin ich ein gutes Stück weiter, die Formeln habe ich jetzt um komplexität rauszunehmen wieder auf den ursprünglichen 5 gelassen und habe einfach vor jeder Formel einen Multiplexer gebaut.
Leider kann ich die Formeln wohl nicht wie benötigt umbauen.
Es kommt folgende Fehlermeldung:

28.12.2023 10:35:21 Logic_24 Taupunktrechner calc_formula3 Error while analyzing formula "6.1078 * 10^(7."
28.12.2023 10:35:22 src/le_math_expr.cpp#23:muparser: Missing parenthesis

Was mache ich da bei der Formel mit dem pow falsch?

Code: Alles auswählen

/**
 * New custom logic
 *
 * 
 */

{
  "_Meta": { // Optional
    "Description": "",
    "Version": "1.00",
    "Icon": "" // format: "data:image/svg+xml;base64,ENCODED_FILE"
  },
  "Input": [
    ["Temperatur","Temperatur","$temp","c" ],
    ["feuchtefeuchte","feuchtefeuchte","$feuchte","c" ]
  ],
  "Output": [
    ["Taupunkt","Berechneter Taupunkt","$taupunkt","a"],
    ["Comperator","True postiv, False, negativ","$comp","a"],
    ["Multi","True postiv, False, negativ","$multi","a"],
    ["IFElse","True postiv, False, negativ","$schwellwertueberschreitungint","a"]
    
  ],
  "Level": [
      //Ein/Ausgänge
    ["$temp","float",0.0],
    ["$feuchte","float",0.0],
    ["$taupunkt","float",0.0],
    
    //Formeln
    //["$formelminusgrade","string","((240.7*(log10(((6.1078 * (10^(7.6*X1)/(240.7+X1))) * (X1/100))/6.1078))) / (7.6-(log10(((6.1078 * (10^(7.6*X2)/(240.7+X2))) * (X2/100))/6.1078))))*100/100"],
//    ["$formelminusgrade","string","X1+X2"],
//    ["$formelplusgrade","string","((237.3*(log10(((6.1078 * (10^(7.5*X1)/(237.3+X1))) * (X1/100))/6.1078))) / (7.5-(log10(((6.1078 * (10^(7.5*X2)/(237.3+X2))) * (X2/100))/6.1078))))*100/100"],
    //["$formelplusgrade","string","X1*X2"],
    ["$formelinbenutzung","string",""],
    ["$formeltointeger","string","(X1==true)?1:0"],
    
    //neue Formeln
    //var sdd = 6.1078 * Math.pow(10, (a*t)/(b+t));
    ["$formel1plus","string","6.1078 * 10^(7.5*X1)/(237.3+X1)"],
    ["$formel1minus","string","6.1078 * 10^(7.6*X1)/(240.7+X1)"],
    //var dd = sdd * (r/100);
    ["$formel2plus","string","X1 * (X2/100)"],
    ["$formel2minus","string","X1 * (X2/100)"],
    
    //var af = Math.pow(10,5) * mw/gk * dd/tk;
    ["$formel3plus","string","10^5 * 18.016/8314.3 * X1/(X2 + 273.15)"],
    ["$formel3minus","string","10^5 * 18.016/8314.3 * X1/(X2 + 273.15)"],

    //var v = Math.log10(dd/6.1078);
    ["$formel4plus","string","log10(X1/6.1078)"],
    ["$formel4minus","string","log10(X1/6.1078)"],
    
    //tp = Math.round( ((b*v) / (a-v))*100)/100;
    ["$formel5plus","string","((237.3*X1) / (7.5-X1))*100/100"],
    ["$formel5minus","string","((240.7*X1) / (7.6-X1))*100/100"],
    
    //Variablen für die Berechnungen
    ["$schwellwert","float",0.0],
    ["$schwellwertueberschreitung","bool",false],
    ["$schwellwertueberschreitungint","integer",0],
    ["$sdd","float",0.0],
    ["$dd","float",0.0],
    ["$af","float",0.0],
    ["$v","float",0.0],
    
    //Troubleshooting
    ["$comp","bool",false],
    ["$multi","bool",false]
    
    
      
  ],
  "Module": [
      //Comparator, prüft ob die Temp postiv oder negativ ist, True bei Plusgraden, False bei Minusgraden
      ["Comparator" , "$temp" , "$comp" , "$schwellwert"], //nur für Fehlersuche
      ["Comparator" , "$temp" , "$schwellwertueberschreitung" , "$schwellwert"],
      //["CalcFormula",["$schwellwertueberschreitung"], "$schwellwertueberschreitungint", "$formeltointeger"],
      
      ["Multiplexer", ["$formel1minus", "$formel1plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$temp"], "$sdd", "$formelinbenutzung"],
      
      ["Multiplexer", ["$formel2minus", "$formel2plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$sdd","$feuchte"], "$dd", "$formelinbenutzung"],

      ["Multiplexer", ["$formel3minus", "$formel3plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$dd","$temp"], "$af", "$formelinbenutzung"],

      ["Multiplexer", ["$formel4minus", "$formel4plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$dd"], "$v", "$formelinbenutzung"],
      
      ["Multiplexer", ["$formel5minus", "$formel5plus"],"$formelinbenutzung","$schwellwertueberschreitung"],
      ["CalcFormula",["$v"], "$taupunkt", "$formelinbenutzung"]
      
      //Mulitplexer, speichert die richtige Formel in der Variable "formelinbenutzung", diese soll dann der freien Berechnung übergeben werden
      //["Multiplexer", ["$formelminusgrade", "$formelplusgrade"],"$multi","$schwellwertueberschreitung"], //Nur für Fehlersuche
      //["Multiplexer", ["$formelminusgrade", "$formelplusgrade"],"$formelinbenutzung","$schwellwertueberschreitung"],
      
      
      //Berechnung des Taupunkts
      //["CalcFormula",["$temp","$feuchte"], "$taupunkt", "$formelinbenutzung"]
      
  ]
}

Re: [V4.0 IP5] Taupunkt berechnen

Verfasst: Do Dez 28, 2023 12:03 pm
von Robert_Mini
Hallo Hans!

Danke für deine Ausdauer, ich ärgere mich gerade über den muparser, da liegt offensichtlich ein Problem vor, das ich gerade weiter einschränken, aber nicht lösen konnte. Ich poste die weitere Problembehandlung separat.

Vielleicht hast du zwischenzeitlich eine andere Logik als Custom Logik zu lösen, möchte ungern deinen Schwung bremsen :-)

lg
Robert