Vai al contenuto

Ricezione dati da radiocomando con protocollo CAN

Home Forum Programmazione IEC 61131 (LogicLab) Ricezione dati da radiocomando con protocollo CAN

Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Autore
    Post
  • #35805
    Giorgio
    Partecipante

    Devo interfacciare un radiocomando che ha una uscita su CAN bus con uno SlimLine, avete un programma di esempio da cui partire per effettuare dei tests.

    #38945
    Sergio Bertana
    Amministratore del forum

    Come riportato in questo topic per Per utilizzare il CAN occorre inizializzarlo definendo la velocità ed i filtri, tipicamente viene impostato per ricevere tutti i messaggi SysCANSetMode(CAN_125KBIT, 16#00000000, 16#00000000).

    Ora il CAN controller riceve tutti i pacchetti CAN e li memorizza in automatico in un suo buffer di ricezione sarà possibile estrarre dal buffer i messaggi con la funzione SysCANRxMsg(Mask, ID, ADR(Msg)). Naturalmente se se desidera leggere solo i messaggi con un certo ID occorre definire l’ID ed il Mask nella funzione.

    La variabile Msg deve essere di tipo SYSCANMESSAGE e se messaggio ricevuto al suo interno i campi:
    Length: Indica la lunghezza in byte del messaggio CAN ricevuto (Campo Data).
    MsgID: Ritorna l’ID del messaggio, il bit 31 è il bit di FF.
    Data: Array con i dati ricevuti (Vedi Length per la lunghezza).

    Ecco la stampa di un programma minimale per la ricezione di tutti i pacchetti CAN (Download sorgente).

    #38946
    Giorgio
    Partecipante

    Ok adesso ricevo il messaggio CAN dal radiocomando. Il messaggio contiene nei primi 4 bytes un valore di peso, come posso trasferirlo in una variabile DINT ?

    #38947
    Sergio Bertana
    Amministratore del forum

    Intanto devi essere sicuro che la variabile ritornata dal radiocomando sia effettivamente un DINT.

    Ora dovendo acquisire valori espressi su più bytes da sistemi diversi, occorre tenere presente l’endianness dei dati dei due sistemi. L’architettura ARM utilizzata nei sistemi SlimLine è di tipo Little-Endian, quindi il byte meno significativo si trova ad indirizzo più basso rispetto al byte più significativo (Questo topic dà ulteriori informazioni).

    Quindi per acquisire un dato espresso su più bytes puoi fare riferimento alle funzioni LEArrayToVar o BEArrayToVar (Devi utilizzare quella adatta all’endianness del tuo radiocomando). La funzione adatta automaticamente l’endianness del dato a quello del sistema SlimLine.

    In pratica ipotizzando di definire nel programma di prima una variabile Weight di tipo DINT per il valore di peso, ed ipotizzando che il radiocomando invii un dato nel formato Big-Endian dovrai scrivere.

    Ok:=BEArrayToVar(DINT_TYPE, ADR(Weight), ADR(Msg.Data[0]));

Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Devi essere connesso per rispondere a questo topic.