Was sich in Online-Registrierkassen verbirgt: Entwicklung eines Finanzregisters. ESC POS ESC * Befehl zum Drucken von Bitmaps auf dem Drucker Drucken mehrerer Zeilen mit ESC

ESC * ist einer von mehreren „Bildbit“-Befehlen in ESC/POS. Es akzeptiert Daten im „Spaltenformat“, die nur eine Zeile mit 8 oder 24 Pixeln darstellen können. Hier gibt es also zwei gute Möglichkeiten.

Drucken mehrerer Zeilen mit ESC*

Es hört sich so an, als ob Sie eine Zeile drucken können, also gehe ich davon aus, dass das Datenformat selbst nicht das Problem ist.

Sie können mehrere Zeilen drucken, indem Sie einfach den Befehl wiederholen, um zusätzliche Zeilen zu drucken, die durch \n Zeilenumbrüche getrennt sind. Dazu muss das Bild zerschnitten und mit Platz aufgefüllt werden, sodass es ein Vielfaches von 8 oder 24 Pixeln hoch ist (wiederum aufgrund des Formats).

Aufgrund des Zeilenabstands müssen Sie beim Drucken des Bildes einen Befehl zum Ändern der Größe der linearen Kanäle und am Ende einen weiteren Befehl zum Zurücksetzen der Kanäle eingeben.

Ich verwende ESC 3 0x10 für 16 Kanalleitungen (Bytes 0x1b 0x33 0x10) und ESC 2 (Bytes 0x1b 0x32) zum Zurücksetzen.

Diese Druckmethode ist hervorragend mit älteren Druckern kompatibel, es kann jedoch sein, dass in der Ausgabe einige dünne horizontale Linien entstehen.

Drucken Sie das gesamte Bild mit GS v 0

Dieses Bit des Bildbefehls akzeptiert verschiedene Daten im „Rasterformat“. Ich mache mir die Tatsache zunutze, dass ein Blob in diesem Format mit Binärdaten im weit verbreiteten PBM-Bitmap-Format (insbesondere Binärdaten in P4-Header-Dateien) identisch ist.

Die Höhe des Bildes ist abhängig von der Größe Ihres Druckpuffers begrenzt, kann aber bis zu 65535 Pixel betragen. Aus Darstellungsgründen muss die Breite durch 8 teilbar sein.

Nur wenige Menschen denken beim Einkaufen in einem Geschäft darüber nach, wie die Kassentechnologie funktioniert. Tatsächlich handelt es sich dabei nicht nur aus technischer, sondern auch aus rechtlicher Sicht um einen gut geölten Mechanismus. Jeder weiß, dass die Hauptsache darin besteht, einen Scheck zu erhalten, aber nur die Unternehmer selbst wissen, warum der Scheck ein Steuerdokument ist, das den Kauf bestätigt.

In diesem Artikel teilen wir unsere Erfahrungen bei der Entwicklung einer Registrierkasse und erklären Ihnen, wie alles von innen funktioniert.



Vintage-Registrierkasse

1. System: Hardware + Software an der Kasse

Der gesamte Soft- und Hardwarekomplex, der am Arbeitsplatz des Kassierers installiert ist, kann als Kassensystem oder POS-Terminal bezeichnet werden, vom englischen Point of Sale – Verkaufsstelle.

Schauen wir uns an, wie ein Kassensystem funktioniert. Denn der grundlegende Unterschied zwischen dem System und dem Terminal ist der Ort des Fiskalspeichers (FP) bzw. Fiskalspeichers (FN): Bei einem Kassensystem ist er in das Druckgerät eingebaut, bei einem Kassenterminal befindet er sich im Computer Einheit.


Typische Registrierkasse. Kassensystem der russischen Firma „SHTRIKH-M“

Kassensystem – ein Software- und Hardwarekomplex, der auf der Grundlage eines Finanzregisters arbeitet. Besteht typischerweise aus einem POS-Computer, einem Monitor und einer Tastatur, einem Belegdrucker, einem Fiskalschreiber, einem Kundendisplay, einer Kassenschublade und einem Bankkartenlesegerät. Ein typischer Satz von Bargeldfunktionen: Buchhaltung und Ausgabe von Waren, Empfang und Ausgabe von Geld, Stornierung eines Kaufs.

Der interessanteste Teil des Kassensystems ist Finanzamt - Dies ist das Herzstück des Systems und eine der Klassen von Registrierkassenautomaten (CCM).

Ein Belegdrucker mit integriertem Fiskalspeicher fungiert als Fiskalregistrator. Es empfängt Informationen über einen Kommunikationskanal, verarbeitet sie und druckt sie aus. Daten zu Bargeldtransaktionen können beliebig lange im Fiskalspeicher gespeichert werden, bis sie zurückgesetzt werden müssen.

Über einen Server werden Daten direkt vom Finanzregister an den Steuerdienst übermittelt Steuerdatenbetreiber - OFD - eine besondere juristische Person, die für den Empfang, die Verarbeitung, die Speicherung und die Übermittlung von Steuerdaten an den Steuerdienst verantwortlich ist.

Im vergangenen Jahr diskutierten russische Unternehmer aktiv über den Übergang zu Online-Registrierkassen und die Übermittlung von Schecks an das Finanzamt über das OFD im Zusammenhang mit der Verabschiedung des Gesetzes 54-FZ „Über die Nutzung von Registrierkassengeräten“.


Die Rolle des OFD. Schema aus dem Artikel über 54-FZ und die Umstellung auf Online-Registrierkassen

Der Föderale Steuerdienst ist der Föderale Steuerdienst der Russischen Föderation. In Kasachstan wird diese Funktion vom State Revenue Committee des Finanzministeriums wahrgenommen. Und in Weißrussland – das Ministerium für Steuern und Abgaben.

In der Russischen Föderation sind mehrere OFDs tätig, in Kasachstan gibt es jedoch nur eines, Kazakhtelecom JSC.

2. Gesetzgebung: Weltweite Online-Kontrolle von Registrierkassen

In vielen Ländern ist die Online-Überwachung von Einzelhandelsgeschäften bereits einsatzbereit: Südkorea (2005), Schweden (2008), Kanada (2010), Polen (2011), Kroatien (2013). Im Jahr 2015 begann die Umsetzung dieses Ansatzes in Kasachstan. Und in Weißrussland wurde die Frist für den Anschluss von Registrierkassen an das Fernkontrollsystem auf den 1. Juli 2018 verschoben (dieselbe Frist ist in Russland vorgesehen).

Die Nutzung von Online-Registrierkassen wird in Kasachstan durch Kapitel 90 der Abgabenordnung geregelt. Seit 2015 übermitteln Verkäufer von Treibstoff und Alkohol Belege über das Internet an das Finanzamt. In der zweiten Stufe – ab 2016 – wurden die im Großhandel mit verschiedenen Materialien und Geräten tätigen Personen an das System angeschlossen; Einzelhandel mit Möbeln, Software und Elektronik; Besitzer von Hotels, Restaurants, Friseursalons und Kinos. Vorgesehen ist die dritte Projektstufe.

Wir verweisen nicht ohne Grund auf Gesetze; sie beschreiben die zwingenden technischen Anforderungen an Software- und Hardwaresysteme zur Erhebung und Übermittlung von Daten an das Finanzamt, die diesen zugrunde liegen. Aufgaben für Entwicklungsingenieure. Beispielsweise wurde im Auftrag des Finanzministers der Republik Kasachstan eine Liste mit Anforderungen an eine Registrierkasse zur Übermittlung von Informationen über Barzahlungen veröffentlicht, die für uns bei der Entwicklung eines Finanzregisters sehr nützlich war.

3. Design und Geschäftslogik des Finanzregisters

Unser grundlegendes Entwicklungsgerät ist ein Thermobondrucker. Das Montagesystem ist Buildroot. Programmierung - in Qt.

Das Projekt erforderte die Entwicklung von:

1) technische Spezifikationen;
2) ein Austauschprotokoll mit einem POS-Computer, nennen wir es POS-C-Protokoll;
3) Daemon-Anwendung, die das Gerät steuert:

  • Modul zum Datenaustausch mit dem OFD-Server über das CCT-Protokoll (Registrierkassenausrüstung);
  • Modul zum Datenaustausch mit einem Kassenrechner über das POS-C-Protokoll;
  • Drucksteuermodul;
  • Kommunikationsschnittstellen-Steuermodul;
  • Datenbankinteraktionsmodul;
  • Webserver.

1) Datenaustauschmodul mit dem OFD-Server

Der Austausch zwischen Gerät und Server erfolgt über das TCP/IP-Protokoll. Bei dieser Interaktion ist das Gerät der Client und das OFD der Server. Protokollpuffer werden als Grundlage für die Kodierung und Dekodierung von Informationen verwendet, die über das CCP-Protokoll übertragen werden.

Zweck der Weboberfläche:

  1. Einstellungen;
  2. Anzeigen des Gerätestatus;
  3. Software-Aktualisierung.


Webschnittstelle

4. Fazit

Basierend auf den aufgeführten Technologien haben wir ein Gerät mit vielen Funktionen und Einstellungen über eine Weboberfläche, Unterstützung verschiedener Austauschprotokolle mit einem POS-Computer und der Möglichkeit zur Softwareaktualisierung entwickelt.

Und jetzt sieht es so aus, als ob das Ingenieursteam von Promwad niemals in der Lage sein wird, einfach in den Laden zu kommen und etwas zu kaufen, ohne über all diese Interna von Online-Kassen, Protokolle für die Datenübertragung, rechtliche Anforderungen und den Ausdruck dieser gesamten Küche nachzudenken:
- Nehmen Sie bitte den Scheck!
- Nein, danke! :-)

P.S. Und zum Schluss noch ein Moment des Humors: Britische Ufologen vom ArtAlienTV-Team entdeckten auf den Bildern des Rovers Curiosity ein Objekt, das einer alten Registrierkasse ähnelte.

ESC/POS ist der Befehlssatz, der Belegdrucker zum Drucken veranlasst.

Einführung

Bevor wir beginnen, müssen Sie drei Dinge über ESC/POS wissen:

  1. Die meisten modernen Belegdrucker unterstützen dies in irgendeiner Form.
  2. Es ist kinderleicht zu schreiben.
  3. Befehle beginnen mit einem ESC-Zeichen (ASCII 27).

Die im obigen Video abgedruckte Quittung ist übrigens ein Beispiel aus dem escpos-php-Repository. Ich werde diesen Ausdruck durchgehen, da er alle grundlegenden ESC/POS-Funktionen demonstriert.

Befehlsstruktur

In den Befehlssequenzen kommen vier spezifische ASCII-Zeichen vor:

Abkürzung Name Code (Hex)
NUL Null 0x00
LF Zeilenvorschub 0x0A
ESC Flucht 0x1B
G.S. Gruppentrenner 0x1D

Normaler Text wird einfach durch Zeilenumbrüche getrennt an den Drucker gesendet. Befehle beginnen mit ESC oder GS und werden von einem druckbaren Zeichen und manchmal einigen Zahlen gefolgt

Zahlen werden einfach als Zeichen übergeben. Beispielsweise wird „5“ als 0x05 übergeben.

Beispiele

Initialisierung

Wenn Sie den Drucker zum ersten Mal anschließen, sollten Sie ihn initialisieren. Dadurch wird die Standardformatierung wiederhergestellt und nicht die dreifach unterstrichene Double-Strike-Schriftart, die beim vorherigen Ausdruck möglicherweise verwendet wurde.

Der Befehl zum Zurücksetzen der Formatierung lautet:

Erfordern __DIR__ . "/autoload.php"; verwenden Sie Mike42\Escpos\Printer; verwenden Sie Mike42\Escpos\PrintConnectors\FilePrintConnector; $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = neuer Drucker($connector); $printer -> close();

00000000 1b 40 |.@| 00000003

„Hallo Welt“-Text

Dies ist die einfachste Art der Quittung und enthält nur unformatierten Text.

Der Text wird einfach durch Zeilenvorschübe getrennt an den Drucker gesendet.

Erfordern __DIR__ . "/autoload.php"; verwenden Sie Mike42\Escpos\Printer; verwenden Sie Mike42\Escpos\PrintConnectors\FilePrintConnector; $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = neuer Drucker($connector); /* Text */ $printer -> text("Hallo Welt\n"); $printer -> cut(); $printer -> close();

00000000 1b 40 48 65 6c 6c 6f 20 77 6f 72 6c 64 0a 1d 56 |.@Hallo Welt..V| 00000010 41 03 |A.| 00000012

Zeilenvorschübe

Mit diesem Befehl kann der Drucker schnell eine bestimmte Anzahl von Zeilen überspringen.

Die Befehle sind:

LF
ESCd[Nummer]
ESC v[Nummer]

Der erste Befehl führt vorwärts, der zweite rückwärts vor. Aus dem Beispiel ist ersichtlich, dass der Demodrucker keinen umgekehrten Papiereinzug unterstützt.

Require_once(dirname(__FILE__). "/escpos-php/Escpos.php"); $printer = new Escpos(); /* Zeilenumbrüche */ $printer -> text("ABC"); $Drucker -> Feed(7); $printer -> text("DEF"); $printer -> feedReverse(3); $printer -> text("GHI"); $Drucker -> Feed(); $printer -> cut(); $printer -> close();

00000000 1b 40 41 42 43 1b 64 07 44 45 46 1b 65 03 47 48 | [email protected]| 00000010 49 0a 1d 56 41 03 |I..VA.| 00000016

Druckmodi

Die Druckmodi umfassen Schrifthöhe, -breite und -fettigkeit in einem einzigen Attribut.

Der Befehl lautet:

Die Schriftartmodi werden durch logische ODER-Verknüpfung einer Auswahl von Attributen erstellt. 0 steht für Plantext in Schriftart A. Modus-Flags sind:

Modus Nummer
Schriftart A (kein Modus) 0
Schriftart B 1
Betont 8
Doppelte Höhe 16
Doppelte Breite 32
Unterstreichen 128

Der Beispielbeleg veranschaulicht die Wirkung jedes Flags.

Erfordern __DIR__ . "/autoload.php"; verwenden Sie Mike42\Escpos\Printer; verwenden Sie Mike42\Escpos\PrintConnectors\FilePrintConnector; $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = neuer Drucker($connector); /* Schriftartmodi */ $modes = array(Printer:::MODE_FONT_A, Printer:::MODE_FONT_B, Printer:::MODE_EMPHASIZED, Printer:::MODE_DOUBLE_HEIGHT, Printer:::MODE_DOUBLE_WIDTH, Printer:::MODE_UNDERLINE); for($i = 0; $i< 2 ** count($modes); $i++) { $bits = str_pad(decbin($i), count($modes), "0", STR_PAD_LEFT); $mode = 0; for($j = 0; $j < strlen($bits); $j++) { if(substr($bits, $j, 1) == "1") { $mode |= $modes[$j]; } } $printer ->selectPrintMode($mode); $printer -> text("ABCDEFGHIJabcdefghijk\n"); ) $printer -> selectPrintMode(); // $printer zurücksetzen -> cut(); $printer -> close();

00000000 1b 40 1b 21 00 41 42 43 44 45 46 47 48 49 4a 61 |.@.!.ABCDEFGHIJa| 00000010 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 80 41 42 |bcdefghijk..!.AB| 00000020 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 |CDEFGHIJabcdefgh| 00000030 69 6a 6b 0a 1b 21 20 41 42 43 44 45 46 47 48 49 |ijk..! ABCDEFGHI| 00000040 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 a0 |Jabcdefghijk..!.| 00000050 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 |ABCDEFGHIJabcdef| 00000060 67 68 69 6a 6b 0a 1b 21 10 41 42 43 44 45 46 47 |ghijk..!.ABCDEFG| 00000070 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b |HIJabcdefghijk..| 00000080 21 90 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 |!.ABCDEFGHIJabcd| 00000090 65 66 67 68 69 6a 6b 0a 1b 21 30 41 42 43 44 45 |efghijk..!0ABCDE| 000000a0 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b |FGHIJabcdefghijk| 000000b0 0a 1b 21 b0 41 42 43 44 45 46 47 48 49 4a 61 62 |..!.ABCDEFGHIJab| 000000c0 63 64 65 66 67 68 69 6a 6b 0a 1b 21 08 41 42 43 |cdefghijk..!.ABC| 000000d0 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 |DEFGHIJabcdefghi| 000000e0 6a 6b 0a 1b 21 88 41 42 43 44 45 46 47 48 49 4a |jk..!.ABCDEFGHIJ| 000000f0 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 28 41 |abcdefghijk..!(A| 00000100 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 67 |BCDEFGHIJabcdefg|. 00000110 68 69 6a 6b 0a 1b 21 a8 41 42 43 44 45 46 47 48 |hijk..!.ABCDEFGH| 30 18 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 |.ABCDEFGHIJabcde|. 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a |GHIJabcdefghijk.|. 00000160 1b 21 38 41 42 43 44 45 46 47 48 49 4a 61 62 63 |.!8ABCDEFGHIJabc|. 68 69 6a 6b 0a 1b 21 b8 41 42 43 44 |. defghijk..!.ABCD |. 00000180 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a |EFGHIJabcdefghij| 4a 61 |k..!. ABCDEFGHIJa|000001a0 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 81 41 42 |bcdefghijk..!.AB| 000001b0 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 |CDEFGHIJabcdefgh| 000001c0 69 6a 6b 0a 1b 21 21 41 42 43 44 45 46 47 48 49 |ijk..!!ABCDEFGHI| 000001d0 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 a1 |Jabcdefghijk..!.| 000001e0 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 |ABCDEFGHIJabcdef| 000001f0 67 68 69 6a 6b 0a 1b 21 11 41 42 43 44 45 46 47 |ghijk..!.ABCDEFG| 00000200 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b |HIJabcdefghijk. .| 00000210 21 91 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 |!.ABCDEFGHIJabcd| 00000220 65 66 67 68 69 6a 6b 0a 1b 21 31 41 42 43 44 45 |efghijk..!1ABCDE| 00000230 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b |FGHIJabcdefghijk| 00000240 0a 1b 21 b1 41 42 43 44 45 46 47 48 49 4a 61 62 |..!.ABCDEFGHIJab| 00000250 63 64 65 66 67 68 69 6a 6b 0a 1b 21 09 41 42 43 |cdefghijk..!.ABC| 00000260 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 |DEFGHIJabcdefghi| 00000270 6a 6b 0a 1b 21 89 41 42 43 44 45 46 47 48 49 4a |jk..!.ABCDEFGHIJ| 00000280 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 29 41 |abcdefghijk..!)A| 00000290 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 |BCDEFGHIJabcdefg| 000002a0 68 69 6a 6b 0a 1b 21 a9 41 42 43 44 45 46 47 48 |hijk..!.ABCDEFGH| 000002b0 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 |IJabcdefghijk..!| 000002c0 19 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 |.ABCDEFGHIJabcde| 000002d0 66 67 68 69 6a 6b 0a 1b 21 99 41 42 43 44 45 46 |fghijk..!.ABCDEF| 000002e0 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a |GHIJabcdefghijk.| 000002f0 1b 21 39 41 42 43 44 45 46 47 48 49 4a 61 62 63 |.!9ABCDEFGHIJabc| 00000300 64 65 66 67 68 69 6a 6b 0a 1b 21 b9 41 42 43 44 |defghijk..!.ABCD| 00000310 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a |EFGHIJabcdefghij| 00000320 6b 0a 1b 21 00 41 42 43 44 45 46 47 48 49 4a 61 |k..!.ABCDEFGHIJa| 00000330 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 80 41 42 |bcdefghijk..!.AB| 00000340 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 |CDEFGHIJabcdefgh| 00000350 69 6a 6b 0a 1b 21 20 41 42 43 44 45 46 47 48 49 |ijk..! ABCDEFGHI| 00000360 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 a0 |Jabcdefghijk..!.| 00000370 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 |ABCDEFGHIJabcdef| 00000380 67 68 69 6a 6b 0a 1b 21 10 41 42 43 44 45 46 47 |ghijk..!.ABCDEFG| 00000390 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b |HIJabcdefghijk..| 000003a0 21 90 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 |!.ABCDEFGHIJabcd| 000003b0 65 66 67 68 69 6a 6b 0a 1b 21 30 41 42 43 44 45 |efghijk..!0ABCDE| 000003c0 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b |FGHIJabcdefghijk| 000003d0 0a 1b 21 b0 41 42 43 44 45 46 47 48 49 4a 61 62 |..!.ABCDEFGHIJab| 000003e0 63 64 65 66 67 68 69 6a 6b 0a 1b 21 08 41 42 43 |cdefghijk..!.ABC| 000003f0 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 |DEFGHIJabcdefghi| 00000400 6a 6b 0a 1b 21 88 41 42 43 44 45 46 47 48 49 4a |jk..!.ABCDEFGHIJ| 00000410 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 28 41 |abcdefghijk. .!(A| 00000420 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 |BCDEFGHIJabcdefg| 00000430 68 69 6a 6b 0a 1b 21 a8 41 42 43 44 45 46 47 48 |hijk..!.ABCDEFGH| 00000440 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 |IJabcdefghijk..!|. 00000450 18 41 42 43 44 45 46 47 48 49 4a 61 62 63 6 4 65 |.ABCDEFGHIJabcde|. 00000460 66 67 68 69 6a 6b 0a 1b 21 98 41 42 43 44 45 46 |fghijk..!.ABCDEF| 00000470 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a |GHIJabcdefghijk.| 1b 21 38 41 42 43 44 45 46 47 48 49 4a 61 62 63 |.!8ABCDEFGHIJabc|. 00000490 64 65 66 67 68 69 6a 6b 0a 1b 21 b8 41 42 43 44 |defghijk..!.ABCD|. 8 49 4a 61 62 63 64 65 66 67 68 69 6a |EFGHIJabcdefghij|. 000004b0 6b 0a 1b 21 01 41 42 43 44 45 46 47 48 49 4a 61 |k..!.ABCDEFGHIJa|. 000004c0 62 63 64 65 66 67 6 8 69 6 a 6b 0a 1b 21 81 41 42 |. .!.AB|. 000004d0 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 |CDEFGHIJabcdefgh|. 45 46 47 48 49 |ijk..!! ABCDEFGHI|000004f0 4a 61 62 6 3 64 65 66 67 68 69 6a 6b 0a 1b 21 a1 |Jabcdefghijk..!.| 00000500 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 |ABCDEFGHIJabcdef| 00000510 67 68 69 6a 6b 0a 1b 21 11 41 42 43 44 45 46 47 |ghijk..!.ABCDEFG| 00000520 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b |HIJabcdefghijk..| 00000530 21 91 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 |!.ABCDEFGHIJabcd| 00000540 65 66 67 68 69 6a 6b 0a 1b 21 31 41 42 43 44 45 |efghijk..!1ABCDE| 00000550 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b |FGHIJabcdefghijk| 00000560 0a 1b 21 b1 41 42 43 44 45 46 47 48 49 4a 61 62 |..!.ABCDEFGHIJab| 00000570 63 64 65 66 67 68 69 6a 6b 0a 1b 21 09 41 42 43 |cdefghijk..!.ABC| 00000580 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 |DEFGHIJabcdefghi| 00000590 6a 6b 0a 1b 21 89 41 42 43 44 45 46 47 48 49 4a |jk..!.ABCDEFGHIJ| 000005a0 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 29 41 |abcdefghijk..!)A| 000005b0 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 66 67 |BCDEFGHIJabcdefg| 000005c0 68 69 6a 6b 0a 1b 21 a9 41 42 43 44 45 46 47 48 |hijk..!.ABCDEFGH| 000005d0 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a 1b 21 |IJabcdefghijk..!| 000005e0 19 41 42 43 44 45 46 47 48 49 4a 61 62 63 64 65 |.ABCDEFGHIJabcde| 000005f0 66 67 68 69 6a 6b 0a 1b 21 99 41 42 43 44 45 46 |fghijk..!.ABCDEF| 00000600 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a 6b 0a |GHIJabcdefghijk.| 00000610 1b 21 39 41 42 43 44 45 46 47 48 49 4a 61 62 63 |.!9ABCDEFGHIJabc| 00000620 64 65 66 67 68 69 6a 6b 0a 1b 21 b9 41 42 43 44 |defghijk. .!.ABCD| 00000630 45 46 47 48 49 4a 61 62 63 64 65 66 67 68 69 6a |EFGHIJabcdefghij| 00000640 6b 0a 1b 21 00 1d 56 41 03 |k..!..VA.| 00000649

Unterstreichen

Der Befehl lautet:

ESC – [Anzahl]

Das Argument wird auf 0 für keine Unterstreichung, 1 für Unterstreichung und 2 für starke Unterstreichung gesetzt.

Erfordern __DIR__ . "/autoload.php"; verwenden Sie Mike42\Escpos\Printer; verwenden Sie Mike42\Escpos\PrintConnectors\FilePrintConnector; $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = neuer Drucker($connector); /* Unterstreichen */ for($i = 0; $i< 3; $i++) { $printer ->setUnderline($i); $printer -> text("Der schnelle Braunfuchs springt über den faulen Hund\n"); ) $printer -> setUnderline(0); // $printer zurücksetzen -> cut(); $printer -> close();

00000000 1b 40 1b 2d 00 54 68 65 20 71 75 69 63 6b 20 62 | [email protected] schnell b| 00000010 72 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f |rown Fox springt ab| 00000020 76 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 |ver the lazy dog| 00000030 0a 1b 2d 01 54 68 65 20 71 75 69 63 6b 20 62 72 |..-.Der schnelle br| 00000040 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 |eigener Fuchs springt über| 00000050 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 0a |er der faule Hund.| 00000060 1b 2d 02 54 68 65 20 71 75 69 63 6b 20 62 72 6f |.-.Der schnelle Bruder| 00000070 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65 |wn fox springt über| 00000080 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 0a 1b |r der faule Hund..| 00000090 2d 00 1d 56 41 03 |-..VA.| 00000096

Schnitte

Der Befehl lautet:

ESC V [Anzahl]

Das Argument stellt offenbar dar, ob ein „teilweiser“ (65) oder ein „vollständiger“ (66) Schnitt durchgeführt werden soll, hat aber keine Auswirkung auf mein Druckermodell.

Erfordern __DIR__ . "/autoload.php"; verwenden Sie Mike42\Escpos\Printer; verwenden Sie Mike42\Escpos\PrintConnectors\FilePrintConnector; $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = neuer Drucker($connector); /* Schnitte */ for($i = 0; $i< 5; $i++) { $printer ->cut(Printer:::CUT_PARTIAL); $printer -> cut(Printer:::CUT_FULL); ) $printer -> cut(); $printer -> close();

00000000 1b 40 1d 56 42 03 1d 56 41 03 1d 56 42 03 1d 56 | [email protected]| 00000010 41 03 1d 56 42 03 1d 56 41 03 1d 56 42 03 1d 56 |A..VB..VA..VB..V| 00000020 41 03 1d 56 42 03 1d 56 41 03 1d 56 41 03 |A..VB..VA..VA.| 0000002e

Schwerpunkt

Der Befehl lautet:

ESC E [Anzahl]

Verwenden Sie 1, um die Hervorhebung zu aktivieren, und 0, um sie zu deaktivieren.

Erfordern __DIR__ . "/autoload.php"; verwenden Sie Mike42\Escpos\Printer; verwenden Sie Mike42\Escpos\PrintConnectors\FilePrintConnector; $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = neuer Drucker($connector); /* Hervorhebung */ for($i = 0; $i< 2; $i++) { $printer ->setEmphasis($i == 1); $printer -> text("Der schnelle Braunfuchs springt über den faulen Hund\n"); ) $printer -> setEmphasis(false); // $printer zurücksetzen -> cut(); $printer -> close();

00000000 1b 40 1b 45 00 54 68 65 20 71 75 69 63 6b 20 62 | [email protected] schnell b| 00000010 72 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f |rown Fox springt ab| 00000020 76 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 |ver the lazy dog| 00000030 0a 1b 45 01 54 68 65 20 71 75 69 63 6b 20 62 72 |..E.Die schnelle br| 00000040 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 |eigener Fuchs springt über| 00000050 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 0a |er der faule Hund.| 00000060 1b 45 00 1d 56 41 03 |.E..VA.| 00000067

Doppel Schlag

Erfordern __DIR__ . "/autoload.php"; verwenden Sie Mike42\Escpos\Printer; verwenden Sie Mike42\Escpos\PrintConnectors\FilePrintConnector; $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = neuer Drucker($connector); /* Double-strike (sieht im Grunde genauso aus wie Hervorhebung) */ for($i = 0; $i< 2; $i++) { $printer ->setDoubleStrike($i == 1); $printer -> text("Der schnelle Braunfuchs springt über den faulen Hund\n"); ) $printer -> setDoubleStrike(false); $printer -> cut(); $printer -> close();

00000000 1b 40 1b 47 00 54 68 65 20 71 75 69 63 6b 20 62 | [email protected] schnell b| 00000010 72 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f |rown Fox springt ab| 00000020 76 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 |ver the lazy dog| 00000030 0a 1b 47 01 54 68 65 20 71 75 69 63 6b 20 62 72 |..G.Die schnelle br| 00000040 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 |eigener Fuchs springt über| 00000050 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 0a |er der faule Hund.| 00000060 1b 47 00 1d 56 41 03 |.G..VA.| 00000067

Schriftarten

Erfordern __DIR__ . "/autoload.php"; verwenden Sie Mike42\Escpos\Printer; verwenden Sie Mike42\Escpos\PrintConnectors\FilePrintConnector; $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = neuer Drucker($connector); /* Schriftarten (viele Drucker haben kein „Font C“) */ $fonts = array(Printer:::FONT_A, Printer:::FONT_B, Printer:::FONT_C); for($i = 0; $i< count($fonts); $i++) { $printer ->setFont($fonts[$i]); $printer -> text("Der schnelle Braunfuchs springt über den faulen Hund\n"); ) $printer -> setFont(); // $printer zurücksetzen -> cut(); $printer -> close();

00000000 1b 40 1b 4d 00 54 68 65 20 71 75 69 63 6b 20 62 | [email protected] schnell b| 00000010 72 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f |rown Fox springt ab| 00000020 76 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 |ver the lazy dog| 00000030 0a 1b 4d 01 54 68 65 20 71 75 69 63 6b 20 62 72 |..M.Die schnelle br| 00000040 6f 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 |eigener Fuchs springt über| 00000050 65 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 0a |er der faule Hund.| 00000060 1b 4d 02 54 68 65 20 71 75 69 63 6b 20 62 72 6f |.M.Der schnelle Bruder| 00000070 77 6e 20 66 6f 78 20 6a 75 6d 70 73 20 6f 76 65 |wn fox springt über| 00000080 72 20 74 68 65 20 6c 61 7a 79 20 64 6f 67 0a 1b |r der faule Hund..| 00000090 4d 00 1d 56 41 03 |M..VA.| 00000096

Rechtfertigung

Der Befehl lautet:

ESC a [Anzahl]

Verwenden Sie 0, um den Text linksbündig auszurichten, 1, um den Text zu zentrieren, oder 2, um ihn rechtsbündig auszurichten.

Erfordern __DIR__ . "/autoload.php"; verwenden Sie Mike42\Escpos\Printer; verwenden Sie Mike42\Escpos\PrintConnectors\FilePrintConnector; $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = neuer Drucker($connector); /* Justification */ $justification = array(Printer:::JUSTIFY_LEFT, Printer:::JUSTIFY_CENTER, Printer:::JUSTIFY_RIGHT); for($i = 0; $i< count($justification); $i++) { $printer ->setJustification($justification[$i]); $printer -> text("Ein Mann plant einen Kanal in Panama\n"); ) $printer -> setJustification(); // $printer zurücksetzen -> cut(); $printer -> close();

00000000 1b 40 1b 61 00 41 20 6d 61 6e 20 61 20 70 6c 61 | [email protected] Mann ein Pla| 00000010 6e 20 61 20 63 61 6e 61 6c 20 70 61 6e 61 6d 61 |n a canal panama| 00000020 0a 1b 61 01 41 20 6d 61 6e 20 61 20 70 6c 61 6e |..a.Ein Mann ein Plan| 00000030 20 61 20 63 61 6e 61 6c 20 70 61 6e 61 6d 61 0a | ein Kanal Panama.| 00000040 1b 61 02 41 20 6d 61 6e 20 61 20 70 6c 61 6e 20 |.a.Ein Mann ein Plan | 00000050 61 20 63 61 6e 61 6c 20 70 61 6e 61 6d 61 0a 1b |ein Kanal Panama..| 00000060 61 00 1d 56 41 03 |a..VA.| 00000066

Barcodes

Die Befehle sind:

GS h [Anzahl]
ESC k [Nummer] [Text] NUL

Der erste Befehl legt die Barcode-Höhe fest – gemessen in Punkten, während der zweite Befehl den eigentlichen Barcode druckt. Die Zahl stellt den Barcode-Standard dar, der für die meisten Zwecke „4“ sein sollte und CODE39 darstellt. 6 Standards werden vom PHP-Treiber unterstützt.

Sie werden feststellen, dass aufgrund von Treiberfehlern oder Druckerinkompatibilität nicht alle Barcodes gedruckt werden! Wie oben empfehle ich, CODE39 zu verwenden, wenn Sie darauf stoßen.

Erfordern __DIR__ . "/autoload.php"; verwenden Sie Mike42\Escpos\Printer; verwenden Sie Mike42\Escpos\PrintConnectors\FilePrintConnector; $connector = new FilePrintConnector("/dev/usb/lp0"); $printer = neuer Drucker($connector); /* Barcodes */ $barcodes = array(Printer:::BARCODE_UPCA, Printer:::BARCODE_UPCE, Printer:::BARCODE_JAN13, Printer:::BARCODE_JAN8, Printer:::BARCODE_CODE39, Printer:::BARCODE_ITF, Printer::: BARCODE_CODABAR); $printer -> setBarcodeHeight(80); for($i = 0; $i< count($barcodes); $i++) { $printer ->text("Barcode $i " . "\n"); $printer -> barcode("9876", $barcodes[$i]); $Drucker -> Feed(); ) $printer -> cut(); $printer -> close();

00000000 1b 40 1d 68 50 42 61 72 63 6f 64 65 20 30 20 0a | [email protected] 0 .| 00000010 1d 6b 00 39 38 37 36 00 0a 42 61 72 63 6f 64 65 |.k.9876..Barcode| 00000020 20 31 20 0a 1d 6b 01 39 38 37 36 00 0a 42 61 72 | 1 ..k.9876..Bar| 00000030 63 6f 64 65 20 32 20 0a 1d 6b 02 39 38 37 36 00 |Code 2 ..k.9876.| 00000040 0a 42 61 72 63 6f 64 65 20 33 20 0a 1d 6b 03 39 |.Barcode 3 ..k.9| 00000050 38 37 36 00 0a 42 61 72 63 6f 64 65 20 34 20 0a |876..Barcode 4 .| 00000060 1d 6b 04 39 38 37 36 00 0a 42 61 72 63 6f 64 65 |.k.9876..Barcode| 00000070 20 35 20 0a 1d 6b 05 39 38 37 36 00 0a 42 61 72 | 5 ..k.9876..Bar| 00000080 63 6f 64 65 20 36 20 0a 1d 6b 06 39 38 37 36 00 |Code 6 ..k.9876.| 00000090 0a 1d 56 41 03 |..VA.| 00000095

Protokollbasis

Die Standardaufgabe eines jeden Belegdruckers ist das Drucken von Text. Darüber hinaus können Sie benutzerdefinierte Einstellungen für Schriftart, Größe, Dichte und andere Geräteeinstellungen erstellen. Alle Informationen (Nützlichkeit und Steuerung) werden in Form von Text übertragen; der Drucker „fängt“ Steuerbefehle ab, trennt sie und druckt nur den Textteil. Somit ist die Kontrolle im Text selbst enthalten. Um den Serviceteil vom Informationsteil zu trennen, werden Sonderzeichen verwendet, die nicht gedruckt werden und nicht über eine Computertastatur eingegeben werden können. Ein Beispiel für ein solches Zeichen ist „ESC“ oder das Dezimalcodezeichen 27. Das Senden dieses Zeichens an den Drucker bedeutet, dass ihm ein kurzer Drucksteuerbefehl folgt. Eine Beschreibung der ESC/POS-Protokollbefehle liegt normalerweise dem Gerät bei und ist Teil der Druckerdokumentation.

Ungefähre Druckerfunktionen

Die folgenden Aktionen können als ungefähre Fähigkeiten jedes Standard-Belegdruckers definiert werden:

  • Schriftgröße vergrößern und verkleinern;
  • Aktivierung der inversen Schriftart (weiße Buchstaben auf schwarzem Hintergrund)
  • Barcode-Druck;
  • Aktivieren Sie den Druckerton;
  • Bereitstellen eines elektrischen Signals zum Öffnen der Geldschublade;
  • Aktivieren Sie das Messer am Drucker, um Papier zu schneiden.

Abhängig vom Modell und den Fähigkeiten des Druckers werden diese Aktionen über ESC/POS-Befehle aktiviert. In diesem Fall überwacht der Drucker jeden Befehl und führt ihn sofort aus.

Wann sollten ESC/POS-Befehle verwendet werden?

Die Verwendung von ESC/POS-Befehlen ist immer dann möglich, wenn der Drucker sie unterstützt (fast alle Drucker) und wenn Sie direkt mit dem Drucker arbeiten, ohne einen zwischengeschalteten Windows-Treiber zu verwenden. Microinvest Warehouse Pro Light steuert das Gerät direkt und sendet die notwendigen Befehle an den Drucker. Sie funktionieren einwandfrei, wenn ein USB-Drucker ohne Zwischentreiber und USB-zu-COM-Emulation verwendet wird.

Wenn es unmöglich ist, ESC/POS-Befehle zu verwenden

Es gibt drei Fälle, in denen die Verwendung von ESC/POS-Befehlen grundsätzlich nicht möglich ist: 1. Steuerregistratoren. Fiskaldrucker verwenden ein komplexes Kommunikationsprotokoll, das mit dem ESC/POS-Protokoll absolut inkompatibel ist. Infolgedessen reagiert der Drucker nicht auf ESC/POS-Befehle; 2. Bei der Steuerung des Druckers über einen installierten Windows-Treiber. In diesem Fall führt der Treiber selbst ESC/POS-Befehle aus und lehnt solche von der Software gesendeten Befehle kategorisch ab. Dadurch entsteht keine Beeinträchtigung des Druckers; 3. Beim Drucken werden Zwischenprodukte verwendet, beispielsweise ein Druckserver oder andere ähnliche Technologien. In diesem Fall werden ESC/POS-Befehle gefiltert und gehen während der Kommunikation verloren, ohne den Drucker überhaupt zu erreichen. Beim Aufbau eines Systems ist es notwendig, die Druckerverwaltung richtig zu planen. Wir empfehlen, jeden Drucker direkt mit dem Steuerrechner zu verbinden und direkt nach dem Protokoll zu arbeiten, ohne Treiber.

Befehlscodierung

ESC/POS-Befehle werden durch ein oder mehrere Sonderzeichen und Befehlsparameter kodiert. All dies wird im entsprechenden Abschnitt (Kopfzeile, Details, Gesamtsummen oder Fußzeile) in den Druckereinstellungen in Microinvest Warehouse Pro Light oder Microinvest Device Manager beschrieben. Die wichtigsten Steuerbefehle sind:

Ihre Aktionen sind in der Druckerdokumentation beschrieben und durch das ESC/POS-Protokoll standardisiert.

Beliebte Teams

Eine ungefähre Liste der beliebtesten ESC/POS-Protokollbefehle:

  • !- Aktiviert Schriftart A;
  • !- Aktiviert Schriftart B;
  • !- Schriftart mit doppelter Höhe;
  • !- Schriftart mit doppelter Breite;
  • !- Schriftart A mit normaler Höhe;
  • E - Enthält fette Schriftart;
  • E - Deaktiviert die Fettschrift;
  • B - Beinhaltet Umkehrdruck;
  • B - Schaltet den Umkehrdruck aus;
  • i – Aktiviert das Messer am Drucker.

Obwohl die aufgeführten Befehle nach Auszügen aus den ESC/POS-Protokollen verschiedener Drucker standardisiert sind, verfügt jeder von ihnen über eine eigene Befehlsausführungstechnologie und die Ergebnisse können je nach Hersteller oder Modell variieren. Um den gewünschten Effekt zu erzielen, müssen Sie die Befehle testen und auswählen, die von den Druckern ausgeführt werden.

Andere Informationen

ESC/POS ist eine sehr leistungsfähige Druckersteuerungstechnologie. Durch dieses Protokoll können Sie auf fast jedem modernen Drucker hervorragende Ergebnisse erzielen. Leider besteht keine 100-prozentige Kompatibilität zwischen verschiedenen Geräten, sodass jeder Befehl auf einem realen, spezifischen Gerät getestet werden muss. Einige Befehle sind von der Ausführungszeit abhängig. So kann beispielsweise die Betätigung eines Messers dazu führen, dass der Ausdruck mit dem Inhalt überholt wird und der Beleg an der falschen Stelle durchtrennt wird. Daher erfordert die Verwendung von ESC/POS-Befehlen je nach Druckermodell reale Tests und eine sorgfältige Konfiguration.

Einige hilfreiche Ressourcen

  • Dokumentation für alle Produkte;
  • Technisches Support-Forum von Microinvest, in dem Sie schnell eine Antwort auf Ihre Frage erhalten;


 

Es könnte nützlich sein zu lesen: