Füllstandsmessung mit US über COM-Schnittstelle

Danke bis hierher Fabian!

Ich werde mich heute Abend/Nacht damit auseinander setzen, denn vorher komme ich nicht dazu.

Aber einen Hauch Hoffnung habe ich wieder geschöpft, das doch noch zu integrieren:)

Ich melde mich wieder!:wink:

P.S. Aber wer noch mehr dazu beitragen kann… Immer her damit.
Ich freue mich riesig darüber!

Hallo Fabian!

Ich habe das jetzt mal so übernommen, die Variable eingetragen und den Pfad gesetzt:

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

// open logfile
$handle = fopen("h:\leveljet	estlog.txt","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, $dbyte." ");
      }
   }
}
fclose($handle);

Nun habe ich ja zumindest gehofft, das die Datei angelegt wird und irgendetwas drin steht, aber weder noch:o
Da ich das ganze nicht wirklich verstehe, kann ich mir auch keinen Reim drauf, zur Fehlerursache machen.
Ich habe versucht, manuell ein execute auszuführen und auch von der Variable „LEVELJET“ triggern zu lassen.

Was mich auch noch an der ganze Sache stört bzw. verwundert, dass der komplette Block (12 Bytes) nicht in einer Zeile an COMPORT und Register-Variable ausgegeben werden.
Manchmal, aber eher sehr selten kommt es vor, meistens jedoch sind es 2-3 Zeilen, die pro Datenblock kommen.

Nunja, das Problem liegt vermutlich beim Trennzeichen, welches die eindeutige Abgrenzung der Datenblöcke vornimmt. Wie bereits beschrieben, musst Du diesen Trenner erst noch ermitteln. Da kein Trenner vorkommt, wird die Bedingung nicht erfüllt und die Schleife nie ausgeführt. Deshalb auch keine Datei…
Allerdings schreibst Du von 12-Byte Blöcken. Daraus sollte sich was machen lassen.


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

// open logfile
$handle = fopen("h:\leveljet	estlog.txt","a"); //$logfilepath definiert die Datei mit Pfad

//Message verarbeiten
$length = strlen($buffer);
if ($length !== 0)
{
   fwrite($handle,$start_time.":>");
   for ($i=0; $i<$length; $i++)
   {
      $dbyte = ord($buffer{$i});
      fwrite($handle, $dbyte." ");
   }
}
fclose($handle);

Was mich auch noch an der ganze Sache stört bzw. verwundert, dass der komplette Block (12 Bytes) nicht in einer Zeile an COMPORT und Register-Variable ausgegeben werden.
Manchmal, aber eher sehr selten kommt es vor, meistens jedoch sind es 2-3 Zeilen, die pro Datenblock kommen.

Ich nehme an, Du meinst im VariableWatch. Das ist normal, da es sich um eine asynchrone Kommunikation handelt, „trudeln“ die Werte nacheinander ein. In der Registervariable landen sie aber schön in einer Reihe. :rolleyes:

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.

Damit hatte ich das Problem des zeitlich versetzten „Eintrudelns“ der Daten gemeint. Dazu habe ich jetzt mal am Anfang mal ein Sleep eingefügt.

Ich wünsche Dir eine kurzweilige Nacht und halte mich auf dem Laufenden!

PS: Wenn Du php-code einfügen möchtest ist es besser, das über den php-Button zu machen, dann gibts auch SyntaxHighlighting (Bunter Text) :smiley:

Ups…

habe gerade gesehen, dass jede Sekunde ein Paket kommt. Dann ist die Zeit im Sleep zu lang. Lass sie erstmal weg und schau was ankommt. Poste am besten mal die Datei.

Gruß
Fabian

Habe jetzt schon einiges ausprobiert, aber alles andere als „Just Forward“ kommt bei der Register-Variable nicht an.

Ich habe jetzt auch noch mal Hyperterminal laufen lassen und je nach Schriftart, verschiedene Symbolketten. Wie soll ich denn nur herausbekommen, welches Trennzeichen verwendet wird. Alle 255 ASCII-Zeichen durchprobieren?:eek:

Mit Schriftart Terminal siehts z.B. so aus: øøøøøxxxxà

Wie ich auch schon im ersten Beitrag zu diesem Thema geschrieben habe, gibt der Hersteller das Protokoll so an:

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

Dann habe ich, da diese beiden Bytes immer gleich sind, auch mit den

0 / Gerätekennung Low-Byte $E8
1 / Gerätekennung High-Byte $03
versucht,
D.h. ich ging davon aus, dass mit $E8 ASCII-Code 232 und mit $03 ASCII-Code 003 gemeint ist. Aber das brachte auch keinen Erfolg, nachdem ich diese Codes als „Left Cutchar“ eingetragen habe. Nur „Just Forward“ geht.

Ich würde ja gerne eine Datei Posten, aber leider wird noch keine erzeugt, weder mit sleep, noch ohne.

Landet denn überhaupt irgendwas in der Variable?

Bezüglich der Datei fällt mir auf, dass Du mit Backslashes arbeitest. Das funktioniert nicht! Du musst Slashes nehmen:

$handle = fopen("h:/leveljet/testlog.txt","a"); //$logfilepath definiert die Datei mit Pfad

Moin,Moin!

Ja, genau die Abschnitte, die auch im Debugger beim ComPort zusehen sind.

Ich habe jetzt slashes genommen, aber die Datei…:frowning:

Wenn ich mir das Paket mit hexview im Debugger ansehe, steht dort:

00F8 F800 80F8 8000 00F8 7800 8000 7800 0000 7800 8078 1EF8

Das ist das komplette Paket, was jede Sekunde neu empfangen wird.

Kannst du damit etwas anfangen?

Das sollte jetzt ergeben:

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
54 cm

4 / Füllhöhe Low-Byte
5 / Füllhöhe High-Byte
116 cm

6 / Liter Low-Byte
7 / Liter High-Byte
4540 Liter

8 / Inhalt in Prozent
68 %

9 / Zustand der Ausgänge

10 / Kontrollbyte Low-Byte
11 / Kontrollbyte High-Byte

Also jetzt mal Schritt für Schritt.

  1. Fehler
    Führe das Script von Hand aus und prüfe ob im Kernel-Log Fehler auftreten. (unter „Kernel“ auf „debug“ gehen) Wenn Du nix findet, dann schicke einfach mal die aktuelle log-Datei.

  2. Datei
    Wird die Datei angelegt? Wenn nicht, Im Kernel-log nach Fehlern suchen, dann unbedingt Pfad überprüfen (Slashes).

füge mal hinter dem fopen folgende Zeile ein:

fwrite($handle,$start_time.":>");

Dann sollte auf jeden Fall schon mal 'ne Zeit drinstehen.

Ich habe alle Einzelschritte eben mal simuliert, funktioniert alles.

Zu den Bytes:
So wie Du es geschrieben hast sind es nicht 12 sondern 24 Byte. Ein Byte ist immer eine 2-stellige hex-Zahl. Entweder ist die Übertragung nicht korrekt oder die Einstellungen der Schnittstelle (Baudrate, Parity usw…) stimmen nicht… :mad:

Hallo Fabian!

Erstmal vielen Dank für deine Ausdauer:o

08.03.2007 22:41:34.276 | DEBUG   | ExecuteThread ID: 3620 | Executed, Ret: 1, Successful:True
08.03.2007 22:41:34.276 | DEBUG   | VariableManager      | Variable: LEVELJET (String), Value: ø€ ø€x 
08.03.2007 22:41:34.276 | DEBUG   | ExecuteThread ID: 2452 | Executing Script: LEVELJET_LOG.ips.php ~ Sender: Variable: LEVELJET, Trigger: OnUpdate

Ich schicke dir das LOG aber gleich noch per PM.

EDIT/
Logfile verschicken geht leider nicht…
„Ungültige Angabe: Beitrag
Wenn Sie einem normalen, gültigen Link im Forum gefolgt sind, wenden Sie sich bitte an den Webmaster.“

Ich werde deshalb hie mal einen Ausschnitt posten:

08.03.2007 22:41:19.104 | DEBUG   | ExecuteThread ID: 4048 | Executed, Ret: 1, Successful:True
08.03.2007 22:41:19.104 | DEBUG   | VariableManager      | Variable: LEVELJET (String), Value: ø
08.03.2007 22:41:19.104 | DEBUG   | ExecuteThread ID: 2568 | Executing Script: LEVELJET_LOG.ips.php ~ Sender: Variable: LEVELJET, Trigger: OnUpdate
08.03.2007 22:41:19.104 | DEBUG   | ExecuteThread ID: 2568 | Execution Result: $buffer=GetValueString("LEVELJET");
SetValueString("LEVELJET","");
list($usec, $sec) = explode(" ", microtime());
$start_time = strftime("%H:%M:%S",$sec).substr($usec,1);

// open logfile
$handle = fopen("h:/leveljet/testlog.txt","a"); //$logfilepath definiert die Datei mit Pfad
fwrite($handle,$start_time.":>");
//Message verarbeiten
$length = strlen($buffer);
if ($length !== 0)
{
   fwrite($handle,$start_time.":>");
   for ($i=0; $i<$length; $i++)
   {
      $dbyte = ord($buffer{$i});
      fwrite($handle, $dbyte." ");
   }
}
fclose($handle);

08.03.2007 22:41:19.104 | DEBUG   | ExecuteThread ID: 2568 | Executed, Ret: 1, Successful:True
08.03.2007 22:41:19.104 | DEBUG   | VariableManager      | Variable: LEVELJET (String), Value: €
08.03.2007 22:41:19.104 | DEBUG   | ExecuteThread ID: 1552 | Executing Script: LEVELJET_LOG.ips.php ~ Sender: Variable: LEVELJET, Trigger: OnUpdate
08.03.2007 22:41:19.104 | DEBUG   | ExecuteThread ID: 1552 | Execution Result: $buffer=GetValueString("LEVELJET");
SetValueString("LEVELJET","");
list($usec, $sec) = explode(" ", microtime());
$start_time = strftime("%H:%M:%S",$sec).substr($usec,1);

// open logfile
$handle = fopen("h:/leveljet/testlog.txt","a"); //$logfilepath definiert die Datei mit Pfad
fwrite($handle,$start_time.":>");
//Message verarbeiten
$length = strlen($buffer);
if ($length !== 0)
{
   fwrite($handle,$start_time.":>");
   for ($i=0; $i<$length; $i++)
   {
      $dbyte = ord($buffer{$i});
      fwrite($handle, $dbyte." ");
   }
}
fclose($handle);

08.03.2007 22:41:19.104 | DEBUG   | ExecuteThread ID: 1552 | Executed, Ret: 1, Successful:True
08.03.2007 22:41:19.104 | DEBUG   | VariableManager      | Variable: LEVELJET (String), Value: x 
08.03.2007 22:41:19.104 | DEBUG   | ExecuteThread ID: 3620 | Executing Script: LEVELJET_LOG.ips.php ~ Sender: Variable: LEVELJET, Trigger: OnUpdate
08.03.2007 22:41:19.104 | DEBUG   | ExecuteThread ID: 3620 | Execution Result: $buffer=GetValueString("LEVELJET");
SetValueString("LEVELJET","");
list($usec, $sec) = explode(" ", microtime());
$start_time = strftime("%H:%M:%S",$sec).substr($usec,1);

// open logfile
$handle = fopen("h:/leveljet/testlog.txt","a"); //$logfilepath definiert die Datei mit Pfad
fwrite($handle,$start_time.":>");
//Message verarbeiten
$length = strlen($buffer);
if ($length !== 0)
{
   fwrite($handle,$start_time.":>");
   for ($i=0; $i<$length; $i++)
   {
      $dbyte = ord($buffer{$i});
      fwrite($handle, $dbyte." ");
   }
}
fclose($handle);

08.03.2007 22:41:19.104 | DEBUG   | ExecuteThread ID: 3620 | Executed, Ret: 1, Successful:True
08.03.2007 22:41:19.104 | DEBUG   | VariableManager      | Variable: LEVELJET (String), Value: €
08.03.2007 22:41:19.104 | DEBUG   | ExecuteThread ID: 3228 | Executing Script: LEVELJET_LOG.ips.php ~ Sender: Variable: LEVELJET, Trigger: OnUpdate
08.03.2007 22:41:19.104 | DEBUG   | ExecuteThread ID: 3228 | Execution Result: $buffer=GetValueString("LEVELJET");
  1. Datei
    Wird die Datei angelegt? Wenn nicht, Im Kernel-log nach Fehlern suchen, dann unbedingt Pfad überprüfen (Slashes).

Nein, keine Datei, keine Fehler.

füge mal hinter dem fopen folgende Zeile ein:

fwrite($handle,$start_time.":>");

Dann sollte auf jeden Fall schon mal 'ne Zeit drinstehen.

OK! …sieht jetzt so aus:

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

// open logfile
$handle = fopen("h:/leveljet/testlog.txt","a"); //$logfilepath definiert die Datei mit Pfad
fwrite($handle,$start_time.":>");
//Message verarbeiten
$length = strlen($buffer);
if ($length !== 0)
{
   fwrite($handle,$start_time.":>");
   for ($i=0; $i<$length; $i++)
   {
      $dbyte = ord($buffer{$i});
      fwrite($handle, $dbyte." ");
   }
}
fclose($handle);

Korrekt so?

Zu den Bytes:
So wie Du es geschrieben hast sind es nicht 12 sondern 24 Byte. Ein Byte ist immer eine 2-stellige hex-Zahl. Entweder ist die Übertragung nicht korrekt oder die Einstellungen der Schnittstelle (Baudrate, Parity usw…) stimmen nicht… :mad:

Ja, das ist mir schon bekannt, nur schreibt der Hersteller (Protokollbeschreibung) ausdrücklich von 12 Bytes…

Beschreibung:
Die serielle Schnittstelle dient zum Datenaustausch zwischen Leveljet und verschiedener Applikationen. Die Übertragung erfolgt dabei über TTL-Pegel 0-5V und kann somit direkt mit anderen Microcontrollern verbunden werden. Zur Datenübertragung an einen PC muß ein Pegelwandler eingesetzt werden.

Schnittstellenparameter:
Die Geschwindigkeit beträgt 19200 Baud, 8 Bit, None-Parity, 1 Stop-Bit (19200,8,N,1), die Datenübertragung erfolgt im Sekundentakt.

Datenformat:
Ein Datenblock umfasst 12 Bytes, davon 10 Datenbytes und zwei CRC-Bytes.
Datenbyte Zuordnung
0 Gerätekennung Low-Byte $E8
1 Gerätekennung High-Byte $03
2 Distanz Low-Byte
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

Mich wundert es aber auch, dass es 24 Bytes sind :confused: und die Schnittstelleneinstellung habe ich genau nach diesen Herstellerangaben vorgenommen.

Hallo nancilla.

Das ist aber ein „lustiges“ Log :rolleyes: :rolleyes: :smiley:

Ich glaube, wir sind der Sache näher gekommen.

Im Log sollte niemals der Code auftauchen. Kann es sein, dass Du im Script die php-Kennzeichnung vergessen hast?
Jedes php-Script beginnt in der ersten Zeile mit <? und endet in der letzten Zeile mit ?>

Beispiel:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : activate_fht.ips.php
Trigger  : 
Interval : 
*/

FHT_SetTemperature(14353, 17.5);

?>

So sollte es aussehen. Der Code hier ist lediglich die Zeile

FHT_SetTemperature(14353, 17.5);

Weiter nichts. Prüfe bitte, ob das auch so ist.

Und poste doch gleich mal die Screenshots vom COM.

Gruß
Fabian

Hallo Fabian!

Erstmal:

Alles Gute zum Geburtstag!

Na selbstverständlich! … :In die Ecke und schäm::o :rolleyes:
Ich habe das eben so übernommen, wie du es gepostet hast:D

Jetzt habe ich eine Datei:)
Und die sieht so aus…

11:15:31.97556900:>0 248 248 0 128 11:15:32.14744200:>248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:33.56929800:>0 11:15:33.66304700:>248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:34.03804300:>120 0 11:15:34.38178900:>120 30 248 11:15:34.35053900:>128 11:15:36.08489300:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:37.41300000:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:38.20986400:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:40.77233200:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:41.44419700:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:42.60043300:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:44.13166500:>248 11:15:44.33478600:>128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:45.16290200:>0 11:15:45.17852500:>0 11:15:46.20976200:>248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:46.77225600:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:47.56912000:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:48.31911000:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:49.94408900:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:51.77219100:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:54.30340800:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:55.47526900:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:57.92836100:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:15:58.28773400:>0 248 248 0 128 248 128 0 0 248 120 0 11:15:59.05334800:>128 0 120 0 0 0 120 0 128 120 30 248 11:15:59.52209100:>128 0 120 0 0 0 120 0 128 120 30 248 11:15:59.61584000:>128 0 120 0 0 0 120 0 128 120 30 248 11:16:00.19395800:>128 0 120 0 0 0 120 0 128 120 30 248 11:16:00.91269900:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:16:02.72517700:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:16:03.88141100:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:16:05.22514500:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:16:08.00635700:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:16:11.94380800:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:16:14.64689700:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:16:21.05306500:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:16:23.09991500:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:16:25.70925600:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:16:26.77174300:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 11:16:27.80298000:>0 248 248 0 128 248 128 0 0 248 120 0 128 0 120 0 0 0 120 0 128 120 30 248 

Da müsste dann natürlich noch Format rein …irgendwie?!

Das Script sieht momentan so aus:

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

// open logfile
$handle = fopen("H:/LevelJet/testlog.txt","a"); //$logfilepath definiert die Datei mit Pfad
// fwrite($handle,$start_time.":>");
//Message verarbeiten
$length = strlen($buffer);
if ($length !== 0)
{
   fwrite($handle,$start_time.":>");
   for ($i=0; $i<$length; $i++)
   {
      $dbyte = ord($buffer{$i});
      fwrite($handle, $dbyte." ");
   }
}
fclose($handle);
?>

Den Screenshot habe ich angefügt…

rs232.JPG

Jo das ist schon besser!
Also jetzt mal so:

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

// open logfile 
$handle = fopen("H:/LevelJet/testlog.txt","a"); //$logfilepath definiert die Datei mit Pfad 
// fwrite($handle,$start_time.":>"); 
//Message verarbeiten 
$length = strlen($buffer); 
if ($length !== 0) 
{ 
   fwrite($handle,$start_time.":>"); 
   for ($i=0; $i<$length; $i++) 
   { 
      $dbyte = ord($buffer{$i}); 
      fwrite($handle, set_byte($dbyte)." "); 
   }
   fwrite($handle,"
");  
} 
fclose($handle);

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

Hallo Fabian,

es ist Abend und da bin ich wieder:D

Das o.g. Script habe ich jetzt auf „OnUpdate“ an die Variable „LEVELJET“ gebunden und bekomme schonmal die Werte so, wie sie auch im Debugger anzeigt werden…

20:35:57.46353000:>fe 
20:35:58.36977300:>78 fe 78 fe 
20:35:59.27601800:>fe 
20:36:00.29163600:>78 fe 78 fe 
20:36:01.27600400:>80 
20:36:01.29163000:>00 f8 00 78 
20:36:01.41662900:>00 78 fe 78 fe 
20:36:02.32287400:>78 fe 78 fe 
20:36:03.30724100:>00 f8 00 78 00 78 fe 78 fe 
20:36:04.29161100:>f8 00 78 00 
20:36:04.30723500:>78 fe 78 fe 
20:36:05.38535400:>fe 
20:36:06.33847200:>00 f8 f8 00 00 80 00 
20:36:06.36972200:>78 fe 78 fe 
20:36:07.41659100:>00 f8 f8 00 00 80 00 80 80 78 00 80 f8 78 00 f8 00 78 00 78 fe 78 fe 
20:36:08.51033400:>fe 
20:36:09.46345300:>78 fe 78 fe 
20:36:10.38532100:>78 00 78 fe 
20:36:10.38532100:>78 fe 
20:36:11.40094100:>00 
20:36:11.43218900:>fe 78 fe 
20:36:12.55718300:>fe 
20:36:13.49467600:>fe 
20:36:14.43217100:>78 00 f8 00 78 00 78 fe 78 fe 
20:36:15.41653900:>80 
20:36:15.43216400:>fe 78 
20:36:15.66653800:>fe 
20:36:16.57278300:>f8 78 00 f8 00 78 00 78 fe 78 fe 
20:36:17.49465200:>fe 
20:36:18.47901900:>f8 
20:36:18.51027000:>fe 
20:36:19.47901400:>00 78 00 78 fe 78 fe 
20:36:20.57275600:>f8 00 78 00 78 fe 78 fe 
20:36:21.52587500:>fe 
20:36:22.66649300:>80 f8 78 00 f8 00 78 00 78 fe 78 fe 
20:36:23.60398800:>78 fe 
20:36:24.52585600:>78 fe 78 fe 
20:36:25.76022300:>fe 
20:36:26.68209200:>f8 78 00 f8 00 78 00 78 fe 78 fe 
20:36:27.63521100:>fe 
20:36:28.58833000:>00 f8 f8 00 00 
20:36:28.88520400:>00 78 00 78 fe 78 fe 
20:36:29.54151300:>f8 
20:36:29.55707300:>00 
20:36:29.57269800:>fe 
20:36:30.72894100:>78 fe 78 fe 
20:36:31.68206100:>fe 
20:36:32.72892800:>78 fe 
20:36:33.69767200:>78 fe 78 fe 
20:36:34.61954100:>00 
20:36:34.63516600:>78 00 78 fe 78 fe 
20:36:35.76016000:>fe 
20:36:36.69765300:>78 fe 78 fe 
20:36:37.74452200:>f8 00 78 00 78 fe 78 fe 

Ein deutlicher Fortschritt, dank Dir …Super!
Nun müsste man noch das passende Stück „herausfischen“ und in eine andere Variable übertragen…:o

Mir scheint nur, dass ein paar Bytes verloren gehen, denn normalerweise müssten sich die Pakete nach 24? Bytes wiederholen, aber ich sehe keine wiederholte Reihenfolge…

Es kann passieren, dass Daten verloren gehen, da das Script vermutlich mehrfach parallel aufgerufen wird. Außerdem triggert sich das Script quasi selbst, da bei Änderung/Update der Variable ein Event ausgelöst wird. Im Script selbst wird die Variable aber gelöscht und somit auch ein Trigger ausgelöst. Damit das nicht passiert, fragen wir die Var ab, ob sie leer ist und fügen noch ein Semaphore ein.

An den Anfang des Scriptes muss folgende Passage:

if (GetValueString("LEVELJET") == "")
   return;
if (!IPS_SemaphoreEnter("RegisterVariable_Log_run",800))
   return;

und ans Ende (aber vor „?>“ :rolleyes: ):

IPS_SemaphoreLeave("RegisterVariable_Log_run");

Das sollte das Log beruhigen und die „Verluste“ eindämmen. Leider sehen die Daten noch nicht so gut aus. Aber es gab nach dem letzten Update Probleme mit der Com-Schnittstelle. Mal sehen, was jetzt rauskommt.

Hi!

:wink: Auch ich bin lernfähig! :smiley:

Nun habe ich folgendes Script:

<?
if (GetValueString("LEVELJET") == "")
   return;
if (!IPS_SemaphoreEnter("RegisterVariable_Log_run",900))
   return;
//IPS_Sleep(300);
$buffer=GetValueString("LEVELJET");
SetValueString("LEVELJET","");
list($usec, $sec) = explode(" ", microtime());
$start_time = strftime("%H:%M:%S",$sec).substr($usec,1);

// open logfile
$handle = fopen("H:/LevelJet/testlog.txt","a"); //$logfilepath definiert die Datei mit Pfad

//Message verarbeiten
$length = strlen($buffer);
if ($length !== 0)
{
   fwrite($handle,$start_time.":>");
   for ($i=0; $i<$length; $i++)
   {
      $dbyte = ord($buffer{$i});
      fwrite($handle, set_byte($dbyte)." ");
   }
   fwrite($handle,"
");
}
fclose($handle);

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

Ich habe die Zeile auf 900 abgeändert:

if (!IPS_SemaphoreEnter("RegisterVariable_Log_run",900))

da mir bei 800 immer noch Bytes verloren gingen.

Und erhalte diese Werte in der Datei:

12:21:02.40026700:>00 f8 
12:21:02.41589100:>f8 00 80 f8 80 00 
12:21:02.41589100:>00 f8 78 00 80 00 
12:21:02.41589100:>78 00 00 00 78 
12:21:02.43151600:>00 80 78 1e 
12:21:02.43151600:>f8 
12:21:03.36898600:>00 f8 f8 00 80 f8 80 00 
12:21:03.36898600:>00 f8 78 00 
12:21:03.38461000:>80 00 78 00 00 
12:21:03.38461000:>00 78 00 80 78 1e 
12:21:03.38461000:>f8 
12:21:04.38457800:>00 f8 f8 00 80 f8 
12:21:04.40020200:>80 00 
12:21:04.40020300:>00 f8 78 00 80 00 78 00 00 00 
12:21:04.41582700:>78 00 80 78 1e f8 
12:21:05.41579500:>00 f8 f8 00 80 f8 80 00 00 
12:21:05.43142000:>f8 78 00 80 00 78 00 
12:21:05.43142000:>00 00 78 00 80 
12:21:05.43142000:>78 1e f8 
12:21:06.43138800:>00 
12:21:06.43138800:>f8 f8 00 80 f8 
12:21:06.44701200:>80 00 00 f8 78 00 
12:21:06.44701200:>80 00 78 00 00 
12:21:06.44701200:>00 78 00 80 78 1e 
12:21:06.46263600:>f8 
12:21:07.46260500:>00 f8 f8 
12:21:07.46260500:>00 80 f8 80 00 00 
12:21:07.46260500:>f8 78 00 80 00 
12:21:07.47822900:>78 00 00 00 78 
12:21:07.47822900:>00 80 78 1e f8 
12:21:08.47819800:>00 
12:21:08.49382200:>f8 
12:21:08.49382200:>78 00 80 00 78 
12:21:08.49382200:>00 00 00 78 00 
12:21:08.50944600:>80 78 1e f8 
12:21:09.44691700:>00 f8 f8 00 80 f8 80 00 00 
12:21:09.44691700:>f8 78 00 80 00 
12:21:09.46254100:>78 00 00 00 78 
12:21:09.46254100:>00 80 78 1e f8 
12:21:10.46251000:>00 f8 
12:21:10.46250900:>f8 00 80 f8 80 00 
12:21:10.47813300:>00 f8 78 00 80 00 

Das sieht schonmal gut aus, denn nun wiederholt sich das komplette Paket jede Sekunde, so wie sein soll…
00 f8 f8 00 80 f8 80 00 00 f8 78 00 80 00 78 00 00 00 78 00 80 78 1e f8

Na das ist doch was:

nun wiederholt sich das komplette Paket jede Sekunde, so wie sein soll…

Ich habe gesehen, dass Du die Wartezeit am Anfang => IPS_Sleep() herausgenommen hast. Lass diese mal drin und erhöhe die Zeit auf 800ms. Damit wartet das Script nach dem Trigger 0,8 Sekunden, bevor es die Variable ausliest, dann sollte der komplette Block in eine Zeile passen.

Zur Erklärung:
Die Zeit beim Semaphore ist nicht zwingend. Wenn das Script nicht parallel läuft, wird gar nicht gewartet. Daher muss eine definierte Zeit vorhanden sein.

Also mit den Daten kann ich nix anfangen. :confused:

Ich habe das Gefühl, es gibt da noch irgendein Problem bei der Übertragung. Auf dem geposteten Bild ist die Schnittstelle nicht aktiviert. Warum hast Du DTR an?

Lade erstmal noch das aktuelle Update runter. Im ersten Post mit dem Hyperterminal sind es genau 12 Bytes. Folglich muss etwas schief gehen. Versuche bitte jetzt nochmal mit Hyperterminal ein paar Werte aufzuzeichnen. Dann kann man sehen, ob es an IPS liegt, dass die Werte „verbogen“ werden.

Stell mal im Gerätemanager die gleichen Einstellungen ein, wie beim COM in IPS.
BTW: Wie kommst Du an COM4? Ist das ein extra Adapter oder hast Du die nur im Gerätemanager umbenannt?

Hatte ich zu dem Zeitpunkt gerade closed.

Warum hast Du DTR an?

Weil sonst garkeine Daten kommen. Habe ich schon probiert.

Lade erstmal noch das aktuelle Update runter.

Ist aktuell!

Im ersten Post mit dem Hyperterminal sind es genau 12 Bytes. Folglich muss etwas schief gehen. Versuche bitte jetzt nochmal mit Hyperterminal ein paar Werte aufzuzeichnen.

Dort sind es auch 12 Zeichen(Bytes) weiterhin.

Stell mal im Gerätemanager die gleichen Einstellungen ein, wie beim COM in IPS.

Passt …schon vorher…

Wie kommst Du an COM4? Ist das ein extra Adapter oder hast Du die nur im Gerätemanager umbenannt?

USB-RS232-Adapter, der aber auch mit der Original(Hersteller)-Software funktioniert.

Wenn ich die Zeit so umstelle, wie du es beschrieben hast, fehlen wieder Bytes. Habe jetzt schon verschiedene Varianten durchprobiert.

Zitat:
Im ersten Post mit dem Hyperterminal sind es genau 12 Bytes. Folglich muss etwas schief gehen. Versuche bitte jetzt nochmal mit Hyperterminal ein paar Werte aufzuzeichnen.

Dort sind es auch 12 Zeichen(Bytes) weiterhin.

AHA!

Das heist, bei der Übertragung ins IPS liegt der Fehler. Versuchs mal mit dem COM/LAN-Modul. Das müsste mit dem COM auch funktionieren. Einfach die rechte Seite deaktiviert lassen.

Das mit der Zeit sollte funktionieren. Einfach die Zeit im Sleep auf 800 und im Semaphore auf 1. Dann wird nur gewartet, bis die Variable „voll“ ist.
Wichtig: Du musst in der RegisterVariable auf „append“ stellen, damit immer angehangen wird. Sonst überschreibt IPS die vorhandenen Bytes mit neuen Daten.