Utilizzo delle nuove tecnologie per l’analisi di codice.

Inplace element structure labview

Negli ultimi anni, l’intelligenza artificiale si è affermata come un supporto estremamente utile per facilitare lo svolgimento di attività complesse, dalla ricerca di informazioni, fino ad arrivare alla pianificazione e organizzazione di attività. AI più avanzate sono in grado di generare bozze di script che agevolano i programmatori e riducono significativamente i tempi di sviluppo.

Tuttavia, questi strumenti non sono ancora del tutto autonomi nella produzione di contenuti di qualità: un occhio attento, può spesso notare pattern tipici delle reti neurali, sintomo di un approccio ancora procedurale. Nonostante ciò, è possibile utilizzare questi potenti alleati per il compito contrario, non quello di scrivere del codice, ma di aiutare a comprenderlo, spiegandone le funzionalità e organizzandolo in blocchi facili da leggere.

Un esempio pratico è l’utilizzo delle AI per interpretare linguaggi di programmazione un po’ datati come Visual Basic, composti spesso da enormi blocchi di testo monoliti, intricati e difficili da analizzare.
In questi casi, un’intelligenza artificiale, prendendo una delle più famose, ChatGPT, si rivela essere un compagno estremamente utile, specialmente se il codice dev’essere migrato verso un ambiente completamente diverso.

Un interessante caso di studio da analizzare, riguarda proprio la conversione di un software scritto in VB6 in LabVIEW. Qui emerge un’importante distinzione: mentre le AI possono essere di valido aiuto nella comprensione di codice di testo, il loro utilizzo per comporre correttamente dei VI (Virtual Instruments) in LabVIEW si rivela spesso inaffidabile, a causa di informazioni spesso errate, o su blocchi inesistenti.

Contesto Operativo

La migrazione di per sé non rappresenta un’impresa insormontabile, ma la fase di analisi del codice costituisce una parte estremamente prolissa del progetto. Affrontare questa fase in modo esaustivo all’interno di un singolo articolo sarebbe troppo dispersivo.

Un esempio pratico può aiutare a chiarire.

Considerando una variabile denominata lUWSampleVar, dichiarata nel codice come Long, il prefisso lUW indica che si tratta di un Long Unsigned Word con un peso di 16 byte. Tuttavia, questa variabile viene collocata in uno slot di tipo Long standard, che secondo la documentazione di VB6 ha un peso di 32 byte.

La situazione si complica ulteriormente quando il codice contiene diversi prefissi, ciascuno con una dimensione specifica. Alcuni, come dUDW (Double Unsigned Double Word, 64 byte), rappresentano variabili più grandi, mentre altri, come bUB (Byte Unsigned Byte, 1 byte), risultano decisamente più piccoli.

L’unico riferimento utile era costituito da una mappatura delle variabili, che associava i prefissi al peso corrispondente. Tuttavia, in alcuni casi, questa mappatura poteva risultare ambigua: ad esempio, il prefisso lDW (Long Double Word), che indicava un dato da 4 byte, poteva essere confuso con la sua versione da 8 byte, generando ulteriori complicazioni.

A rendere l’analisi ancora più complessa era l’utilizzo di Visual Studio, che per VB6 non applicava alcuna colorazione al codice per distinguere i diversi tipi di testo. Questo comportava la visualizzazione di un enorme muro di testo monocromatico, rendendo il processo particolarmente laborioso.

Per comprendere l’utilità di questa analisi, è necessario spostare l’attenzione su LabVIEW e approfondire il processo di estrazione dei dati da un file, nel caso osservato, un file binario.

Lettura di dati binari in LabVIEW

Apertura del File

Il primo passo consiste nell’apertura del file binario. Per farlo, è necessario creare un nuovo Virtual Instrument (VI) e accedere alla palette di gestione dei file, selezionando l’opzione Open/Replace/Create File.

Vista della palette generica delle funzioni di LabVIEW, con evidenziata quella di FILE IO

Questa funzione permette di aprire un file in modalità lettura o scrittura. In questo caso, abbiamo bisogno solo della modalità lettura, specificando un percorso assoluto o relativo per il file da aprire.

Diverso utilizzo della open, sopra con percorso relativo al file, sotto con percorso assoluto al file.

Funzioni di lettura

Una volta aperto il file, si passa alla lettura dei dati; LabVIEW offre due modalità principali per questo scopo: Read from Binary File e Preallocated Read from Binary File.

Vista delle due funzioni di lettura presenti su labview, a sinistra la Read From Binary File, a destra la Preallocated Read from Binary File

La principale differenza tra queste due modalità risiede nella gestione della memoria: la prima modalità alloca dinamicamente memoria e copia i dati in un nuovo array, mentre la seconda evita tale copia, leggendo direttamente in un array pre-allocato. La scelta tra le due dipende principalmente dalle dimensioni del file da leggere. A questo punto, configurando correttamente le variabili numeriche, è possibile determinare il numero di byte da estrarre dal file.

Inoltre, il terminale di ingresso varia tra le due funzioni: nella prima modalità, è possibile collegare sia un percorso di file, ignorando l’operazione di apertura del file di cui si parlava in precedenza, sia un riferimento al file stesso; nella seconda, invece, è possibile collegare solo il riferimento al file.

Una volta concatenati i blocchi di apertura e lettura, i dati estratti possono essere impiegati nei processi successivi del sistema, consentendo una gestione accurata e precisa delle variabili ottenute dal file binario.

Estrazione dei dati

L’immagine seguente è fornita a scopo illustrativo per mostrare come la funzione si comporta se si collegano terminali con dati differenti in ingresso. È importante notare che l’accesso parallelo concorrente al file, tramite la stessa reference, potrebbe generare errori di lettura. Pertanto, si raccomanda di eseguire una lettura sequenziale dei dati, come mostrato.

Estrazione in sequenza dei dati su labview per dimostrazione di utilizzo di controlli numerici di tipologia diversa (I32,U8,Single,FixedPoint,Stringa)

Al terminale di ingresso del tipo di dato (Data In) è possibile inserire variabili numeriche di dimensioni diverse, consentendo di estrarre un numero variabile di byte dal file binario. Il terminale di uscita, denominato Data Out, restituirà valori dello stesso tipo del dato in ingresso, assicurando coerenza tra input e output durante il processo di lettura.

Una volta configurati in sequenza i blocchi per l’apertura e la lettura del file, è possibile leggere i valori estratti e utilizzarli nei passaggi successivi del processo. È importante sottolineare che la lettura del file avviene in modo sequenziale; pertanto, il cavo che trasmette il riferimento al file deve essere collegato da un blocco di lettura all’altro. Il parallelismo mostrato nell’immagine precedente è puramente dimostrativo e serve a illustrare graficamente la coerenza nel tipo di dato selezionato tra ingresso e uscita.

Una scelta accurata del tipo di dato è fondamentale per garantire un’adeguata estrazione dal file. Poiché la lettura avviene in modo sequenziale, il peso in byte di un dato estratto in un punto iniziale influenzerà tutte le letture successive, con il rischio di causare un effetto a catena. Questo potrebbe generare letture errate e restituire valori non corretti per tutti i dati estratti successivamente, compromettendo l’intero processo.

Estrazione in sequenza dei dati su labview per dimostrazione di utilizzo di controlli numerici di peso diverso

Analisi del VB6 tramite IA

Le problematiche del codice.

Comprendere come è stata affrontata questa migrazione aiuta a coglierne la complessità e le soluzioni adottate per superare le difficoltà. L’incarico era quello di estrarre e mappare oltre 400 variabili da un blocco di dati binari di 6 Kb. Ogni variabile doveva essere trattata seguendo una mappatura dettagliata fornita in anticipo.

Uno dei problemi principali era legato alla natura del codice originale, scritto in VB6; senza disporre della suite proprietaria per la compilazione, non era possibile mandare in Run il codice, per osservare i valori dei dati estratti in tempo reale.

L’eseguibile esistente mostrava solo una piccola parte delle variabili tramite l’interfaccia, rendendo impossibile il confronto diretto tra i valori estratti in LabVIEW e quelli gestiti dal codice originale.

L’utilizzo di ChatGPT

A questo punto, l’utilizzo di ChatGPT, che si è rivelato essenziale per affrontare le difficoltà incontrate durante il processo; tramiti specifici comandi si è stati in grado di trasformare l’intelligenza artificiale in un assistente capace non solo di monitorare l’avanzamento del lavoro, ma anche di semplificare la gestione della complessa mappatura delle variabili.

Man mano che venivano analizzate le righe di codice VB, ChatGPT, che riceveva come input la sequenza delle variabili estratte, memorizzava i dati, li organizzava in modo coerente e li associava ai corrispondenti pesi in byte, che venivano calcolati in base ai tipi di dato presenti nella mappatura originale.

Questo approccio, che eliminava la necessità di effettuare continuamente conversioni manuali dalla notazione dei tipi di dato al calcolo dei pesi, consentiva di ottenere una lista già pronta, ordinata e facilmente utilizzabile per l’implementazione nel VI di LabVIEW, evitando così errori ripetuti e accelerando notevolmente il processo.

La versione 4o di ChatGPT, grazie alla capacità di memoria intrachat, ha permesso di lavorare in modo più fluido: si potevano fornire dati all’intelligenza artificiale che venivano poi utilizzati nei passaggi successivi. Questo ha facilitato l’applicazione di schemi logici semplici su grandi quantità di dati.

Il processo di analisi

Nel concreto, il processo avveniva così: si forniva un blocco di codice VB, ad esempio con 5 variabili….

Un blocco di codice VB6 contenente 5 variabili con prefisso diverso, precedute dalla funzione Get e dal riferimento in memoria del file

…venivano controllati i tipi di dato associati alle variabili…

Un blocco di codice in Visual Basic che mostra la dichiarazione di variabili. Le variabili sono LUBSample1 come Long, dUDWSample2 come Double, IUWSample3 come Long, bUBMaxSample come Byte e bUBMinSample come Byte, corrispondenti ai tipi e alle dimensioni descritti nell'immagine precedente.

…e, tramite specifici prompt, ChatGPT teneva traccia del progresso, aggiornando in tempo reale una lista con il peso totale dei dati estratti.

Una lista di variabili e dei loro tipi in italiano, che descrive l'uso della memoria in byte. Viene indicato che la variabile IUBSample1 è di tipo IUB e occupa 4 byte, dUDWSample2 è di tipo dUDW e occupa 8 byte, IUWSample3 è di tipo IUW e occupa 4 byte, bUBMinSample e bUBMaxSample sono di tipo bUB e occupano 1 byte ciascuna. L'uso complessivo della memoria è di 18 byte.

Una volta verificata la correttezza delle informazioni, queste venivano riportate nel VI di LabVIEW, utilizzando il meccanismo di estrazione Preallocated Read from Binary File illustrato precedentemente.

Estrazione dei dati di diverse dimensioni da file binario, i blocchi di read sono posizionati sequenzialmente all'interno di una struttura che eseguire la compattazione e la ricompattazione di un cluster di dati.

Anche se in rare occasioni era necessario correggere ChatGPT, l’approccio ha notevolmente velocizzato il lavoro.

L’interazione continua con l’IA ha permesso di superare i limiti del metodo trial and error, portando a una migrazione rapida ed efficiente.

Il risultato finale? Un processo complesso che, grazie alla collaborazione con ChatGPT, è stato reso più fluido, riducendo sensibilmente i tempi e gli sforzi necessari.

Ora puoi approfondire questo argomento con uno dei nostri corsi HandsON.

Protocolli Industriali con LabVIEW

Scoprire i protocolli industriali, come integrarli in labview. In questo corso impararerai a implementare toolkit e librerie, per utilizzare protocolli come ModBus e OPC-UA
Intermedio

Liv. Intermedio

OnLine; Con Istrutttore

3 gg

LabVIEW UI/UX

Lo sviluppo di applicativi per Testing e Misure vede sempre più una necessità di integrare interfacce curate soprattutto in prospettiva dell'utilizzo da utenti meno esperti e nel considerare di ridurre errri e incertezze dovute spesso ad un interfaccia poco chiara e intuitva.
Intermedio

Liv. Intermedio

OnLine; Con Istrutttore

3 gg

Corso LabVIEW StateMachine Pro

Il paradigma di programmazione convenzionale è il data flow. Siamo abituati ad usare il cluster di errore per gestire la sequenza di esecuzione dei nodi in labview. La macchina a Stati, permette di gestire l'ordine di esecuzione condizionato all'uscita dello stato in esecuzione. L'implementazione di questo pattern permette quindi l'integrazione del diagramma di stato e una razionalizzazione dell'applicazione, diventando più flessibile, leggibile e manutenibile.
INTERMEDIO

Liv. INTERMEDIO

In Presenza

1 gg

Scopri i nostri servizi e Prodotti, Contattaci ora!

Altri articoli dal nostro Blog

Bonfiglioli ha rinnovato il laboratorio prove con un sistema basato su CompactRIO, riducendo i tempi di acquisizione a 5 ms e integrando gestione cloud e allarmi real-time, migliorando efficienza e standardizzazione dei test.