Lesen des Status von Zebra Printer

9

Ich arbeite an einem Projekt, bei dem wir einen Zebra-Drucker für Strichcode-Etiketten benötigen. Wir verwenden C #, und wir machen OK auf der Druckseite der Dinge und senden rohe ZPL-Zeichenfolgen an den Drucker (mit winspool.drv).

Allerdings müssen wir auch vom Drucker lesen, und kein Glück dort.

Wir müssen den Status vom Drucker abrufen, der die Ausgabe an den ZPL-Befehl "~ HS" liefert, damit wir erkennen können, wie viele Etiketten im Speicher warten, um gedruckt zu werden. Die EnumJobs () von winspool.drv hat nur Aufträge auf der Windows-Spool, und sobald sie an den Drucker gesendet werden, sind sie aus dieser Liste entfernt. Das bedeutet jedoch nicht, dass das Etikett gedruckt wurde, da der Drucker über einen Schälsensor verfügt und nur ein Etikett nach dem anderen druckt, und wir sind natürlich daran interessiert, Etiketten an den Drucker zu senden.

Ich habe etwas versucht (mit den winspool.drv-Aufrufen):

%Vor%

Aber ich bekomme nichts beim ReadPrinter-Aufruf. Ich weiß nicht einmal, ob dies der richtige Weg ist.

Wer hat das schon einmal angepackt?

Danke.

    
pmoreira 04.12.2009, 11:18
quelle

5 Antworten

2

Ich stehe vor dem gleichen Problem. Hast du schon etwas zu diesem Thema geschafft?

Ax Perez Parra Castro, so habe ich es gemacht:

- rufen Sie die RawPrinterHelper-Klasse von hier Ссылка

ab

-my Drucker (Zebra 2030) unterstützt ZPL nicht, so weit ich weiß, ist die einzige Möglichkeit, Unicode zu senden

- Ich habe eine Liste von Zeichen erstellt, die ich brauche, z. B.

%Vor%

(hole diese int-Werte von en.wikipedia.org/wiki/ASCII)

- den Befehl z. sb.Append(esc + enq + Convert.ToChar(7).ToString()); (aus dem Druckerhandbuch sollte der Befehl & lt; ESC & gt; & lt; ENQ & gt; & lt; 7 & gt; die Firmware-Version bekommen)

- Sendet den Befehl RawPrinterHelper.SendStringToPrinter(printerName, sb.ToString()); (in meinem Fall ist printerName "Zebra TTP 2030")

    
bfi 01.06.2010 15:04
quelle
1

Vor ungefähr 15 Jahren habe ich Software geschrieben, um über Zebra Drucker zu drucken.

Zu der Zeit, als wir mit dem Drucker über RS-232 (? Standard serielle Kommunikation) kommunizierten, was gut funktionierte, kamen alle Informationen zeitnah und genau vom Drucker zurück.

Vor kurzem würde ich mit Epson Tally-Druckern arbeiten und fand die Windows-Druckertreiber unbeholfen und ineffizient. Ich ließ ein Level runter und kommunizierte direkt mit dem Drucker über GDI, und alles funktionierte zu meiner Zufriedenheit.

Ich sage, nehmen Sie den mittleren Mann heraus, wenn Sie eine Ebene herunterfahren und mit dem Drucker direkt kommunizieren, anstatt über Windows-Druckertreiber zu kommunizieren, werden Sie mehr Erfolg haben.

Hoffe, das hilft,

    
Binary Worrier 04.12.2009 12:14
quelle
1

ReadPrinter wird in dieser Situation nicht helfen. Es liest den Druckauftrag zurück, den Sie an den Drucker gesendet haben, nicht die Antwort des Druckers. Der Vollständigkeit halber: Um ReadPrinter zu verwenden, müssen Sie den Drucker erneut öffnen, indem Sie die kombinierte Syntax "Druckername - Job-ID" verwenden:

%Vor%

Dies funktioniert nur, wenn der Job 12345 noch nicht entfernt wurde.

Um die Frage zu beantworten, müssen Sie WriteFile verwenden, um Daten zu senden, und ReadFile , um die Antwort zu erhalten. Um diese Funktionen zu verwenden, müssen Sie den Drucker mit CreateFile öffnen. Nachdem Sie das getan haben, ist der Rest absolut trivial.

Das Problem besteht darin, den Gerätepfad zu ermitteln, der an CreateFile übergeben werden muss, um den Drucker zu öffnen. Wenn Ihr Drucker ein LPT-Drucker ist, ist das so einfach wie "LPT:" , aber für einen USB-Drucker müssen Sie den Gerätepfad erhalten, der so aussieht:

  

\?\usb#vid_0a5f&pid_0027#46a072900549#{28d78fad-5a12-11d1-ae5b-0000f803a8c2}

Ich habe einen Weg gefunden, um diesen Pfad zu erhalten , aber es funktioniert nur, wenn nur ein Drucker installiert ist. Wenn Sie mehr haben, benötigen Sie eine Beziehung zwischen dem Gerätepfad und dem Druckernamen, den Sie in der Systemsteuerung sehen, und diese Beziehung ist etwas, was ich noch nicht gedacht habe. Ich habe eine Frage dafür erstellt: Stellt fest, welcher Druckername entspricht zu welcher Geräte-ID .

    
GSerg 18.05.2012 21:08
quelle
0

Wenn Sie die Möglichkeit haben, kernel32.dll zu verwenden und den USB-Treiber-gebundenen winspool.srv wegzulassen, könnten Sie diesen Vanilla-Ansatz verwenden:

%Vor%

Ansonsten gibt es eine Lösung (es ist VB.NET obwohl) (aber ich kann es nicht sagen Wenn dies mit ZPL / EPL / fingerprint / ...- Druckern funktioniert, verwendet GetPrinter mit PRINTER_INFO_2 .
Es gibt auch eine Übersetzung unter pinvoke.net verfügbar .

    
Andreas Niedermair 01.10.2014 09:01
quelle
0

Ich habe TCP / IP-Kommunikation mit C ++ verwendet und konnte von der Druck-Engine antworten.

    
Vivek 10.01.2018 21:14
quelle