Espressioni

L'unico linguaggio di espressione dietro variabili e condizioni di allarme, che cosa può referenziare, la superficie di lettura di ogni tipo di punto, le regole che il valutatore impone, i messaggi che dà la convalida, e come funzionano l'editor di script e il suo selettore Sfoglia….

Visualizza come Markdown

Un solo linguaggio di espressione serve due posti nella pagina Logic: quello che una variabile di espressione calcola e la condizione che un allarme sorveglia. Entrambi sono una sola espressione JavaScript valutata in modalità strict dentro un ambiente isolato senza accesso alla macchina, ed entrambi si modificano nello stesso editor di script. Gli script delle azioni usano lo stesso vocabolario ma sono blocchi di istruzioni; le differenze sono su Azioni.

Che cos'è un'espressione

Un'espressione è esattamente una espressione JavaScript: valori letterali, aritmetica, confronti, operatori logici, il condizionale a ? b : c, operazioni su stringhe, stringhe template e chiamate agli oggetti predefiniti di JavaScript Math, Date e JSON. Le istruzioni (let, if, i cicli) appartengono alle azioni: una seconda istruzione viene rifiutata con « Una variabile contiene una sola espressione. Le istruzioni appartengono alle Azioni. » Le assegnazioni e ++/-- in qualunque punto di un'espressione vengono rifiutate con « Le espressioni sono di sola lettura. Le scritture appartengono alle Azioni. »

L'espressione referenzia i punti con il loro indirizzo radicato. Che cosa consegna ogni radice all'espressione:

Radice Che cosa entra nell'espressione
I tag di Connector, Variables, Alarms, i Channels di un'unità di Process Un oggetto vivo con la superficie di lettura tipizzata qui sotto. Un riferimento nudo (Connector.Simulated.Pump.Flow da solo) vale il valore del punto; un allarme nudo vale il suo IsActive.
System, Server, Assets, e lo stato della prova, la produttività, i comandi e la preparazione di un'unità di Process Il valore attuale in sé: un numero, un testo, un booleano o un istante. Si usa direttamente; non c'è alcun membro da aggiungere.

System.Now è l'istante della valutazione: ogni riferimento a esso dentro una valutazione legge la stessa ora. Entra come Date di JavaScript, come ogni marca temporale, quindi gli istanti si confrontano e si sottraggono in modo naturale: (System.Now - Connector.Simulated.Pump.Run.SourceTimeStamp()) / 1000 sono secondi.

Una variabile di espressione può referenziare tag, variabili di memoria, allarmi, punti di Process, punti di Assets e le diagnostiche di System e Server, ma mai un'altra variabile di espressione: l'editor la rifiuta (« 'Variables.X' è una variabile di espressione. Le espressioni non possono referenziare altre variabili di espressione; referenziare invece variabili di memoria o i punti sottostanti. ») così i risultati non dipendono mai dall'ordine di valutazione. Una condizione di allarme può referenziare tutto tranne Alarms.* (« Le condizioni di allarme non possono referenziare altri allarmi. ») e deve produrre un booleano.

La superficie di lettura di un punto

Un tag vivo offre:

Membro Restituisce Significato
.Value valore tipizzato Il valore ingegneristico, dopo tutta la catena di conversione del tag
.ValueRaw valore tipizzato Il valore grezzo normalizzato al tipo dichiarato del tag, prima della scalatura
.ValueObject qualunque cosa Il valore esattamente come lo ha prodotto il driver
.ValueScaled, .ValueCalibrated, .ValueLimited, .ValueRounded numero Il valore dopo le fasi Scalatura, Taratura, Limiti e Decimali
.ValueToBool(), .ValueToInteger(), .ValueToReal(), .ValueToString(), .ValueToDateTime() valore convertito Il valore ingegneristico convertito a quella categoria; nessun valore resta nessun valore
.State() booleano Qualità: vero finché la lettura è buona
.SourceTimeStamp() Date Quando il dispositivo ha prodotto la lettura
.ApplicationTimeStamp() Date Quando il server integrato l'ha ricevuta
.Name, .EngineeringUnit testo Il nome e l'unità del tag

Una variabile offre .Value, le cinque conversioni .ValueTo*(), .State(), .ApplicationTimeStamp(), .Name e .EngineeringUnit. Un allarme offre .IsActive, .IsAcked, .CurrentState, .State() (se la sua condizione si è potuta valutare nell'ultimo ciclo), .ActiveSince(), .LastTransitionAt() e .Name. Un canale di Process offre la superficie del tag quando è collegato a un tag e quella della variabile quando è collegato a una variabile; un canale senza collegamento non offre nulla. Nient'altro di un oggetto vivo è raggiungibile: un membro fuori da questa superficie si legge come indefinito, e chiamarne uno fallisce alla convalida. Il selettore Sfoglia… elenca sotto ogni punto proprio questi membri, così nessuno va scritto a memoria.

Le regole che il valutatore impone

Sia nell'editor mentre scrivi sia di nuovo a ogni ciclo di 100 ms:

  • Il controllo di qualità. Prima di valutare, ogni punto referenziato viene risolto e aggiornato. Un punto che manca, che è di cattiva qualità o che non ha valore rende il risultato un vuoto di cattiva qualità senza eseguire l'espressione, così un tag fuori linea non può mai fabbricare un campione e null non arriva mai al motore per diventare 0.
  • I risultati non finiti sono vuoti. NaN o infinito (divisione per zero, aritmetica indefinita) non diventano mai un campione.
  • Protezione contro le esecuzioni fuori controllo. Una valutazione viene interrotta oltre 250 ms, 5.000 istruzioni o 4 MB di memoria di script, e conta come vuoto di cattiva qualità. Si tiene un motore per ogni testo di espressione, così nulla trapela da un'altra espressione.
  • Conversione. Un risultato riuscito viene convertito al tipo di uscita della variabile; una condizione di allarme viene convertita a booleano, e un risultato che non si converte lascia l'allarme nel suo stato.
  • Gli errori sono vuoti, non eccezioni. Un errore di esecuzione durante il ciclo dà un vuoto e una voce nel diario (il primo fallimento, riepiloghi mentre si ripete, una riga quando rientra); il ciclo prosegue con la variabile successiva.

Che cosa rifiuta la convalida

L'editor convalida la bozza ogni mezzo secondo e mostra il primo problema sotto il valore o sotto la condizione:

Messaggio Causa
Serve un'espressione. / Serve una condizione. L'editor è vuoto.
Errore di espressione: … Il testo non si analizza.
Una variabile contiene una sola espressione. Le istruzioni appartengono alle Azioni. Più di un'istruzione, o un'istruzione che non è un'espressione.
Le espressioni sono di sola lettura. Le scritture appartengono alle Azioni. Un'assegnazione oppure ++/--.
Gli indirizzi devono essere statici: a 'Root' si accede con un segmento calcolato. Variables[name] o qualunque segmento non letterale.
Indirizzo incompleto 'Connector.Simulated'. Una catena troppo corta per nominare un punto sotto la sua radice.
'X' non è stato trovato. L'indirizzo non si risolve in nulla.
'X' è una variabile di espressione. … Un riferimento a un'altra variabile di espressione.
Le condizioni di allarme non possono referenziare altri allarmi. Un riferimento Alarms.* in una condizione.
La condizione deve valutare a un Bool, ma ha prodotto 'x'. La valutazione di prova di una condizione ha prodotto un valore presente che non si converte a booleano.
Errore di espressione: un punto vivo non si può usare direttamente qui. Leggerlo attraverso il suo membro .Value (per esempio Connector.Driver.Device.Tag.Value). Un oggetto vivo usato dove serve un valore primitivo (Tag + 1).
Errore di espressione: <messaggio del motore> La valutazione di prova ha sollevato un errore: un identificatore sconosciuto, un membro bloccato chiamato come funzione.

La valutazione di prova gira con i valori attuali senza riguardo alla qualità, così un messaggio riflette l'espressione, non un ingresso di cattiva qualità; un ingresso di cattiva qualità si vede invece nella scheda PUNTI REFERENZIATI.

L'editor di script

Ogni espressione, condizione e script della pagina si modifica nella stessa scheda: un sopratitolo (ESPRESSIONE, CONDIZIONE o SCRIPT), un pulsante Sfoglia…, l'editor, un suggerimento e il messaggio di convalida. L'editor è CodeMirror con evidenziazione JavaScript, una cronologia di annullamento e il completamento automatico dei simboli di indirizzo: i nomi delle radici per un simbolo nudo, poi i figli del percorso scritto fino a quel punto, membri compresi appena il simbolo nomina un punto (immettere un indirizzo). Il testo passa alla bozza con un ritardo e si salva da solo. Le caselle di espressione e di condizione sono alte almeno 56 px, quella dello script di azione 160 px. Quando il motore dell'editor non riesce a partire, la casella degrada a una semplice area di testo che continua a leggere e scrivere, senza evidenziazione, completamento o cronologia; Sfoglia… allora aggiunge l'indirizzo scelto alla fine invece che al punto di inserimento.

Sfoglia… apre una finestra di dialogo (« Sfoglia: inserisci in ESPRESSIONE ») con l'albero dell'intero spazio degli indirizzi fino al livello dei membri; seleziona una riga e premi Inserisci, oppure fai doppio clic su di essa, per mettere il suo indirizzo al punto di inserimento. Ogni editor possiede la propria finestra di dialogo, quindi due editor sulla stessa pagina non condividono mai una selezione.

Che cosa non fanno le espressioni

Non scrivono nulla, non chiamano i comandi di prova di Process, non conservano stato tra una valutazione e l'altra, non possono definire funzioni condivise tra espressioni, e non vengono valutate su richiesta: il ciclo le pubblica ogni 100 ms e l'editor anticipa la bozza due volte al secondo.