# Incidencias

> Condiciones vigiladas de lo que se está ensayando, escritas como una expresión JavaScript sobre los canales del modelo y juzgadas durante un ensayo o siempre.

Una **incidencia** registra que lo que se está ensayando hizo algo digno de mención. Donde una alarma
vigila la planta y el equipo, una incidencia pertenece al procedimiento: sus flancos se quedan con el
ensayo que los observó y entran además en la cronología permanente de Incidencias de la página
Eventos. Su condición es una expresión JavaScript sobre los canales del modelo, con antirrebote en los
dos flancos y controlada por la calidad de lo que lee. Las incidencias viven en Process > Modelos >
modelo > Preparación > **Incidencias** y exigen el permiso **Editar recetas y evaluaciones**.

## La carpeta Incidencias {#the-occurrences-folder}

Al seleccionar la fila **Incidencias** se abre la página de la carpeta ("Condiciones vigiladas de lo
que se está ensayando. Cada flanco se queda con su ensayo cuando procede y entra además en el
histórico permanente de incidencias.") con una tarjeta por incidencia, por su nombre; al hacer clic en
una tarjeta se abre y la X la quita. Sin ninguna, la página dice "Todavía no hay incidencias. Añada
una."

| Comando | Qué hace | Atenuado cuando (situación) | No se dibuja cuando (rol) |
| --- | --- | --- | --- |
| **Incidencia** (barra de detalle, con la carpeta seleccionada; botón derecho **Añadir incidencia**) | Añade `Incidencia <n>`: gravedad Advertencia, armada durante los procedimientos, habilitada, sin mensaje, con una condición vacía. La fila se añade a su grupo, resaltada y desplazada hasta quedar a la vista allí; su tarjeta la abre. | Alguna unidad tiene un ensayo, o el runtime está detenido. | Sin Editar recetas y evaluaciones. |

## La página de la incidencia {#the-occurrences-page}

La cabecera lleva el nombre, una píldora con la gravedad (en el color propio de la gravedad) y una
píldora **Deshabilitada** cuando la incidencia está apagada. Debajo pueden aparecer dos clases de
aviso:

- Una nota de precaución cuando la condición guardada no valida (el borrador se guarda igual; la nota
  dice qué está mal, véase más abajo).
- Un aviso **Evaluación no disponible** por cada unidad en la que no se pudo evaluar la condición en
  vivo, como "`<unidad>`: `<error>`". El diagnóstico de una unidad se escribe una vez por cada error
  que no cambia y se borra cuando la evaluación vuelve a salir bien.

### Identidad y comportamiento {#identity--behavior}

| Campo | Qué es | Valores / valor por defecto | Efecto |
| --- | --- | --- | --- |
| **Nombre** | El nombre de la incidencia: la fila del árbol, el rótulo del evento en el archivo del ensayo, la cronología de Eventos y los informes. | Texto libre; `Incidencia <n>` al crearla. | Renombra la fila y cómo la llama la lista de comprobación de un procedimiento. |
| **Gravedad** | El peso de una activación. El selector muestra cada opción en la tinta que llevará su píldora. | **Información**, **Advertencia** (por defecto), **Crítica**. | Da color a la píldora y al episodio dondequiera que se liste. Durante un ensayo, la activación de una incidencia de gravedad Advertencia o Crítica pide además una notificación del sistema operativo mientras la aplicación está oculta o minimizada; la de Información se queda en la ventana. |
| **Armado** | Cuándo se juzga la condición. | **Durante un procedimiento** (por defecto): solo mientras está activo un ensayo de un procedimiento que la arma, sobre las filas registradas. **Siempre**: también fuera de los ensayos, por un vigilante de fondo que lee en vivo los vínculos de la unidad. | Una incidencia Siempre no necesita ningún procedimiento que la arme; una Durante un procedimiento la juzgan solo los procedimientos que la marcan. |
| **Retardo a la activación (ms)** | Cuánto tiene que aguantar verdadera la condición antes de confirmar **Activada**, a la resolución de las muestras. | Un número de milisegundos; 0 por defecto. El campo no acepta un número negativo: la entrada se rechaza, la nota bajo el campo lo dice, y vuelve el valor anterior. | Aplica el antirrebote al flanco de subida. |
| **Retardo a la desactivación (ms)** | Cuánto tiene que aguantar falsa la condición antes de confirmar **Despejado**. | Lo mismo; 0 por defecto. | Aplica el antirrebote al flanco de bajada. |
| **Habilitada** | Si la incidencia llega a armarse. | Activada por defecto. | Una incidencia deshabilitada no se arma nunca, ni en un ensayo ni fuera de él, y nunca bloquea el Arranque. |
| **Mensaje** | El texto que se registra y se anuncia con una activación. | Texto libre; vacío por defecto. | Viaja con cada flanco al archivo del ensayo y al diario. |

### Condición {#condition}

"Una sola expresión JavaScript que devuelve un booleano." La tarjeta lleva un editor de código, la lista de
las referencias que puede usar ("Referencias de canal disponibles: Channels.Ch_1,
Channels.Outlet_temperature, …"), y el recordatorio "Durante un ensayo la condición lee las columnas
registradas del datalog; el vigilante Siempre lee en vivo los vínculos de la unidad. La sintaxis, las
referencias que faltan y los fallos de evaluación en ejecución se muestran aquí sin tratarlos como
falso ni como pérdida de señal."

Un canal se referencia como `Channels.<identifier>`, donde el identificador es el nombre del canal
saneado: las letras y los dígitos sobreviven, todo otro carácter se convierte en `_`, y un nombre que
empieza por un dígito gana un `_` delante. `Channels` contiene solo los canales del modelo y nada más,
así que un canal llamado `Math`, `isNaN` o `true` sigue siendo un nombre de canal válido y no oculta
ninguna global de JavaScript. Un `NaN` presente y de buena calidad son datos que se pueden comprobar
con `isNaN(Channels.Pv)`. Ejemplos: `Channels.Outlet_temperature > 80`,
`Channels.Door_open && Channels.Heater_on`.

El borrador se valida mientras usted escribe, contra valores de muestra del tipo de cada canal, y la
nota de precaución de debajo de la cabecera dice qué falla:

| Nota | Significado |
| --- | --- |
| "Error de sintaxis: …" | La expresión no se analiza. |
| "La referencia de canal 'Channels.X' no existe en este modelo." | Una referencia no nombra ningún canal. |
| "Más de un canal se corresponde con 'Channels.X'." | Dos nombres de canal se sanean al mismo identificador; renombre uno en la rejilla de Canales. |
| "La condición debe devolver un booleano, pero devolvió `<type>`." | La expresión da algo que no es verdadero ni falso. |
| "Error de evaluación: …" | La expresión lanza un error. |

Una condición no válida se guarda igualmente como borrador. Tiene consecuencias en otros sitios: una
incidencia habilitada que no valida y que arma un procedimiento (marcada en él, o armada Siempre)
bloquea el Arranque de ese procedimiento, y la página del procedimiento muestra "La incidencia
'`<nombre>`' no es válida: …"; una incidencia Siempre no válida no pone en marcha su vigilante de
fuera de ensayo y deja aquí un diagnóstico visible en lugar de repetirlo en cada sondeo.

Cada evaluación corre en un motor acotado (un límite de 500 ms, un número acotado de sentencias y una
memoria acotada), así que una expresión desbocada hace fallar su evaluación y no la estación.

## Cómo se juzga una incidencia {#how-an-occurrence-is-judged}

Durante un ensayo la condición se juzga sobre las filas que registra el datalog, así que un canal que
el datalog del procedimiento no registra no está disponible para ella. Un procedimiento que arma una
incidencia sobre un canal así, o que arma una y no registra nada en absoluto, se rechaza en su propia
página y en el Arranque: la incidencia nunca llegaría a juzgar, y la nota de precaución la nombra.
Fuera de los ensayos, una incidencia Siempre la juzga un vigilante que lee en vivo los vínculos de la
unidad. Cualquiera de los dos jueces mantiene el último estado confirmado mientras algún canal
referenciado no está disponible: solo un valor que falta o una calidad mala suspenden el juicio, y un
valor presente y de buena calidad (un `NaN` incluido) son datos evaluables. El juez registra cuatro
transiciones: **Activada** (tras el retardo a la activación), **Despejado** (tras el retardo a la
desactivación), **No disponible** (un canal referenciado perdió su señal) y **Recuperada** (todos los
canales referenciados han vuelto; la condición se vuelve a juzgar y el retardo que corresponda empieza
de nuevo).

Durante un ensayo, cada transición se escribe primero en el archivo del ensayo y después se copia, con
su contexto de ensayo, en el diario duradero de la página [Eventos](events-occurrences); fuera de los
ensayos el vigilante escribe solo en el diario. Arrancar un ensayo descarta el juez de fuera de ensayo
de la unidad, y salir del ensayo crea uno nuevo, así que ninguna activación cruza un límite no
observado. Las ediciones del nombre, del mensaje o de la gravedad afectan solo a los flancos
posteriores; las ediciones de la condición, de los retardos, del modo de armado o del estado habilitado
empiezan una observación nueva.

Los episodios (de la activación al restablecimiento, con cualquier intervalo de pérdida de señal
contado aparte) se derivan de esos flancos dondequiera que la aplicación los muestre: la tarjeta
Incidencias de un panel, la página Eventos, Históricos y los informes. El tiempo activo de un episodio
es exactamente el intervalo entre los dos flancos persistidos, así que excluye el retardo a la
activación e incluye el retardo a la desactivación: el reloj arranca cuando la condición ya ha
aguantado el retardo a la activación, y se para solo cuando se escribe el restablecimiento, después de
que haya corrido el retardo a la desactivación. Ese es el número que un informe entrega a un tercero.

## Dónde se usa una incidencia {#where-an-occurrence-is-used}

La página de un procedimiento lleva la tarjeta **Incidencias armadas durante este procedimiento**, con
una píldora "`<n>` armadas" y una casilla por incidencia del modelo, por su nombre. Marcar una la arma
durante los ensayos de ese procedimiento; una incidencia armada **Siempre** vigila igualmente y no
necesita marca. Sin ninguna incidencia en el modelo, la tarjeta dice "Todavía no hay incidencias en
este modelo. Añada algunas en Incidencias del modelo." Véase [Procedimientos](process-procedures).

Renombrar un canal reescribe las referencias `Channels.<identifier>` de ese canal en todas las
condiciones del modelo; no toca cadenas, comentarios ni una propiedad del mismo nombre en otro objeto.

## Quitar la incidencia {#remove-occurrence}

**Quitar la incidencia** está en el grupo de peligro de la barra de detalle con la incidencia
seleccionada, en su menú del botón derecho, y como la X de la tarjeta de la página de la carpeta.
Pregunta antes ("Eliminar la incidencia", "Esto quita la incidencia del modelo.") y la desarma de todos
los procedimientos que la habían marcado. Exige Editar recetas y evaluaciones y se atenúa bajo el
bloqueo de ingeniería y el runtime detenido.

## Qué no hace una incidencia {#what-an-occurrence-does-not-do}

- No es una alarma: no se reconoce, no tiene prioridad y no vigila tags. Las alarmas de la planta están
  en la página [Logic](logic-alarms).
- No dispara nada. Una activación se registra y se anuncia; no lleva ninguna acción, etiqueta ni
  informe adjunto.
- No puede leer nada que no sean los canales del modelo: ningún tag, ninguna variable, ningún otro
  modelo.
- No se juzga de forma distinta por unidad: una sola condición sirve a todas las unidades, sobre los
  vínculos propios o las filas registradas de cada una.
