![]() |
ecape-sequenz zum drucker
hallo zusammen,
ich möchte aus lazarus heraus die esc-seq. zum Öffnen der Kassenschublade an den Drucker schicken. mit:
Code:
schicke ich "normalen" Text (in mytext)zum Drucker, der dort auch brav gedruckt wird :-)
stream := tfilestream.create(printerport,fmOpenWrite);
stream.Write(pchar(myText)^,length(myText)); wie aber bekomme ich die esc-seq zum Drucker. lt Manual soll folgende Sequenz geschickt werden: Die ESC-Sequenzen "Geldlade öffnen" 1) Schubladen Öffnung: ESC p m t1 t2; z. B. Chr(&H1B) + "p" + Chr(&H0) + Chr(&H64) + Chr(&H64) Aus QBASIC heraus: PRINT#1,CHR$(27);CHR$(112);CHR$(0);CHR$(50);CHR$(1 50); wie funkt das in pascal? ichdanke euch gewaltig für eure Ideen. Gruss KHH |
AW: ecape-sequenz zum drucker
Vorab 1), z.B., QBASIC das passt hinten und vorne nicht zusammen. 8-)
allgemein würde das so gehen :
Delphi-Quellcode:
var t : Textfile;
begin AssignFile (t,'LPT1'); rewrite (t); write (t,chr (27)+ richtige ESC-Sequenz); close (t); |
AW: ecape-sequenz zum drucker
mh, ich danke dir, aber das funktioniert wohl nicht mit ner seriellen Schnittstelle :-(
|
AW: ecape-sequenz zum drucker
Dann ersetzt doch einfach
Delphi-Quellcode:
durch
AssignFile (t,'LPT1');
Delphi-Quellcode:
oder statt COM1 den seriellen Port, den du benutzt.
AssignFile (t,'COM1');
|
AW: ecape-sequenz zum drucker
Also wenn schon AsignFile dann auch CloseFile.
Delphi-Quellcode:
var t : Textfile;
begin try AssignFile(t, 'LPT1'); Rewrite(t); Write(t, chr(27) + richtige ESC-Sequenz); finally CloseFile(t); end; end; |
AW: ecape-sequenz zum drucker
Zitat:
aber es kommt nix beim drucker an :-( wie wird denn Write(t, chr(27) + richtige ESC-Sequenz); für die genannten seqenzen definiert? danke gruss KH |
AW: ecape-sequenz zum drucker
Zitat:
Zitat:
- H = Hexadezimal (und wie gibt man das in Delphi an?) - genau, mit einem $, also $1B - und statt über CHR kann man es auch direkt als CHAR-Konstante deklarieren, oder man läßt es so Chr(&H1B) = Chr($1B) = #$1B - und das " in Pascal ein ' sein soll, braucht man keinem zu sagen, oder? "p" = 'p' = #$70 = #112 = CHR(112) PS: #27 = #$1B = Escape Zitat:
$64 (Hexadezimal) = 100 (Dezimal)
Delphi-Quellcode:
(laut dem ersten Code)
#27'p'#0#100#100
|
AW: ecape-sequenz zum drucker
Ich glaube das Thema wird "etwas" unterschätzt. Siehe das :
Zitat:
@roter Kasten : schön, dass du da bist. :lol: Kein einziger Beitrag ist zu sehen. Nur das was momentan noch editiert wird. :shock: |
AW: ecape-sequenz zum drucker
Himitsu hat ja den Hex-Kram quasi übersetzt. Was für solche Fälle immer nützlich ist, das ist das :
![]() Na gut, da Ami mich warten lässt, und die Glaskugel heute neu poliert wurde noch hierzu was : 1) Schubladen Öffnung: ESC p m t1 t2 Diese Sequenz kommt mir sowieso bekannt vor. ESC ist klar, p könnte für "pay" stehen, also Kasse öffnen. Was soll das m ? Zunächst mal t1 und t2 (auch klar). Die zwei Zahlen stehen für ein Zeitintervall. Dieses bestimmt, wie lange der Schubladenstrom fliesst, damit der Öffnungsmechanismus das Ding aufmachen kann. Wenn ich mich recht entsinne ist in der ESC-Sequenz noch eine Schubladennummer vorgesehen. Das kann nur das m sein. Also hätten wie z.B. so etwas :
Delphi-Quellcode:
Das wäre eine gültige ESC-Sequenz für die Schublade. Hinter 'p' steht die erste #0 für erste Schublade, weil vermutlich nur eine da ist. t1 steht auf 0, t2 auf 150, d.h. der Schubladenstrom fliesst für 150 ms. Gewähr wird sowieso keine übernommen, aber wenn das so richtig ist, dann geht das Teil auf. Ansonsten die 150 erhöhen. Kommt kein "Klack", dann ist Kabel falsch, Drucker aus oder die serielle Verbindung ist falsch eingestellt.
write (t,chr(27)+'p'+chr(0)+chr(0)+chr(150));
Sieht jetzt so aus, als bräuchte man den m und t1 Wert nicht, aber t1 ist sicherheitshalber und 2 Schubladen braucht man schon in Grenzgebieten, selbst im EUR-Zeitalter. Vielleicht gibts ja bald sogar wieder Engpass an Kassenschubladen. :lol: |
AW: ecape-sequenz zum drucker
Was ist es denn für eine Kasse ? Eine Bezeichnung wäre hilfreich und wie ist diese angeschlossen ?
|
AW: ecape-sequenz zum drucker
Zitat:
![]() mithilfe der unit :uCOMPort; funktioniert es jetzt per FComPort.SENDSTRING und FComPort.SENDBYTE text und zeilenubruch auf dem Drucker auszugeben. nur die sch..öne Schublade reagiert nicht, weder auf 27 112 48 40 40 ( aus ![]() noch auf 27 112 0 100 100 wie komme ich an die richtigen sequenzen? Gruss KH |
AW: ecape-sequenz zum drucker
Und die Software zum Geldfachschublade ist installiert ?
Das Geldfachschubladensystem passt zur Kasse ? etc. pp. Woher hast du die ESC-Sequenzen ? |
AW: ecape-sequenz zum drucker
es ist ein windowsdruckertreiber installiert.
Beigelegt ist ein testprogramm,leider ohne quellcode, welches die Kassenschublade auch öffnet. der Versuch per eingebundener dll und GetProcAddress(DLLHandle, 'fnPCashDrawerOpen(1)'); war leider auch negativ. |
AW: ecape-sequenz zum drucker
Wenn ich das richtig verstehe, geht die Kommunikation über den seriellen Port. Wenn man den Datenstrom einfach loggt? Viel dürfte es ja nicht sein, was da kommt und vielleicht hätte man dann einen Anhaltspunkt. Ich habe gerade mal mit Google gesucht und es scheint da diverse kostenfreie Tools zu geben, die den Port abhören können (oder dies zumindest versprechen).
|
AW: ecape-sequenz zum drucker
und was hast du gefunden ?
Mir brennt leider die Zeit unter den Nägeln :-( |
AW: ecape-sequenz zum drucker
Oh sorry, also z.B.
![]() ![]() //edit: hm. Wenn ich das richtig sehe, würdet Du genau das Monitoring benötigen, was natürlich in der kleinen Version nicht enthalten ist. |
AW: ecape-sequenz zum drucker
Vielleicht wäre der hier besser:
![]() |
AW: ecape-sequenz zum drucker
Zitat:
danke probiere ich gleich mal aus ich melde mich dann wieder |
AW: ecape-sequenz zum drucker
Zitat:
ok, ausprobiert :-( bei aktivem Logger stürzt Windows beim Schreiben auf den Com-Port mit Bluesceen ab:wall: |
AW: ecape-sequenz zum drucker
Soll jetzt geloggt werden, wie die Übertragung läuft, oder nur was übertragen wird?
Bei Letzterem könnte man auch einfach mal schnell ReadFile und WriteFile hooken. (falls keines der großen Tools funktionieren will) |
AW: ecape-sequenz zum drucker
Wenn der Windows-Druckertreiber installiert ist, blockiert dieser den Comport. Kein anderes Programm kann ihn dann verwenden. Man kann dann aber einfach den Befehl zum Öffnen der Schublade als Textzeile mit der Schrift 'Control' an den Drucker senden. Ist nur ein Buchstabe, welcher müsste ich nachsehen.
Warum die elende serielle Schnittstelle für den Drucker? Ist extrem langsam und veraltet. Drucken von Graphiken und Truetype-Schriften ist damit unzumutbar. Weiter habe ich gesehen, dass der Kassenrechner selbst eine Schnittstelle für eine Kassenschublade hat. Warum nicht die verwenden? Habe das bei Kassenrechnern anderer Herstellern gemacht, funktioniert gut. Hier mal meine Routine, die mit nahezu allen Anschlußmöglichkeiten klarkommt:
Delphi-Quellcode:
procedure opendrawer;
Var FH:THandle; Buff: array[0..5] of char; RetW:DWORD; port:string; begin if dm.SchubladeVonRechner then begin if dm.SchubladeHWPort>$8000 then // Schublade an Drucker mit LPT begin port:='lpt'+inttostr(dm.SchubladeHWPort-$8000); FH:= CreateFile(PChar(Port), GENERIC_READ or GENERIC_WRITE, 0, Nil, OPEN_EXISTING, 0, 0); if (FH <> INVALID_HANDLE_VALUE) then try Buff:=#27#112#48#50#250; // Escape-Sequenz WriteFile(FH, Buff, 5, RetW, Nil); finally CloseHandle(FH); end; FH:= CreateFile(PChar(Port), GENERIC_READ or GENERIC_WRITE, 0, Nil, OPEN_EXISTING, 0, 0); if (FH <> INVALID_HANDLE_VALUE) then try Buff:=#27#112#49#50#250; // Zweiter Anschluss WriteFile(FH, Buff, 5, RetW, Nil); finally CloseHandle(FH); end; end else begin portwriteb( dm.SchubladeHWPort,dm.SchubladeAuf ); // Schublade am Rechner angeschlossen Strom ein man braucht zlportio (Torry?) Timerschublade.Enabled:=true; // Schaltet Strom wieder ab end; end else if dm.Schubladedirekt then // IBM-Kasse mit Steuerung Schublade über Comport (vacommx: Tcomport) begin if not (dm.displayport=dm.Schubladecomnr) then vacomm3.WriteStr(dm.Schubladecm) else vacomm2.WriteStr(dm.Schubladecmd); end else begin if (dm.Steuertextoption=2) or (dm.Steuertextoption=1) then begin switchprinter(dm.Steuertextdrucker); if fileexists(dm.steuertext) then begin redbeleg.lines.LoadFromFile(dm.steuertext); // RTF-Text mit Steuerzeichen, senden über Druckertreiber redbeleg.Print(''); end else begin messagedlg(_('Schubladen - Steuertext konnte nicht gefunden werden'),mterror,[mbok],0); end; end; end; |
AW: ecape-sequenz zum drucker
alsooo
der logger hat mir die virtuelle com5 zerschossen ich werd jetzt erst mal die Treiber neu installieren müssen :-( |
AW: ecape-sequenz zum drucker
Zitat:
werd ich gleich mal ausprobieren apropo schriftart das mit der schriftart control hab ich auch gelesen, wo aber bekomme ich die her ? |
AW: ecape-sequenz zum drucker
>> Weiter habe ich gesehen, dass der Kassenrechner selbst eine Schnittstelle für eine Kassenschublade hat. Warum nicht die verwenden?
du meinst die RJ11 schnittstelle da hängt die Lade ja dran, aber wie spreche ich die direkt an ? |
AW: ecape-sequenz zum drucker
Eigentlich bietet der Hersteller da eine OPOS Schnittstelle an, schon mal da geschaut oder nachgefragt?
|
AW: ecape-sequenz zum drucker
Nachtrag: Die Procedure ist mit einer älteren Delphi-Version verendet worden. Ev. ist Anpassung an Unicode nötig.
Schrift Control stellt der Druckertreiber zur Verfügung. Vorgehensweise (WIN XP, 7 noch nicht getestet: Wordpad öffnen Menue Datei - Drucken Bondrucker auswählen Übernehmen Abbruch Jetzt sollte die Schrift Control verfügbar sein, ebenso andere Druckeschriften, wie z.B. FontA11 bei Epson Wenn mann den Befehl an den Drucker auf diese Weise schickt, "druckt" dieser ev. einen kleinen Streifen leeres Papier. Kann man meines Wissens nicht abstellen. Besser ist den Befehl t.B. im Bonkopf mitzuschicken. Ist die Schublade am Drucker angeschlossen oder am Rechner selber? Am Rechner: portwriteb( Port,Wert ); (zlportio) Werte für Port und Bitmaske sollte in der Doku des Rechners stehen |
AW: ecape-sequenz zum drucker
Zitat:
|
AW: ecape-sequenz zum drucker
alsooo
lat EPSON Doku soll A bis E in FONT control die Lade öffnen. Dabei unterscheiden sich die Buchstaben durch unterschiedlich lange Impulse kleinbuchstagen sollen Lade 2 öffnen. Ichhabe nun mal die diversen Grossbuchstaben an den Drucker geschicht. aber ausser dem Ausdruck passiert nix A ergibt dann XXp aber die Lade geht nicht auf :-( |
AW: ecape-sequenz zum drucker
Zitat:
aber wie spreche ich diese aus meiem Programm heraus an ? |
AW: ecape-sequenz zum drucker
Trotz Beratungsresistenz :
Zitat:
Du versuchst immer noch, mit einer Luftnummer die Schublade aufzukriegen. Siehe das geschriebene zu t1/t2. Nachtrag zu m : 0 steht für "Drawer kick out Pin 2". Entsprechend steht 1 für Pin 5. Und t1/t2: "The pulse defined by t1 and t2 is output on connector pin m". Entsprechende esc-Sequenz steht auch bereits in #9. |
AW: ecape-sequenz zum drucker
ich glaub ich steh grad auf der Leitung
:-( jetzt doch die esc-seqenzen an dem comport, oder den Buchstaben an den Druckertreiber ? oder direkt an die rj11 ? Ich blick grad gar nix mehr :-( |
AW: ecape-sequenz zum drucker
Was ? Buchstabe an Druckertreiber schicken ? :shock: Hat das zwischendrin jemand vorgeschlagen ? Druckertreiber für was ? Na ja, Du kannst die ESC-Sequenz ja ignorieren. Probiere es mal mit gut zureden. :lol:
|
AW: ecape-sequenz zum drucker
Post #21 und #26
Code:
und funktionieren tut nix
ausserdem schreibt epson
EPSON supplies a Windows driver for the current range of TM Series printers. Programmers can also use the Generic / Text Only driver to control the Cashdrawer. EPSON Windows Driver EPSON has provided a ‘control’ font in the Windows driver that sends the appropriate command to the printer when triggered by certain control characters. The control characters listed below are provided for Cashdrawer control. A Open Drawer 1 (50ms drive pulse width) 81H B Open Drawer 1 (100ms drive pulse width) 82H C Open Drawer 1 (150ms drive pulse width) 83H D Open Drawer 1 (200ms drive pulse width) 84H E Open Drawer 1 (250ms drive pulse width) 85H a Open Drawer 2 (50ms drive pulse width) 89H b Open Drawer 2 (100ms drive pulse width) 8AH c Open Drawer 2 (150ms drive pulse width) 8BH d Open Drawer 2 (200ms drive pulse width) 8CH e Open Drawer 2 (200ms drive pulse width) 8DH Programming Examples Cashdrawer 1 Kick Printer.FontName = “control” Printer.FontSize = 10 Printer.Print “A” Cashdrawer 2 Kick Printer.FontName = “control” Printer.FontSize = 10 Printer.Print “a” :-( |
AW: ecape-sequenz zum drucker
Für den Drucker wird aber gar kein Treiber gebraucht. Zumindest nicht für Text oder Schublade öffnen. WIrd über den Treiber gedruckt, dann gilt auch das :
Zitat:
Unabhängig vom Programm : Dos-Box aufmachen und "mode" eingeben. Was steht bei COM1 ? Anschliessend folgenden Befehl eingeben : "mode LPT1:=COM1:". Drucker ist jetzt auf LPT1 umgeleitet. Mit "Print <Dateiname>" irgendwas ausdrucken. Wenns geht, dann Schublade neu testen. |
AW: ecape-sequenz zum drucker
Zitat:
Der Drucker hat bestimmt schon Komplexe, weil er ständig das Signal weitergibt (ja an was, an nix) aber du immer noch nicht zufrieden bist. Da aus dem Datenblatt nicht hervorgeht, ob der Anschluss für die Kassenlade vom eingebauten Drucker verwaltet wird oder von der Kasse selber wirst du wohl oder übel mal den Hersteller kontaktieren müssen. So wie ich das sehe, wird das aber nicht über den Drucker realisiert, sondern über die Kassenhardware selber und dann wirst du den OPOS-Treiber ansprechen müssen. -> Hersteller fragen oder (das ist glaube ich sogar ein Standard :gruebel: ) mal im Internet suchen nach How to deal with OPOS * an dem Tag soll ja angeblich die Welt untergehen Zitat:
|
AW: ecape-sequenz zum drucker
Hallo Hansa, hast recht. Glaube auch nicht wirklich, dass die Schublade am Drucker angeschlossen ist. Epson Drucker haben immer 24 V, kann man nicht ändern wie bei dem Kassenrechner.
Mich wundert das es mit OPOS geht. Übrigens verträgt sich meines Wissens OPOS nicht mit dem Windows-Druckertreiber, eines von beiden funktioniert nicht wenn beides installiert ist. Wir verwenden OPOS nicht, ev. kann ich mich da auch irren. Habe eine PN an KH geschickt. |
AW: ecape-sequenz zum drucker
alsooo
mit Hilfe von Neumann und OPOS sowie ZLPortIO funktioniert die Ansteuerung der RJ 11 Schnittstelle, an der die Lade hängt und diese geht auch auf. ich sende hex 48F und 10 an die Schnittstelle. Leider steht die Schnittstelle so unter Dauerstrom. Hat jemand ne Idee wie dieser unterbrochen werden kann? Danek für eure Hilfe Gruss KHH |
AW: ecape-sequenz zum drucker
Hallo,
bei der ZlPortio ist eine Testanwendung, mit der man die Pors lesen und schreiben kann. Damit kann man etwas probieren. |
AW: ecape-sequenz zum drucker
Zitat:
|
AW: ecape-sequenz zum drucker
für alle die es noch intressiert.
Per Einbindung einer vom Hersteller zu beziehenden DLL funktioniert das Öffnen der Lade problemlos. Gegebenenfalls (Ladenabhängig) muss an der Kasse noch ein Jumper von 12 auf 24 V umgestellt werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 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