Home › Forum › Programmazione IEC 61131 (LogicLab) › Ricezione dati da radiocomando con protocollo CAN
- Questo topic ha 3 risposte, 2 partecipanti ed รจ stato aggiornato l'ultima volta 11 anni, 3 mesi fa da
Sergio Bertana.
-
AutorePost
-
Giugno 8, 2015 alle 2:27 pm #35805
Giorgio
PartecipanteDevo 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.
Giugno 8, 2015 alle 2:31 pm #38945Sergio Bertana
Amministratore del forumCome 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).
Giugno 8, 2015 alle 2:51 pm #38946Giorgio
PartecipanteOk 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 ?
Giugno 8, 2015 alle 2:54 pm #38947Sergio Bertana
Amministratore del forumIntanto 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]));
-
AutorePost
- Devi essere connesso per rispondere a questo topic.