ccTalkProtocol, ccTalk protocol management

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

Il protocollo ccTalk è un protocollo seriale a standard aperto, progettato per offrire il trasferimento sicuro delle informazioni sul credito e sullo stato per applicazioni nel settore delle transazioni monetarie automatizzate.

Sul mercato sono disponibili unità di accettazione monete, unità di accettazione banconote, serbatoi di monete, e molti altri dispositivi per gestire il denaro gestibili tramite protocollo ccTalk.

Il protocollo ccTalk opera su di un bus ad un filo gestito in open collector dai vari dispositivi connessi in multidrop sul bus. Per interfacciare il bus ccTalk con la porta seriale RS232 dello SlimLine viene utilizzato un apposito convertitore. Nella figura a lato ecco un semplice schema per realizzare un convertitore RS232/ccTalk.

Schema interfaccia ccTalk

Questo blocco funzione da eseguire in task Back, gestisce il protocollo, deve essere connesso ad una porta seriale File a cui si connettono i dispositivi ccTalk. Questo è un blocco funzione protetto per utilizzarlo occorre richiedere il codice di protezione. E’ comunque possibile utilizzarlo liberamente in modo test per 15 minuti.

Per eseguire un comando ccTalk in DAdd definire l’indirizzo del dispositivo di destinazione del comando ed il CCode il codice del comando da eseguire. In TxDBf e TxDLgt definire indirizzo e dimensione del buffer con i dati da inviare, in RxDf e RxDLgt definire indirizzo e dimensione d el buffer dati di risposta al comando.

Attivando Enable il comando verrà inviato ed attesa la risposta, Done si attiva al termine della esecuzione o su errore. Per eseguire un nuovo comando occorre disabilitare e poi riabilitare l’ingresso Enable.

In caso di errore si attiva per un loop l’uscita Fault, con la funzione SysGetLastError è possibile rilevare il codice di errore. Fare riferimento alla tabella elenco errori per la descrizione.

Information Circle

Funzione

CODESYS: Non disponibile

LogicLab: eLLabVendingLib

Descrizione

Enable (BOOL) Invio comando ccTalk e ricezione risposta .
SpyOn (BOOL) Se attivo permette di spiare il funzionamento del FB (Vedi articolo).
File (eFILEP) Flusso dati stream da utilizzare per la comunicazione.
DAdd (USINT) Destination address, indirizzo dispositivo a cui inviare il comando.
CCode (USINT) Command code, codice comando.
TxDBf (@eVOID) Indirizzo buffer dati da inviare con il comando. Se comando non prevede dati settare a eNULL.
TxDlgt (UDINT) Dimensione dati da inviare con il comando. Se comando non prevede dati settare a 0.
RxDBf (@eVOID) Indirizzo buffer dati da ricevere in risposta al comando. Se comando non prevede dati settare a eNULL.
Timeout (REAL) Timeout esecuzione comando (S).
Done (BOOL) Si attiva al termine della esecuzione comando e rimane attiva fino alla disabilitazione di Enable.
Fault (BOOL) Attivo per un loop di programma se errore gestione.
CCounter (UDINT) Numero di comandi eseguiti.
ECounter (UDINT) Numero di errori.

Immagine FB ccTalkProtocol

Spionaggio funzionamento

Se SpyOn attivo è possibile utilizzare la console di spionaggio per verificare il funzionamento della FB. Sono previsti vari livelli di triggers.

Trigger di spionaggio
16#00000001Tx: Trasmissione frame comando ccTalk.
16#00000002Rx: Ricezione frame risposta ccTalk.
16#00004000Er: Errori di esecuzione.

Esempi

Viene gestito un lettore di moneta Alberici AL66.

LogicLab (PTP156)
PROGRAM ST_ccTalkProtocol
VAR
    i : UDINT; (* Auxiliary variable *)
    TimeBf : UDINT; (* Time buffer (uS) *)
    StartUp : BOOL; (* StartUp read *)
    CaseNr : USINT; (* Case number *)
    DBuf : ARRAY[0..4] OF BYTE; (* Data buffer *)
    ECounter : BYTE; (* Event counter *)
    Error : USINT; (* Error code *)
    Credit : REAL; (* Credit amount (€) *)
    Sp : SysSerialPort; (* Serial port management *)
    CCTalk : ccTalkProtocol; (* ccTalk protocol manager *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_ccTalkProtocol"
// *****************************************************************************
// This program manages an Alberici AL66 coins acceptor.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------
    // Initialize program objects.

    IF (SysFirstLoop) THEN
    
        // Initialize serial port.

        Sp.COM:=ADR('COM0'); //COM port definition
        Sp.Baudrate:=19200; //Baudrate
        Sp.Parity:='E'; //Parity
        Sp.DataBits:=8; //Data bits
        Sp.StopBits:=1; //Stop bits
        Sp.DTRManagement:=DTR_AUTO_WO_TIMES; //DTR management
        Sp.DTRComplement:=FALSE; //DTR complement
        Sp.EchoFlush:=FALSE; //Received echo flush
        Sp.DTROnTime:=0; //DTR On time delay (mS)
        Sp.DTROffTime:=0; //DTR Off time delay (mS)
        Sp.FlushTm:=0; //Flush time (mS)
        Sp.RxSize:=0; //Rx buffer size
        Sp.TxSize:=0; //Tx buffer size

        // Initialize variables.

        StartUp:=TRUE; //StartUp read
        CCTalk.Timeout:=0.5; //Timeout (S)
        TimeBf:=SysGetSysTime(TRUE); //Time buffer (uS)
    END_IF;

    // -------------------------------------------------------------------------
    // MANAGE THE CCTALK PROTOCOL
    // -------------------------------------------------------------------------
    // Manage the ccTalk protocol

    Sp(Open:=TRUE); //Serial port management
    CCTalk.File:=Sp.File; //I/O stream
    CCTalk(); //ccTalk protocol management

    // -------------------------------------------------------------------------
    // PROGRAM CASES
    // -------------------------------------------------------------------------
    // Manage the program cases. 

    CASE (CaseNr) OF

        // ---------------------------------------------------------------------
        // DELAY TIME
        // ---------------------------------------------------------------------
        // A delay is waited.

        0:
        IF ((SysGetSysTime(TRUE)-TimeBf) < 250000) THEN RETURN; END_IF;
        CaseNr:=10; //Case number

        // ---------------------------------------------------------------------
        // MODIFY INHIBIT STATUS COMMAND
        // ---------------------------------------------------------------------
        // Sets accepted coins, a mask is defined, each bit refer to a coin.
        // +-+-+-+-+-+-+-+-+----+----+----+-----+-----+-----+------+------+
        // |F|E|D|C|B|A|9|8|1 Ec|2 Ec|5 Ec|10 Ec|20 Ec|50 Ec|1 Euro|2 Euro|
        // +-+-+-+-+-+-+-+-+----+----+----+-----+-----+-----+------+------+
        // ---------------------------------------------------------------------
        // Send comand 231 (Modify inhibit status).

        10:
        DBuf[0]:=16#00; //Coins enable
        DBuf[1]:=16#0D; //Coins enable

        CCTalk.DAdd:=2; //Destination address
        CCTalk.CCode:=231; //Command code
        CCTalk.TxDBf:=ADR(DBuf); //Tx data buffer
        CCTalk.TxDLgt:=2; //Tx data length
        CCTalk.RxDBf:=eNULL; //Rx data buffer
        CCTalk.RxDLgt:=0; //Rx data length
        CCTalk.Enable:=TRUE; //Enable
        CaseNr:=CaseNr+1; //Case number

        // ---------------------------------------------------------------------
        // READ BUFFERED CREDIT OR ERROR CODES COMMAND
        // ---------------------------------------------------------------------
        // Send comand 229 (Read buffered credit or error codes).
        // This command must be sent at least every 500 mS.             

        1:
        IF NOT(CCTalk.Done) THEN RETURN; END_IF;
        CCTalk.DAdd:=2; //Destination address
        CCTalk.CCode:=229; //Command code 
        CCTalk.TxDBf:=eNULL; //Tx data buffer 
        CCTalk.TxDLgt:=0; //Tx data length 
        CCTalk.RxDBf:=ADR(DBuf); //Rx data buffer 
        CCTalk.RxDLgt:=2; //Rx data length 
        CCTalk.Enable:=TRUE; //Enable
        CaseNr:=CaseNr+1; //Case number

        // ---------------------------------------------------------------------
        // CALCULATE CREDIT AMOUNT
        // ---------------------------------------------------------------------
        // 1st Byte: Event counter (00 to FF, then 01. 00 on reset).       
        // 2nd Byte: Coins type (00 on coin error).  
        // 3th Byte: Exit path (On coin error the code is returned).
        // ---------------------------------------------------------------------
        // Wait command execution and check evene counter. 

        2:
        IF NOT(CCTalk.Done) THEN RETURN; END_IF;
        CaseNr:=0; //Case number

        // On startup initialize the event counter.

        IF (StartUp) THEN ECounter:=DBuf[0]; StartUp:=FALSE; RETURN; END_IF;
        IF (DBuf[0] = ECounter) THEN RETURN; END_IF;

        // Coin has been inserted check if is correct.

        ECounter:=DBuf[0]; //Event counter 
        IF ((DBuf[1] = 0) OR (DBuf[1] > 8)) THEN Error:=1; RETURN; END_IF;

        // Calculate credit amount.

        CASE (DBuf[1]) OF
            1: Credit:=Credit+2.0; //2 Euro
            2: Credit:=Credit+1.0; //1 Euro
            3: Credit:=Credit+0.5; //50 Cents
            4: Credit:=Credit+0.2; //20 Cents
            5: Credit:=Credit+0.1; //10 Cents
            6: Credit:=Credit+0.05; //5 Cents
            7: Credit:=Credit+0.02; //2 Cents
            8: Credit:=Credit+0.01; //1 Cent
        END_CASE;
    END_CASE;

// [End of file]
Was this article helpful?