Mal wieder komplettes Neuland für mich, mit PHP Socket-Programmierung hatte ich bisher noch nicht gebraucht – aber einmal ist immer das erste Mal! 🙂
Also hat unsere Qualitätssicherung den VJ1510 angeschafft, damit der Drucker UV-Tinte auf jedes Produkt spritzt und somit die Chargennummer und Datum/Uhrzeit auf dem Produkt vermerkt sind. Mit einer klassischen UV Lampe kann man das ganze dann wunderbar ablesen.
Soweit die Theorie – nur wie steuert man den Drucker am besten an?
Die Produktionsplanung läuft bei uns komplett in PHP ab und funktioniert wunderbar, also liegt es irgendwie nahe dass man das ganze verbindet und den Job von PHP erledigen lässt.
Vom Hersteller habe ich eine Beschreibung erhalten mit den wichtigsten Kommunikations-Befehlen mit derer man den Drucker ansteuern und die Benutzer-Felder mit Werten befüllen kann.
Die Software vom Hersteller kommt für uns nicht in Frage weil sie nur mit Windows läuft.
Der Drucker lauscht auf dem Port 3100 und nimmt dort Befehle entgegen, das Format ist recht einfach
startet ein Kommando und
beendet es. Dazwischen kann man seine Behle senden – ein „E“ liefert z.B. den Status des Druckers zurück „000000“ wäre das Ideal.
Ein wenig Suche im PHP-Manual und schon habe ich das Problem gelöst, der Drucker bekommt auf Knopfdruck mit dem kleinen PHP Script eine Chargennummer übergeben:
$address=“192.168.100.140″;
$port=“3100″;
$wert=“80123″;verbinden($address, $port, 3);
if($serror) {
echo „$serrorn“;
}else{
# wert an drucker senden
# U – als startkuerzel fuer Userfeld
# CHARGENNR – bezeichnung des Userfeldes
$in=chr(2).“UCHARGENNR“.chr(10).$wert.chr(3).“n“;
socket_write($socket, $in, strlen($in));
socket_close($socket);
}function verbinden($remote, $port, $timeout = 10) {
global $serror, $socket;$ip = „“;
# pruefen ob es sich um eine ip-adresse handelt
if( !preg_match(‚/^d+.d+.d+.d+$/‘, $remote) ) {
$ip = gethostbyname($remote);
if ($ip == $remote) {
$serror = „F1-Fehler: Drucker unbekannt!“;
return NULL;
}
}else{
$ip = $remote;
}if (!($socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP))) {
$serror = „F2-Fehler: „.socket_strerror(socket_last_error());
return NULL;
}socket_set_nonblock($socket);
$timeout *= 1000; # timeout mal 1000 weil in millisekunden gerechnet wird
$attempts = 0; # mehr als ein versuch?
$error = NULL;
$verbunden;while (!($verbunden = @socket_connect($socket, $remote, $port+0)) && $attempts++ < $timeout) {
$error = socket_last_error();
if ($error != SOCKET_EINPROGRESS && $error != SOCKET_EALREADY) {
$serror = „F3-Fehler: „.socket_strerror($error);
socket_close($socket);
return NULL;
}
usleep(1000000);
}if (!$verbunden) {
$serror = „F4-Fehler: Zeitüberschreitung ($timeout Sekunden) beim Verbinden. „.socket_strerror(socket_last_error());
socket_close($socket);
return NULL;
}socket_set_block($socket);
}
Und wie Franz so treffend angemerkt hat, das Ding schaut aus wie eine Melkmaschine 🙂