# Convalida

> La pagina dello stato di salute della configurazione: che cosa la stazione esamina in procedure, logica, dashboard e negli elenchi dei suoi server e broker, ogni rilievo che sa segnalare e come è formulato, che cosa apre una riga, il distintivo della barra e perché qui non si ripara nulla.

La pagina Convalida elenca ciò su cui la stazione non può reggersi: un collegamento di canale, un interblocco, un campo di automazione, un'espressione, uno script o una condizione di Logic, oppure un componente di dashboard che punta a un tag, a una variabile, a una procedura o a un indirizzo che la stazione non ha più, un'espressione, uno script o una condizione di Logic scritti in un modo che il loro editor rifiuta, un'azione di Process la cui documentazione una prova non potrebbe emettere come configurata, e una procedura che l'avvio di una prova rifiuterebbe. È la voce **Convalida** in fondo alla barra di navigazione, si apre per un'identità che possiede il permesso **Visualizzare Convalida** e risponde a `/validation`. È una pagina a scorrimento, disegnata a tutta larghezza perché ogni rilievo è una frase. È la sorella dello stato di salute del runtime nella barra di stato: quello dice se la stazione sta leggendo, questa dice se la configurazione si risolve ancora.

Elenca anche una riga di un elenco con cui la stazione consegna i suoi dati (l'elenco del server OPC UA, la mappa dei registri del server Modbus o l'elenco di pubblicazione di un broker MQTT) la cui sorgente è stata eliminata: una riga così resta nel suo elenco e non serve né pubblica nulla.

La pagina segnala; non ripara mai. Una riga apre l'editor che possiede il difetto, sull'entità che lo contiene, e la riparazione è una modifica fatta lì.

## Il riquadro di stato {#the-status-card}

Il riquadro in cima è l'intera risposta della pagina sulla configurazione, e l'unico posto in cui una stazione pulita viene annunciata:

| Stato | Punto | Titolo | Dettaglio |
|---|---|---|---|
| Pulita | Verde | Niente da correggere | Ogni riferimento nelle procedure, nella logica, nelle dashboard e in ciò che la stazione serve e pubblica si risolve, ogni procedura partirebbe, e ogni azione ha quello che le serve per uscire. |
| Rilievi | Ambra | *N* elementi da correggere ("1 elemento" per uno solo) | Qui non si corregge nulla. Una riga apre l'editor a cui appartiene il difetto, sull'entità che lo contiene. |

Il riquadro porta l'unico comando della pagina, **Ricontrolla** (suggerimento: "Controlla di nuovo adesso tutta la configurazione. L'elenco si aggiorna anche da solo ogni volta che qualcosa cambia."). È in grigio mentre un esame è in corso. Poiché un esame che trova la stessa cosa lascia l'elenco esattamente com'era, l'esito è riportato nel registro delle azioni della barra di stato: "Controllo completato: niente da correggere.", "Controllo completato: *N* da correggere.", oppure "Controllo non riuscito: *motivo*".

Raramente serve Riesamina. Il validatore è sempre acceso, sulla stazione, e riesamina da sé 750 millisecondi dopo una raffica di modifiche su una qualsiasi delle superfici che legge: dispositivi, linee e tag di Connector; modelli di Process; le risorse; variabili, azioni e allarmi di Logic; le dashboard; i modelli di etichetta; i layout dei rapporti. La pagina e il distintivo della barra seguono il risultato. Un esame che Connector attraversa mentre sta spostando dispositivi dentro o fuori (un aggiornamento di driver, un dispositivo in aggiunta) è ripreso una volta che Connector si è assestato, così un riferimento non viene mai chiamato rotto solo perché il suo dispositivo è in volo.

Legge anche i tre elenchi con cui la stazione consegna i suoi dati: una riga aggiunta, modificata o eliminata sul server OPC UA, sul server Modbus o sulla scheda Pubblicare di un broker fa riesaminare allo stesso modo, e così l'eliminazione del tag, della variabile, dell'allarme o del comando che una riga nomina.

## I gruppi {#the-groups}

I rilievi sono raggruppati per la superficie che li possiede, in un ordine fisso. Un gruppo che non contiene nulla non viene disegnato, così una stazione con un solo difetto di dashboard mostra un solo gruppo.

| Gruppo | Generi di rilievo | La riga sotto il titolo |
|---|---|---|
| Process | Collegamenti (collegamenti di canale, interblocchi, automazione), procedure e occorrenze che armano, e documentazione delle azioni | *N elementi.* Collegamenti di canale, interblocchi e automazioni di unità che nominano un tag, una variabile o una procedura che la stazione non ha più, procedure che un avvio rifiuterebbe, e azioni i cui documenti una prova non potrebbe produrre così come sono configurate. |
| Logic | Variabili a espressione, azioni, allarmi | *N elementi.* Espressioni, script di azione e condizioni di allarme che leggono un indirizzo che non si risolve più, o scritti in un modo che il loro editor rifiuta. |
| Dashboard | Componenti | *N elementi.* Componenti le cui proprietà puntano a un indirizzo che non si risolve più. Vengono disegnati, ma non leggono nulla. |
| Connector | Righe dell'elenco del server OPC UA, della mappa dei registri del server Modbus e degli elenchi di pubblicazione dei broker MQTT | *N elementi.* Righe dell'elenco del server OPC UA, della mappa dei registri del server Modbus e degli elenchi di pubblicazione dei broker MQTT la cui sorgente è stata eliminata. Restano nel loro elenco, ma non servono né pubblicano nulla. |

## Una riga {#a-row}

Ogni riga è un rilievo, e dice di che cosa parla senza aprire nulla:

- Un glifo per il genere: un'unità per un collegamento di Process, un segno di stampa per la documentazione di un'azione, il segno della composizione scritta per una procedura, una bandiera per un'occorrenza, i segni di variabile, azione e allarme dell'albero di Logic, il segno di dashboard per un componente.
- Il **nome** dell'entità, poi il suo **tipo** quando il tipo dice qualcosa che il nome non dice (un componente che l'integratore non ha mai nominato ripiega sul proprio genere, e la riga non dice "Indicatore analogico Indicatore analogico"), poi "in *posizione*" dove ce n'è una.
- Il rilievo: per un campo che nomina un bersaglio, "*Campo* punta a `riferimento`, che non esiste più." con il riferimento scritto a spaziatura fissa; per un campo che il runtime non può usare, "*Campo*: *che cosa non va*."
- Una freccia a destra: la riga apre qualcosa. Il suggerimento della riga e il suo nome accessibile sono la frase intera più il punto in cui il clic atterra ("Apri l'unità in Process.", "Apri l'azione in Process.", "Apri la procedura in Process.", "Apri l'occorrenza in Process.", "Apri il componente nell'editor.", "Apri la variabile in Logic.", "Apri l'azione in Logic.", "Apri l'allarme in Logic.").
- Per una riga di un elenco di un server, il glifo è il segno che l'albero del Connector disegna per ciò che contiene l'elenco (il server OPC UA, il server Modbus, il broker MQTT), e il clic atterra dove finisce il suggerimento ("Apri la riga nel server OPC UA.", "Apri la riga nel server Modbus.", "Apri la riga nella pagina del broker MQTT.").

## Ogni rilievo che l'esame sa produrre {#every-finding-the-scan-can-produce}

Le formulazioni qui sotto sono quelle proprie della pagina. Un collegamento di canale memorizza la chiave della sua sorgente, quindi la sua riga nomina la chiave che non si risolve più; un interblocco, una sorgente di automazione e un ritorno memorizzano un'identità che l'operatore non legge mai, quindi le loro righe dicono che il tag o la variabile è stato rimosso invece di stamparla.

### Process: collegamenti di canale {#process-channel-bindings}

Tipo "Collegamento di canale"; nome: il nome del canale (oppure "(canale rimosso)"); posizione: "*Modello* · *Unità*". Apre la schermata Canali del modello sull'unità.

| Campo | Formulazione |
|---|---|
| Tag | punta alla chiave di tag memorizzata, che non esiste più |
| Variabile | punta alla chiave di variabile memorizzata, che non esiste più |

### Process: interblocchi {#process-interlocks}

Tipo "Interblocco"; nome: il nome dell'unità; posizione: "*Modello* · *Unità*". Un'unità è giudicata su ciò che osserva davvero: la propria sorgente, oppure il valore predefinito del modello quando segue il modello. Apre la schermata Automazione del modello sull'unità.

| Campo | Formulazione |
|---|---|
| Sorgente | segue il modello, il cui valore predefinito non indica alcuna sorgente booleana. |
| Sorgente | non è configurata alcuna sorgente booleana. |
| Sorgente | sono selezionati sia un tag sia una variabile. |
| Tag | il tag a cui era impostato è stato rimosso. |
| Tag | un tag DateTime non è convertibile in booleano. (anche i tag Guid e ByteString) |
| Variabile | la variabile a cui era impostato è stata rimossa. |
| Variabile | una variabile di tipo data e ora non è convertibile in booleano. (anche immagine, icona e colore) |

I primi tre sono segnalati soltanto mentre l'interblocco di fermo del modello è abilitato.

### Process: automazione {#process-automation}

Tipo "Automazione"; nome: il nome dell'unità; posizione: "*Modello* · *Unità*". È giudicata soltanto un'automazione **abilitata**: una spenta non comanda nulla e si ritira dall'elenco. Apre la schermata Automazione del modello sull'unità.

| Campo | Formulazione |
|---|---|
| Comandi | non è configurata alcuna sorgente di avvio. |
| Procedura | la procedura fissa non è disponibile. (selezione fissa) |
| Selettore | un rilievo di sorgente (più sotto), per una sorgente intera |
| Codice del selettore *n* | seleziona una procedura che è stata rimossa. |
| Sorgente del comando *Avvia*, Sorgente del comando *Arresta* e così via, una per sorgente di comando | un rilievo di sorgente, per una sorgente booleana |
| Metadati | una corrispondenza riempie una procedura o un campo che è stato rimosso. |
| Metadato "*campo*" | un rilievo di sorgente (numerico per un campo numerico; booleano, intero, reale, testo o data per gli altri), oppure: questo campo non supporta la generazione automatica. |
| Ritorno “Pronta”, Ritorno “Attiva”, Ritorno “Codice selezionato”, Ritorno “Risultato del comando” | il tag che scrive è stato rimosso. / il tag che scrive non è scrivibile. / richiede un tag booleano. (Pronta, Attiva) / richiede un tag intero. (Codice selezionato, Risultato del comando) |

Un rilievo di sorgente è uno fra: "non è configurata alcuna sorgente.", "sono selezionati sia un tag sia una variabile.", "il tag che legge è stato rimosso.", "il tag che legge non è leggibile." (il tag è disabilitato o di sola scrittura), "un tag *tipo* non è compatibile qui.", "la variabile che legge è stata rimossa.", "una variabile di tipo *tipo* non è compatibile qui.". La compatibilità segue il ruolo del campo: una sorgente booleana ha bisogno di un tag o di una variabile booleana; una sorgente intera di un tipo intero; una sorgente numerica di un tipo intero o reale; una sorgente di metadati di un qualsiasi tipo booleano, intero, reale, testo o data.

### Process: procedure {#process-procedures}

Tipo "Procedura"; nome: il nome della procedura; posizione: il nome del modello. Il giudizio passa dalla stessa porta da cui passa l'avvio di una prova, quindi una procedura che questo elenco dichiara eseguibile è una procedura che il banco accetta. Apre la pagina propria della procedura.

| Campo | Formulazione |
|---|---|
| Composizione | Una valutazione giudica sulle righe registrate. Questa procedura ne porta una, ma non ha alcun datalog. |
| Composizione | L'occorrenza '*nome*' sorveglia i campioni registrati. Questa procedura la arma, ma non ha alcun datalog. |
| Composizione | Non c'è nulla da eseguire: questa procedura non fa riferimento né a un datalog né a una ricetta. |
| Composizione | Il modo immediato richiede una ricetta immediata (o nessuna). Un profilo temporale non ha un singolo istante. |
| Composizione | Il modo controllato richiede una ricetta immediata (o nessuna). I setpoint si applicano all'avvio, lo stato sicuro all'arresto. |
| Composizione | Il modo temporale richiede una durata. Impostarne una. |
| Composizione | Il modo temporale richiede una ricetta temporale (o nessuna). Un insieme immediato non ha una linea del tempo. |
| Composizione | Il profilo della ricetta (*N* ms) è più lungo della finestra temporale (*M* ms). |
| Composizione | L'occorrenza '*nome*' sorveglia 'Channels.*canale*', che il datalog di questa procedura non registra. |
| Composizione | Un rifiuto su quello che una prova conclusa porta alla produzione, oppure su un valore di ricetta che non raggiunge il canale a cui è rivolto, nelle parole dell'editor che ne è proprietario. |

### Process: occorrenze {#process-occurrences}

Tipo "Occorrenza"; nome: il nome dell'occorrenza; posizione: il nome del modello. Viene letta solo un'occorrenza che una procedura arma, e viene letta una volta sola per quante procedure la armino, perché la condizione è una e così la riparazione. Apre la pagina propria dell'occorrenza.

| Campo | Formulazione |
|---|---|
| Condizione | Il rifiuto della condizione stessa, nelle parole dell'editor delle occorrenze: un riferimento di canale che questo modello non ha, una condizione che non si lascia leggere, una che restituisce qualcosa di diverso da un booleano, oppure due canali che finiscono nello stesso nome. Anch'esso è scritto in inglese. |

Una condizione che sta in piedi da sola e che tuttavia non può essere giudicata, perché il datalog della procedura lascia fuori il canale che sorveglia, è un rilievo su quella procedura: il datalog è la scelta della procedura.

### Process: documentazione delle azioni {#process-action-paperwork}

Tipo "Azione"; nome: il nome dell'azione; posizione: il nome del modello. Il giudizio è lo stesso da cui la pagina propria dell'azione ricava il suo avviso "Da rivedere", quindi un'azione dichiarata pronta lì è pronta anche qui. Apre la pagina propria dell'azione.

| Campo | Formulazione |
|---|---|
| Comandi | Aggiungere un comando: questa azione non emette ancora nulla. |
| Comando *n* · Etichetta (Avvio), Comando *n* · Rapporto (Completamento) e così via | Il primo rilievo su quel comando, poi "(altri *k* su questo comando)" quando ce ne sono di più. Un comando con più rilievi resta una sola riparazione, fatta su una sola pagina, quindi è una sola riga. |

I rilievi che un comando può portare, nell'ordine in cui si riparano:

- Selezionare almeno un esito di completamento. (un comando al Completamento senza alcun esito spuntato)
- Scegliere un rapporto. / Il rapporto selezionato non esiste più.
- Scegliere un modello di etichetta. / Il modello è stato azzerato o eliminato; le corrispondenze memorizzate sono conservate. / Il modello globale selezionato non esiste più.
- Il modello selezionato non ha ancora comandi di stampante; scriverli o importarli prima che una prova raggiunga questo comando.
- Non è possibile leggere i segnaposto del modello: *errore*
- `{{marker}}` richiede una sorgente. / `{{marker}}` è associato più di una volta.
- `{{marker}}`: scegliere una sorgente / questa sorgente non è disponibile all'avvio / selezionare un campo del catalogo dei metadati di questo modello / selezionare un criterio da una delle valutazioni di questo modello / impostare un ciclo esplicito, numerato da 0, da 0 a *n* / togliere i decimali da questa sorgente di data e ora / usare il formato predefinito per questa sorgente numerica / i decimali devono essere compresi tra 0 e 9 / togliere la formattazione numerica o di data da questa sorgente di testo
- `{{marker}}` è stato rimosso dal modello attuale; rimuovere la corrispondenza memorizzata.

### Logic {#logic}

Nessuna posizione: i generi di Logic stanno al primo livello. Una riga per indirizzo distinto che non si risolve, con l'indirizzo scritto come lo scrive l'espressione. Sono esaminate soltanto le variabili a espressione; una variabile di memoria non ha alcuna espressione da leggere. Quando ogni indirizzo di un testo si risolve, il testo viene anche giudicato come lo giudica il suo editor, e un testo che l'editor rifiuta è una riga, con la frase dell'editor stesso come formulazione: un allarme salvato come `!Variables.Start` dà « 'Variables.Start' è il punto stesso, non il suo valore: come condizione conta sempre come vero. Leggerne il valore con Variables.Start.ValueToBool(). » Il giudizio lascia fuori la valutazione di prova dell'editor sui valori attuali, quindi una riga non va e viene mai con una lettura, e un testo vuoto non viene elencato: è una definizione non ancora scritta.

| Tipo | Campo | Formulazione |
|---|---|---|
| Variabile di espressione | Espressione | punta a `indirizzo`, che non esiste più |
| Azione | Script | punta a `indirizzo`, che non esiste più |
| Allarme | Condizione | punta a `indirizzo`, che non esiste più |
| Variabile di espressione | Espressione | la frase con cui il suo editor rifiuta il testo ([Che cosa rifiuta la convalida](logic-expressions#what-validation-refuses)) |
| Azione | Script | la frase con cui il suo editor rifiuta il testo ([Che cosa rifiuta la convalida](logic-actions#what-validation-refuses)) |
| Allarme | Condizione | la frase con cui il suo editor rifiuta il testo ([Che cosa rifiuta la convalida](logic-expressions#what-validation-refuses)) |

### Dashboard {#dashboards}

Tipo: il genere del componente come lo nomina l'editor (Indicatore analogico, Grafico a linee, Valore…); nome: il nome digitato per il componente, altrimenti la sua didascalia, altrimenti ciò che l'editor ricava; posizione: il nome della dashboard. Una riga per campo di indirizzo, così un componente il cui valore e il cui colore leggono due punti rimossi vale due riparazioni.

| Campo | Formulazione |
|---|---|
| Indirizzo, Punto di colore, Serie 2 › Indirizzo, e ogni altro campo di indirizzo del genere, ciascuno con l'etichetta che gli dà il pannello delle proprietà dell'editor (un elenco annidato si legge come il suo percorso) | punta a `indirizzo`, che non esiste più |

Sono letti soltanto i campi di indirizzo, e soltanto un valore che si analizza come indirizzo radicato con almeno un segmento: un'etichetta che contiene "Process.Press 1.Temperature" è testo, non un riferimento, e non è mai segnalata. Lo stesso indirizzo nello stesso campo è un solo rilievo. I sinottici definiti su un modello di Process sono saltati: collegano i canali attraverso un segnaposto di unità, e nessun punto risponde a quegli indirizzi finché un'unità non apre il sinottico.

### Connector {#connector}

Una riga dell'elenco del server OPC UA, della mappa dei registri del server Modbus o dell'elenco di pubblicazione di un broker MQTT tiene la sua sorgente (un tag, una variabile, un allarme e, sul server OPC UA, anche un comando di un dispositivo) per la sua identità: una ridenominazione non la rompe mai, e un'eliminazione lascia la riga al suo posto, con il nome di ciò che ha perso. Una riga così è elencata qui, la stessa che la sua tabella mostra come mancante. Una sorgente che la stazione ha ancora ma non offre (un tag disattivato, un tag di un dispositivo disattivato, una variabile di un tipo che nessun registro porta) non è elencata: lo dicono i campi stessi della riga. La riga conserva un'identità che l'operatore non legge mai, quindi dice quale genere di sorgente è sparito invece di mostrarla.

| Tipo | Nome | Posizione | Campo | Formulazione |
|---|---|---|---|---|
| Nodo servito | Tag mancante, Variabile mancante, Allarme mancante o Comando mancante | Server OPC UA | Sorgente | il tag servito è stato rimosso. / la variabile servita è stata rimossa. / l'allarme servito è stato rimosso. / il comando servito è stato rimosso. |
| Riga della mappa dei registri | il posto della riga come lo legge la mappa (la sua classe di registro e il suo registro) | Server Modbus | Sorgente | il tag servito è stato rimosso. / la variabile servita è stata rimossa. / l'allarme servito è stato rimosso. |
| Topic MQTT pubblicato | il topic della riga | il nome del broker | Sorgente | il tag pubblicato è stato rimosso. / la variabile pubblicata è stata rimossa. / l'allarme pubblicato è stato rimosso. |

La pagina non elimina né cambia nulla, e ogni server continua a fare con la riga quello che faceva: il server OPC UA non serve nulla per lei, il server Modbus risponde con l'eccezione 04 a un client che legge i suoi registri, e il broker conserva l'ultimo messaggio che ha trattenuto sul topic. La riparazione si fa sulla scheda della riga: un'altra sorgente scelta, o la riga eliminata.

## Che cosa apre una riga {#what-a-row-opens}

| Genere | Apre | Dove atterra |
|---|---|---|
| Componente | La dashboard in modo modifica (`/d/{dashboard}?edit=true&focus={component}`) | Con il componente selezionato e le sue proprietà mostrate, dove l'indirizzo si riscrive. Modificare richiede il permesso Modificare le dashboard; senza di esso la dashboard si apre in consultazione. |
| Collegamento di canale | Lo spazio di lavoro Process (`/process?focus={unit}&screen=channels`) | La schermata Canali del modello, con la riga di quell'unità scelta e ogni cartella sopra di essa espansa. |
| Interblocco, Automazione | Lo spazio di lavoro Process (`/process?focus={unit}&screen=automation`) | La schermata Automazione del modello, con la riga di quell'unità scelta. |
| Documentazione dell'azione | Lo spazio di lavoro Process (`/process?focus={action}&screen=action`) | La pagina propria dell'azione nella colonna. |
| Procedura | Lo spazio di lavoro Process (`/process?focus={procedure}&screen=procedure`) | La pagina propria della procedura nella colonna. |
| Occorrenza | Lo spazio di lavoro Process (`/process?focus={occurrence}&screen=occurrence`) | La pagina propria dell'occorrenza nella colonna. |
| Variabile a espressione, Azione, Allarme | La pagina Logic (`/logic?focus={id}`) | L'entità selezionata nel suo editor, con la sua sezione dello spazio degli indirizzi espansa. |
| Nodo servito, Riga della mappa dei registri, Topic MQTT pubblicato | Il Connector (`/connector?focus={row}`) | Il server OPC UA, il server Modbus o il broker selezionato nell'albero, con la riga selezionata nella sua scheda Nodi serviti, Mappa dei registri o Pubblicare e i suoi campi aperti sotto la tabella, dove si sceglie un'altra sorgente o si elimina la riga. |

Aprire porta sul difetto; la pagina di destinazione applica poi i propri permessi alla modifica (Gestire Process sulle schermate di Process, Configurare Logic in Logic, Configurare Connector nel Connector). Un'entità che non si risolve più quando la pagina arriva (eliminata nel frattempo) è ignorata, e la pagina si apre dove si aprirebbe normalmente.

## Il distintivo della barra {#the-rail-badge}

La voce Convalida sulla barra porta una pastiglia di cautela con il numero di elementi da correggere, "99+" oltre novantanove, e nessuna pastiglia mentre la configurazione è pulita. Il conteggio è quello proprio del validatore, tenuto aggiornato in sottofondo dallo stesso riesame che la pagina segue, così si muove mentre modifichi su una pagina qualsiasi, senza che questa pagina sia aperta. Anche aprire questa pagina e ripetere il riesame su di essa aggiornano il conteggio, così la pastiglia non legge mai un numero diverso da quello dell'elenco.

## Che cosa la pagina non fa mai {#what-the-page-never-does}

- Non ripara nulla: nessun ricollegamento, nessuna eliminazione, nessuna rinomina. Ogni riga è un "apri"; su una riga non c'è altra azione, e non c'è alcuna azione in blocco.
- Non giudica mai il runtime: un dispositivo che non comunica è lo stato di salute della barra di stato, non un rilievo qui. Un riferimento a un tag che esiste ma legge con qualità cattiva si risolve.
- Non segnala mai un'automazione disabilitata, un sinottico definito su un modello, testo libero che sembra un indirizzo, una variabile di memoria, o un secondo rilievo e successivi dello stesso comando di azione (il conteggio dice quanti altri aspettano su quella pagina).
- Non legge mai un'occorrenza che nessuna procedura arma, e non elenca mai due volte la stessa occorrenza armata per quante procedure la armino: una condizione è una riparazione.
- Non esamina mai mentre Connector è a metà transizione; aspetta e misura una volta sola.
- È lo stesso elenco su ogni schermata, tanto sulla finestra della stazione quanto in un browser, ed è lo stesso per ogni identità che lo può aprire: il permesso condiziona la pagina, non le sue righe.
- Mentre il runtime è fermo la pagina cede il posto all'avviso di pausa come ogni pagina; il distintivo conserva il suo ultimo conteggio.
- Non elimina mai una riga di un elenco di un server né cambia ciò che un server ne fa, e non elenca mai una sorgente che la stazione ha ancora ma non offre (un tag disattivato, una variabile di un tipo che nessun registro porta): lo dice la scheda stessa della riga.
