Vai al contenuto

Informazioni sulla gestione delle stringhe

Home Forum Programmazione IEC 61131 (LogicLab) Informazioni sulla gestione delle stringhe

Stai visualizzando 4 post - dal 1 a 4 (di 4 totali)
  • Autore
    Post
  • #35341
    Maurizio Conti
    Partecipante

    Devo gestire l’invio di una stringa verso un display seriale per la visualizzazione di una variabile numerica a 3 cifre. Il frame di comando del display è del tipo <STX><Add><Nr><Nr><Nr><ETX>.

    Ho realizzato una semplice FB a cui passando l’indirizzo del display ed il valore della variabile mi crea la stringa da inviare al display, ma non riesco ad ottenere il risultato desiderato. Invio al Vs supporto tecnico per email il programma potete verificare dove ho commesso l’errore ?

    #37593
    Sergio Bertana
    Amministratore del forum

    Allego alla mia risposta la stampa del programma che mi hai inviato così da potermi riferire per la risposta. Come si vede nella FB per valorizzare la stringa di uscita Buffer hai utilizzato una sintassi del tipo:

    Buffer[0]:=’$02′; (* STX *)

    Il linguaggio IEC61131 non prevede l’indicizzazione che è invece tipica del C. Quando tu accedi con le parentesi quadre il compilatore suppone che stai accedendo alla stringa [0] di un array di stringhe. Quindi non fà quello di cui tu hai bisogno, cioè di copiare il valore 16#02 nel primo byte della stringa.

    Se vuoi utilizzare l’indice devi definire un array di USINT al posto di una stringa, in alternativa per utilizzare una stringa devi usare un pointer per riferirti ai suoi singoli bytes. Allego la stampa ed il programma sorgente corretto.

    #38281
    Anonimo
    Inattivo

    Buonasera avrei una domanda in merito al programma d’acquisizione del valore di peso. In linea 49 viene effettuato un controllo sulla variabile ‘RxChars’. Tale variabile viene inizializzata in linea 35, ma poi non viene più valorizzata. Non si sarebbe dovuto incrementare il valore di ‘RxChars’ dopo ogni acquisizione, ovvero dopo linea 44 ?

    #38282
    Sergio Bertana
    Amministratore del forum

    Ciao chegio, per gli altri utenti del forum informo che stiamo parlando del programma di esempio riportato in questo topic, di cui qui la stampa del programma a cui si fa riferimento. Ed un bravo a chegio che ha individuato l’errore “volutamente” nascosto nel programma…

    In effetti ho scritto quel programma di getto scopiazzando pezzi da altri programmi e quell’errore è proprio scappato. Visto poi che l’errore non inficia il funzionamento non me ne sono accorto nel test. Però attenzione questo errore è molto grave perché è uno di quegli errori che possono provocare malfunzionamenti di un programma. Se si continuano a ricevere caratteri dalla seriale senza ricevere <CR> si sfora la dimensione del buffer RxString andando a sporcare le variabili allocate successivamente. Quindi come suggerito dopo la riga 44 si deve gestire l’incremento della variabile RxChars con le istruzioni.

    RxChars:=RxChars+1; (* Nr of characters *)

    In alternativa si può eliminare del tutto la gestione della variabile RxChars, eseguendo alla riga 49 il controllo sul pointer alla stringa con le istruzioni.

    IF (Ptr >= (ADR(RxString)+SIZEOF(RxString)-1)) THEN CaseNr:=0; RETURN; END_IF;

    Per completezza ricordo che una variabile stringa ha lunghezza superiore di un byte a quella dichiarata (Per contenere il codice tappo di fine stringa 16#00). Quindi il valore di SIZEOF(RxString) è 33.

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