Macchine a Stati: Stringhe o Enumeratori?

"State Machine in LabVIEW: stringhe per prototipi rapidi, enum per sistemi scalabili e professionali."

In questo articolo analizziamo due approcci alla costruzione di State Machine in LabVIEW, confrontando pro e contro e scoprendo in quali scenari ciascuno risulta più adatto.

LabVIEW State Machine

UnaState Machinedescrive un’applicazione come sequenza di stati con regole di transizione.
In LabVIEW si realizza tipicamente con:

  • un While Loop che gestisce il ciclo,
  • una Case Structure che rappresenta gli stati,
  • uno shift register che memorizza il prossimo stato.
  • Il messaggio solitamente unenumo unastringa(altri tipi di dato sarebbero troppo poco descrittivi per leggibilità e integrazione)

Il vero nodo sta nel tipo di dato usato come messaggio, che può esserestringa,ringoenum.
Il ring equivale a gestire numeri: limitato e poco utile per rappresentare un tipo “messaggio” per la State Machine. La community apre la discussione quindi, tra stringhe ed enumeratori.

Messaggi String : Fessibilità

L’uso dellestringhecome message type, in una State Machine diLabVIEWè il metodo più flessibile e meno vincolante.

Ogni stato è rappresentato dal valore della stringa, passato nello shift register e richiamato dalla Case Structure.

Questo approccio consente di aggiungerestati rapidamente, non obbliga alla dichiarazione di una typedef, ed è adatto a prototipi o logiche ridotte, anche quando i messaggi sono raccolti per esempio da strumentazione.

Il limite principale è l’assenza dicontrollo in edit-mode: un errore di battitura genera uno stato non previsto, da curare con uno statpo default per gestire eccezioni di messaggi non interpretati (come per esempio suggerito nei 5 stati fondamentali Idle, Init,Default, Error, Exit.

Le stringhe sono inoltrecase sensitive(superabile abilitandoinsensitive matchsulla stuttura del case).

Il debug, se non si applicano strategie preventive, diventa complesso, in particolare quando si devono gestire molti messaggi (pensiamo alle architetture piu complesse tra piùproduttori e consumatori).

Per riassumere:

PROCONTRO
Creazione immediata di stati.Nessun controllo a compile-time
Massima flessibilità in sviluppo inizialeRischio di duplicati ed errori di battitura
Messaggi da Hardware (i.e. ASCII)Debug complesso senza strategie preventive
Manipolazione estesa, Serializzazione, Protocolli Custom

L’uso delle stringhe è molto diffusop tra i programmatori della community e le motivazioni sono verso la flessibilità e l’esperienza che permette stratergie di prevenzione errori.

È sempre necessario unDefault case(non una stringa “Default”), che intercetta valori non mappati.

Oltre a garantire la compilazione, è utile in architetture con più State Machine che condividono un dispatcher: gestisce stati non utilizzati senza replicare logiche e mantiene l’architettura leggera.
Un esempio di utilizzo dei messaggi arriva dallaJKI State Machineun esempio di implementazione molto versatile e dove i vantaggi dei msg come stringhe è completamente utilizzato.

Osserviamo come può essere possibile creare stati “segnaposto” che possono essere utilizzati anche per organizzare meglio tutti i messaggi nel case selector e formare anche macro command, per esempio concatenando messaggi e scodandoli estraendo una linea concatenata.

Enumeratori come messaggi: Meno Errori e Rigore

L’uso deglienumeratori (enum)come case selector in una SM di LabVIEW è la soluzione che possiamo definire più scolastica.

I messaggi sono dichiarati in una type-def che garantisce che ogni nuovo messaggio da gestire deve essere prima DICHIARATO (in uno stile più C-like) e si distribuisce direttamente ai subVI che usano la typeDef dimessaggio.

Ogni stato è rappresentato da un valore simbolico definito nell’enum e, se tipizzato cometypedef, ogni modifica si propaga automaticamente a tutto il progetto.

Questo garantisce coerenza e rende più semplice l’aggiornamento delle Case Structure.

Il principale vantaggio rispetto alle stringhe è ilcontrollo a compile-time: se uno stato non è gestito nella Case Structure, LabVIEW lo segnala subito, evitando comportamenti imprevisti a runtime. Gli enum sono inoltrestrongly typede non possono essere modificati a runtime, caratteristica che aumenta stabilità e riduce il rischio di errori.

Possono essere poi convertiti in TypeDef, generando coerenza tra tutte le copie di se stessi sparse per il codice, garantendo una replicazione della stessa struttura SM ovunque sia posizionata.

La comodità sta nella capacità di aggiornare il typedef quando si aggiungono o modificano stati, riflettendo il cambiamento ovunque sia utilizzata.

PROCONTRO
Controllo a compile-timeRichiede gestione del typedef
Aggiornamento automatico della Case Structure tramite typedefMeno immediati nella prototipazione rapida
Maggiore leggibilità e coerenza del codice
Non necessita del caso di Default

L’uso degli enum è consigliato nelle State Machine destinate a sistemi complessi e manutenibili: il rigore imposto dal typedef previene errori e rende l’architettura più scalabile sul lungo periodo.

Conclusione

La scelta del case selector in una State Machine di LabVIEW determina stabilità e manutenibilità del progetto.

  • Lestringhesono pratiche per prototipi e logiche ridotte, ma espongono a errori di battitura, duplicati e mancanza di controlli a compile-time.
  • Glienumeratoriimpongono disciplina progettuale attraverso typedef e garantiscono coerenza grazie al controllo a compile-time. Sonostrongly typed: gli stati sono definiti a priori e non mutano a runtime.

Per applicazioni professionali e scalabili, glienumrappresentano la scelta consigliata. Le stringhe restano utili solo in contesti sperimentali o di test rapido, dove la velocità conta più della robustezza.

La scelta e la discussione rimane accesa, anche in Bytelabs ci sono diverse scuole di pensiero e questopostdal forum della community NI fa capire quanto non ci possa essere una scelta migliore.

Secondo noi non importa piu se usare TypeDef enum o String, importa piuttosto stabilire uno standard di lavoro condivisio tra il team.

Immagine di Lorenzo Borghi
Lorenzo Borghi
Ingegnere magistrale in Automazione e Robotica, certificato LabVIEW Developer (CLD), Lorenzo è Software Engineer in Bytelabs dal 2022. Si occupa di progettazione e sviluppo di sistemi di test e misura, con particolare attenzione all'automazione dei collaudi e all'integrazione di soluzioni hardware/software avanzate.

Potrebbe interessarti anche:

La digitalizzazione dei processi di taratura consente tracciabilità, automazione e
La produzione di dispositivi elettromeccanici medicali richiede collaudi rigorosi, laboratori
Parlaci del tuo progetto o della tua idea.

Contattaci

Phone: +39 0532 458971
Email: info@bytelabs.it
Via Cento, 8D 44124 Ferrara
CF/PI/VAT: IT 02051510382

Follow Us!