Füllstandsmessung mit US über COM-Schnittstelle

Hallo Experten,

Da ich den Leveljet ProJET : Produkte zur Füllstandsmessung der Heizöltanks (momentan nur) im Einsatz habe, würde mich die Anbindung an IPS interessieren um damit den Füllstand in Litern zu loggen.

Es gibt eine Protokollbeschreibung für die COM-Schnittstelle:
http://www.projet.de/Software/Leveljet_seriell.pdf

Ein Datenblock umfasst 12 Bytes, davon 10 Datenbytes und 2 CRC-Bytes:

Datenbyte / Zuordnung
0 / Gerätekennung Low-Byte $E8
1 / Gerätekennung High-Byte $03
2 / Distanz Low-Byte (Entfernung US-Sensor zur Flüssigkeit)
3 / Distanz High-Byte
4 / Füllhöhe Low-Byte
5 / Füllhöhe High-Byte
6 / Liter Low-Byte
7 / Liter High-Byte
8 / Inhalt in Prozent
9 / Zustand der Ausgänge
10 / Kontrollbyte Low-Byte
11 / Kontrollbyte High-Byte

Zum Protokollieren wären für mich interessant, die Literausgaben.
Ich würde das dann gerne graphen mit WIIPS.

Leider habe ich keine Ahnung, wie ich das anstellen soll, bis auf die Einbindung der COM-Schnittstelle… aber wie auslesen und protokolieren?

Desweiteren würde ich gerne für die Ausgaben Distanz, Füllhöhe, Liter, Inhalt, Zustand der Ausgänge, Variablen anlegen, um damit dann weiter arbeiten zu können… Alarmmeldungen etc.

Wer kann weiterhelfen?

Vielen Dank im Voraus!

Einfach eine RegisterVariable Instanz an den Com hängen. Dann landen alle Inputs in einer Var. Dann in Bytes zerlegen und voila.
>> Such einfach mal nach „register variable“ im Forum, da gibts schon was dazu…

Zum Loggen:
Dafür brauchst Du doch einfach nur die „Ergebnisse“, welche ja sicherlich wieder in Variablen landen mit wiips aufzeichnen (Graph anlegen)

Gruß
Fabian

Hallo Fabian,

Vielen Dank für deine Antwort.

Das habe ich so gemacht…
Also den COM-Port angelegt (ist auch connected), den Splitter „Register Variable“ angelegt, eine Variable dafür und mit dem COM-Port verbunden.

Es kommt nix an der Variable an :frowning:
Habe ich etwas vergessen?
Es sollte sekündlich eine Übertragung stattfinden und sich die Variable damit ändern, oder?!

Ich weiss erstmal nicht weiter…

Also wenn sekündlich der Ölstand wechseln würde, hättest Du nen satten Verbrauch :rolleyes:

Mal Spaß beiseite, kommt einfach nur nix in der Variable an oder hat sie einen Inhalt, der sich nicht ändert?

Ich gehe davon aus, dass die Einstellungen (19200,8,N,1) stimmen. Hast Du den COM-Port in der Instanz nach dem Anlegen geöffnet (grün). Schau bitte nochmal in der wiki nach den Einstellungen.

Stimmt alles, dann sieh mal mit dem Debugger auf dem Com und der RV nach, ob überhaupt etwas reinkommt.
Klappt das, stell den Com auf forward, damit alles erstmal weiter geleitet wird.

step by step…

  1. so wie prof sagt…

  2. sollte alles von dir nach bestem wissen und gewissen :wink: richtig gemacht worden sein, dann fällt mir bzgl. dem pdf-manual folgendes auf:

a) wie wird der flow-control (hardware, software) gehändelt - das steht nicht im pdf -> testen oder experimentieren)

b) muss ggf. noch dtr oder rts gesetzt werden? (keine angaben dazu im pdf -> also erkundigen). ips hat befehle zum setzen des dtr (COMPort_SetDTR) oder rts (COMPort_SetRTS).

Moin Moin,

Also sekündlich ändert sich der Füllstand nicht, es findet laut Beschreibung aber jede Sekunde eine Übertragung statt.
Es kommt nur nichts an der Variable an …d.h. die ist „nackig“ …es gibt bisher einfach keinen Wert bzw. Eintrag.

Schnittstellenparameter sind wie vorgegeben eingestellt.
Mit der Flusskontrolle habe ich auch schon experimentiert und durch probiert…
COM steht auf forward…
Mit DTR und RTS habe ich noch nichts unternommen.

Wie bzw. wo muss ich die Befehle setzen?

^^:)

–>

Mit DTR und RTS habe ich noch nichts unternommen.

Wie bzw. wo muss ich die Befehle setzen?

Hallo,

ich würde ersteimal Kommunikation über die COM SSt testen mit Hyperterminal. Wenn das geht, dann den nächsten Schritt mit der IPSymcon Software.
Ich benutze für die Zisterne einen Ultraschall-Entfernungsmesser und kann den auch über die COM SST und IPSymcon lesen. Schau mal bei www.icplan.de

Hallo,

Vielen Dank für den Tipp mit HT!

Ich habe das mal probiert und empfange auch etwas, doch kann ich damit nichts anfangen… Siehe Screenshot!

Kann jemand helfen? Bitte!

Ist doch perfekt so… jetzt nur noch das protololl rausfädelen und fertig.
start- und stopbits mit dazwichen die data bytes (wahrscheinlich)

Hallo Fredje,

… jetzt nur noch das protololl rausfädelen und fertig.
start- und stopbits mit dazwichen die data bytes (wahrscheinlich)

:confused: Ja, ja, das mag für dich ein Leichtes sein, aber… Protokoll rausfädeln …Start und Stopbits dazwischen …häää? :eek:

Das erste Problem ist ja noch, dass ich über den COM-Port von IPS keinen Nix garnix reinbekomme.
Das müsste erst geklärt werden, wieso?

Helft mir doch bitte für „Dummies“ auf die Sprünge! :o

Dann wurde ich dir raten die gleiche einstellung vom hyper uber zu nehmen in IPS und per register-variable (oder wie heisst das den wieder) mal das gleiche rein zu bekommen…
¨Wenn ich irgendwo jedesmal probleme gehabt habe in IT ist / sind es COM-probleme… also nicht gleich weich werden.
Trink ne kaffee und uberblicke es nochmal…

Ich habe ja schon alle Möglichkeiten an der COM von IPS ausprobiert.
Ich bekomme in der Variable zu REGISTER VARIABLE einfach nichts rein …keine 1, kein x oder o, oder sonst irgendein Zeichen oder Wert.

Die Schnittstelleneinstellungen (19200,8,N,1) passen.

Beim Hyperterminal habe ich einfach nur die Schnittstelle ausgewählt (COM4), die Parameter angepasst (19200,8,N,1) und auf anrufen geklickt, schon gings los.

Was kann ich denn noch probieren?

Hallo!

Ich möchte dieses Thema wieder aufgreifen.
Nachdem ich das neu Liveupdate http://www.eyep.de/forum/showthread.php?t=2975 eingespielt habe, bekomme ich nun tatsächlich auch etwas an „Register Variable“ und am ComPort angezeigt.
Nur kann ich damit immer noch nichts anfangen.

Man sieht, im angehängten Screenshot des Debuggers, aber gut das wirklich Blöcke mit insgesamt 12 Bytes jede Sekunde neu empfangen werden.
Die angezeigten ASCII-Zeichen ergeben aber keinen Sinn, auch wenn ich diese binär umwandle und daraus einen Wert errechne.

Es handelt sich immer um die Zeichen x (ASCII 120), € (ASCII 128) und ø (ASCII 248).
Daraus ergibt sich kein passender Wert, wenn ich z.B. High u. Low-Byte der Literangabe (Byte 6/7) zusammen nehme in Binär umwandle und einen Dezimalwert errechne.

Ein aktuelles Beispiel:
Der aktuelle Literstand in meinem Heizöltanks liegt bei 4540 Liter.
Am COMport kommt als LowByte „€“ u. Highbyte „x“ an.

Bitte seht selbst! Ich hoffe auch eure Hilfe!

Hallo nancilla,

ich kann Dir zwar leider nicht helfen, habe aber mal eine Frage da mich das Teil interessiert.

Wie lang ist Deine serielle Leitung?
Ich müsste nämlich aus dem Keller bis auf den Dachboden und das ist ganz schön weit :o

Hallo Horst!

Nach ProJET : Produkte kann die Zuleitung vom US-Sensorkopf bis zum Gerät, auf 100m verlängert sein.
Bei der ser. Schnittstelle stellen 30m sicher auch kein Problem dar.

Bei mir beträgt die Länge:
Sensor <-> Anzeige ca. 10m u.
Anzeige <-> PC (RS232) ca. 15m
da der Server auch im Keller untergebracht ist.

Hat noch sonst noch niemand mit COMPORT und Auswertung der übertragenen Daten gearbeitet?:frowning:

@hbraun:
Kommt darauf an, was Du für eine serielle Schnittstelle benutzt und mit welcher Geschwindigkeit. Bei 9600 sollten 25-30m kein Problem darstellen - entsprechende Leitungsqualität und -verlegung vorausgesetzt.

@nancilla
Die angezeigten Zeichen müssen erst in hex umgewandelt werden. Dann musst Du herausfinden, welcher hex-code zum trennen der einzelnen Datenblöcke benutzt wird. Denn im RegVar werden alle eingehenden Daten mit append einfach „gestapelt“. Wenn es keinen Trenner gibt, musst Du nur auf die Variable triggern und dann am besten noch kurz warten, damit alle Daten erstmal geschrieben werden können.
Die Funktion zum Umwandeln heist ord().

An dem unten stehenden kleinen script kann man die Vorgehensweise erkennen. Die Daten werden in eine Datei geschrieben


$buffer=GetValueString("log_var");
SetValueString("log_var","");
list($usec, $sec) = explode(" ", microtime());
$start_time = strftime("%H:%M:%S",$sec).substr($usec,1);

// open logfile
$handle = fopen("$logfilepath","a"); //$logfilepath definiert die Datei mit Pfad

//Message verarbeiten
 $splitter = chr(129); //Trennzeichen
 $chunks = explode($splitter,$buffer); //Zerlegung in einzelne Datenblöcke
 //print_r($chunks);
echo "Arraygröße: ".count($chunks)."
";
foreach($chunks as $chunk)
{
   $length = strlen($chunk);
   echo "
";
   if ($length !== 0)
   {
      fwrite($handle,$start_time.":>");
      for ($i=0; $i<$length; $i++)
      {
         $dbyte = ord($chunk{$i});
         //if ($dbyte == 129)

         fwrite($handle, set_byte(ord($chunk{$i}))." ");
      }
   }
}
fclose($handle);

und der Vollständigkeit halber noch die Funktion set_byte:

function set_byte($byte)
{
   if ($byte < 16)
      return "0".dechex($byte);
   else
      return dechex($byte);
}

Die sorgt nur für bessere Lesbarkeit der hex-Werte. :slight_smile:

Nun ich hoffe, das Script funktioniert, denn ich habe es nur schnelle aus meinem FHT-Datenlogger ausgeschnitten.

Gruß
Fabian

Hallo Fabian, hallo nancilla,

Danke für die Infos zur Länge der seriellen Leitung. Werde dann mal bei meiner Finanzmanagerin einen Invest-Antrag stellen :wink:

@prof

Huuu!:eek:

Da ich immer noch „PHP-bl*d“ bin, muss ich mal nachhaken…

Also müsste ich jetzt statt „log_var“ den Variablennamen eintragen, den ich für die Registervariable vergeben habe?
Und statt „logfilepath“ den Pfad u. Dateinamen zur Datei in der geschrieben werden soll?

Und wie Kann ich dann die hex-Werte wieder in lesbare Werte, also den ganzen Dezimalwert umwandeln?

Ich möchte die ausgegebenen Werte irgendwann über Torros WIIPS in einem Diagramm ansehen… das ist mein Ziel!

Also Deine Annahmen zu der Variable und dem Pfad sind richtig.

Was die Umwandlung betrifft, war ich wohl etwas übers Ziel hinausgeschossen. Die Ausgabe von

$dbyte = ord($chunk{$i});

ergibt schon einen Dezimalwert.

Da ich es in hex brauchte, musste die zusätzliche Umwandlung mit

dechex($byte)

sein.

Du solltest

fwrite($handle, set_byte(ord($chunk{$i}))." "); 

durch

fwrite($handle, $dbyte." "); 

ersetzen

Also sollte die erste Operation schon genügen. Schau Dir einfach die Werte mal an.

Gruß
Fabian