SysCANTxMsg, transmit a CAN message

Home / Knowledge Base / Manualistica / Programmazione IEC 61131-3 / Gestione CAN Bus / SysCANTxMsg, transmit a CAN message

La funziona carica i messaggi da trasmettere nel buffer FIFO di trasmissione, il controller CAN controlla se messaggi nel buffer e quando il bus è libero trasmette il primo messaggio caricato e poi di seguito con tutti gli altri. Mentre il controller trasmette svuotando il buffer è possibile se vi è spazio (Funzione SysIsCANRxTxAv) caricare altri messaggi da trasmettere.

Il messaggio da trasmettere và creato in una variabile di tipo SYSCANMESSAGE il cui indirizzo và passato alla funzione nel parametro Msg.

Function
CODESYS: Non disponibile
LogicLab: eLLabXUnified12Lib

Msg (@SYSCANMESSAGE)) Indirizzo variabile di tipo SYSCANMESSAGE che contiene il messaggio da trasmettere.

La funzione ritorna (BOOL) TRUE se messaggio trasferito nel buffer.

Errori

In caso di errore la funzione ritorna FALSE, eseguendo immediatamente dopo la funzione SysGetLastError è possibile rilevare il codice di errore. Fare riferimento alla tabella seguente per la descrizione.

Esempi

Come utilizzare gli esempi.
Nell'esempio ogni secondo viene inviato un messaggio CAN di 4 bytes di lunghezza, il contenuto del messaggio è il valore della variabile UDINT TxData.

LogicLab (Ptp116)
PROGRAM ST_SysCANTxMsg
VAR
    Pulse : BOOL; (* Pulse *)
    i : UDINT; (* Auxiliary counter *)
    TxData : UDINT; (* Tx data *)
    CANMsg : SYSCANMESSAGE; (* CAN message *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysCANTxMsg"
// *****************************************************************************
// A 29 bit CAN message is sent at every 1 second.
// -----------------------------------------------------------------------------

    // -------------------------------------------------------------------------
    // INITIALIZATION
    // -------------------------------------------------------------------------

    IF (SysFirstLoop) THEN
        i:=SysCANSetMode(CAN_250KBIT, 16#00000000, 16#00000000); //Accept all 11 and 29 bits messages
    END_IF;

    // -------------------------------------------------------------------------
    // MESSAGE TRANSMISSION
    // -------------------------------------------------------------------------
    // At every 1 second a CAM message is sent. 

    IF NOT(SysIsCANRxTxAv(TRUE)) THEN RETURN; END_IF;
    IF (SysClock1000 <> Pulse) THEN
        Pulse:=SysClock1000; //Pulse
        TxData:=TxData+1; //Tx data

        // Prepare the CAM message and send it.

        CANMsg.RmReq:=FALSE; //eFALSE:Data frame, eTRUE:Remote request
        CANMsg.Length:=4; //Data length
        CANMsg.MsgID:=16#92345678; //Message ID 29 Bit
        CANMsg.Data[0]:=TO_BYTE(TxData/16#1000000); //Message data
        CANMsg.Data[1]:=TO_BYTE(TxData/16#10000); //Message data
        CANMsg.Data[2]:=TO_BYTE(TxData/16#100); //Message data
        CANMsg.Data[3]:=TO_BYTE(TxData); //Message data
        i:=SysCANTxMsg(ADR(CANMsg)); //Eseguo trasmissione
    END_IF;

// [End of file]

Ti è stato utile questo articolo ?