Serial port Datensätze verarbeiten

Hallo, zusammen, Anfängerfrage…
ich habe eine Zählerkomponente die am seriellen Port hängt.
Hab einige Zeit im Forum gesucht, aber nicht das richtige gefunden.

Den serial port habe angelegt, (Serial port(Com2(9600,8,1,N))
eine Cutter instance auch.

wenn ich mir in beiden, über debug, den Datenstrom ansehe kommen dort Daten an.

Die serielle Komponente sendet:
z.B. 00000123

00 3B 00 3B 00 3B 00 3B 00 3B 01 3B 02 3B 03 0D 0A

am Serial port kommt an:

00 00 00 3B 00 00 00 3B 00 00 00 3B 00 00 00 3B 00 00 00 3B 01 00 00 3B 02 00 00 3B 03 00 00 0D 0A

und leider auch nicht als kompletten Datenstrom sondern so:

14.02.2011 09:49:27.00 | Received Data | 00 00 00 00 3B 00 00 00
14.02.2011 09:49:27.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00
14.02.2011 09:49:27.00 | SENDCHUNK | 00 00 00 00 3B 00 00 00
14.02.2011 09:49:27.00 | Received Data | 00 3B 00 00 00 00 3B 00
14.02.2011 09:49:27.00 | CURRENTBUFFER | 00 3B 00 00 00 00 3B 00
14.02.2011 09:49:27.00 | SENDCHUNK | 00 3B 00 00 00 00 3B 00
14.02.2011 09:49:27.00 | Received Data | 00 00 00 3B 03 00 00 00
14.02.2011 09:49:27.00 | CURRENTBUFFER | 00 00 00 3B 03 00 00 00
14.02.2011 09:49:27.00 | SENDCHUNK | 00 00 00 3B 03 00 00 00
14.02.2011 09:49:27.00 | Received Data | 3B 04 00 00 00 3B 03 00
14.02.2011 09:49:27.00 | CURRENTBUFFER | 3B 04 00 00 00 3B 03 00
14.02.2011 09:49:27.00 | SENDCHUNK | 3B 04 00 00 00 3B 03 00
14.02.2011 09:49:27.00 | Received Data | 00 00 3B 04 00 00 00 0D 0A
14.02.2011 09:49:27.00 | CURRENTBUFFER | 00 00 3B 04 00 00 00 0D 0A
14.02.2011 09:49:27.00 | SENDCHUNK | 00 00 3B 04 00 00 00 0D 0A
14.02.2011 09:49:29.00 | Received Data | 00 00 00 00 3B 00 00 00
14.02.2011 09:49:29.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00
14.02.2011 09:49:29.00 | SENDCHUNK | 00 00 00 00 3B 00 00 00
14.02.2011 09:49:29.00 | Received Data | 00 3B 00 00 00 00 3B 00
14.02.2011 09:49:29.00 | CURRENTBUFFER | 00 3B 00 00 00 00 3B 00
14.02.2011 09:49:29.00 | SENDCHUNK | 00 3B 00 00 00 00 3B 00
14.02.2011 09:49:29.00 | Received Data | 00 00 00 3B 03 00 00 00
14.02.2011 09:49:29.00 | CURRENTBUFFER | 00 00 00 3B 03 00 00 00
14.02.2011 09:49:29.00 | SENDCHUNK | 00 00 00 3B 03 00 00 00
14.02.2011 09:49:29.00 | Received Data | 3B 04 00 00 00 3B 03 00 00 00 3B 05 00 00 00 0D 0A
14.02.2011 09:49:29.00 | CURRENTBUFFER | 3B 04 00 00 00 3B 03 00 00 00 3B 05 00 00 00 0D 0A
14.02.2011 09:49:29.00 | SENDCHUNK | 3B 04 00 00 00 3B 03 00 00 00 3B 05 00 00 00 0D 0A
14.02.2011 09:49:31.00 | Received Data | 00 00 00 00 3B 00 00 00

wie kann ich den Datenstrom im IP-Symcon weiter verarbeiten, so das ich am Ende auf die 00000123 als Zahlenwert komme?

Vielen Dank für jede Hilfe

Ich würde den Cutter auf Right = 0D0A setzen und den Rest per RegisterVariable in einem Skript verarbeiten.

paresy

Hallo Paresy,

vielen Dank für die schnelle Antwort.
Wenn ich das im cutter so setze bekomme ich die Daten so wie weiter unten einkopiert.

irgendwie werden die Daten nicht so getrennt, wie ich das gerne hätte.
was mache ich falsch?

14.02.2011 11:50:49.00 | Received Data | 00 00 00 00 3B 00 00 00
14.02.2011 11:50:49.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00
14.02.2011 11:50:49.00 | Received Data | 00 3B 00 00 00 00 3B 00
14.02.2011 11:50:49.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00
14.02.2011 11:50:49.00 | Received Data | 00 00 00 3B 06 00 00 00
14.02.2011 11:50:49.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00
14.02.2011 11:50:49.00 | Received Data | 3B 09 00 00 00 3B 05 00
14.02.2011 11:50:49.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00 3B 09 00 00 00 3B 05 00
14.02.2011 11:50:49.00 | Received Data | 00 00 3B 01 00 00 00 0D
14.02.2011 11:50:49.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00 3B 09 00 00 00 3B 05 00 00 00 3B 01 00 00 00 0D
14.02.2011 11:50:49.00 | Received Data | 0A
14.02.2011 11:50:49.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00 3B 09 00 00 00 3B 05 00 00 00 3B 01 00 00 00 0D 0A
14.02.2011 11:50:49.00 | SENDCHUNK | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00 3B 09 00 00 00 3B 05 00 00 00 3B 01 00 00 00
14.02.2011 11:50:51.00 | Received Data | 00 00 00 00 3B 00 00 00
14.02.2011 11:50:51.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00
14.02.2011 11:50:51.00 | Received Data | 00 3B 00 00 00 00 3B 00
14.02.2011 11:50:51.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00
14.02.2011 11:50:51.00 | Received Data | 00 00 00 3B 06 00 00 00
14.02.2011 11:50:51.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00
14.02.2011 11:50:51.00 | Received Data | 3B 09 00 00 00 3B 05 00
14.02.2011 11:50:51.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00 3B 09 00 00 00 3B 05 00
14.02.2011 11:50:51.00 | Received Data | 00 00 3B 02 00 00 00 0D
14.02.2011 11:50:51.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00 3B 09 00 00 00 3B 05 00 00 00 3B 02 00 00 00 0D
14.02.2011 11:50:51.00 | Received Data | 0A
14.02.2011 11:50:51.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00 3B 09 00 00 00 3B 05 00 00 00 3B 02 00 00 00 0D 0A
14.02.2011 11:50:51.00 | SENDCHUNK | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00 3B 09 00 00 00 3B 05 00 00 00 3B 02 00 00 00
14.02.2011 11:50:53.00 | Received Data | 00 00 00 00 3B 00 00 00
14.02.2011 11:50:53.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00
14.02.2011 11:50:53.00 | Received Data | 00 3B 00 00 00 00 3B 00
14.02.2011 11:50:53.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00
14.02.2011 11:50:53.00 | Received Data | 00 00 00 3B 06 00 00 00
14.02.2011 11:50:53.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00
14.02.2011 11:50:53.00 | Received Data | 3B 09 00 00 00 3B 05 00
14.02.2011 11:50:53.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00 3B 09 00 00 00 3B 05 00
14.02.2011 11:50:53.00 | Received Data | 00 00 3B 03 00 00 00 0D 0A
14.02.2011 11:50:53.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00 3B 09 00 00 00 3B 05 00 00 00 3B 03 00 00 00 0D 0A
14.02.2011 11:50:53.00 | SENDCHUNK | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 06 00 00 00 3B 09 00 00 00 3B 05 00 00 00 3B 03 00 00 00
14.02.2011 11:50:55.00 | Received Data | 00 00 00 00 3B 00 00 00

Du mussst im Cutter auf setzen klicken. Bei dir hat er es nicht uebernommen.

Hallo RWN,

hab ich gemacht, auch auf übernehmen, auf ok und neu geöffnet…
Der Eintrag 0A 0D steht auch beim erneuten öffnen im Fenster

Leider ändert sich nichts, die Daten kommen etwa im Abstand von 2 Sekunden an.

Du solltest auch mal bei der RegisterVariable gucken was kommt. Im Cutter siehst du doch, dass SENDCHUNK immer korrekt ist. :wink:

paresy

Hallo Paresy, vielen Dank! (bin halt Anfänger ;))

nun kommen die Daten schön sauber in Blöcken an.
Nun habe ich ein script an die RegisterVariable gehangen, komme aber mit der Beschreibung nicht weiter.

Das Beispiel funktioniert bei mir nicht :confused:

wo werden die Daten gespeichert, bzw. wie kann ich die Daten abrufen?

<?
$RegVarID = 34515 /[Cutter\Register Variable]/; // Achung: Das ist die ID der Registervariablen und NICHT der Instanz, von der die Daten eigentlich stammen
$newdata = 38822 /[Cutter\Register Variable\value\IPS_VALUE]/; // Die gerade empfangenen Daten (Vorsicht, die können Sonder- und Steuerzeichen haben)
$olddata = RegVar_GetBuffer ( 34515 /[Cutter\Register Variable]/ ); // Auslesen, was schon bzw. noch im Puffer steht
RegVar_SetBuffer(34515 /[Cutter\Register Variable]/, $olddata . $newdata); // Alles in die Variable schreiben, damit der Datenstrom komplett gespeichert wird
?>

Datesätze in RV

00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 01 00 00 00 3B 00 00 00 00 3B 07 00 00 00 3B 01 00 00 00 3B 01 00 00 00
00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 01 00 00 00 3B 00 00 00 00 3B 07 00 00 00 3B 01 00 00 00 3B 02 00 00 00
00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 01 00 00 00 3B 00 00 00 00 3B 07 00 00 00 3B 01 00 00 00 3B 03 00 00 00
00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 01 00 00 00 3B 00 00 00 00 3B 07 00 00 00 3B 01 00 00 00 3B 04 00 00 00
00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 01 00 00 00 3B 00 00 00 00 3B 07 00 00 00 3B 01 00 00 00 3B 05 00 00 00
00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 01 00 00 00 3B 00 00 00 00 3B 07 00 00 00 3B 01 00 00 00 3B 06 00 00 00
00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 01 00 00 00 3B 00 00 00 00 3B 07 00 00 00 3B 01 00 00 00 3B 07 00 00 00
00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 01 00 00 00 3B 00 00 00 00 3B 07 00 00 00 3B 01 00 00 00 3B 08 00 00 00
00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 01 00 00 00 3B 00 00 00 00 3B 07 00 00 00 3B 01 00 00 00 3B 09 00 00 00

Da deine Daten ja schon synchron sind, und du nicht mehr Puffern musst, ist die Sache ganz easy :D. IP-Symcon ist hat toll :smiley:


echo $IPS_VALUE;

Beachte, dass die Werte im Meldungsfenster landen werden und du das Skript nicht per Execute starten kannst.

paresy

PS: Ich sehe nur gerade wirklich nicht, wie du von dem HEX Wert auf deine Zahlen kommst :slight_smile: - Gibt es da ne richtige Protokollbeschreibung wie das jetzt umzuwandeln ist? Ich würde ja jetzt bei 3B nen explode machen und dann die jeweils die 4Bytes … das ergibt grad keinen Sinn :wink:

Hallp Paresy,
vielen Dank für Deine Hilfe.

Der Datensatz beinhaltet die Zahl

00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 01 00 00 00 3B 00 00 00 00 3B 07 00 00 00 3B 01 00 00 00 3B 01 00 00 00

00010711

Ich hab es mit dem Beispielscript in der Anleitung RegisterVariable versucht, komme da aber nicht weiter :frowning:

ich hab noch einen 2. Cutter angelegt mit SyncZeichen 3B und Eingabelänge 5

dann bekomme ich die Daten so aufbereitet.

so, dass 0048329 so dargestellt werden…
bin ich auf dem richtigen Weg?:confused:

5.02.2011 11:38:53.00 | SENDCHUNK | 3B 00 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 00 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 04 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 08 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 03 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 02 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 09 00 00 00

hier die Daten komplett:

15.02.2011 11:38:53.00 | Received Data | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 04 00 00 00 3B 08 00 00 00 3B 03 00 00 00 3B 02 00 00 00 3B 09 00 00 00
15.02.2011 11:38:53.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 04 00 00 00 3B 08 00 00 00 3B 03 00 00 00 3B 02 00 00 00 3B 09 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 00 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 00 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 04 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 08 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 03 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 02 00 00 00
15.02.2011 11:38:53.00 | SENDCHUNK | 3B 09 00 00 00
15.02.2011 11:38:55.00 | Received Data | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 04 00 00 00 3B 08 00 00 00 3B 03 00 00 00 3B 03 00 00 00 3B 00 00 00 00
15.02.2011 11:38:55.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 04 00 00 00 3B 08 00 00 00 3B 03 00 00 00 3B 03 00 00 00 3B 00 00 00 00
15.02.2011 11:38:55.00 | SENDCHUNK | 3B 00 00 00 00
15.02.2011 11:38:55.00 | SENDCHUNK | 3B 00 00 00 00
15.02.2011 11:38:55.00 | SENDCHUNK | 3B 04 00 00 00
15.02.2011 11:38:55.00 | SENDCHUNK | 3B 08 00 00 00
15.02.2011 11:38:55.00 | SENDCHUNK | 3B 03 00 00 00
15.02.2011 11:38:55.00 | SENDCHUNK | 3B 03 00 00 00
15.02.2011 11:38:55.00 | SENDCHUNK | 3B 00 00 00 00
15.02.2011 11:38:57.00 | Received Data | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 04 00 00 00 3B 08 00 00 00 3B 03 00 00 00 3B 03 00 00 00 3B 01 00 00 00
15.02.2011 11:38:57.00 | CURRENTBUFFER | 00 00 00 00 3B 00 00 00 00 3B 00 00 00 00 3B 04 00 00 00 3B 08 00 00 00 3B 03 00 00 00 3B 03 00 00 00 3B 01 00 00 00
15.02.2011 11:38:57.00 | SENDCHUNK | 3B 00 00 00 00
15.02.2011 11:38:57.00 | SENDCHUNK | 3B 00 00 00 00
15.02.2011 11:38:57.00 | SENDCHUNK | 3B 04 00 00 00
15.02.2011 11:38:57.00 | SENDCHUNK | 3B 08 00 00 00
15.02.2011 11:38:57.00 | SENDCHUNK | 3B 03 00 00 00
15.02.2011 11:38:57.00 | SENDCHUNK | 3B 03 00 00 00
15.02.2011 11:38:57.00 | SENDCHUNK | 3B 01 00 00 00

Nein. Das obere war schon korrekt. Du musst jetzt halt PHP lernen und ein paar Zeilen Code programmieren. Mit zusammenklicken bist du jetzt fertig.

paresy

ok, vielen Dank, php… ja, kann mir vielleich doch einer der „alten“ Hasen einen Wink mit dem Zaunpfahl geben, wie isch das anstelle?

Das ist, wonach du suchst. Einfach in das Skript kopieren und die 12345 gegen deine ID tauschen.


$n = "";
$x = explode(chr(0x3B), $IPS_VALUE);
foreach($x as $z) { $n .= ord($z{0}); }
SetValue(12345, (int)$n);

paresy

Guten Morgen Paresy,

vielen Dank, jetzt bekomme ich die Impuls sauber in einer Variablen angezeigt, toll was IPS alles kann, und mit so einem kurzen Script!

Hier habe ich das gesamte Script. Die Impulse werden in die Variable (Ausgabe Impulse) geschrieben aber ich habe im Script 2 Fehlermeldungen:

Notice: Undefined variable: IPS_VALUE in C:\IP-Symcon\scripts\45181.ips.php on line 6

Notice: Uninitialized string offset: 0 in C:\IP-Symcon\scripts\45181.ips.php on line 7

was hat es damit auf sich?


<?
$RegVarID = 34515 /*[Cutter\Register Variable]*/ ; 
$newdata = 34515 /*[Cutter\Register Variable]*/ ; // Die gerade empfangenen Daten 
$olddata = RegVar_GetBuffer ( 34515 /*[Cutter\Register Variable]*/  ); // Auslesen, was im Puffer steht
$n = "";
$x = explode(chr(0x3B), $IPS_VALUE);
foreach($x as $z) { $n .= ord($z{0}); }
SetValue(28385 /*[Cutter\Register Variable\Ausgabe Impulse]*/ , (int)$n);
?>

Ich denke mal das dein Skript durch die RegVar getriggert wird. Du darfst das Skript nicht per Execute ausführen da dann nichts in der IPS_Value drinn steht. Somit kann er dann auch nichts im Array haben… ($x as $z).

Füge dies in die 2 Zeile ein:


if($IPS_SENDER == "Execute")
 die("Nein... Dieses Skript darf nicht per Execute gestartet werden");

paresy

:):):slight_smile:
Danke für eure Anmerkungen…
habs kapiert.

$RegVarID = 34515 /*[Cutter\Register Variable]*/ ; 
$newdata = 34515 /*[Cutter\Register Variable]*/ ; // Die gerade empfangenen Daten 
$olddata = RegVar_GetBuffer ( 34515 /*[Cutter\Register Variable]*/  ); // Auslesen, was im Puffer steht 

Das kannst Du dir sparen.:wink:

ok, vielen Dank… bin halt noch Anfänger.
nächster Schritt ist die Umrechnung der Impulse in Kwh…

Die umrechnung der Impulse in KWh habe ich geschafft, Danke noch mal für die Hilfe.

Ergänzend zu meiner Frage am Anfang, habe ich nun Datensätze von 8 zählern welche an einem Stück hintereinander gesendet werden. Also in der RegVar kommen 128 Zeichen lange Datensätze an.
(habe ich hier zur besseren Übersicht mal im Editor getrennt)
(am Ende hab ich den Zahlenwert angehangen)

00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 02 3B entspr. 2
00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 04 3B entspr. 4
00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 08 3B entspr. 8
00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 0A 3B 06 3B entspr. 16
00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 1E 3B 02 3B entspr. 32
00 3B 00 3B 00 3B 00 3B 00 3B 00 3B 3C 3B 04 3B entspr. 64
00 3B 00 3B 00 3B 00 3B 00 3B 64 3B 14 3B 08 3B entspr. 128
00 3B 00 3B 00 3B 00 3B 00 3B C8 3B 32 3B 06 3B entspr. 256

Frage ist, wie bekomme ich die Daten in Blöcke zu 8 Datensätzen getrennt und in unterschiedliche Variablen abgelegt?

was ich bisher versucht habe ist:


<?
$n = "";
$x = explode(chr(0x3B), $IPS_VALUE);
foreach($x as $z) { $n .= ord($z{0}); }
$data .= $IPS_VALUE;
//wenn $data mindestens 128 Zeichen lang ist
if (strlen($data) >= 128)
{
// $data in Blöcke von bis zu 8 Zeichen zerlegen
$datasets = str_split($data, 8);
}
// alle Datensätze durcharbeiten
for ($i = 0; $i < count($datasets); $i++)
{
// vollständige Datensätze (genau 8 Zeichen lang) ausgeben
if (strlen($datasets[$i]) == 8)
SetValue(28385 /*[Cutter\Register Variable\Zaehler 1\1Ausgabe Impulse]*/ , (int)$n);
}
?>

funktioniert leider nicht, was mache ich falsch?:confused: