DataTransfer, transfer data between systems

List

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

Questo blocco funzione esegue il trasferimento di un blocco di memoria tra due sistemi in File occore definire lo stream di comunicazione utilizzato (La comunicazione deve essere Full-duplex). L’uscita Linked si attiva quando si è verificata la corretta connessione tra i due  sistemi, e per garantire che i due sistemi siano sempre correttamente interconnessi anche se non vi è variazione nei dati da trasmettere viene comunque inviato un pacchetto dati ogni tempo definito in Heartbeat.

Il parametro Timeout definisce il tempo massimo per il trasferimento dei dati, l’invio dei dati si conclude con la ricezione di un acknowledge da parte dell’altro sistema, un ciclo di invio dati e ricezione acknowledge richiede al minimo 2 loop di esecuzione programma. Se dopo l’invio non viene ricevuto acknowledge entro il tempo definito viene generato errore.

L’invio dei dati è automatico sulla variazione di uno qualsiasi dei bytes del buffer di trasmissione, RxDataOk si attiva per un loop ad ogni ricezione dati dall’altro sistema, TxDataSent si attiva per un loop al termine della trasmissione dei dati verso l’altro sistema.

Programma “DataExchange”

E’ disponibile il progetto LogicLab DataExchange (Download) che trasferito su 2 sistemi SlimLine, tramite una pagina web di configurazione permette di realizzare lo scambio dati tra i due sistemi con protocollo UDP. Il sistema server utilizza il FB SysUDPServer mentre il sistema client utilizza il FB SysUDPClient.

Utilizzando LogicLab è possibile modificare il programma secondo le proprie esigenze per permettere la comunicazione con protocollo TCP o utilizzando la comunicazione seriale. L’area di scambio dati può essere ridimensionata a proprio piacere per permettere lo scambio non solo di I/O logici ma anche di valori analogici o altre informazioni.

Screenshot programma DataExchange
Information Circle

Blocco funzione

CODESYS: Non disponibile

LogicLab: eLLabUtyLib

Descrizione

Enable (BOOL) Comando abilitazione.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento della FB (Vedi articolo).
TXData (BOOL) Se attivato comanda la trasmissione dei dati all’altro sistema. Và resettato su attivazione di TxDataSent.
AutoTxD (BOOL) Se attivo i dati sono inviati automaticamente all’altro sistema su variazione dati in TxDBuffer.
File (eFILEP) Stream di comunicazione con l’altro sistema.
RxDBuffer (PVOID) Indirizzo buffer dove devono essere trasferiti i dati ricevuti.
RxDSize (UDINT) Dimensione buffer dati ricevuti. Deve coincidere con il valore di TxDSize dell’altro sistema.
TxDBuffer (PVOID) Indirizzo buffer dati da inviare. Ad ogni variazione del contenuto del buffer l’intero buffer è inviato all’altro sistema.
TxDSize (UDINT) Dimensione buffer dati da inviare. Deve coincidere con il valore di RxDSize dell’altro sistema.
Heartbeat (REAL) Tempo massimo in cui deve esserci uno scambio dati tra i due sistemi espresso in secondi. Se non vi è variazione nei dati da trasmettere ogni tempo definito il sistema client invia un pacchetto dati. Deve essere definito lo stesso valore in entrambi i sistemi.
Timeout (REAL) Tempo massimo ricezione acknowledge su invio dati espresso in secondi. Se a seguito di un invio dati nel tempo definito non viene ricevuto l’acknowledge si genera errore. Deve essere definito lo stesso valore in entrambi i sistemi.
Connect (BOOL) Comanda la connessione con l’altro sistema.
Linked (BOOL) Si attiva se i due sistemi client e server sono correttamente interconnessi.
Fault (BOOL) Attivo per un loop se errore esecuzione.
RxDataOk (BOOL) Attivo per un loop alla ricezione dati.
TxDataSent (BOOL) Attivo per un loop su alla ricezione dell’acknoledge dati inviati all’altro sistema.
RxPackets (UDINT) Contatore pacchetti ricevuti.
TxPackets (UDINT) Contatore pacchetti trasmessi.
CTime (REAL) Tempo comunicazione (S).
Errors (UDINT) Numero di errori.

Immagine FB DataTransfer

Trigger di spy

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

Livelli di trigger
TriggerDescrizione
16#00000001Tx: Trasmissione dati e/o acknowledge.
16#00000002Rx: Ricezione dati e/o acknowledge.
16#40000000Error: Errore esecuzione.

Esempi

Come utilizzare gli esempi.
Nell’esempio è gestito lo scambio dati su di uno stesso sistema utilizzando una connessione UDP in localhost (IP 127.0.0.1).

LogicLab (Ptp114, ST_DataTransfer)
PROGRAM ST_DataTransfer
VAR
    i : UDINT; (* Auxiliary buffer *)
    TimeBf : UDINT; (* Time buffer (mS) *)
    SRxDBuffer : ARRAY[0..15] OF BYTE; (* Rx data buffer (Server) *)
    STxDBuffer : ARRAY[0..7] OF BYTE; (* Tx data buffer (Server) *)
    CRxDBuffer : ARRAY[0..7] OF BYTE; (* Rx data buffer (Client) *)
    CTxDBuffer : ARRAY[0..15] OF BYTE; (* Tx data buffer (Client) *)
    SDataTxfer : DataTransfer; (* Data transfer (Server) *)
    CDataTxfer : DataTransfer; (* Data transfer (Client) *)
    UDPServer : SysUDPServer; (* UDP server *)
    UDPClient : SysUDPClient; (* UDP client *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_DataTransfer"
// *****************************************************************************
// Exchanges data using a localhost UDP connection.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATIONS
    // -------------------------------------------------------------------------
    // Program initializations.

    IF (SysFirstLoop) THEN

        // Set UDP server parameters.

        UDPServer.FilesArr:=ADR(SDataTxfer.File); //Files array
        UDPServer.LocalAdd:=ADR('0.0.0.0'); //Local address
        UDPServer.LocalPort:=2000; //Local port
        UDPServer.MaxConn:=1; //Accepted connections
        UDPServer.FlushTm:=50; //Flush time (mS)
        UDPServer.LifeTm:=30; //Life time (S)
        UDPServer.RxSize:=TO_UINT(SIZEOF(SRxDBuffer)+16); //Rx buffer size
        UDPServer.TxSize:=TO_UINT(SIZEOF(STxDBuffer)+16); //Tx buffer size

        // Set server data transfer parameters.

        SDataTxfer.Enable:=TRUE; //Enable
        SDataTxfer.SpyOn:=TRUE; //Spy active
        SDataTxfer.AutoTxD:=FALSE; //Auto transmit data
        SDataTxfer.RxDBuffer:=ADR(SRxDBuffer); //Rx data buffer
        SDataTxfer.RxDSize:=SIZEOF(SRxDBuffer); //Rx data size
        SDataTxfer.TxDBuffer:=ADR(STxDBuffer); //Tx data buffer
        SDataTxfer.TxDSize:=SIZEOF(STxDBuffer); //Tx data size
        SDataTxfer.Heartbeat:=2.0; //Heartbeat time (S)
        SDataTxfer.Timeout:=2.0; //Timeout time (S)

        // Set UDP client parameters.

        UDPClient.PeerAdd:=ADR('127.0.0.1'); //Peer address
        UDPClient.PeerPort:=2000; //Peer port
        UDPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
        UDPClient.LocalPort:=0; //Local port
        UDPClient.FlushTm:=50; //Flush time (mS)
        UDPClient.LifeTm:=30; //Life time (S)
        UDPClient.RxSize:=TO_UINT(SIZEOF(CRxDBuffer)+16); //Rx buffer size
        UDPClient.TxSize:=TO_UINT(SIZEOF(CTxDBuffer)+16); //Tx buffer size

        // Set client data transfer parameters.

        CDataTxfer.Enable:=TRUE; //Enable
        CDataTxfer.SpyOn:=TRUE; //Spy active
        CDataTxfer.AutoTxD:=TRUE; //Auto transmit data
        CDataTxfer.RxDBuffer:=ADR(CRxDBuffer); //Rx data buffer
        CDataTxfer.RxDSize:=SIZEOF(CRxDBuffer); //Rx data size
        CDataTxfer.TxDBuffer:=ADR(CTxDBuffer); //Tx data buffer
        CDataTxfer.TxDSize:=SIZEOF(CTxDBuffer); //Tx data size
        CDataTxfer.Heartbeat:=2.0; //Heartbeat time (S)
        CDataTxfer.Timeout:=2.0; //Timeout time (S)
    END_IF;

    // -------------------------------------------------------------------------
    // SERVER TRANSFER MANAGEMENT
    // -------------------------------------------------------------------------
    // Manages the data transfer as server. It sends data on command.

    UDPServer(Enable:=SDataTxfer.Connect); //UDP server management
    SDataTxfer(); //Data transfer

    // At every defined time the data is sent.
    
    IF ((SysTimeGetMs()-TimeBf) > TO_UDINT(T#2s)) THEN
        TimeBf:=SysTimeGetMs(); //Time buffer (mS)
        SDataTxfer.TxData:=TRUE; //Transmit data
    END_IF;

    // When data is acknowledged by client the send command is reset.

    IF (SDataTxfer.TxDataSent) THEN SDataTxfer.TxData:=FALSE; END_IF;

    // -------------------------------------------------------------------------
    // CLIENT TRANSFER MANAGEMENT
    // -------------------------------------------------------------------------
    // Manages the data transfer as client. It sends data automatically when
    // they change.

    UDPClient(Connect:=CDataTxfer.Connect); //UDP client management
    CDataTxfer(File:=UDPClient.File); //Data transfer

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