La cadena de conversión
La conversión tipada que comparten todos los tags, de la lectura bruta al valor de ingeniería, las dos políticas de lectura no válida, las acciones fuera de rango, las transformaciones de Boolean y String, y cómo una escritura deshace las etapas.
Todos los tags comparten una cadena de conversión tipada que convierte la lectura bruta en el valor de ingeniería. La cadena vive en el propio tag: la tarjeta Conversión de la página Tags y la rejilla del dispositivo muestran las mismas etapas, y el valor que aterriza en Logic, en los paneles de control, en el grabador y en lo que publica la estación es el que sale de la última etapa. El nodo OPC UA público lleva el valor bruto.
Primero el bruto
La cadena parte del valor bruto convertido al tipo de dato del tag, no del objeto propio del controlador: un controlador que entrega 3,7 a un tag Int32 lee 4 en lo alto de la tarjeta, y todas las etapas siguen desde ese 4. Una lectura que el tipo declarado no puede contener en absoluto (texto donde se declara un número) es una lectura vacía, nunca un cero de relleno. Las etapas calculan con números reales, y en el otro extremo el valor de ingeniería toma su tipo:
| Tag | Valor de ingeniería |
|---|---|
| Tipo de dato entero, Escala y Calibración apagadas, o encendidas con factor 1 y desplazamiento 0 (como nace todo tag) | El propio número entero, en el tipo de dato del tag. |
| Tipo de dato entero, Escala o Calibración que cambian el valor | Un número real (Double), redondeado por la etapa Decimales: un tag Int16 que guarda una temperatura multiplicada por diez lee 235 en el dispositivo y 23,5 con escala 0,1. |
| Float o Double | El tipo de dato del tag, así que un tag Float redondea a lo que un float puede representar. |
El tipo de dato sigue siendo el que llevan el dispositivo y el nodo OPC UA público. Encender o apagar Escala o Calibración cambia el tipo del valor de ingeniería a partir de ese momento: lo que el grabador ya grabó se queda como se grabó, y un canal conserva el tipo que declara, así que un canal Entero graba el valor redondeado al entero más cercano y un canal Número decimal conserva los decimales. La tarjeta Conversión se cierra con el valor entregado y avisa cuando un tipo entero que Escala y Calibración dejan como está pierde al redondear los decimales de un límite al que Límites recorta el valor.
Las etapas
En los tipos numéricos la cadena es una sucesión de etapas, cada una con su propia casilla; una etapa deshabilitada deja pasar su entrada, y la tarjeta muestra el valor corriente al final de cada etapa para poder seguir una lectura en vivo a través de las matemáticas:
| Etapa | Por defecto | Qué hace |
|---|---|---|
| Escala | encendida | escalado = bruto × Angular + Lineal. Angular vale 1 por defecto y Lineal 0. Un Angular de 0 se rechaza allí donde se escribe ("Un factor de escala de 0 pondría a cero todas las lecturas. Introduzca el factor por el que multiplicar (1 mantiene el valor)."), porque pondría a cero todas las lecturas y la vista previa y la cadena guardada nunca deben contradecirse. |
| Calibración | apagada | Un segundo par lineal aplicado al valor escalado: calibrado = escalado × Angular + Lineal. Se mantiene aparte de Escala para que un ajuste de estado inicial y final no perturbe las matemáticas del rango, y va con su propio permiso; véase Calibración. Un Angular de 0 se rechaza igual. |
| Lectura no válida | siempre visible | Dos políticas para las lecturas que no traen ningún número utilizable (más abajo). No es una casilla: su "apagado" es en sí una de las respuestas. |
| Límites | apagada | Juzga el valor contra Mín (0 por defecto) y Máx (100 por defecto) y aplica la acción fuera de rango elegida (más abajo). Las cotas se normalizan, así que un Mín por encima del Máx nunca falla: la menor de las dos es el suelo. |
| Decimales | encendida | Redondea a Decimales posiciones, 2 por defecto, aceptadas de 0 a 15. |
Las dos etapas lineales llevan un asistente de Dos puntos que calcula el par a partir de dos puntos de referencia; está descrito paso a paso en Calibración.
El dispositivo respondió sin un número
Un termopar abierto, un canal sin sensor: la lectura llegó, el equipo habla, pero la medida es NaN. Solo en tags numéricos, y la calidad sigue siendo buena en los dos casos:
| Política | Efecto |
|---|---|
| Dejarlo pasar (por defecto) | El NaN viaja intacto y se salta la etapa Límites entera, lleve esa etapa la acción que lleve: los límites juzgan números, y aquí no hay ninguno. Infinito no es NaN y sigue saturando en el rango. |
| Sustituir por un valor | El número declarado hace de sustituto desde esta etapa en adelante y entra en Límites, Decimales y la conversión final como cualquier lectura. |
El dispositivo no respondió
Un tiempo de espera agotado, un cable cortado, un equipo apagado, una excepción del controlador. Todos los tipos, aunque a un tag que lee texto, una marca de tiempo, un identificador o un bloque de bytes solo se le ofrecen las dos primeras políticas: un sustituto declarado es un número, y una lectura de esos tipos no lo es.
| Política | Efecto |
|---|---|
| Mostrar el error (por defecto) | El tag se lee vacío y su calidad pasa a mala, así que el fallo asoma en todas partes a la vez. |
| Mantener el último valor bueno | La última lectura que aterrizó se queda a la vista, sin caducidad, hasta que el equipo vuelve a responder. Las marcas de tiempo siguen apuntando a esa lectura, porque es cuando se midió el número. No se mantiene nada antes de que aterrice la primera lectura; entonces el tag se lee vacío. |
| Sustituir por un valor | El número declarado se presenta tal y como está declarado: no hay ninguna lectura que recorrer las etapas, así que no se escala, ni se calibra, ni se redondea, solo se convierte al tipo del valor de ingeniería. Se ofrece en los tipos numéricos y en el Booleano, cuya lectura puede salir de un número; no en String, DateTime, Guid ni ByteString. |
Un sustituto no es nunca silencioso: la tarjeta Valor en vivo imprime por qué ("Último valor bueno, mantenido mientras el dispositivo no responde."), el punto en vivo se pone ámbar, el servidor OPC UA integrado publica el valor con un estado de sustitución en lugar de Good a secas, y un agente que lee el tag con tag_read sabe qué sustituto es (substitution). Sigue publicado mientras la política lo pida: un dispositivo que sigue sin responder no hace que un cliente externo alterne entre el sustituto y un fallo de lectura, así que lo que ese cliente lee es lo que muestra el panel. La propia lectura recupera el punto en cuanto el dispositivo responde, y también lo hace apagar el sustituto. Elegir un sustituto es elegir disponibilidad, así que las alarmas y las expresiones siguen juzgando el punto como si tuviera un valor; lo que eso cuesta se paga a la vista, porque el diario técnico sigue registrando la lectura fallida y el estado de salud del dispositivo sigue informando de que está sin conexión. Un sustituto responde a "qué debe mostrar este punto", nunca a "está ahí el equipo". Un valor de sustitución declarado fuera de los límites habilitados se avisa allí donde se escribe: "Fuera de los límites (de 0 a 100): el valor que sustituye una lectura fallida."
Una lectura que enmudece cuenta como una lectura fallida. Cuando no llega ninguna lectura nueva durante el intervalo de sondeo del tag más 10 segundos, como cuando un dispositivo acepta la conexión y después deja de responder, la política de arriba se aplica como si la lectura hubiera fallado, para todo lo que lee el tag: las expresiones de Logic, los paneles de control, lo que se registra y los agentes. Con Mostrar el error el tag se lee vacío y su calidad pasa a mala, mientras el servidor OPC UA integrado conserva en el nodo el último valor del dispositivo con UncertainLastUsableValue en lugar de Good, de modo que un cliente externo ve el número que tenía y sabe que nada lo renueva; con un sustituto, el sustituto se presenta y se publica como arriba. Las alarmas mantienen su estado mientras la calidad es mala, como siempre. La tarjeta Valor en vivo dice por qué ("No ha llegado ninguna lectura nueva desde la marca de tiempo de la aplicación. El tag lo cuenta como una lectura fallida."), las marcas de tiempo siguen fechando la última lectura que aterrizó, y la próxima lectura que aterrice devuelve el tag.
Un tag de Solo escritura no tiene ninguna de estas políticas. La estación nunca lo lee, así que ninguna lectura suya puede fallar: hasta que la estación escribe en él, el tag no tiene valor y lo dice, sin sustituto, sin punto ámbar y sin nada publicado en su lugar por OPC UA, y el panel no dibuja esta fila para él. Una política elegida mientras el tag se leía se queda guardada y se ignora mientras el tag sea de Solo escritura; vuelve a aplicarse en cuanto el acceso sea Solo lectura o Lectura y escritura.
Valores fuera de rango
Acciones de Límites para un valor fuera del Mín y el Máx:
| Acción | El valor pasa a ser | Calidad |
|---|---|---|
| Nulo | Un hueco (sin valor). | buena |
| Recorte (por defecto) | La cota más cercana. | buena |
| Error y nulo | Un hueco. | mala (falta de límite) |
| Error y recorte | La cota más cercana. | mala (falta de límite) |
| NaN | NaN. | buena. Se ofrece solo en tags Float y Double, cuyo tipo puede representarlo; permite que un canal de Process clasifique el valor no válido. Una acción NaN que una escritura de agente o una copia de seguridad restaurada dejen en un tag entero degrada al hueco de Nulo. |
Una falta de límite se pliega dentro de la calidad efectiva del tag, así que el punto en vivo, las expresiones de propiedad y las alarmas ven todos el valor fuera de límites como malo sin ningún cableado añadido, y la tarjeta Conversión imprime "El valor 130 está fuera de los límites (de 0 a 100)." Sigue siendo una condición de proceso más que un problema de conexión, y el estado de salud del dispositivo no cuenta por ello al dispositivo como sin conexión.
Boolean, String y los demás tipos
Los tipos no numéricos tienen sus propias transformaciones en la misma tarjeta Conversión:
- Booleano: Invertir informa de la negación lógica del valor bruto.
- String: Inicio de la subcadena (desde 0) y Longitud (en blanco = hasta el final) recortan una ventana de la cadena bruta; una longitud en blanco llega hasta el final, y las cotas fuera de rango se recortan en lugar de fallar.
- Todos los demás tipos (DateTime, Guid, ByteString) pasan sin cambios. Su tarjeta Conversión lleva solo la etapa Lectura no válida, con la política para el dispositivo que no respondió, y un tag de Solo escritura de esos tipos no muestra tarjeta.
Mostrar el error y mantener el último valor bueno se aplican a todos los tipos; sustituir por un valor se ofrece solo en los tags numéricos y booleanos, así que un tag String, DateTime, Guid o ByteString no lo lista. Una sustitución ya guardada en un tag de uno de esos tipos, como podía guardarla una versión anterior, se obedece como mostrar el error, y la siguiente vez que se guarda el tag, desde el panel o por un agente, se guarda mostrar el error en su lugar. La política de NaN se aplica solo a los tags numéricos.
Las escrituras deshacen la cadena
El campo de escritura de la tarjeta Valor en vivo toma un valor de ingeniería y deshace en orden las etapas habilitadas que son invertibles: recorta al Mín y al Máx cuando Límites está habilitada (una escritura siempre se recorta, nunca se descarta, sea cual sea la acción de límite), descalibra ((valor − Lineal) ÷ Angular), desescala igual, y luego convierte al tipo del tag. Un tag entero cuya Escala o Calibración cambia el valor acepta una fracción: 123,4 en un tag Int16 con escala 0,1 escribe 1234. Sin una etapa así, una fracción escrita en un tag entero se redondea al número entero más cercano, y las mitades van lejos de cero (2,5 escribe 3). El redondeo pierde información y no se deshace. Una entrada booleana vuelve a aplicar Invertir. La subcadena de String es solo de visualización, así que una escritura de cadena envía el valor entero tal cual; DateTime, Guid y ByteString pasan sin cambios. Un valor escrito por un cliente OPC UA externo sobre el nodo público ya es bruto y no cruza nada de esto.