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)
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.
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:
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.
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.
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:
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:
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 und die Schnittstelleneinstellung habe ich genau nach diesen Herstellerangaben vorgenommen.
Das ist aber ein „lustiges“ Log :rolleyes: :rolleyes:
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 ?>
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.
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
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.
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?
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.