Newsgroup: it.comp.lang.delphi
Titolo: Controllo stato carta in stampante

Ciao,
 
ho realizzato un programmino di stampa scontrini utilizzando Rave
Report. Ora mi chiedono di controllare la presenza della carta nella
stampante e di mostrare un errore in caso di carta inceppata.
 
La stampantina è collegata al pc tramite USB ed è vista come
controller usb in gestione dispositivi. Posso usare il componente
comport per inviare i comandi di richiesta stato ?
 
In gestione dispositivi per la stampante ho
 
ubicazione : Port_#0001.Hub_#0005
 
Grazie

 stampante e di mostrare un errore in caso di carta inceppata.
 
FInisce sempre così, gli dai il dito si prendono il braccio ;)
scherzi a parte, per parlare con la stampante devi interrogare il suo 
driver. Cerca nel cd di installazione della stampante se c'è l'sdk.
 
Oppure potresti cercare nel registro di windows le chiavi relative alla 
stampante e vedere se eventualmente ce n'è qualcuna relativa allo stato 
dei cassetti, ma la vedo difficile: in genere si colloquoia con il 
driver ed è lui che pilota la stampante.
 
 
-- 
morde
QT 4.7
Delphi (5,6,7.. expired)
Firebird Database

Vero vero .... ho fatto sembrare troppo facile la stampa per cui ora
vogliono di più :-)
 
Allora la stampante è questa
 
http://www.custom.it/eng/products/show_product.aspx?id=KioskEquipment&pid=142
 
 
Io non dispongo del driver status monitor (a pagamento), ma ho un
manuale con un elenco di comandi. Ho ad esempio che il comando
 
$10 $04 n
 
trasmette lo stato della stampante in tempo reale ( se n=4 ho lo stato
del sensore carta)
 
Posso mandare in qualche modo questi comandi ?
Nell cartella di installazione ci sono solo dll ....
 
grazie dell'aiuto

Sul manuale con elenco comandi parla di emulazione esc pos ... ho
cercato in rete e ho trovato un esempio che usa la funzione escape,
secondo voi è quello che mi serve ?
 
type
  TPrnBuffRec = record
  bufflength: Word;
  Buff_1: array[0..255] of Char;
end;
 
procedure TFTestStampa.SpeedButton2Click(Sender: TObject);
var
  Buff: TPrnBuffRec;
  TestInt: Integer;
  cmd : string;
begin
  printer.BeginDoc;
 
  try
    TestInt := PassThrough;
    if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TESTINT),
@testint, nil) > 0 then
      begin
        cmd := '$10 $04 4';
        StrPCopy(Buff.Buff_1, cmd);
        Buff.bufflength := StrLen(Buff.Buff_1);
        Escape(Printer.Canvas.Handle, Passthrough, 0, @buff, nil);
      end
 
  finally
    printer.EndDoc;
 
end;

 secondo voi è quello che mi serve ?
 
Si, dovrebbe. Nel codice chiama l'API escape per sapere se il 
dispositivo supporta i set di comandi escape (QUERYESCSAPESUPPORT), se 
il ritorno dell'API è >0 lo considera OK e prosegue inviando alla 
stampante la sequenza $10 $04 4 (che non so che significa).


Il problema è che questo comando dovrebbe restituirmi un risultato per
cui devo passare anche l'ultimo parametro alla funzione escape
 
procedure TFTestStampa.SpeedButton2Click(Sender: TObject);
var
  Buff: TPrnBuffRec;
  BuffOut: TPrnBuffRec;
  TestInt: Integer;
  cmd : string;
begin
  printer.BeginDoc;
 
  try
    TestInt := PassThrough;
    if Escape(Printer.Handle, QUERYESCSUPPORT, SizeOf(TESTINT),
@testint, nil) > 0 then
      begin
        cmd := chr(10) + chr(04) + '4';
        StrPCopy(Buff.Buff_1, cmd);
        Buff.bufflength := StrLen(Buff.Buff_1);
        Escape(Printer.Canvas.Handle, Passthrough, 0, @buff,
@buffOut);
 
        ShowMessage( conver(strPas(buffOut.Buff_1)) );
      end
 
  finally
    printer.EndDoc;
 
end;
 
{ FUNZIONE CHE TRASFORMA RISPOSTA IN STRINGA HEX }
function TFTestStampa.Conver(s: string): String;
var
  i:  Byte;
  t : String;
begin
  t := '';
  for i := 1 to Length(s)  do
    t := t + IntToHex(Ord(s[i]), 2) + ' ';
  Result := t;
end;
 
buffOut devo definirlo cosi ?
Facendo ShowMessage( conver(strPas(buffOut.Buff_1)) ); stampa sempre
la stessa stringa hex, indipendentemente dalla stringa di ingresso
cmd.
Quando lancio questo codice la stampantina mi stampa un foglietto
bianco, quindi qualcosa gli arriva ....

 bianco, quindi qualcosa gli arriva ....
 
Appunto ;)
Continua su questa strada: studia, prova, fallisci, riprova, impara, 
migliorati...


Il fatto è che qualsiasi comando mando mi restituisce sempre 18 ... e
in rete non trovo nessun esempio di invio con la funzione escape di un
comando che poi prevede una risposta ...

 comando che poi prevede una risposta ...
 
...e quindi ti fermi?
 
A.
 
 
 

 stampante e di mostrare un errore in caso di carta inceppata.
 
non č cosě banale. Oltre al job nello spooler di Windows, c'č anche il
buffer interno della stampante per cui, in caso di carta inceppata,
l'eventuale job successivo, o il resto del job di stampa attuale, puň
essere comunque andato "oltre" la tua applicazione, e non essere piů
gestibile, interrompibile, ecc.
 
Dě a quegli intelligentoni che ti hanno fatto sta domandina del cavolo,
che i tempi delle stampanti ad aghi senza buffer e con connessione
diretta seriale o parallela sono finiti insieme al dos.
Certo, qualcosa si potrebbe fare: disattivare da dip switch (se
possibile) il buffer della stampante, e disattivare lo spooler. A quel
punto basterebbe mandare un codice di reset alla stampante, usando
l'esc/pos, e vedere se arriva a destinazione o se la seriale va in
timeout.
 
-- 
Alessandra
 
Il clero sa ch'io so che loro sanno di non sapere - Robert Green
Ingersoll

 Ingersoll
 
Attenzione che a me non interessa lo spooler, io devo verificare lo
stato della carta ancor prima di lanciare la stampa, e dovrei poterlo
fare visto che la stampantina ha integrato un sensore per la carta e
ho disponibili questi comandi esc/pos con cui interrogare il
dispositivo.
Mi confermate che leggo correttamente il buffer in uscita ? Sembra
quasi che vada a leggere il valore del puntantore piu che il valore
effettivo scritto nel buffer

 stato della carta ancor prima di lanciare la stampa, e dovrei poterlo
mi stai dicendo che ti stai facendo questo mazzo perchï¿œ l'utente non 
vuole ricordarsi di mettere la carta nella stampante?
-- 
Emanuele Desideri

 vuole ricordarsi di mettere la carta nella stampante?
 
certo, perchè "tanto.. che ci vuole per te che sei esperto.. e poi tu a
fare queste cose ti diverti.."
Sono le classiche scuse del cliente che vuole tutto compreso nel prezzo
iniziale (magari risibile) e che pensa che tutto sia semplice, veloce,
e soprattutto dovuto.
 
-- 
Alessandra
 
Credo che ci siano due tipi di persone al mondo: quelle che hanno
credenze mistiche, e quelle che non ce l'hanno. Questi ultimi credono
che la vita sia tutto ciò che abbiamo, e che dobbiamo godercela e
aiutare gli altri a godersela. Gli altri pensano che la vita futura sia
più importante di quella presente, e temo che faranno saltare in aria
il mondo - Harold Kroto, premio Nobel per la chimica del 1996

 stato della carta ancor prima di lanciare la stampa
 
controdomanda: visto che esiste lo spooler, chettefrega se non c'č
carta? la stampa viene tenuta in memoria, l'utente carica la carta,
rimette online la stampante e ta dah, come per magia la stampa viene
fuori. Dunque a che pro il controllo pre-stampa? Quanti anni ha questo
tuo intelligentone di cliente? č abituato a lavorare ai tempi del dos,
prima che esistesse lo spooler?
 
-- 
Alessandra
 
La conoscenza č fatta di una materia piů dura di quella della fede
sicché, quando si urtano, č la fede a spaccarsi - A.Schopenhauer

 carta? la stampa viene tenuta in memoria, l'utente carica la carta,
 
stavo pensando esattamente la stessa cosa...
 
Però mi è venuta in mente anche un'altra cosa.
Forse ti preoccupi così tanto della stampante perchè hai l'esigenza che 
la stampa vada a buon fine. in questo caso, non sarebbe sufficiente 
offrire la posibilità di una ristampa?
 
-- 
Emanuele Desideri
 
 

 sufficiente offrire la posibilità di una ristampa?
 
giusto. Tra l'altro è un problema irrisolvibile a priori quello della
certezza che la stampa possa andare a buonfine o meno. Bisognerebbe
infatti non solo verificare che ci fosse la carta, ma anche che ce ne
fosse abbastanza da poter stampare tutto il job. Il che non si può
ricavare in alcun modo dalla stampante. Quindi bisogna mettere in conto
sempre che la stampa possa abortire in corso (per errori tecnici, fine
carta, ecc.) o non partire proprio (fine carta, stampante offline, ecc.)
Per questo esiste lo spooler. E diamine, usiamolo, siamo nel 2011 e
ancora stiamo a colloquiare con i codici di escape?
 
-- 
Alessandra
 
Puoi chiamare Dio in mille modi: Dio, Allah, Buddha, Geova, Yahvè,
Ernesto? tanto non ti risponde - Corrado Guzzanti.

Grazie delle risposte, vi spiego meglio le mie esigenze : trattasi di
un'applicazione per la gestione del pagamento di un parcheggio. Se la
stampante non ha carta e quindi non può stampare lo scontrino da
mettere sul veicolo devo impedire all'utente di inserire monete e fare
qualsiasi cosa.
 
Con la porzione di codice riportata sopra riesco ad inviare comandi
alla stampantina ma non riesco a leggere quello che mi rimanda in
risposta .... per questoo chiedevo come gestire quel buffout.
 

 qualsiasi cosa.
 
io rovescerei il problema: visto che i ticket sono di lunghezza fissa,
e i rotoli saranno da un tot di ticket ciascuno, si può implementare un
conto alla rovescia sul software dei tocket stampati (il contatore
viene resettato a mano sul programma dall'operatore ogni volta che
carica un rotolo nuovo), in modo da sapere quando si arriva a zero (e
magari anche da preavvisare l'operatore.. "guarda che mancano solo 20
ticket all'esaurimento del rotolo.. 19.. 18, ecc.).
 
-- 
Alessandra
 
Se la religione è la conoscenza voglio restare ignorante - Nicola
Vahatalo

L'idea non è male ma se si inceppa la carta ? l'utente non ha lo
scontrino e se non blocco l'applicazione tutti gli utenti successivi
inseriranno soldi ma non avranno lo scontrino ..... finchè un
operatore non si accorgerà che la carta è inceppata.
 
Il comando che voglio inviare mi dice se la carta è finita e anche se
è inceppata ....

 è inceppata ....
 
l'inceppamento, ammesso che venga rilevato, porta ad uno stato di
"offline" la stampante, non produce un errore di fine carta. Quindi è
un problema ancora diverso dal primo che ponevi.
 
-- 
Alessandra
 
Noè era il prediletto del Signore: viveva nel deserto, divorato dalla
sete e dai pidocchi. - Giobbe Covatta

 un problema ancora diverso dal primo che ponevi.
 
comunque, penso si possano risolvere entrambe le cose inviando un job
di stampa e verificando, entro pochi secondi dall'invio, la coda di
stampa sia vuota. Se non lo fosse, allora la stampante ha avuto qualche
problema, e a quel punto blocchi tutto.
 
-- 
Alessandra
 
Io non so se Dio esiste. Ma se esiste, spero che abbia una buona scusa.
Woody Allen

Il comando di richiesta stato stampante mi da tutte le informazioni
che voglio sullo stato della stampante e della carta, qualcuno mi sa
dire se leggo correttamente il bufout ?

fedeRagtop62 ha detto questo giovedì :

ok ora capisco meglio il dominio del problema...
e scusa la domanda...se una stampa non va a buon fine, l'utente che ha 
appena messo i soldi che fa si impicca???
di solito dovrebbe essere possibile contattare un operatore il quale 
non solo risolverà il problema dell'utente, ma sapra gestire il sistema 
o per rimetterlo on-line od off-line(guasto).
oppure il sistema deve prevedere qualcosa che automatizzi il tutto, 
anche la gestione dell'utente che è rimasto senza ticket!!!
 
in quest'ultimo caso, ti prego solo per pietà di non far passare al 
cliente sta oosa come un semplice controllo di stampa!!!:D
 
-- 
Emanuele Desideri
 
 

Ok, poniamo che mi basti capire quando una stampa non va a buon fine.
Come faccio a capirlo ?
Sto provando ad usare la funzione GetPrinter con PRINTER_INFO_2 ...
 
http://msdn.microsoft.com/en-us/library/dd144911%28VS.85%29.aspx
 
 
ma mi restituisce sempre 0.
Io utilizzo rave report, ho notato che quando lancio una stampa appare
l'icona della stampante sulla barra di windows, ma se vado ad aprire
le stampe in corso non cè nulla. Se nella stampante non cè carta dopo
un po l'icona della stampante scompare e stop. Perchè ?

 un po l'icona della stampante scompare e stop. Perchè ?
 
in generale, questo succede perchè la stampa è stata trasferita nella
memoria della stampante. Quando l'operatore avrà rifornito il cassetto
(pensa ad una laser) e rimesso la stampante online, la stampa
riprenderà.
 
-- 
Alessandra
 
Fede è credere ciò che sai che non è così - Mark Twain

E come posso intercettare questo evento lato codice per disattivare
l'applicazione finchè l'operatore non rifornisce il cassetto ?

 l'applicazione finch� l'operatore non rifornisce il cassetto ?
se nemmeno lo spooler lo sa (la stampante � online e la coda dei job
vuota), a maggior ragione non pu� saperlo la tua applicazione.
L'unica sarebbe disattivare la memoria interna della stampante. Con
alcune stampanti POS si pu� fare via dip switch.
-- 
Alessandra
Il punto di vista secondo cui il credente sarebbe pi� felice dell'ateo
� assurdo, � tanto quanto la diffusa convinzione che l'ubriaco � pi�
felice del sobrio - G. B. Shaw