Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Epson TM-T70 USB Kassenschublade öffnen (https://www.delphipraxis.net/179636-epson-tm-t70-usb-kassenschublade-oeffnen.html)

Pet04 21. Mär 2014 10:12

Epson TM-T70 USB Kassenschublade öffnen
 
Hallo,

gibt es eine Möglichkeit eine am Epson TM-t70 USB angeschlossenen Kassenlade per button click zu öffnen, ohne dass der Belegdrucker druckt.

Vielen dank für die Hilfe schon mal

Furtbichler 21. Mär 2014 10:20

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Verwendest Du einen OPOS-Treiber? Damit sollte das gehen.

vagtler 21. Mär 2014 10:20

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Ja.

Pet04 21. Mär 2014 10:23

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Momentan benutze ich die Win. Treiber und drucke den Beleg ganz einfach über "wrieln"

wie funtioniert das mit dem opos Treiber ?
Wie binde ich das in Delphi ein ?

Furtbichler 21. Mär 2014 10:47

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Zitat:

Zitat von vagtler (Beitrag 1252868)
Ja.

Ach, Du auch? Wozu denn? Zum Trollen?
Zitat:

wie funtioniert das mit dem opos Treiber ?
Wie binde ich das in Delphi ein ?
OPOS-Treiber von Epson downloaden, installieren, OCX registrieren bzw. Delphi den Wrapper erstellen lassen, Beispiele durchlesen. Beispielprogramm basteln, fertig.

vagtler 21. Mär 2014 10:51

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Zitat:

Zitat von Furtbichler (Beitrag 1252874)
Zitat:

Zitat von vagtler (Beitrag 1252868)
Ja.

Ach, Du auch? Wozu denn? Zum Trollen?

Hätte der TE mal 20 Sekunden zum Googeln verwendet, wäre meine Antwort bestimmt detaillierter ausgefallen. Ansonsten war sie auf das nötigste beschränkt und beantwortet die Frage des TE vollumfänglich.

Pet04 21. Mär 2014 11:27

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Funktioniert das nur über die opos Treiber ober gibt es auch eine andere Möglichkeit ?

hhcm 21. Mär 2014 11:52

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Es wird doch sicherlich eine Virtuelle Serielle Schnittstelle installiert oder?
Dann gehts auch per Serieller Anbindung mit dem passenden ESC Befehl.

Furtbichler 21. Mär 2014 12:13

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Zitat:

Zitat von vagtler (Beitrag 1252875)
Hätte der TE mal 20 Sekunden zum Googeln verwendet, wäre meine Antwort bestimmt detaillierter ausgefallen.

Witzbold, das hat er vermutlich. Welche Lösung meinst Du doch gleich, die man nach 20 Sekunden findet? Bin mal gespannt, welche funktionierende und verifizierte Lösung Du hier präsentierst.

Zitat:

Zitat von hhcm (Beitrag 1252881)
Dann gehts auch ...mit dem passenden ESC Befehl.

Wie lautet der?

Ich habe im Büro zufällig gerade einen TM-295P rumzustehen, dem ich beibringen muss, das Papier zu greifen bzw. freizugeben. ESC-Sequenz zum Freigeben hab ich gefunden, die zum Greifen nicht (trotz Handbuch). Ich habe das OPOS-OCX genommen und damit geht es teilweise. Aber der 'release' klappt nur mit ESC-Sequenz. Bestimmt gibt es hier richtige Programmierer (wie das vagtler z.B.) die innerhalb von 25 Sekunden gegoogeln und ein funktionierendes Beispielprojekt erstellen.

Zum Thema: Installiere OPOS, richte den Drucker ein (SetupPOS.EXE starten). Der bekommt einen bestimmten Namen 'TM-170' vermutlich. Dann öffnest Du Delphi und installierst die ActiveX-Komponente (Im Komponenten-Menü, glaube ich). Danach schaust Du dir die Beispielprojekte an, die grauenvoll sind.

Du musst mit dem OPOS-Teil deinen Drucker Claimen, aktivieren und enablen (oder öffnen). Hab den Code nicht hier, es sind aber drei aktionen in der richtigen Reihenfolge. Danach solltest Du den Drucker und die Schublade vermutlich kontrollieren können. Ach, drucken geht auch.

Ich habe eben im TM-170 Manual geschaut, aber auf die Schnelle auch keine ESC-Sequenz gefunden, aber die wird es geben, keine Frage.

So: Und wenn jetzt alle Beteiligten mit dem Klugscheißern aufhören, wird das vielleicht noch was, gell?

Neumann 21. Mär 2014 12:46

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Hallo,

ich mache das über den Windows-Druckertreiber so:
Delphi-Quellcode:
function RawDataToPrinter(szPrinterName:PChar; lpData:PByte; dwCount:Word) : Boolean;
Var
  hPrinter : THandle;
  DocInfo : DOC_INFO_1;
  dwJob : Word;
  dwBytesWritten : Cardinal;
Begin
  Result:=False;
  if NOT OpenPrinter( szPrinterName, hPrinter, NIL ) then
    Exit;

  DocInfo.pDocName := 'RAWJOB';
  DocInfo.pOutputFile := NIL;
  DocInfo.pDatatype := 'RAW';

  dwJob := StartDocPrinter( hPrinter, 1, @DocInfo );
  if (dwJob = 0 ) Then begin
    ClosePrinter( hPrinter );
    Exit;
  end;


  if not StartPagePrinter( hPrinter ) then begin
    EndDocPrinter( hPrinter );
    ClosePrinter( hPrinter );
    Exit;
  end;


  if not WritePrinter( hPrinter, lpData, dwCount, dwBytesWritten ) then begin
    EndPagePrinter( hPrinter );
    EndDocPrinter( hPrinter );
    ClosePrinter( hPrinter );
    Exit;
  end;

  if not EndPagePrinter( hPrinter ) then begin
    EndDocPrinter( hPrinter );
    ClosePrinter( hPrinter );
    Exit;
  end;

  if not EndDocPrinter( hPrinter ) then begin
    ClosePrinter( hPrinter );
    Exit;
  end;

  ClosePrinter( hPrinter );

  Result:=dwBytesWritten = dwCount;
End;

function SwitchPrinter(const APrtName : string):string;
var
  Device,
    Driver,
    Port: array[0..255] of Char;
  DevMode: THandle;
begin
  with Printer do
  begin
    PrinterIndex := Printers.IndexOf(APrtName);
    GetPrinter(Device, Driver, Port, DevMode);
    SetPrinter(Device, Driver, Port, 0);
    result:=Printers[printerindex];
  end;
end;
procedure Tfrmmain.opendrawer(nr:integer);
Var
   FH:THandle;
   Buff: array[0..5] of char;
   RetW:DWORD;
   port:string;
   cmd:string;
   acmd:ansistring;
   p:pansichar;
begin
  // Anderer Code
  acmd:=#27#112#48#250#250;
  if dm.steuertext='Epson2' then // 2. Schubladenanschluss
  acmd:=#27#112#49#250#250;
  p:=AnsiStrAlloc(length(acmd));
  p:=StrPCopy(p,acmd);
  switchprinter(dm.Steuertextdrucker); //Druckername
  rawdatatoprinter(pwidechar(dm.Steuertextdrucker),pbyte(p),length(acmd));
end;
Funktioniert - mit teilweise anderen Kommando (acmd) mit eigentlich allen Bondruckern.

vagtler 21. Mär 2014 12:53

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Zitat:

Zitat von Furtbichler (Beitrag 1252883)
[...] Witzbold, das hat er vermutlich. Welche Lösung meinst Du doch gleich, die man nach 20 Sekunden findet? Bin mal gespannt, welche funktionierende und verifizierte Lösung Du hier präsentierst. [...]

https://www.google.de/search?q=Epson...en+cash+drawer

2. Link

Furtbichler 21. Mär 2014 13:38

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Get doch. Hast zwar 40 Minuten benötigt und keine 20 Sekunden, aber immerhin. Hauptsache gespurt.

ol1uw 21. Mär 2014 17:07

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Hallo
eventuell ja mit dem EPSON Advanced Printer Driver.
Delphi-Quellcode:
 Printer.BeginDoc;
 Printer.Canvas.Font.Name:='control';
 Printer.Canvas.Font.Size:=1;
 //paper cut
 Printer.Canvas.TextOut(x,y,'P');
 //drawer
 Printer.Canvas.TextOut(x,y,'a');
 Printer.EndDoc;
Uwe

Neumann 21. Mär 2014 17:46

AW: Epson TM-T70 USB Kassenschublade öffnen
 
@ol1uw:

Das funktioniert zwar, aber leider druckt der Drucker dann einen etwa 1 cm langen Papierschnipsel.

Pet04 25. Mär 2014 13:57

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Hallo,

habe nun mal den opos Printer in delphi importiert.

Zum Testen folgendes...

Delphi-Quellcode:
PosPrinter.Open('TM-T70U');
POSPrinter.ClaimDevice(5000);
POSPrinter.DeviceEnabled := True;
POSPrinter.PrintNormal(PTR_S_RECEIPT, String('TEST PRINT OPOS\n'));
POSPrinter.DeviceEnabled := False;
POSPrinter.ReleaseDevice;
POSPrinter.Close;
end;
Leider druckt der Drucker nicht.


Um die Kassenlade öffnen zu können muss dan auch der cashdrawer. ocx in Delphi importiert werden ?

VCLControls 25. Mär 2014 15:03

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Das Thema mit der Lade gab es schon mal.
Das Modell war zwar nicht exakt das Gleiche, sollte aber eigentlich keine Rolle spielen und wurde über die Steuerbefehle erledigt.

bernau 25. Mär 2014 15:43

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Zitat:

Zitat von ol1uw (Beitrag 1252928)
Hallo
eventuell ja mit dem EPSON Advanced Printer Driver.
Delphi-Quellcode:
 Printer.BeginDoc;
 Printer.Canvas.Font.Name:='control';
 Printer.Canvas.Font.Size:=1;
 //paper cut
 Printer.Canvas.TextOut(x,y,'P');
 //drawer
 Printer.Canvas.TextOut(x,y,'a');
 Printer.EndDoc;
Uwe

Dazu muss aber der Font "Control" von Epson installiert sein.

Pet04 26. Mär 2014 06:38

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Mit "Print BeginDoc..." druckt der Drucker dann einen etwa 1 cm langen Papierschnipsel.
Dies soll natürlich nicht passieren.

Deshalb möchte ich es ml über die OPOS Treiber testen.

1. Drucken
2. Kassenlade über einen Button öffnen.

zu 1. s.o.

Leider druckt der Drucker nicht.

ZU 2. Muss der Cashdrawer.ocx auch in Delphi importiert werden oder kann ich die Lade direkt über den Printer.ocx öffnen.

Aber erst mal soll der Drucker drucken :-)

Neumann 26. Mär 2014 06:47

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Den Control-Font muss man nicht extra installieren, er ist sozusagen in dem Drucker eingebaut und steht immer dann zur Verfügung, wenn der Drucker ausgewählt wird, z.B. in Wordpad. Leider bleibt dann wie gesagt das Problem mit dem Papierstreifen wenn man den Befehl so wie oben an den Drucker sendet.

Was ich vorher gepostet habe funktioniert ohne Druck von Papierstreifen und bei sehr vielen Bondruckern (Epson, Star, Bixolon usw.).

Pet04 26. Mär 2014 07:21

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Bekomme deine Funktion leider nicht zum laufen.
Hast du zufallig eine Demo Souce der funktioniert.

Wenn ich die Funktionen einbinde ... undeklarierte Bezeichner usw.
Wie rufe ich sie genau auf ?

Danke für deine Hilfe

Neumann 26. Mär 2014 09:20

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Das ganze Programm kann ich hier nicht veröffentlichen.

Delphi-Quellcode:

function RawDataToPrinter(szPrinterName:PChar; lpData:PByte; dwCount:Word) : Boolean;
Var
   hPrinter : THandle;
   DocInfo : DOC_INFO_1;
   dwJob : Word;
   dwBytesWritten : Cardinal;
Begin
   Result:=False;
   if NOT OpenPrinter( szPrinterName, hPrinter, NIL ) then
     Exit;

   DocInfo.pDocName := 'RAWJOB';
   DocInfo.pOutputFile := NIL;
   DocInfo.pDatatype := 'RAW';

   dwJob := StartDocPrinter( hPrinter, 1, @DocInfo );
   if (dwJob = 0 ) Then begin
     ClosePrinter( hPrinter );
     Exit;
   end;


   if not StartPagePrinter( hPrinter ) then begin
     EndDocPrinter( hPrinter );
     ClosePrinter( hPrinter );
     Exit;
   end;


   if not WritePrinter( hPrinter, lpData, dwCount, dwBytesWritten ) then begin
     EndPagePrinter( hPrinter );
     EndDocPrinter( hPrinter );
     ClosePrinter( hPrinter );
     Exit;
   end;

   if not EndPagePrinter( hPrinter ) then begin
     EndDocPrinter( hPrinter );
     ClosePrinter( hPrinter );
     Exit;
   end;

   if not EndDocPrinter( hPrinter ) then begin
     ClosePrinter( hPrinter );
     Exit;
   end;

   ClosePrinter( hPrinter );

   Result:=dwBytesWritten = dwCount;
End;

function SwitchPrinter(const APrtName : string):string;
var
   Device,
     Driver,
     Port: array[0..255] of Char;
   DevMode: THandle;
begin
   with Printer do
   begin
     PrinterIndex := Printers.IndexOf(APrtName);
     GetPrinter(Device, Driver, Port, DevMode);
     SetPrinter(Device, Driver, Port, 0);
     result:=Printers[printerindex];
   end;
end;
procedure Tfrmmain.opendrawer(nr:integer); // Muss keine Methode sein, einfache Procedure geht auch
Var
    FH:THandle;
    Buff: array[0..5] of char;
    RetW:DWORD;
    port:string;
    cmd:string;
    acmd:ansistring;
    p:pansichar;
begin
   // Anderer Code
   acmd:=#27#112#48#250#250;
   if dm.steuertext='Epson2' then // 2. Schubladenanschluss dm.steuertext kann man durch Konstante ersetzen
   acmd:=#27#112#49#250#250;
   p:=AnsiStrAlloc(length(acmd));
   p:=StrPCopy(p,acmd);
   switchprinter(dm.Steuertextdrucker); //Druckername, so wie er in Windows angezeigt wird
   rawdatatoprinter(pwidechar(dm.Steuertextdrucker),pbyte(p),length(acmd));
end;
Einfach die Kommentare beachten und ein bischen umschreiben

Pet04 26. Mär 2014 14:05

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Delphi-Quellcode:
 procedure TForm4.opendrawer(); // Muss keine Methode sein, einfache Procedure geht auch
 //procedure TForm4.opendrawer(nr:integer); // Muss keine Methode sein, einfache Procedure geht auch
Var
     FH:THandle;
     Buff: array[0..5] of char;
     RetW:DWORD;
     port:string;
     cmd:string;
     acmd:ansistring;
     p:pansichar;
 begin
    // Anderer Code
    acmd:=#27#112#48#100#100;
   // if dm.steuertext='Epson2' then // 2. Schubladenanschluss dm.steuertext kann man durch Konstante ersetzen
   // acmd:=#27#112#49#250#250;
    p:=AnsiStrAlloc(length(acmd));
    p:=StrPCopy(p,acmd);
    switchprinter('EPSON TM-70'); //Druckername, so wie er in Windows angezeigt wird
    rawdatatoprinter(pwidechar('EPSON TM-70'),pbyte(p),length(acmd));
 end;
Habe den Code angepasst leider reagiert der Drucker überhaupt nicht.

in der funktion RawDataToPrinter sprigt er in exit.

if NOT OpenPrinter( szPrinterName, hPrinter, NIL ) then
Exit;

Muss ich vorher noch etwas beachten.

Neumann 26. Mär 2014 15:37

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Ist der Drucker in Windows installiert?

Druck er Testseite oder aus Wordpad?

Pet04 27. Mär 2014 06:32

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Ja, er ist installiert und druckt auch über wordpad.

Neumann 27. Mär 2014 09:00

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Dann sollte es eigentlich gehen. Kann der Druckername falsch sein? Um da zu prüfen, kann man die Funktion Switchprinter benutzen. Ist der Druckername falsch, liefert diese den Namen des Standarddruckers zurück.

Pet04 27. Mär 2014 11:02

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Bei der function RawDataToPrinter springt er ins exit.


Delphi-Quellcode:
  if NOT OpenPrinter( szPrinterName, hPrinter, NIL ) then
      Exit;
Bei der SwitchPrinter Funktion wird der Epson angezeit.

Habe ich was vergessen ?
Muss ich den Printer noch extra "open"
Wenn ja wie ?

Pet04 27. Mär 2014 13:05

AW: Epson TM-T70 USB Kassenschublade öffnen
 
Funktioniert doch !!!

Habe beim Druckernamen einen Buchstaben vergessen.

Wer lesen kann ist klar im Vorteil :-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:07 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz