Wer beruflich mit Point-Of-Sale-Systemen bzw. Computerkassen zu tun hat, musste sich bestimmt auch schon mal detaillierter mit dem Bon-Drucker beschäftigen. Sehr bekannte gute Drucker stammen aus dem Hause Epson (die TM-Reihe) und diese sieht man recht häufig in Supermärkten, beim Bäcker, wie auch an der Tankstelle. Die sogenannten „ESC-Kommandos“, mit denen es möglich ist dem Drucker Befehle zu erteilen, habe ich bisher nur mal genutzt um die Kassenlade zum Test zu öffnen um aus der Ferne zu prüfen, ob der Mechanismus der Kassenlade funktioniert. Da es etwas komplexer ist den Status der Kassenlade (offen/geschlossen) herauszufinden, habe ich mein zusammengetragenes Wissen hier noch einmal zusammengefasst.
ESC-Kommandos im Allgemeinen
Eine Escape-Sequenz ist eine Zeichenkombination die keinen Text repräsentiert, sondern vom Gerät/Programm abgefangen wird und eventuell eine Sonderfunktion ausführt. Im Fall eines Druckers kann dies z. B. die Umschaltung auf eine andere Schriftgröße oder das Auswerfen der Seite sein. Man „flüchtet“ also aus der normalen Funktionalität bzw. dem einfachen zu druckenden/auszugebenden Text.
Als Escaping bezeichnet man auch die Nutzung eines Maskierungszeichens, wie beispielsweise „\n“ um in vielen Programmiersprachen die Ausgabe in einer neuen Zeile fortzusetzen. Daher kommt auch der Spruch „Das muss man escapen“. Meiner Meinung nach kann man das Auskommentieren von Quellcode auch als Escaping bezeichnen, da man beim Auskommentieren von Quellcode die ursprüngliche Funktionalität des Codes komplett „abschaltet“.
ESC-Kommandos an den Drucker senden
Ich habe zwei verschiedene Möglichkeiten gefunden Befehle an den Drucker zu senden. Zum Einen ist dies durch den Befehl „copy“ in der Kommandozeile möglich, zum Anderen mit einem Extra-Kommandozeilen-Tool. Durch den Copy-Befehl kopiert man eine Datei, welche die ESC-Befehle beinhaltet, einfach auf den Drucker, wodurch diese Datei gedruckt bzw. verarbeitet wird:
1 |
copy /B posbefehl.dat \\pos\printername |
Der Drucker muss natürlich im Netzwerk freigegeben sein, damit man den Befehl schicken kann. Ansonsten hat man keine keine Möglichkeit den Drucker, z. B. über die COM-Schnittstelle, anzusprechen. Mit entsprechenden OPOS-Treibern bzw. dem SDK sieht es da vermutlich einfacher aus…
Für mehr als den Befehl um die Kassenlade zu öffnen habe ich es diesen Weg über Windows-Bordmittel nicht nutzen können.
Wie muss so eine Textdatei aussehen die man übergibt? Für das Öffnen der Kassenlade sah es bei mir wie folgt aus:
Der Befehl setzt sich aufgebröselt aus folgenden Komponenten zusammen: ESC p m t1 t2
ESC p = Kassenlade öffnen
m =Connector-Pin (0 für Kassenlade 1, 1 für Kassenlade 2)
t1 = „On-Time“, die angegebene Zeit in ms x 2, für die das Signal zum Öffnen gesendet wird – ich habe hier die Erfahrung gemacht, dass dadurch die Kassenlade „heftiger“ aufspringt, wenn man das Signal länger sendet, das kann aber auch nur gefühlt so gewesen sein
t2 = „Off-Time“, die angegebene Zeit in ms x 2, in welcher die Kassenlade nach Abschluss des Befehls nicht auf weitere Befehle zum Öffnen reagiert
Wichtig zu erwähnen ist, dass es mit den entsprechenden Hexadezimal- bzw. Dezimalzahlen aus den Programmierhandbüchern auf diesem Weg nicht funktioniert! Diese werden immer nur ausgedruckt. Eventuell gibt es da noch die Möglichkeit diese nach dem ESC anzuhängen um kenntlich zu machen, dass keine Druckdaten sondern Befehle in Form von Hexadezimalzahlen folgen. Damit habe ich mich aber nicht weiter beschäftigt.
Dann gibt es noch das Tool „Send-Data“ von Epson. Es handelt sich dabei um Kommandozeilentool, dessen Nutzung so ähnlich abläuft wie der einfache Copy-Befehl. Das Tool bekommt man hier:
https://download.epson-biz.com/modules/pos/index.php?page=single_soft&cid=5027&scat=47&pcat=3
Theoretisch ist mit diesem Tool das Übertragen von Befehlen direkt an die COM-Schnittstelle möglich. Das funktionierte bei mir bzw. mit dem verwendeten Treiber allerdings nicht. Statt die Daten zu übertragen hat das Tool immer nur eine Datei mit dem Namen des Ports erstellt (z. B. „esdprt001“)?! Deshalb musste ich hier ebenfalls den Umweg über die Freigabe des Druckers wählen.
Der Vorteil des Send-Data-Tools ist allerdings, dass man den Befehl in Hexadezimal oder Dezimalzahlen in einer Textdatei gespeichert haben kann und diese nun übertragen kann. Somit kann man die entsprechenden Befehle aus der vorhandenen Literatur einfach nutzen. Der Befehl für das Öffnen der Kassenlade sieht nun beispielsweise in Hexidezimalzahlen so aus:
$1B $70 $0 $FF $FF
Das $-Zeichen muss voran gestellt werden um kenntlich zu machen, dass eine Hexadezimalzahl folgen wird. $1B steht hierbei für „ESC“.
In der Kommandozeile wird bei Nutzung des Parameters -t auch zurückgegeben wie der Befehl übermittelt worden ist:
Kassenladen-Status abfragen?
Wenn die Kassenlade über den Drucker angeschlossen ist, dann kann man den Zustand der Kassenlade auch über den Drucker abfragen. Der Befehl zum Öffnen der Kassenlade wird wie zuvor gezeigt als Druckbfehl/-auftrag an den Drucker weitergegeben. Ebenso kann man auch Befehle an den Drucker schicken, mit denen man bestimmte Zustände ermitteln kann. Herauszufinden wie dies funktioniert war allerdings etwas kniffelig und ein paar Stunden Herumgefrickel habe ich damit herumbekommen.
Grundsätzlich muss wohl ein Treiber installiert sein, der die „bidirektionale Kommunikation“ mit dem Drucker unterstützt. Diese stellt man in den Eigenschaften des Druckers ein:
Ansonsten kommt vom Drucker logischerweise nichts an Daten zurück. Wenn das entsprechende Feld ausgegraut ist, muss man sich erst einmal einen anderen Drucker-Treiber besorgen, der die bidirektionale Kommunikation unterstützt.
Für das Zusammensetzen entsprechender Befehle habe ich ein „kurzes“ 700-seitiges Buch von Epson gefunden:
https://download.delfi.com/SupportDL/Epson/Manuals/TM-T88IV/Programming%20manual%20APG_1005_receipt.pdf (interessant sind die Seiten 290, 310 und 311)
Um den Zustand der Kassenlade herauszufinden habe ich folgenden Befehl gefunden, welcher den aktuellen Zustand anfragt:
$1D $72 $02
In der Kommandozeile bekam ich dann leider trotzdem keine Rückmeldung nach dem Absetzen des Befehls. Ich vermute dies liegt daran, dass ich auch mit dem Tool Send-Data über die Netzwerk-Freigabe des Druckers gehe und dieser auf diesem Weg vermutlich keine Daten zurückgeben kann. Stattdessen wird man aber in der Log-Datei (bei meinem Drucker „C:\Windows\EpsStmMon3.log““) des Drucker-Treibers fündig. Dort wird die Statusmeldung verzeichnet, nachdem man den Befehl abgesetzt hat:
Kassenlade geschlossen:
20190214111213.471,RDI,00000490,ESDPRT001:,00000054
20190214111213.533,RDO,00000490,ESDPRT001:,00000001,00
Kassenlade offen:
20190128142455.444,RDI,000004D4,ESDPRT001:,00000054
20190128142455.475,RDO,000004D4,ESDPRT001:,00000001,01
Interpretation des Status:
Was genau die Zahlen repräsentieren habe ich nicht recht verstanden. Binärzahlen, die irgendwie zu den Tabellen aus dem Programmierhandbuch passen würden, können es eigentlich nicht sein. Auf jedenfall tauchen diese aber immer in dieser Form auf, wenn die Kassenlade bei der Abfrage geöffnet oder geschlossen ist.
Hallo,
ich suche eine Lösung den Schubladenstatus einer Kasse abzufragen.
Da ich die Drucker normal über Windows installiert habe, einige stehen auch im LAN, steht mir keinê COM-Schnittstelle zur Verüfung. Also ESC-Sequenzen senden = OK. Empfang einer Anwort ist gelöst. Auch beim Drucker am Platz, TMT88.., funktionieren alle
Sendebefehl nur kein Empfang.
Lösung ?
Würde mich über eine Antwort freuen.
MfG
Walter
Hallo Walter,
ich habe deinen Kommentar unter den passenden Artikel verschoben.
Bei den Druckern mit LAN bzw. ohne COM-Schnittstelle funktioniert also die in meinem Artikel gezeigte Methode mit den ESC-Kommandos und der Log-Datei, oder habe ich das falsch verstanden?
mfg
Tobias
Hallo Tobias
Erstmals vielen Dank für deinen Artikel. Ist um einiges verständlicher als alle Dokumente welche ich von Epson heruntergeladen und gelesen habe.
Frage: Weisst du wie man ein befehl oder funktion für das öffnen der kassenschublade unter MacOS sendet?
Ich könnte eine TM-T20III 012 (Netzwerk) unter MacOS 13.1 problemlos einrichten bzw. Installieren. Sobald der Kassensoftware ein KassenBON Druck, geht auch die Kassenschublade auf. Problem ist allerdings wenn z.B. die kasse mit münzen gefüllt werden muss und kein Kassenbon gedruckt werden kann da nichts verkauft wurde. Hast du ein Ahnung welchen weg den einfachsten ist für diese Funktionalität?
Hallo Ricardo,
vielen Dank für dein Feedback.
Leider habe ich von MacOS nicht so viel Ahnung. Ich nehme an mit einem entsprechenden Copy-Befehl im Terminal funktioniert es dort nicht oder hast du das noch nicht getestet bisher?
Ich habe mich damit nicht näher beschäftigt, aber ich habe etwas Interessantes gefunden. Es gibt anscheinend die Möglichkeit ESC-Kommandos per JavaScript auszugeben und drucken zu lassen:
https://www.neodynamic.com/articles/How-to-print-raw-ESC-POS-commands-from-Javascript/
Viele Grüße
Tobias