Vai al contenuto

SysCANSetMode, set the CAN controller mode

Vai all indice del manuale di programmazione
Tipo: Funzione
Libreria LogicLab: eLLabXUnified12Lib
Libreria Codesys: Non disponibile

Il CAN Bus è un sistema di comunicazione a due fili, half-duplex, un frame CAN è costituito da un’intestazione di quattro byte (Contenente un identificatore CanID a 11 o 29 bit) seguito da un massimo di 8 byte di dati. I dati trasmessi sul bus sono ricevuti da tutti i nodi connessi che devono decidere se sono rilevanti o meno. L’interfaccia CAN esegue questo controllo utilizzando un filtro Filter ed una maschera Mask di accettazione. Il bit 31 di Filter e Mask indicano al controller se accettare messaggi standard (11 bit), extended (29 bit) o entrambi.

Questa funzione imposta il modo di funzionamento del controller CAN, permette di definire il valore di bit rate, il filtro e la maschera di accettazione pacchetti. Mask determina quali bit del CanID debbano essere confrontati con il bit di Filter. Se un bit di Mask è FALSE il corrispondente bit di CanID verrà accettato indipendentemente dal valore del bit di Filter. Se un bit di Mask è TRUE, il corrispondente bit di CanID verrà confrontato con il valore del bit di Filter; se corrispondono, viene accettato, altrimenti viene rifiutato.

Descrizione

BitRate (CAN_BRATE) Valore definizione bit rate CAN bus (Vedi tabella).
Filter (UDINT) Valore di filtro pacchetti CAN.
Mask (UDINT) Valore di maschera filtro pacchetti CAN.

La funzione ritorna una variabile BOOL, TRUE se eseguita correttamente, FALSE se errore.

Immagine funzione SysCANSetMode

Esempi

Come utilizzare gli esempi.
Nell’esempio viene impostato il controller CAN per ricevere diversi tipi di messaggi (Scommentare l’impostazione desiderata). Sulla ricezione del messaggio ne viene eseguito il report nella console di spionaggio.

LogicLab (Ptp116, ST_SysCANSetMode)
PROGRAM ST_SysCANSetMode
VAR
    i : USINT; (* Auxiliary counter *)
    SBf : STRING[ 64 ]; (* Spy buffer *)
    CANMsg : SYSCANMESSAGE; (* CAN message *)
END_VAR

// *****************************************************************************
// PROGRAM "ST_SysCANSetMode"
// *****************************************************************************
// Are executed some CAN controller settings to show various messages filtering.
// The SysSpyData function allows to enable the Spy console to display the
// received messages.
//
// A Spy console report of some received messages.
// 
// 08:37:28(2.00)|Rx|MsgID:00000456, Length:2 - 12 34
// 08:37:30(2.00)|Rx|MsgID:88123456, Length:8 - 01 23 45 67 89 AB CD EF 
// -----------------------------------------------------------------------------

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

    IF (SysFirstLoop) THEN
//      eTO_JUNK(SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#00000000, 16#80000000)); //Accept all 11 bits messages
//      eTO_JUNK(SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#80000000, 16#80000000)); //Accept all 29 bits messages
        eTO_JUNK(SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#00000000, 16#00000000)); //Accept all 11 and 29 bits messages
//      eTO_JUNK(SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#000007FF, 16#9FFFFFFF)); //Accept only 11 bits messages with CanID=16#000007FF
//      eTO_JUNK(SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#8FFFFFFF, 16#9FFFFFFF)); //Accept only 29 bits messages with CanID=16#1FFFFFFF
//      eTO_JUNK(SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#000007FF, 16#1FFFFFFF)); //Accept 11 and 29 bits messages with CanID=16#000007FF
//      eTO_JUNK(SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#80001567, 16#9FFFFFFF)); //Accept only 29 bits messages with CanID=16#00001567
//      eTO_JUNK(SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#80001560, 16#9FFFFFF0)); //Accept only 29 bits messages with CanID of 16#00001560~16#0000156F
    END_IF;

    // -------------------------------------------------------------------------
    // MESSAGE RECEPTION
    // -------------------------------------------------------------------------
    // Check if a messages has been received, can be received only the messages
    // that are accepted by the filter set. 

    IF NOT(SysIsCANRxTxAv(FALSE)) THEN RETURN; END_IF;
    IF NOT(SysCANRxMsg(16#00000000, 16#00000000, ADR(CANMsg))) THEN RETURN; END_IF;

    // Create report of the received message and sends it to the spy console,

    eTO_JUNK(SysVsnprintf(ADR(SBf), SIZEOF(SBf), ADR('MsgID:%08X'), UDINT_TYPE, ADR(CANMsg.MsgID)));
    eTO_JUNK(SysCVsnprintf(ADR(SBf), SIZEOF(SBf), ADR(', Length:%d -'), USINT_TYPE, ADR(CANMsg.Length)));

    FOR i:=0 TO CANMsg.Length-1 DO
        eTO_JUNK(SysCVsnprintf(ADR(SBf), SIZEOF(SBf), ADR(' %02X'), USINT_TYPE, ADR(CANMsg.Data[i])));
    END_FOR;

    eTO_JUNK(SysWrSpyData(SPY_ASCII, 0, 16#00000001, ADR('Rx'), ADR(SBf)));

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