Gestire protocollo seriale ASCII
Home › Forum › Programmazione IEC 61131 (LogicLab) › Gestire protocollo seriale ASCII
- Questo topic ha 5 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 9 anni, 6 mesi fa da
Gianluca.
-
AutorePost
-
Gennaio 29, 2016 alle 2:46 pm #35924
Gianluca
PartecipanteHo la necessità di usare un protocollo ASCII ma non trovo il sistema per mettere il mio Slim (full 485) in listen sulla seriale 485, il comando che mi arriva è formato da una stringa di 8 o 12 caratteri. In base al comando che arriva devo mandare una risposta sempre con una stringa. Come posso fare ?
Gennaio 29, 2016 alle 5:15 pm #39315Sergio Bertana
Amministratore del forumLa porta seriale RS485 opera solo in Half-Duplex su 2 fili, ma da quanto mi dici sembra di capire che il tuo protocollo è comunque un protocollo di questo tipo. Un sistema invia una stringa di 8/12 carattteri e tu devi interpretarla e poi rispondere.
Intanto la porta RS485 pùo operare in diversi modi (Vedi FB SysSerialPort, estratto manuale), per operare con la RS485 devi impostare COM2. Il parametro DTRManagement definisce il modo in cui la porta opera, impostando DTR_AUTO_WO_TIMES, la porta è sempre in ricezione, ed andrà automaticamente in trasmissione quando viene eseguita una scrittura di dati su di essa.
Da programma è possibile acquisire i dati in ricezione con le funzioni Sysfgetc e Sysfread, mentre per trasmettere i dati dovrai usare le funzioni Sysfputc e Sysfwrite. Naturalmente per interpretare la stringa ricevuta dovrai realizzare un piccolo programma che buffera i dati in ricezione, poi li interpreta, ed infine invia la risposta.
Il forum è pieno di esempi di questo genere puoi guardare qui, qui, qui, qui.
Febbraio 1, 2016 alle 2:17 pm #39323Gianluca
PartecipantePerfetto grazie mille…
Aprile 8, 2016 alle 9:45 am #39510Gianluca
PartecipanteHo un problema con la ricezione di valori REAL, per leggere il valore uso un puntatore a REAL partento dal byte della stringa che contiene il valore:
BYTE BufferRx[110]
@REAL PtrReal1
REAL valore1…
PtrReal1:=ADR(BufferRx[7]);
valore1:=@PtrReal1;
…Guardando con il watch i valori mi diventano così, il valore del puntatore è corretto: @PtrReal1=-2.5, il valore in valore1 non diventa -2.5 ma simile a valore1=1.005e-008. Ovviamente con questo valore della variabile valore1 il programma non funziona correttamente.
Aprile 8, 2016 alle 12:36 pm #39511Sergio Bertana
Amministratore del forumSei caduto nel problema di allineamento della allocazione variabili, lo SlimLine è basato su una architettura ARM e questa architettura vuole che le variabili a 16 bits siano allocate ad indirizzi divisibili per 2 mentre le variabili a 32 bits ad indirizzi divisibili per 4 (Topic).
Quindi per risolvere il tuo problema, siccome non sai a priori dove il compilatore alloca la variabile stringa ti consiglio di allocare una variabile di appoggio REAL e poi con due puntatori a byte copiare il dato dalla stringa nella varibile REAL. Nella copia attenzione all’endianness dei dati.
Aprile 13, 2016 alle 8:54 am #39522Gianluca
PartecipantePerfetto con il gioco dei puntatori ho risolto e tutto funziona correttamente, in questa funzione non avevo proprio pensato al discorso della locazione di memoria per i valori REAL. pb:=ADR(RxTxBuf[7]); pv:=ADR(Valore1);
@pv:=@pb; pv:=pv+1; pb:=pb+1;
@pv:=@pb; pv:=pv+1; pb:=pb+1;
@pv:=@pb; pv:=pv+1; pb:=pb+1;
@pv:=@pb;Dove Valore1 è tipo REAL pb e pv sono di tipo @BYTE
-
AutorePost
- Devi essere connesso per rispondere a questo topic.