SysCANSetMode, set the CAN controller mode

List

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

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.

Function
CODESYS: Non disponibile
LogicLab: eLLabXUnified12Lib

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 TRUE se eseguita correttamente, FALSE se errore.

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)
PROGRAM ST_SysCANSetMode
VAR
    i : UDINT; (* Auxiliary counter *)
    j : USINT; (* Auxiliary counter *)
    CANMsg : SYSCANMESSAGE; (* CAN message *)
    SBf : STRING[ 64 ]; (* Spy buffer *)
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
//      i:=SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#00000000, 16#80000000); //Accept all 11 bits messages
//      i:=SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#80000000, 16#80000000); //Accept all 29 bits messages
        i:=SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#00000000, 16#00000000); //Accept all 11 and 29 bits messages
//      i:=SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#000007FF, 16#9FFFFFFF); //Accept only 11 bits messages with CanID=16#000007FF
//      i:=SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#8FFFFFFF, 16#9FFFFFFF); //Accept only 29 bits messages with CanID=16#1FFFFFFF
//      i:=SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#000007FF, 16#1FFFFFFF); //Accept 11 and 29 bits messages with CanID=16#000007FF
//      i:=SysCANSetMode(CAN_SPEED#CAN_250KBIT, 16#80001567, 16#9FFFFFFF); //Accept only 29 bits messages with CanID=16#00001567
//      i:=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,

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

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

    i:=SysWrSpyData(SPY_ASCII, 0, 16#00000001, ADR('Rx'), ADR(SBf));

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