LevelJet Script ( Cm in Liter umrechnen) ?

Hallo,

hab es nun den Level Jet mit IPS verknüpft!
Nun zeigt mir die Variable den Wert Abstand in cm an?
Bin auf der Suche nach einen Script das mir die Werte in Liter bzw. in Prozent errechnet!

Im Level Jet hab ich als Tank „frei“ gewählt und die Werte cm = x Liter usw…eingetragen.

Danke für die Info!

Hallo,

wenn du deine Werte kennst dann ist das doch nur eine kleine Rechenaufgabe.
Wie viel Liter sind den bei deinen Tank 1cm oder anders herum wie viel cm sind ein Liter?

Schöne Grüße
Thomas

Es wird ja der Abstand vom Sensorkopf auf die Wasseroberfläche gemessen?
Bei mir sind 165 cm gleich 4000 Liter.

Nur wie kann ich von meinen Werten 30 Stück, das in einem Script verpacken?

Und wieviel Liter sind das bei einer anderen Höhe?

Oder wie weit ist den Sensor vom Boden des Gehälters enfernt und welche Bauform hat er?

Hier kann keiner hellsehen …?

Gruß Doc

Hellsehen ist nicht notwendig, nur über den Threadrand :smiley:

Gruß
Bruno

Wenn ich davon ausgehe, dass der Sensor 30cm über einem vollen Tank angebracht ist und bei einem Mess-Abstand von 165cm der 4000ltr Tank leer ist, dann ist bei
Messwert = 30cm = 4000 ltr
Messwert = 165cm = 0 ltr
Messbereich dann 135cm
Das bedeutet pro cm sind es 29,62962962962963 ltr

So würde ich das sehen.

Dann müßte das Script dem Wert von einem vollen Tank (4000ltr) das Ergebniss aus der Rechnung ((Messwert-30cm) mal 29,62962962962963) abziehen und dieses Ergebniss in Liter in eine Floatvariable eintragen.

Nachtrag, wenn der Wert dann unbedingt in % dargestellt werden soll: Floatvariable (Liter) dann einfach durch 40 teilen

Was die 30 bei Leveljet heißen weiß ich nicht.

Meiner einer Meinung, :wink: Gruß Helmut

kommt auch immer auf die Tankform an.

Bei meinem Tank war eine Tabelle dabei, welche Füllhöhe wieviel Litern entspricht.
So dass meine Logik die in viele Unterbereiche trennen müsste.

Hab mich dann auf die cm/prozent Angabe beschränkt das reicht auch. Wasserverbrauch messe ich sowieso mit einer Wasseruhr - naheliegend oder ??

Guten Morgen!

Die Tankform ist weder Kugel, noch Zylinder. Somit musste ich beim Level Jet die Tankform „frei“ eingeben. Hierfür stehen bis zu 32 Messpunkte zur Verfügung, die man selber eintragen muss ( Habe 30 Messpunkte verwendet)
Per Anhang die Bauform meines Tankes.

Der Sensorkopf ist 23,2 cm vom Höchststand entfernt, das sind die 4000 Liter.
Der Wasserstand ist vom Boden bis zur Oberfläche 165 cm (Messbereich ist dann 141,8 cm)

Habe alle 132 Liter, die ich in den Tank per Wasseruhr befüllt habe eine Messmarke in cm gesetzt:
132 Liter =15 cm
264 Liter =23 cm
396 Liter = 30 cm
528 Liter = 36 cm
666 Liter = 42 cm
793 Liter = 46 cm
925 Liter = 51 cm
1057 Liter = 55 cm
1189 Liter = 60 cm
usw…

BL-Massskizze-4300l.jpg

Antworten finden wir hier:

Hat misch auch geholfen :wink:

Er hatte die Frage nunmal so gestellt, als ob er das Volumen berechnen wollte und bei 165cm 4000l im Tank sind.
Diese Angaben reichen dafür nicht.
Und woher wusstet du die Bauform?

Zum schätzen der Füllmenge braucht er doch IPS nicht, oder? :smiley:

Grüße Doc

Bin „von der anderen Seite“ des Threads gekommen :smiley: :smiley:

Gab hier auch noch ein Bild:

schätzen der Füllmenge braucht er doch IPS nicht

Wird ja zukünftig ganz genau ausgewertet, wobei Messpunkt 31 noch fehlt mit 4092 l (oder gibt
es einen Ablauf bei 3960 l

Hab’ die Werte mal in Exel eingegeben, ist fast linear:

Und die Rechnung nach seinen Daten aufgetan:
165-23,2 = 141,8
141,8/30 = 4,726666666666667
4000/141,8 = 28,20874471086037ltr/cm

Tankinhalt ist dann 4000-((Messwert-23,2) x 28,20874471086037)

Gruß Helmut

Hallo Helmut,
danke für die Anschauliche Tabelle!

Würde heißen das 1cm 28 Liter sind?
Wie kann ich das in ein Script packen?

Ausschlaggebend des Scriptes ist immer der Distanzwert vom LevelJet (Float Variable)?

Ich habe für Dich mal mein HID-Modul als Daten-Quelle genommen, Du mußt also das was ich mit HID einlese per ser. Schnittstelle einlesen. Aber Das hast Du ja schon vorliegen :wink:

Ich habe eine Registervariable auf mein HID-Modul gesetzt und als Aktionscript dieses geschrieben.

<?
switch($IPS_SENDER)                 // ermitteln, wodurch das Skript aufgerufen wurde
{
    case "RegisterVariable":             // durch Registervariable aufgerufen: neuer Wert wurde empfangen
   $data  = substr ($IPS_VALUE, 4, 1);
    // nächste Stellen an $data anhängen
    $data .= substr ($IPS_VALUE, 5, 1);
    $data .= substr ($IPS_VALUE, 6, 1);
 //echo $data;                               // zur Kontrolle

 //echo strval ($data);                      // zur Kontrolle
 If (strval($data) > "0"):
	 SetValue(10274 /*[Füllstand\Messwert_Michl_Float]*/,$data); // Die Floatvariable beschreiben
	 $Messwert = GetValueFloat(10274 /*[Füllstand\Messwert_Michl_Float]*/);
	 SetValueFloat(10274 /*[Füllstand\Messwert_Michl_Float]*/ ,$Messwert);
	 $FloatWert = GetValueFloat(10274 /*[Füllstand\Messwert_Michl_Float]*/ );
	 $Liter = (4000-(($FloatWert-23.2) * 28.20874471086037));
	 SetValueFloat(57418 /*[Füllstand\Michl's Tank in Liter]*/ ,$Liter );
	 //SetValueFloat(58065 /*[Füllstand\Michl's Füllstand in %]*/,intval($Liter/40));
	 SetValueinteger(50134 /*[Füllstand\Michl Füllstand in %]*/,intval($Liter/40));
 endif;
}
?>

Du mußt 2 Floatvariablen erstellen, eine mit Suffix ~Water und eine Integer mit Suffix ~Intensity.100)

Geht sicher besser, bin nicht der PHP-Freak ;=)
Gruß Helmut

Ich hab jetzt eine Register Variable angelegt! Instanz hinzufügen ->Register Variable.
Dann hab ich den Serial Port ProJet gewählt und bei Target das Script gewählt?

Hoff das stimmt so?
Aber leider passiert hier nichts bei den Angelegten 3 Float Variablen?

Ich habe keine serielle Schnittstelle und nie ein ProjetLevel-Dingsda gesehen, weiß also nicht wie da die Daten kommen.

Hier mal ein Script, das passen könnte, wäre gut wenn Du mal Hardcopy von Deinen Daten (was kommt im Debugfenster der ser.Schnittstelle/Registervariable usw) zeigst.

<?
switch($IPS_SENDER)                 // ermitteln, wodurch das Skript aufgerufen wurde
{
    case "RegisterVariable":             // durch Registervariable aufgerufen: neuer Wert wurde empfangen

	 SetValue(10274 /*[Füllstand\Messwert_Michl_Float]*/,$IPS_VALUE); // Die Floatvariable beschreiben
	 $Messwert = GetValueFloat(10274 /*[Füllstand\Messwert_Michl_Float]*/);
	 SetValueFloat(10274 /*[Füllstand\Messwert_Michl_Float]*/ ,$Messwert);
	 $FloatWert = GetValueFloat(10274 /*[Füllstand\Messwert_Michl_Float]*/ );
	 $Liter = (4000-(($FloatWert-23.2) * 28.20874471086037));
	 SetValueFloat(57418 /*[Füllstand\Michl's Tank in Liter]*/ ,$Liter );
	 //SetValueFloat(58065 /*[Objekt #58065 existiert nicht]*/,intval($Liter/40));
	 SetValueinteger(50134 /*[Füllstand\Michl Füllstand in %]*/,intval($Liter/40));

}
?>

Gruß Helmut

Hallo Helmut,
danke!
Also dein Script das du erstellt hast, da brauche ich die Werte nicht Manuell zufügen (132 Liter =15 cm, 264 Liter =23 cm, usw…) das wird automatisch errechnet? Oder liege ich da falsch?
Anhand der Exel Tabelle weis man, das 1cm 28 Liter sind?

Ich werde das Script heute am Nachmittag Testen :slight_smile:

Nee, das ist unberücksichtig, warum? Weil Du Digitfehler haben kannst, die da Werte bringen, die mich nur verwirren.

Beispielrechnung Deiner geschriebenen Werte:

8cm = 132 ltr
7cm = 132 ltr
6cm = 132 ltr
6cm = 138 ltr
4cm = 127 ltr
5cm = 132 ltr
4cm = 132 ltr
5cm = 132 ltr

Ich glaube auch, dass diese Auflösung in den unteren Werten unnötig ist.

Zumal eine Anzeige in % so eine „Kleinkariertheit“ widerspricht. Du weißt ja, dass der Tank unten so geformt ist, dass die Werte nicht linear sein können.

Deshalb habe ich den Gesamtwertebereich genommen.

Gruß Helmut

Hallo Helmut,

hab das momentan so gelöst:
Der Level Jet zeigt mir ja immer die Distance zur Wasseroberfläche der Zisterne an, an dem wird dann anhand deines Skriptes der Prozent und Literanteil errechnet.

Wenn sich beim Level Jet die Distance ändert ( Alle 2 Stunden erfolgt eine Messung ), dann löse ich dein Script mit
einem Ereignis (Auslösung bei Variablenänderung) aus.

Das Script sieht so aus:


     $Messwert = GetValueFloat(24726 /*[Hardware IPS\JKM-868 (LevelJET)\Distance]*/);
     SetValueFloat(14121 /*[Übersicht Regenwasserzisterne\Regenwasserzisterne\Messwert]*/ ,$Messwert);
     $FloatWert = GetValueFloat(14121 /*[Übersicht Regenwasserzisterne\Regenwasserzisterne\Messwert]*/ );
     $Liter = (4000-(($FloatWert-30.5) * 28.20874471086037));
     SetValueFloat(12364 /*[Übersicht Regenwasserzisterne\Regenwasserzisterne\Liter]*/ ,$Liter );
     //SetValueFloat(58065 /*[Objekt #58065 existiert nicht]*/,intval($Liter/40));
     SetValueinteger(59868 /*[Übersicht Regenwasserzisterne\Regenwasserzisterne\Prozent]*/,intval($Liter/40));



dies funktioniert auch sehr gut :slight_smile:

Nur hab ich ja eine Tank Form die einer Kugel + Zylinder ähnelt.
Bei der Programmierung des Level Jet musste ich die Werte ja manuell eingeben:

CM Liter

15 130
23 260
30 400
36 530
42 670
46 790
51 920
56 1060
61 1190
63 1320
65 1450
72 1590
74 1720
79 1850
86 1980
90 2110
94 2250
98 2380
103 2510
106 2640
111 2780
115 2910
119 3040
124 3170
129 3300
134 3440
139 3570
146 3700
154 3830
165 4000

nun zu meiner Frage kann ich diese Werte auch in das Script einpflegen?
Da die Werte am Display etwas andere sind als die in IPS?

Vielen Dank für die Info!!!

Ich schätze man kann die Tabelle in IPS einpflegen, nur: ich bin da ehrlich, halte ich es für totalen Quatsch, warum:

  1. Du kannst beim Erstellen der 30 Punkte Ablesefehler und/oder Digitfehler nicht ausschliessen.
  2. Die Linie ist fast linear, nur im unteren und oberen Bereich weicht sie von einer Geraden ab.
  3. Mach’ eine Prozentanzeige, dann siehst Du den Stand auch.
  4. und der ausschlaggebene Faktor für mich: Dazu reichen meine PHP-Kenntnisse nicht aus :wink:

Gruß Helmut

Michl_Tank1.xls (35.5 KB)