# El espacio de direcciones de la unidad

> Cada punto que publica una unidad bajo Process.Model.Unit, su tipo y su significado, qué puntos son comandos escribibles, y qué puede leer de él un script de Logic.

Cada unidad publica los datos de sus ensayos como direcciones corrientes de [Logic](logic) bajo
`Process.<Model>.<Unit>`, así que los paneles de control, las expresiones de Logic, el servidor OPC UA
integrado y el agente llegan a ellos sin fontanería adicional. La rama se recorre en la página Logic,
en "De otras páginas" ([De otras páginas](logic-from-other-pages)) y en todos los selectores de
dirección. Renombrar un modelo, una unidad, un canal, un campo de metadatos, una evaluación o un
criterio sustituye las direcciones correspondientes y reescribe las referencias textuales vivas; los archivos registrados conservan
congelados los nombres que tenían cuando se escribieron. Los segmentos son los nombres saneados: una
unidad llamada "Unidad 1" del modelo "Climatic chamber" se direcciona como
`Process.Climatic_chamber.Unidad_1`.

| Rama | Qué expone | Escribible |
| --- | --- | --- |
| `Channels.<Channel>` | El valor vinculado en vivo de cada canal, con el tipo que declara el canal. | Un canal escribible (rol Solo escritura o Lectura y escritura) es un punto escribible por el punto único de escritura; una fuente que tiene un ensayo rechaza a cualquier otro escritor. |
| `Procedure.<point>` | El estado del ensayo, un escalar por punto (tabla de abajo). | No. |
| `Commands.<command>` | `Start`, `Hold`, `Resume`, `Stop`, `Abort` y `Comment`. | Sí: escribir despacha (tabla de abajo). |
| `Next.<point>` | La zona de preparación que consume el próximo Arranque. | Solo los campos de metadatos manuales. |
| `LastRun.<point>` | El registro del último ensayo que la unidad terminó ([LastRun](#lastrun)). | No. |
| `Productivity.Today.<branch>` y `Productivity.Rolling.<branch>` | La proyección de productividad de la unidad para cada periodo. | No. |

## Canales {#channels}

Un punto de canal lee el valor que hay detrás del vínculo de la unidad, proyectado al tipo de datos del
canal, y se lee como un hueco cuando el canal está sin vincular o su fuente no está disponible. En un
script de Logic el punto es una proyección tipada de solo lectura del tag o la variable vinculados,
nunca el propio tag: `Value`, `ValueObject`, `ValueRaw`, `ValueScaled`, `ValueCalibrated`,
`ValueLimited`, `ValueRounded`, las conversiones `ValueToBool()`, `ValueToInteger()`, `ValueToReal()`,
`ValueToString()` y `ValueToDateTime()`, la calidad `State()`, las marcas `SourceTimeStamp()` y
`ApplicationTimeStamp()`, `Refresh()`, `Name` y `EngineeringUnit`. Los miembros de la cadena de
conversión responden para un vínculo con un tag; un vínculo con una variable responde el valor y la
marca de la aplicación.

## Procedure {#procedure}

Todos los puntos se calculan a partir del ensayo en vivo y se leen con calidad buena; un punto que no
tiene nada que decir se lee como un hueco.

| Punto | Tipo | Significado |
| --- | --- | --- |
| `Status` | Texto | `Preparing` mientras la unidad está reservada y todavía no existe ningún ensayo, `Idle` mientras nada la posee, y en los demás casos el estado del ensayo: `Running`, `Held`, `Saving`, `Completed`, `Aborted`, `Failed`. |
| `Running` | Booleano | Estrictamente el estado En marcha; nunca verdadero para la preparación, En pausa, Guardando o la finalización. |
| `Busy` | Booleano | Todo el tramo ocupado: reserva, En marcha, En pausa, Guardando y el cierre final del archivo del ensayo. |
| `Verdict` | Texto | `Ok`, `Nok`, `Indeterminate` o `None`, escritos exactamente así, sea cual sea la palabra que muestren la interfaz o una etiqueta impresa: una comparación se escribe `Process.<Model>.<Unit>.Procedure.Verdict == "Nok"`. La evidencia juzgada se puede seguir leyendo después de terminar el ensayo hasta que arranca el siguiente. |
| `Mode` | Texto | El modo del ensayo activo, `Instant`, `Temporal` o `Controlled`; un comando suelto (instantánea, evaluar ahora) también informa. Hueco en reposo. |
| `ActiveProcedure` | Texto | El nombre del ensayo activo ("Procedimiento · Unidad"). Hueco en reposo. |
| `SegmentIndex` | Entero | El segmento actual del perfil temporizado, contando desde 0. Hueco sin perfil. |
| `CycleIndex` | Entero | El ciclo actual, contando desde 0. Hueco en reposo. |
| `CycleCount` | Entero | El total de ciclos del ensayo (1 para una pasada única). Hueco en reposo. |
| `Cycle` | Texto | "2 / 10" para un ensayo cíclico; un hueco cuando el ensayo no es cíclico, para que una lectura vinculada muestre la marca de hueco en lugar de una pasada única engañosa. |
| `FailedCycles` | Entero | Los ciclos juzgados No conformes hasta ahora. Hueco cuando el ensayo no es cíclico. |
| `SamplesEvaluated`, `SamplesOut`, `SamplesUnavailable`, `SamplesInvalid` | Entero | Los contadores de evidencia de la evaluación, actualizados atómicamente por el motor de evaluación. Hueco sin evidencia juzgada. |
| `Elapsed` | Número decimal | Segundos desde que arrancó el ensayo. Hueco en reposo. |
| `StartedAt` | Fecha y hora | Cuándo arrancó el ensayo activo. Hueco en reposo. |
| `Metadata.<Field>` | Texto | Un punto por campo de metadatos del modelo: el valor que el ensayo en curso congeló en el Arranque. Hueco en reposo y para un campo que ese ensayo no pide; un campo dejado en blanco se lee como texto vacío. Es lo que una acción disparada en el Arranque lee del ensayo que empieza, ya que `Next.<Field>` muestra el siguiente. |

## Comandos {#commands}

Leer una punta de comando responde "¿se puede ejecutar esto ahora?", así que un Botón vinculado se
deshabilita solo; escribirla despacha el comando por la consola de ensayos, anotado en el diario con el
origen de la superficie que escribe y registrado con la identidad de quien pulsó. Un comando es una
llamada a un servicio, nunca la escritura encolada de un punto.

| Punto | Se lee verdadero cuando | Al escribirlo |
| --- | --- | --- |
| `Start` | La unidad no está ocupada, el runtime acepta operaciones, el enclavamiento está En reposo y hay un procedimiento preparado. | Arranca el procedimiento preparado con los metadatos preparados. |
| `Hold` | Un ensayo está En marcha y su procedimiento es Temporizado. | Congela la ventana. |
| `Resume` | Un ensayo está En pausa y el enclavamiento está En reposo. | Suelta la pausa. |
| `Stop` | Un ensayo está En marcha. | Termina el ensayo como Completado. |
| `Abort` | Un ensayo está En marcha o En pausa. | Termina el ensayo como Abortado. |
| `Comment` | Nunca: el punto no tiene lectura. | Añade el texto escrito como comentario al ensayo activo, o como nota posterior al ensayo en el último ensayo terminado de la unidad cuando está en reposo. Una unidad sin ningún ensayo lo rechaza ("La unidad no tiene ningún ensayo que comentar."), y lo mismo un texto vacío. |

Todos los comandos se leen falsos mientras la estación rechaza las escrituras (el runtime detenido).

## Next {#next}

| Punto | Tipo | Significado |
| --- | --- | --- |
| `Next.Procedure` | Texto | El nombre del procedimiento preparado. Aquí es de solo lectura: la preparación se hace en la tarjeta Ensayo del panel de unidad. |
| `Next.<Field>` | Texto | Un punto por cada campo de metadatos que pide el procedimiento preparado; la rama se rehace cuando la unidad se vuelve a preparar, y un campo de otro procedimiento se lee como un hueco. Un campo manual (de texto o numérico) es un punto de preparación escribible, que es lo que escribe un componente Entrada vinculado a él. Un campo secuencial es una predicción de solo lectura del identificador que compondría ahora el contador; leerlo no lo reserva nunca. |

La preparación es de toda la estación, en memoria y transitoria: se reinicia cuando arranca la
aplicación y la consume, no la borra, el Arranque.

## Productividad {#productivity}

Dos periodos, `Today` (desde la medianoche local) y `Rolling` (la ventana declarada en el modelo o en
la unidad), cada uno con tres ramas ([Productividad](process-productivity)):

| Rama | Puntos | Tipo |
| --- | --- | --- |
| `Summary` | `ProductivityPercent`, `YieldPercent`, `TypicalElapsedSeconds` | Número decimal; un hueco hasta que existe el denominador. |
| `Summary` | `Finalized`, `OK`, `NOK`, `Indeterminate`, `Unclassified`, `Aborted`, `Failed` | Recuentos enteros. |
| `Outputs.<key>` | `Quantity`, `RatePerHour` | Número decimal; una clave por cantidad con nombre, o por procedimiento productivo cuando el modelo no declara ninguna cantidad. |
| `Procedures.<key>` | `Quantity`, `RatePerHour` y los puntos de resumen de arriba | Como arriba, por procedimiento productivo. |

Las claves se derivan del identificador estable y de la unidad de salida congelada, no del nombre
visible, así que un cambio de nombre nunca mueve una expresión. Todos los puntos son de solo lectura, y
la proyección se lee del índice del histórico, nunca de los archivos de ensayo.

## LastRun {#lastrun}

El registro del último ensayo que la unidad terminó: cuál fue, cómo terminó, qué introdujo el
operador en el Arranque y cómo salió cada criterio. Es lo que lee una acción de Logic disparada en la
Finalización ([Acciones](process-actions#logic-action-commands)), y cualquier otro consumidor lo lee
igual: una pantalla que muestra la última pieza, una alarma, los servidores de la estación. Cuenta
cada ensayo registrado de la unidad, también uno fallido y una Instantánea o un Evaluar ahora; un
ensayo importado no cuenta nunca.

| Punto | Tipo | Significado |
| --- | --- | --- |
| `RunId` | Texto | El identificador del ensayo. |
| `Procedure` | Texto | El nombre del procedimiento tal como lo registró el ensayo. |
| `Status` | Texto | `Completed`, `Aborted` o `Failed`, escritos exactamente así. |
| `Verdict` | Texto | `Ok`, `Nok`, `Indeterminate` o `None`, escritos como en `Procedure.Verdict`; un ensayo fallido se lee `None`. |
| `StartedAt`, `FinishedAt` | Fecha y hora | Cuándo arrancó el ensayo y cuándo terminó. |
| `Elapsed` | Número decimal | Segundos desde el arranque hasta el final. |
| `CycleCount` | Entero | Los ciclos del ensayo (1 en una pasada única). |
| `FailedCycles` | Entero | Los ciclos juzgados No conformes. |
| `Metadata.<Field>` | Texto | Un punto por campo de metadatos del modelo: el valor que el ensayo congeló en el Arranque. Un campo que el ensayo no pidió se lee como hueco; un campo dejado en blanco se lee como texto vacío. |
| `Evaluations.<Evaluation>.<Criterion>.<point>` | Como abajo | Una carpeta por evaluación del modelo y, debajo, una por criterio, con el nombre del criterio, o con el de su canal cuando no tiene. |

Cada criterio lleva un resultado, plegado sobre todos los ciclos en que se juzgó, así que la
dirección es la misma para una pasada única y para un ensayo de cien ciclos:

| Punto | Tipo | Significado |
| --- | --- | --- |
| `Outcome` | Texto | `Ok`, `Nok` o `Indeterminate`, escritos exactamente así: un ciclo No conforme da `Nok`; si no, un ciclo Indeterminado da `Indeterminate`; si no, `Ok`. |
| `Passed` | Booleano | Verdadero solo cuando `Outcome` es `Ok`. |
| `Value` | Número decimal | El valor medido del canal vigilado: la última muestra evaluada de la ventana, en modo Un punto la juzgada, del ciclo más reciente que midió uno. |
| `MinValue`, `MaxValue` | Número decimal | El menor y el mayor valor evaluado, sobre todos los ciclos. |
| `Limits` | Texto | Los límites tal como se registraron, como `5 .. 45`. |
| `WorstExcursion` | Número decimal | La mayor distancia más allá de un límite, sobre todos los ciclos. |
| `FailedCycles` | Entero | Los ciclos que juzgaron este criterio No conforme. |

La rama tiene la forma del modelo, nunca la forma del último ensayo: cada campo de metadatos del
catálogo y cada criterio de cada evaluación es un punto, así que un script que nombra uno pasa la
validación antes de cualquier ensayo, y después de un ensayo de un procedimiento que juzgó por otra
evaluación.

| Situación | Qué leen los puntos |
| --- | --- |
| Ningún ensayo de la unidad ha terminado todavía | Un hueco con mala calidad, en cada punto. |
| Un ensayo termina | El registro nuevo, ya en su sitio antes de que el `Procedure.Status` de la unidad diga que el ensayo terminó. |
| Otro ensayo de la unidad está en curso | El registro anterior, hasta que ese ensayo termine. |
| La aplicación vuelve a arrancar | El último ensayo terminado de la unidad, releído de su archivo poco después del arranque; un hueco hasta que se lee. |
| Un criterio que el último ensayo no juzgó (de otra evaluación, o añadido después) | Un hueco en cada punto. |
| Dos evaluaciones, o dos criterios, cuyos nombres se leen igual | Nada: la dirección no se resuelve en ninguno de los dos, y la página de la evaluación lo dice ([Evaluaciones](process-evaluations#names-are-addresses)). |

Renombrar un campo de metadatos, una evaluación, un criterio o el canal de un criterio sin nombre
mueve estas direcciones como cualquier otro renombrado de esta página.

## Qué puede hacer un script {#what-a-script-may-do}

Los scripts de variable, de alarma y de acción de Logic pueden **leer** todo lo de aquí: valores de
canal, estado del ensayo, disponibilidad de los comandos, valores preparados, el último ensayo y
puntos de productividad. No pueden despachar un comando, ni escribir un campo de preparación, ni
añadir un comentario; esas escrituras son de los consumidores explícitos de comandos: los paneles de
operación, los Botones y las Entradas de un panel de control, la automatización de
la unidad y las herramientas del agente.

Un punto de canal se lee como la proyección tipada de [Canales](#channels); cualquier otro punto de
aquí se lee como su valor simple, sin `.Value` detrás, a diferencia de una variable:

```js
if (Process.Oven_soak.Oven_1.LastRun.Verdict === "Ok") {
  Variables.Last_serial = Process.Oven_soak.Oven_1.LastRun.Metadata.Serial;
}
```
