Newsgroup: it.comp.lang.delphi
Titolo: Interfacciamento con gettoniera

Ciao,
 
devo interfacciarmi con una gettoniera avendo a disposizione solo un
manuale tecnico con una lista di comandi possibili.
In pratica devo sapere quanti soldi sono stati inseriti nella
gettoniera.
 
So che non potete dirmi molto con queste informazioni ma sapete
indirizzarmi o darmi un input su come procedere ?
 
Utilizzo delphi 7
 
Grazie

 manuale tecnico con una lista di comandi possibili.
 
Forse devi prima stabilire quale tipo di connessione potrai utilizzare
(seriale, USB, Tcp/Ip, ...)
 
Alessandro

 manuale tecnico con una lista di comandi possibili.
Che tipo di collegamento hai con la gettoniera? Presumo RS-232.
In base a quello, adoperi il protocollo relativo.
-- 
morde
QT 4.7
Delphi (5,6,7.. expired)
Firebird Database

 gettoniera.
 
Coges?
 
-- 
http://www.kiva.org
 
http://www.wwoof.it
 
Microsoft gives you Windows... Linux gives you the whole house.
Per il ng it.hobby.hi-fi: a*fan*ulo 'sta ca**o di hifi/hiend, tutte
put*an*te.
Per il ng it.comp.lang.delphi: astenersi perditempo e lamer.
 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it
 
 
 

Il collegamento avviene tramite USB, in realtà dalla gettoniera esce
un cavo a 10 fili che va in uno scatolotto che converte in USB....
 
Inoltre so che
 
output 3 = 5cent
output 4 = 10cent
output 5 = 20cent
output 6 = 50cent
output 7 = 1€
output 8 = 2€
 
Devo capire come leggere questo output

 un cavo a 10 fili che va in uno scatolotto che converte in USB....
 
Rispiega tutto in modo esaustivo.
Se vuoi risposte precise fornisci un'analisi precisa.


 > Il collegamento avviene tramite USB, in realt dalla gettoniera esce


 ha scritto nel messaggio 
news:64d25936-a769-446c...@n35g2000yqf.googlegroups.com...

I dispositivi di gestione monetica lavorano in genere su bus dedicati al 
mondo gaming/vending.
 
Quindi le gettoniere autoricaricanti sono perlopiù executive o mdb,
i selettori di moneta (come presumo quello che devi utilizzare tu) sono 
paralleli TTL/cctalk/mdb (la maggior parte hanno TTL su un 10poli 5x2 e 
cctalk su un 5x1),
i lettori di banconote sono mdb/cctalk + una miriade di protocolli 
proprietari che a volte si appoggiano anche all'usb come supporto fisico.
 
Da quanto ho capito, tu hai un selettore di moneta parallelo (di quelli nei 
quali si inserisce la moneta che quando è riconosciuta è lasciata cadere nel 
cassetto sottostante con 1 segnale per ogni tipo di moneta inserita + 
alimentazione + reject + coinblock).
A questo selettore di moneta è stata poi collegata una interfaccia con 
ingressi TTL e che comunica via USB.
A questo punto a te non interessa tanto il protocollo del selettore, ma 
quello dell'interfaccia interposta che comunica appunto tramite usb.
Il protocollo te lo devono per forza fornire, altrimenti sei praticamente 
fermo (quando colleghi l'interfaccia al pc come è riconosciuta ? Non è che 
per caso hai una dll alla quale effettuare chiamate ?)
 
Ciao
 
Roberto P. 
 

 Specification, Issue 4.3.
 
Ok, quindi adesso parti da qui:
http://en.wikipedia.org/wiki/CcTalk
 
e segui i riferimenti al link, troverai il sito con le specifiche del 
protocollo da scaricare.
Quelle da te fornite sono qui:
http://www.money-controls.de/manuals/cctalk/cctalk43-1.pdf
 
 
In delphi non so se ci sono componenti che implementano il protocollo, 
probabilmente troverai qualche COM (altresì detto ActiveX) di terze 
parti che potresti importarti e gestire.
Sono certo che in C++ un actviex che wrappa il protocollo e gestisce la 
perifeca qualcuno l'ha scritto.
 
Un'altra strada è, data la specifica del pacchetto di bytes, scriversi 
il gestore di quel pacchetto.
Con async pro di turbopower lo puoi fare benissimo, nell'OnDataReceveing 
(vado a memoria..) puoi spacchettizzare i bits e ragionare su quello che 
ti è arrivato).
 
Non sono cose banali però..e richiedono tempo.
Un'altra cosa: di questi tempi dove si parla di 64bits, è molto 
rischioso affidarsi a codice che funziona nativamente solo sui 32 bit.
E le seriali sono intimamente legate all'hardware a 8,16,e 32 bit.


Sempre dal manuale : The ‘timing’ of the communication meets the
characteristics of the RS232 industrial standard. RS232 communication
has various parameters that in this application are configured as
follows: 9600 bauds, 1 start bit, 8 data bits, without parity, 1 stop
bit

La gettoniera di che marca e'?


 questo articolo e` stato inviato via web dal servizio gratuitohttp://
www.newsland.it/newssegnala
 gli abusi ad 
ab...@newsland.it
Grazie morde .. provo a vedere i link da te citati, certo sono un po
spaventato dalle tue parole visto che sono un principiante
La gettoniera è questa 
http://www.automaten-khatieb.de/Azkoyen%20Manuals/Protocol_modular.pdf
L'interfaccia è questa 
http://www.coinmech.com/product_profile.cfm?id=471

 spaventato dalle tue parole visto che sono un principiante
 
Scusa, vedila in questo modo:
Ti è stato chiesto di interfacciarti con un programma a quel 
dispositivo. Del dispositivo hai tutto, documentazione, hardware e 
descrizione del funzionamento.
Quello che devi fare, se non ne trovi uno già fatto, è di scriverti un 
gestore del protocollo che ti permetta di mandare e ricevere 
comandi/risposte.
In pratica, si tratta di studiare, crescere e lavorarci sopra. Del tutto 
normale, senza spaventarsi: le cose nuove in quanto tali fanno sempre un 
pò paura :-)
 
Tecnicamente, dovresti leggere i segnali che ti arrivano dall'USB.
Vedi se trovi qualcosa di già pronto, sennò ti metti di buona lena e 
incominci.


Ok ;-)
 
Un'altra cosa, è presente un'applicazione che permette di configurare
il dispositivo e testarlo. Nella sua cartella di installazione vedo
delle dll, possono essermi utili ?
 
Grazie ancora
 

 delle dll, possono essermi utili ?
 
Potrebbero esserlo, cosa c'è dentro lì?
 
Come ho già detto prima, sono sicuro che qualcuno abbia già scritto un 
componente che espone un'API per pilotare i dispositivi con quel protocollo.


 Firebird Database
 
In che senso cosa cè dentro, devo decompilarle ? Si chiamano
AZKcctalk001, UtilidadesDLL, COMCAT ecc, ci sono anche active x
COMDLG32.OCX ecc..
 
Intanto ho trovato questo 
http://www.muetze1.de/?page_id=838
 ....è
quello che mi serve secondo te ?
 

leggendo il pdf dell'interfaccia USB to cctalk Converter nella
penultima pagina c'è scritto che una volta installato il driver sulle
risorse di sistema ci sarà una COM 7 con la quale dovrai dialogare
tramite un componente (io preferisco CPort) utilizzando il protocollo
di cui hai già le specifiche, ciao Brunello


Esatto Brunello ... alla fine devo trovare un componente per
comunicare con una USB serial port (COM) ... sto provando a guardare
gli esempi di CPort (COMExample, ModTest, ecc.  )  usando i parametri
scritti sopra 9600 bauds, 1 start bit, 8 data bits, without parity, 1
stop bit
 
Riconoscono la perferica sulla porta COM3 ma inserendo una moneta non
succede niente, non mostrano niente a video. Ora me li studio un po,
sono contento di aver avuto una conferma che sono sulla strada
giusta :-) grazie

Credo di sbagliare qualcosa ... si connette al dispositivo ma non
riesco a ricevere o inviare nulla
 
//METODO DI CONNESSIONE
procedure TForm1.Button_OpenClick(Sender: TObject);
begin
  if ComPort.Connected then
    ComPort.Close
  else
    ComPort.Open;
 
end;
 
//METODO DI INVIO RICHIESTA AL DISPOSITIVO USB
procedure TForm1.Button_SendClick(Sender: TObject);
var
  Str: String;
begin
  Str := Edit_Data.Text;
  if NewLine_CB.Checked then
    Str := Str + #13#10;
  ComPort.WriteStr(Str);
 
 
end;
 
//RICEZIONE DATI DAL DISPOSITIVO USB
procedure TForm1.ComPortRxChar(Sender: TObject; Count: Integer);
var
  Str: String;
begin
  ComPort.ReadStr(Str, Count);
  Memo.Text := Memo.Text + Str;
end;
 
Provando a chiamare il metodo Button_SendClick con la stringa [0] [0]
[1] [246] [9] non succede nulla
Dal manuale
 
REQUEST STATUS [248]
This command requests the Validator for information about its status:
string detector system and/or coin return mechanism activated.
Send: [Dir] [0] [1] [248] [Chk]
Reply: [1] [1] [Dir] [0] [Data 1] [Chk] -> ACK with 1 data
Where Dir = address of the corresponding validator
Data 1 = Status shown in ¡Error!No se encuentra el origen de la
referencia.:
 
Chi ha già usato questo componente mi sa dare un indizio su come
fare ?
 
 

 ha scritto nel messaggio 
news:474847f2-d838-4f67...@u20g2000yqj.googlegroups.com...
Credo di sbagliare qualcosa ... si connette al dispositivo ma non
riesco a ricevere o inviare nulla
[...]
Provando a chiamare il metodo Button_SendClick con la stringa [0] [0]
[1] [246] [9] non succede nulla
Dal manuale
REQUEST STATUS [248]
This command requests the Validator for information about its status:
string detector system and/or coin return mechanism activated.
Send: [Dir] [0] [1] [248] [Chk]
Reply: [1] [1] [Dir] [0] [Data 1] [Chk] -> ACK with 1 data
Where Dir = address of the corresponding validator
Data 1 = Status shown in �Error!No se encuentra el origen de la
referencia.:
Chi ha gi� usato questo componente mi sa dare un indizio su come
fare ?
Presupponendo che tu risca a rimepire il campo Edit_Data con i caratteri 
corretti (ovvero anche con il carattere zero che non � inseribile da 
tastiera), ritengo che il problema non sia nel componente, ma nel protocollo 
che devi implementare correttamente.
Nel protocollo cctalk ll primo byte indica l'indirizzo del destinatario.
L'indirizzo 0 � utilizzato per i comandi broadcast, tipo di messaggio per il 
quale non � mai prevista nessuna risposta.
Per avere una risposta dovresti inviare il messaggio all'indirizzo corretto 
della periferica.
Inoltre nel tuo esempio riporti il codice messaggio [246] (request 
manufacturer id) per il quale il checksum [9] (xor di tutti i bytes) non � 
corretto, ma questo spero sia un errore di battitura....
Non conosco il tipo di applicazione che devi scrivere, ma ti consiglio di 
fare molta attenzione: quando si parla di denaro 
(accettatori/rendiresto/...)  non sono ammessi errori o malfunzionamenti 
(nel senso che anche se involontariamente "freghi" il cliente, fosse anche 
per pochi cent ti distruggono l'apparecchiatura....).
Per implementare un cctalk completo e sufficientemente sicuro (ovvero che 
supporta svariati tipi di periferica, gestendo anche le loro differenti 
tempistiche) mi sono serviti svariati mesi di lavoro, per poi spostare il 
tutto su una scheda a microcontrollore dedicato che oltre al cctalk supporta 
anche diversi altri tipi di bus e mi garantisce un funzionamento immediato 
anche durante il boot o stato 'impegnato' del pc con il quale comunica via 
seriale.
Roberto P. 


io ho sempre usato ComPort.Connected := true;
 
comunque prima di avventurarti con la programmazione nei file di
esempio c'è MiniTerm lo compili lo esegui e nei settaggi imposta
l'echo dei caratteri inviati, e già hai una verifica del collegamento
fisico con il dispositivo, poi puoi provare con ComExample a inviare
delle stringhe e vedere come risponde, ciao Brunello

Sul manuale dice che il checksum deve essere valorizzato in modo che
la somma sia 256, per questo qui lo avevo messo pari a 9, [0] [0] [1]
[246] [9]
https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BxKWzL5rJt_gNWEwZDRmMTktODljYy00ZjljLWFhZWQtMzIxZmY0YjVlMmFl&hl=it
Il destination address sembra debba essere 2, non 0, però non cambia
nulla.
Brunello quando premo su Direct COM check mi dice "No modem responding
on COM3", quindi vuol dire che la connessione non funziona
correttamente ?

 correttamente ?
 
vai su pannello di controllo- sistema-  hardware- gestione periferiche
nella lista guarda Porte (com lpt) guarda se presente la porta AZKOYEN
USB Serial Port (COM ??) caricata dal driver ed è quella porta COM con
la quale dialogare
 
inoltre come ti hanno suggerito le risposte di caratteri non
printabili può generarti confusione quindi per i primi tentativi ti
conviene convertirli, io a suo tempo usavo questa  piccola funzione
per la conversione in Hex della ricezione
 
function 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;


Si ok guardando il codice ho visto che mandava proprio una richiesta
al modem, ma sulla COM3 cè la mia gettoniera, non il modem.
 
No ho capito il discorso sui caratteri, io riesco a inserire 0 nel
campo Edit_Data, il mio problema è come impostare la richiesta alla
periferica
 
ComPort.WriteStr('AT'+CHR(13));
 
Quando avvio il software della gettoniera e tramite esso stabilisco le
monete accettate,  le monete vengono riconosciute e mandate nel
raccoglitore, quando non sono definite monete accettate le monete
inserite non vengono riconosciute, vengono espulse dal davanti della
gettoniera (restituite al cliente). Sono in questa seconda situazione
dopo aver fatto comport.connect e aver testato che comport.connected =
true.
 
Quindi immagino che devo mandare un messaggio alla gettoniera in cui
dico le monete che deve accettare ...


perchè lo zero sull'edit la seriale lo riceverà come 48 codice ascii
pertanto se devi inviare una stringa ComPort.WriteStr(chr(0) + ...)


Ah ok, si vede che sono un principiante, scusate.
Io devo mandare questo messaggio
 
Send: [Dir] [0] [1] [230] [Chk]
 
dove dir=2 e chk=23, quindi ho scritto
 
ComPort.WriteStr(chr(2)+chr(0)+chr(1)+chr(230)+chr(23));
 
Le parentesi quadre non ci vogliono immagino, però ComPort.ReadStr(S,
80); mi da sempre una stringa vuota

ComPort.WriteStr(chr(2)+chr(0)+chr(1)+chr(230)+chr(23));
 
2 xor 0 xor 1 xor 230 = 229 e non 23
 
Come già accennato,  devi cmq considerre la periferica nel suo insieme e con 
le sue caratteristiche, ad un singolo messaggio può rispondere oppure no, 
dipende dallo stato in quel momento.
Come spiega il protocollo cctalk sarebbe buona cosa iniziare tutte le 
sessioni con un reset, attendere il dovuto tempo di guardia, procedere con 
una identificazione delle periferiche collegate al bus leggendone le 
caratteristiche e possibilità.
In base a queste ultime puoi poi decidere se abilitare alcune o tutte le 
features e quindi gestire la periferica nel suo funzionamento 'normale', 
gestendone cioè gli eventi e le condizioni di anomalia/allarme.
 
Roberto P. 
 

Non lo so, il manuale dice questo per il checksum
 
The “Checksum” is the value that makes the 8 lower bits of the sum of
all the bytes in the
message, including the checksum, give result ‘0’.
For example, the message [01] [00] [02] [00] will be followed by the
checksum [253]
because:
1 + 0 + 2 + 0 + 253 = 256 = 0.
 
Comunque non so più che prove fare, mi rileggerò il manuale.

Ho trovato il log dell'applicazione allegata alla gettoniera con la
comunicazione pc/gettoniera, posto le prime righe scritte all'avvio
applicazione
Throw GestorCCTALK.exe :: 16:57:41 23/09/2011
***************************************************
PC -----> DIS::     (16:57:43 23/09/2011)
 dADR nDAT sADR hCMD CHKM
 0x00 0x00 0x01 0xFD 0x02
DIS -----> PC::
 ADR1
 0x02
PC -----> DIS::     (16:57:46 23/09/2011)
 dADR nDAT sADR hCMD CHKM
 0x02 0x00 0x01 0xF5 0x08
DIS -----> PC::
 dADR nDAT sADR hCMD D1.. D2.. D3.. D4.. D5.. D6.. D7.. D8.. D9.. D10.
D11. D12. D13. CHKM
 0x01 0x0D 0x02 0x00 0x43 0x6F 0x69 0x6E 0x20 0x41 0x63 0x63 0x65 0x70
0x74 0x6F 0x72 0x16
PC -----> DIS::     (16:57:46 23/09/2011)
 dADR nDAT sADR hCMD CHKM
 0x02 0x00 0x01 0xF4 0x09
DIS -----> PC::
 dADR nDAT sADR hCMD D1.. D2.. D3.. D4.. D5.. D6.. D7.. D8.. D9.. CHKM
 0x01 0x09 0x02 0x00 0x41 0x36 0x2D 0x43 0x43 0x54 0x41 0x4C 0x4B
0x9Eù
I messaggi hanno la struttura
[Destination address]
[Nº of data bytes]
[Origin address]
[Header]
[ Data 1 ]
[ Data 2 ]
...
[ Checksum ]
Il primo messaggio con header 0xFD corrisponde al messaggio 253,
probabilmente sbaglio ancora ad inviare la richiesta visto che il
dispositivo non mi risponde nulla

dispositivo non mi risponde nulla
Hai settato la porta 9600,n,8,1 senza handshake?
Hai provato con un programma terminale ad inviare una stringa corretta per 
verificare l'arrivo della risposta ?
In caso affermativo procedi oltre ed utilizza il tuo sw, se invece non 
funziona nemmeno con un programma terminale, allora indaga nell'hw.
Roberto P. 

 Grazie
 
la cosa piů semplice del mondo da provare...apri hyperterminal e metti 
un gettone...che succede?

Allora nel componente ComPort ho settato
 
BaudRate : 9600
DatBits : dbEight
FlowControl : ControlRTS rtsDisable (non rts Handshake)
Parity : none
Port : COM3
stopBits : sbOneStopBit
 
Ho controllato e il comando reset sembra non essere chiamato ... forse
la prima volta che ho usato il software allegato quando avevo ancora i
logs disattivati.
Se apro hyperterminal e inserisco una moneta non succede niente, ho
provato ad andare su TRANSFER, SEND TXT FILE ma non succede nulla. Nel
file TXT ci ho scritto 0x00 0x00 0x01 0xFD 0x02

Forse ce l'abbiamo fatto, finalmente ho ricevuto una risposta al
messaggio di richiesta monete accettate dalla gettoniera (impostate da
softare allegato a prodotto)
 
Comport.Writestr(chr(002) + chr(000) + chr(001) + chr(230) +
chr(023));
 
Ora ho solo qualche problema nella lettura della risposta
 
ComPort.ReadStr(S,80); {Get COM response.}
ShowMessage( conver(S))
 
e
 
function TMainForm.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;
 
ottengo ; 01 02 02 00 FF 00 FC , in esadecimale.
 
Da manuale la risposta è infatti [1] [2] [Dir] [0] [Data 1] [Data 2]
[Chk]
[Data 1] = Inhibit Byte 1 (LSB: coins 1 to 9)
[Data 2] = Inhibit Byte 2 (MSB: coins 10 to 16)
 
quindi credo voglia dire che le monete dalla 1 alla 9 sono accettate
mentre quelle dalla 10 alla 16 no ... :-)
Ora però sembra debba attivare qualcosa perchè qualsiasi moneta
inserisco viene rifiutata