Vai al contenuto

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 fa da Gianluca.
Stai visualizzando 6 post - dal 1 a 6 (di 6 totali)
  • Autore
    Post
  • #35924
    Gianluca
    Partecipante

    Ho 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 ?

    #39315
    Sergio Bertana
    Amministratore del forum

    La 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.

    #39323
    Gianluca
    Partecipante

    Perfetto grazie mille…

    #39510
    Gianluca
    Partecipante

    Ho 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.

    #39511
    Sergio Bertana
    Amministratore del forum

    Sei 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.

    #39522
    Gianluca
    Partecipante

    Perfetto 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

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