# Occorrenze

> Condizioni sorvegliate dell'oggetto in prova, scritte come espressione JavaScript sui canali del modello e giudicate durante una prova oppure sempre.

Un'**occorrenza** registra che l'oggetto in prova ha fatto qualcosa di notevole. Dove un allarme
sorveglia l'impianto e le apparecchiature, un'occorrenza appartiene alla procedura: i suoi fronti
restano con la prova che li ha osservati ed entrano anche nella cronologia permanente delle
Occorrenze della pagina Eventi. La sua condizione è un'espressione JavaScript sui canali del
modello, ritardata su entrambi i fronti e subordinata alla qualità di ciò che legge. Le occorrenze
stanno sotto Process > Modelli > modello > Allestimento > **Occorrenze** e richiedono il permesso
**Modificare ricette e valutazioni**.

## La cartella Occorrenze {#the-occurrences-folder}

Selezionare la riga **Occorrenze** apre la pagina della cartella ("Condizioni sorvegliate
dell'oggetto in prova. Ogni fronte resta con la sua prova quando è pertinente ed entra anche nello
storico permanente delle occorrenze.") con un riquadro per occorrenza, per nome; premere un riquadro
la apre e la X la rimuove. Senza nessuna, la pagina dice "Ancora nessuna occorrenza. Aggiungerne
una."

| Comando | Che cosa fa | In grigio quando (situazione) | Non disegnato quando (ruolo) |
| --- | --- | --- | --- |
| **Nuova occorrenza** (barra di dettaglio, cartella selezionata; tasto destro **Aggiungi un'occorrenza**) | Aggiunge `Occorrenza <n>`: gravità Avvertenza, armata durante le procedure, abilitata, senza messaggio, con una condizione vuota. La riga si aggiunge al suo gruppo, evidenziata e portata in vista lì; il suo riquadro la apre. | Una qualsiasi unità tiene una prova, oppure il runtime è fermo. | Senza Modificare ricette e valutazioni. |

## La pagina dell'occorrenza {#the-occurrences-page}

L'intestazione porta il nome, una pastiglia con la gravità (nell'inchiostro proprio della gravità) e
una pastiglia **Disabilitata** quando l'occorrenza è spenta. Sotto di essa possono comparire due
generi di avviso:

- Una nota di cautela quando la condizione salvata non è valida (la bozza resta comunque salvata; la
  nota dice che cosa non va, vedi più avanti).
- Un avviso **Valutazione non disponibile** per ogni unità su cui la condizione dal vivo non si è
  potuta valutare, nella forma "`<unità>`: `<errore>`". La diagnostica di un'unità è scritta una
  sola volta per errore immutato e viene cancellata quando la valutazione riesce di nuovo.

### Identità e comportamento {#identity--behavior}

| Campo | Che cos'è | Valori / predefinito | Effetto |
| --- | --- | --- | --- |
| **Nome** | Il nome dell'occorrenza: la riga dell'albero, l'etichetta dell'evento nel file della prova, la cronologia di Eventi e i rapporti. | Testo libero; `Occorrenza <n>` alla creazione. | Rinomina la riga e il modo in cui la nomina la lista di una procedura. |
| **Gravità** | Il peso di un'attivazione. Il selettore mostra ogni opzione nell'inchiostro che la sua pastiglia porterà. | **Informazione**, **Avviso** (predefinita), **Critica**. | Colora la pastiglia e l'episodio ovunque siano elencati. Durante una prova, l'attivazione di un'occorrenza Avvertenza o Critica chiede anche una notifica del sistema operativo mentre l'applicazione è nascosta o ridotta a icona; Informazione resta nella finestra. |
| **Armata** | Quando la condizione viene giudicata. | **Durante una procedura** (predefinita): soltanto mentre è attiva una prova di una procedura che la arma, sulle righe registrate. **Sempre**: anche fuori dalle prove, per mezzo di un sorvegliante di sfondo che legge dal vivo i collegamenti dell'unità. | Un'occorrenza Sempre non ha bisogno di alcuna procedura che la armi; una armata Durante una procedura è giudicata soltanto dalle procedure che la spuntano. |
| **Ritardo all'attivazione (ms)** | Per quanto tempo la condizione deve restare vera prima che **Attivata** sia confermata, alla risoluzione dei campioni. | Un numero di millisecondi; 0 per impostazione predefinita. Il campo non accetta un numero negativo: l'inserimento viene rifiutato, la nota sotto il campo lo dice, e il valore precedente torna. | Ritarda il fronte di salita. |
| **Ritardo al rientro (ms)** | Per quanto tempo la condizione deve restare falsa prima che **Rientrata** sia confermata. | Lo stesso; 0 per impostazione predefinita. | Ritarda il fronte di discesa. |
| **Abilitata** | Se l'occorrenza si arma del tutto. | Attiva per impostazione predefinita. | Un'occorrenza disabilitata non si arma mai, né in una prova né fuori da una prova, e non blocca mai l'Avvio. |
| **Messaggio** | Il testo registrato e annunciato con un'attivazione. | Testo libero; vuoto per impostazione predefinita. | Viaggia con ogni fronte nel file della prova e nel diario degli eventi. |

### Condizione {#condition}

"Una sola espressione JavaScript che restituisce un valore booleano." Il riquadro contiene un editor di codice,
l'elenco dei riferimenti che si possono usare ("Riferimenti di canale disponibili: Channels.Ch_1,
Channels.Outlet_temperature, …") e il promemoria "Durante una prova la condizione legge le colonne
registrate del datalog; il sorvegliante Sempre legge dal vivo i collegamenti dell'unità. Errori di
sintassi, riferimenti mancanti e valutazioni non riuscite si mostrano qui senza trattarli come falso
o come perdita di segnale."

Un canale si referenzia come `Channels.<identifier>`, dove l'identificatore è il nome del canale
depurato: lettere e cifre sopravvivono, ogni altro carattere diventa `_`, e un nome che comincia per
cifra riceve un `_` davanti. `Channels` contiene soltanto i canali del modello e nient'altro, quindi
un canale di nome `Math`, `isNaN` o `true` resta un nome di canale valido e non nasconde alcuna
variabile globale di JavaScript. Un `NaN` presente e di buona qualità è un dato che si può verificare
con `isNaN(Channels.Pv)`. Esempi: `Channels.Outlet_temperature > 80`,
`Channels.Door_open && Channels.Heater_on`.

La bozza è convalidata mentre scrivi, contro valori di esempio del tipo di ciascun canale, e la nota
di cautela sotto l'intestazione dice che cosa non va:

| Nota | Significato |
| --- | --- |
| "Errore di sintassi: …" | L'espressione non si analizza. |
| "Il riferimento di canale 'Channels.X' non esiste in questo modello." | Un riferimento non nomina alcun canale. |
| "Più di un canale corrisponde a 'Channels.X'." | Due nomi di canale si depurano nello stesso identificatore; rinominane uno nella griglia dei canali. |
| "La condizione deve restituire un valore booleano, ma ha restituito `<type>`." | L'espressione produce qualcosa che non è vero né falso. |
| "Errore di valutazione: …" | L'espressione solleva un errore. |

Una condizione non valida resta comunque salvata come bozza. Ha conseguenze altrove: un'occorrenza
abilitata che non supera la convalida e che una procedura arma (spuntata su di essa, oppure armata
Sempre) blocca l'Avvio di quella procedura, e la pagina della procedura mostra "L'occorrenza
'`<nome>`' non è valida: …"; un'occorrenza Sempre non valida non avvia il proprio sorvegliante fuori
dalle prove e lascia qui una sola diagnostica visibile invece di ripeterla a ogni interrogazione.

Ogni valutazione gira in un motore vincolato (un limite di 500 ms, un numero limitato di istruzioni e
una memoria limitata), così un'espressione fuori controllo fa fallire la propria valutazione e non la
stazione.

## Come si giudica un'occorrenza {#how-an-occurrence-is-judged}

Durante una prova la condizione è giudicata sulle righe che il datalog registra, quindi un canale che
il datalog della procedura non registra non le è disponibile. Una procedura che arma un'occorrenza
su un canale simile, o che ne arma una senza registrare nulla, è rifiutata sulla propria pagina e
all'Avvio: l'occorrenza non giudicherebbe mai, e la nota di cautela la nomina. Fuori dalle prove,
un'occorrenza Sempre è giudicata da un sorvegliante che legge dal vivo i collegamenti dell'unità.
L'uno e l'altro giudice tengono l'ultimo stato confermato mentre un canale referenziato non è
disponibile: soltanto un valore mancante o una cattiva qualità sospendono il giudizio, e un valore
presente e di buona qualità (`NaN` compreso) è un dato valutabile. Il giudice registra quattro
transizioni: **Attivata** (dopo il ritardo all'attivazione), **Rientrata** (dopo il ritardo al
rientro), **Non disponibile** (un canale referenziato ha perso il proprio segnale) e **Ripristinata**
(ogni canale referenziato è tornato; la condizione viene giudicata di nuovo e il ritardo pertinente
riparte).

Durante una prova ogni transizione è scritta prima nel file della prova e poi copiata, con il proprio
contesto di prova, nel diario duraturo della pagina [Eventi](events-occurrences); fuori dalle prove
il sorvegliante scrive soltanto nel diario. Avviare una prova scarta il giudice dell'unità fuori
dalle prove, e uscire dalla prova ne crea uno nuovo, così nessuna attivazione attraversa un confine
non osservato. Le modifiche al nome, al messaggio o alla gravità valgono soltanto per i fronti
successivi; le modifiche alla condizione, ai ritardi, al modo di armamento o allo stato di
abilitazione fanno cominciare un'osservazione nuova.

Gli episodi (dall'attivazione al rientro, con ogni intervallo di perdita di segnale contato a parte)
sono derivati da quei fronti ovunque l'applicazione li mostri: il riquadro Occorrenze di un pannello,
la pagina Eventi, gli Storici e i rapporti. Il tempo attivo di un episodio è esattamente l'intervallo
fra i due fronti resi persistenti, quindi esclude il ritardo all'attivazione e comprende il ritardo
al rientro: l'orologio parte quando la condizione si è già mantenuta per il ritardo all'attivazione,
e si ferma soltanto quando il rientro è scritto, dopo che il ritardo al rientro è trascorso. È questo
il numero che un rapporto consegna a un terzo.

## Dove si usa un'occorrenza {#where-an-occurrence-is-used}

La pagina di una procedura porta il riquadro **Occorrenze armate durante questa procedura**, con una
pastiglia "`<n>` armate" e una casella di spunta per occorrenza del modello, per nome. Spuntarne una
la arma durante le prove di quella procedura; un'occorrenza armata **Sempre** sorveglia comunque e
non ha bisogno di alcuna spunta. Senza alcuna occorrenza nel modello il riquadro dice "Ancora nessuna
occorrenza in questo modello. Aggiungerne alcune sotto le Occorrenze del modello." Vedi
[Procedure](process-procedures).

Rinominare un canale riscrive i riferimenti `Channels.<identifier>` di quel canale in ogni condizione
del modello; non tocca le stringhe, i commenti né una proprietà dello stesso nome su un altro
oggetto.

## Rimuovi l'occorrenza {#remove-occurrence}

**Rimuovi l'occorrenza** sta nel gruppo di pericolo della barra di dettaglio con l'occorrenza
selezionata, nel suo menu del tasto destro e come X sul riquadro della pagina della cartella. Chiede
prima ("Elimina l'occorrenza", "Questo rimuove l'occorrenza dal modello.") e disarma l'occorrenza da
ogni procedura che l'aveva spuntata. Richiede Modificare ricette e valutazioni ed è in grigio sotto
il blocco di progettazione e con il runtime fermo.

## Che cosa non fa un'occorrenza {#what-an-occurrence-does-not-do}

- Non è un allarme: non si tacita, non ha priorità e non sorveglia i tag. Gli allarmi dell'impianto
  stanno sulla pagina [Logic](logic-alarms).
- Non fa scattare nulla. Un'attivazione è registrata e annunciata; nessuna azione, etichetta o
  rapporto vi è collegato.
- Non può leggere nulla oltre ai canali del modello: nessun tag, nessuna variabile, nessun altro
  modello.
- Non è giudicata in modo diverso da unità a unità: una sola condizione serve ogni unità, sui
  collegamenti propri di quell'unità o sulle righe che ha registrato.
