Direttive del preprocessore
Direttive del preprocessore
Tramite le direttive del preprocessore è possibile influenzare le funzioni del compilatore del modulo Math, l'elaborazione delle variabili e l'esecuzione del codice. Le direttive del preprocessore devono trovarsi all'inizio di una riga nel testo delle formule e terminano con la prima fine riga non nascosta all'interno di un livello di parentesi. I commenti possono essere inseriti secondo le regole note.
Le direttive sono contrassegnate da un carattere # seguito da un identificatore. I parametri che seguono la direttiva e il loro formato dipendono dalla funzione. Formati possibili sono ad esempio:
#directiveA <parameter>
#directiveB <name>[<parameter>](<parameter>){<code>}
#directiveC <key>, <key>=<value>, …
Inserire testo di formule "#include"
Con questa direttiva è possibile inserire testo di formule da una risorsa o da un file esterno. La sintassi utilizzata determina quale sorgente viene indirizzata.
#include "aRessource"
#include 'aRessource'
#include <aFile>
La risorsa indicata come stringa viene acquisita nel codice sorgente tenendo conto dei decoder ivi specificati oppure come testo.
Il file indicato in <…> viene acquisito nel codice sorgente. Sono ammessi percorsi assoluti e relativi, dove i percorsi relativi vengono cercati a partire da directory definite in modo fisso (percorsi di ricerca).
Gli elementi in %...% vengono sostituiti dal valore corrispondente della variabile d'ambiente.
Percorsi di ricerca in WINDOWS:
-
%USERPROFILE%/mm_lib/ -
%LOCALAPPDATA%/optimeas.osg.com/mm_lib/ -
%APPDATA%/optimeas.osg.com/mm_lib/
Percorsi di ricerca in LINUX/YOCTO:
-
/sdi/config/mm_lib/ -
/sdi/apps/smartcore/mm_lib/ -
/var/lib/mm_lib/ -
/usr/local/lib/mm_lib/ -
/usr/lib/mm_lib/
Rimuovere il riferimento temporale "#timeless"
Per eliminare il riferimento temporale di determinati canali di ingresso per il modulo Math è possibile utilizzare la direttiva #timeless. I nomi dei canali possono essere passati alla direttiva in un elenco con la virgola come separatore. Se i nomi contengono caratteri diversi da quelli ammessi per un identificatore, devono essere racchiusi tra '...' o "...". L'uso della sintassi $'...' non è ammesso, poiché qui viene impostato solo un attributo del canale.
#timeless <varName>, <varName2>, ...
La stessa funzione viene attivata o disattivata tramite la macro #property con la proprietà timeout=<bool>.
Una funzionalità analoga è messa a disposizione dalla funzione value() per un utilizzo mirato e locale nel testo delle formule.
Fondamenti: elaborazione dei dati corretta nel tempo e timeout
Come descritto nell'introduzione, il modulo Math elabora i dati provenienti dalle diverse sorgenti dello smartCORE sempre in modo corretto nel tempo. In questo modo si garantisce che, ad es., un segnale di corrente e uno di tensione vengano correlati in modo coerente tra loro per il calcolo di una potenza.
Esistono tuttavia anche sorgenti di dati che forniscono nuovi valori solo molto raramente. Può trattarsi ad es. di dati di misura di una stazione meteorologica, interrogata magari solo ogni 10 minuti e scritta nei canali smartCORE, oppure di dati di un orario che viene interrogato e aggiornato da un server una sola volta al giorno.
I dati che vengono passati dallo smartCORE al modulo Math, dopo un intervallo di tempo impostabile vanno in timeout e vengono poi utilizzati ulteriormente con questo stesso scostamento temporale e con l'ultimo valore disponibile, sebbene la validità non sia confermata da misure o interrogazioni più recenti. Ne consegue che tutti i calcoli che ne dipendono vengono sì eseguiti sempre in modo corretto nel tempo, ma con un ritardo pari a questo intervallo.
L'intervallo di timeout è definito dal parametro globale inputTimeoutS e può essere sovrascritto individualmente per un canale con la macro #property e la proprietà timeout.
Questo ritardo può avere effetti sfavorevoli nella rappresentazione dei dati MQTT nel cloud o anche per compiti di controllo.
Con le funzioni
è possibile interrogare i diversi stati di una variabile di ingresso. Nel caso in cui non sia stato possibile collegare alcun canale smartCORE o questo canale non fornisca ancora dati, viene assegnato un valore default, impostabile tramite la macro #property <channel>, default=<var>.
Qual è l'effetto dell'attributo timeless?
I canali di ingresso contrassegnati come timeless sono sempre validi dall'inizio alla fine del rispettivo intervallo di calcolo evaluationTimeMs, riferito al rispettivo tempo di sistema.
Nell'esempio mostrato il calcolo del set di formule viene eseguito agli istanti e . Fino all'istante