Home › Forum › Discussioni su problematiche generali › Parsing stringa da porta seriale
- Questo topic ha 4 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 6 giorni, 16 ore fa da Sergio Bertana.
-
AutorePost
-
Maggio 20, 2022 alle 3:54 pm #65318StefanoPartecipante
Devo interfacciare una vecchia pressa ad uno scada per monitorarne il funzionamento.
La pressa mi da 4 contatti puliti con i segnali:– Ciclo in corso
– Funzionamento automatico
– Funzionamento manuale
– Arresto per allarmeha poi una porta seriale, a cui andrebbe collegata una stampante solo testo, che a fine di ogni ciclo emette una stringa contenente una decina di valori di funzionamento e un carattere di new line. Quindi qualcosa tipo:
” 1.33 84.9 7893 22.5 6.74 ecc ecc”
” 1.93 87.4 7894 23.5 6.94 ecc ecc”Le stringhe sono sempre lunghe 80 caratteri, i valori sembrerebbero campi a larghezza fissa allineati a destra.
Io dovrei acquisire i valori digitali e renderli disponibili su una word via modbus TCP, che è abbastanza banale. Contestualmente leggere la stringa dalla seriale fino al carattere di fine linea, scartare le righe non valide (quando la macchina calcola di essere su un nuovo foglio emette le intestazioni di colonna e dei trattini) dividere i campi, convertirli da testo a numero e renderli disponibili via modbus. Magari salvare le stringhe ricevute su di un file di testo per avere un debug.
Pensavo di usare un MPS056A320.
L’idea era di fare un ciclo che legge una carattere alla volta dalla seriale e lo accoda ad un buffer. Una volta raggiunti gli 80 caratteri, o il carattere di fine linea, dividere la stringa in X stringhe di dimensione Yx e convertirle con SysVarsscanf. Se SysVarsscanf non da errori allora copiare i dati nelle locazioni raggiungibili da modbus.
L’approccio è un po’ a basso livello ma mi pare abbastanza robusto.
Ci sono librerie più evolute che mi sfuggono?Maggio 23, 2022 alle 10:29 am #65321Sergio BertanaAmministratore del forumDirei che è la soluzione migliore, se dai una occhiata al capitolo Semplice protocollo seriale nella documentazione del FB SysSerialPort, trovi già una base di partenza per la tua applicazione.
Giugno 8, 2022 alle 11:28 am #65484StefanoPartecipantePer fare il debug dell’applicazione mi farebbe comodo avere una pagina web che mostri il log delle stringe arrivate tramite seriale. Esattamente la cosa che fa la pagina web di sistema che mostra i log. C’è un modo standard per replicarla appoggiata ad un diverso file di testo?
Settembre 2, 2024 alle 7:14 pm #77651StefanoPartecipanteSto ampliando il progetto oggetto di questo post, scritto sulla falsa riga dell’esempio nella documentazione di SysSerialPort.
Adesso raccolgo dalla seriale dati da macchine diverse. Il parsing delle stringhe è alquanto diverso: alcune usano la virgola per i decimali, altre il punto, altre hanno la stringa con i valori posti in ordine differente, altre hanno la seriale con parametri diversi. Fin’ora avevo due casi e portavo avanti due software diversi. Ora i casi sono di più e vorrei unificare in un software solo, mettere un valore indicante il tipo di macchina in SysUSetA e nel software agire diversamente in base al valore.
Guardando sempre l’esempio ST_SerialDataReceive se io creassi dei blocchi funzionali per i le varie casistiche, e li richiamassi nel codice a seconda del tipo di macchina, le variabili locali dichiarate in ST_SerialDataReceive sarebbero accessibili dai blocchi funzionali oppure dovrei dichiararle tutte come variabili globali (o passarle come parametro) perchè siano accessibili?
In alternativa potrei usare anche le macro per tenere diviso il codice.
Settembre 5, 2024 alle 7:58 am #77655Sergio BertanaAmministratore del forumSi certo puoi realizzare dei FB o delle funzioni per gestire le varie decodifiche stringa ma come hai detto tu per poter accedere a variabili esterne da FB o funzione le variabili devono essere globali. Non puoi accedere con la definizione EXTERN da FB o funzione a variabili locali di un program.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.