arnoa
12.05.2013, 17:25
Da mir die Einbindung meines alten PLS100-112 einiges an Zeit gekostet hat, möchte ich hier meine Erfahrungen teilen.
Der PLS100-112 hat schon einige Jahre auf dem Buckel und es gibt so gut wie keine Informationen mehr im Netz. In diesem Sinne möchte ich mich bei einem SICK Technik-Mitarbeiter bedanken der mir diesbezüglich alle noch vorhandenen Dokumentationen zukommen hat lassen. Ohne diese Informationen und einem guten Serial-Port Sniffer wäre ich nicht ans Ziel gekommen!
Das Ergebnis sieht derzeit so aus:
http://www.aurob.com/wp-content/uploads/2013/03/aurob_software_sick_laserscanner.jpg
Die Einbindung war nicht ganz einfach da keine Beschreibung des Datenstromes bzw. zum Aufbau eines Datensatzes mehr zu finden war und die Befehlssätze vom PLS200 nicht gleich sind wie die des PLS100. Der Datensatzaufbau (wenn dann mal die Daten kommen http://www.aurob.com/wp-includes/images/smilies/icon_wink.gif ) sieht wie folgt aus:http://www.aurob.com/wp-content/uploads/2013/03/sick_data_format1.jpg (http://www.aurob.com/wp-content/uploads/2013/03/sick_data_format1.jpg)
Ich lasse den Lasercanner auf die vollen 180° arbeiten. Abtastschritt ist ein halbes Grad. Somit bekommen ich 720 Bytes an Daten (je ein Low und ein High Byte pro Grad). Diese werden dann zusammengesetzt und ergeben die Länge zum Hindernis. WICHTIG, und dieser Fehler hat mir viel Zeit gekostet, ist das vom High Byte die letzten drei Bits abgeschnitten werden müssen. Somit stehen für den Abstandswert 12 Bits zu Verfügung mit denen ein Bereich von 0 bis 8191 abgedeckt wird. Das sieht dann wie folgt aus:
http://www.aurob.com/wp-content/uploads/2013/03/sick_data_bitmask.jpg (http://www.aurob.com/wp-content/uploads/2013/03/sick_data_bitmask.jpg)
Ich habe das derzeit in dieser Form gelöst (unschön – muss optimiert werden!)
// Einlesen des Low und High Bytes
int dec_low = buffData[i + 0]; // LOW BYTE
int dec_high = buffData[i + 1]; // HIGH BYTE
// Die letzten drei Bits vom High Byte entfernen
int dec_high_cut = (byte)(dec_high << 3);
dec_high_cut = (byte)(dec_high_cut >> 3);
// Low und High Byte miteinander verbinden
int decvalue = dec_high_cut << 8 | dec_low;
// x und y Koordinaten für die Ausgabe berechnen
x = (decvalue * Math.Cos(deg * (Math.PI / 180)));
y = (decvalue * Math.Sin(deg * (Math.PI / 180)));
Bei Interesse und/oder Bedarf kann ich natürlich detailliertere Informationen zur Einbindung liefern.
Der PLS100-112 hat schon einige Jahre auf dem Buckel und es gibt so gut wie keine Informationen mehr im Netz. In diesem Sinne möchte ich mich bei einem SICK Technik-Mitarbeiter bedanken der mir diesbezüglich alle noch vorhandenen Dokumentationen zukommen hat lassen. Ohne diese Informationen und einem guten Serial-Port Sniffer wäre ich nicht ans Ziel gekommen!
Das Ergebnis sieht derzeit so aus:
http://www.aurob.com/wp-content/uploads/2013/03/aurob_software_sick_laserscanner.jpg
Die Einbindung war nicht ganz einfach da keine Beschreibung des Datenstromes bzw. zum Aufbau eines Datensatzes mehr zu finden war und die Befehlssätze vom PLS200 nicht gleich sind wie die des PLS100. Der Datensatzaufbau (wenn dann mal die Daten kommen http://www.aurob.com/wp-includes/images/smilies/icon_wink.gif ) sieht wie folgt aus:http://www.aurob.com/wp-content/uploads/2013/03/sick_data_format1.jpg (http://www.aurob.com/wp-content/uploads/2013/03/sick_data_format1.jpg)
Ich lasse den Lasercanner auf die vollen 180° arbeiten. Abtastschritt ist ein halbes Grad. Somit bekommen ich 720 Bytes an Daten (je ein Low und ein High Byte pro Grad). Diese werden dann zusammengesetzt und ergeben die Länge zum Hindernis. WICHTIG, und dieser Fehler hat mir viel Zeit gekostet, ist das vom High Byte die letzten drei Bits abgeschnitten werden müssen. Somit stehen für den Abstandswert 12 Bits zu Verfügung mit denen ein Bereich von 0 bis 8191 abgedeckt wird. Das sieht dann wie folgt aus:
http://www.aurob.com/wp-content/uploads/2013/03/sick_data_bitmask.jpg (http://www.aurob.com/wp-content/uploads/2013/03/sick_data_bitmask.jpg)
Ich habe das derzeit in dieser Form gelöst (unschön – muss optimiert werden!)
// Einlesen des Low und High Bytes
int dec_low = buffData[i + 0]; // LOW BYTE
int dec_high = buffData[i + 1]; // HIGH BYTE
// Die letzten drei Bits vom High Byte entfernen
int dec_high_cut = (byte)(dec_high << 3);
dec_high_cut = (byte)(dec_high_cut >> 3);
// Low und High Byte miteinander verbinden
int decvalue = dec_high_cut << 8 | dec_low;
// x und y Koordinaten für die Ausgabe berechnen
x = (decvalue * Math.Cos(deg * (Math.PI / 180)));
y = (decvalue * Math.Sin(deg * (Math.PI / 180)));
Bei Interesse und/oder Bedarf kann ich natürlich detailliertere Informationen zur Einbindung liefern.