Acciones
El editor de acciones: identidad y ubicación, el bloque del script, lo que un script puede leer y escribir, todos los mensajes de validación, el verbo Ejecutar y su diario, Habilitar y Deshabilitar, Copiar y Eliminar, y los límites de una ejecución.
Una acción es un bloque de sentencias JavaScript que lee el espacio de direcciones y escribe variables de memoria y tags. Las acciones son el camino de escritura de Logic: corren a petición (Ejecutar), por un disparador, o desde un Botón de un panel de control cableado a ellas. Seleccione una acción bajo la sección Acciones de la columna de Logic (o cree una con Nuevo… > Nueva acción) para abrir su editor; leer necesita Ver Logic, editar Configurar Logic, y ejecutar Operar Logic.
La cabecera muestra la marca de acción, el nombre, la línea "Un script que usted ejecuta a petición, o que un disparador ejecuta por usted, y que escribe variables y tags." y una insignia Deshabilitado mientras la acción está apagada. La columna del formulario lleva IDENTIDAD y SCRIPT; el carril lleva ÚLTIMA EJECUCIÓN.
Identidad
| Campo | Qué es | Valores / por defecto | Efecto |
|---|---|---|---|
| Nombre | El nombre visible y el rótulo bajo el que se anota una ejecución en el diario. | Texto libre; una acción nueva es ActionN; un nombre en blanco se guarda como Action. |
Se guarda solo con cada pulsación de tecla. Las acciones se referencian por identidad, así que cambiar el nombre no reescribe nada y no rompe nada. |
| Línea de ubicación | Dónde está archivada la acción, en palabras: Actions / Startup / Walk setpoint. |
Solo lectura. | Una acción no tiene dirección; la línea es un lugar, nunca algo que se escriba en una expresión. Se cambia con Mover a en el árbol. |
| Descripción (opcional) | Texto libre. | Vacío por defecto. | Ninguno. |
Script
La tarjeta SCRIPT es el editor de scripts con la indicación "Sentencias JavaScript (let, if, for, funciones). Escriba las variables de memoria por asignación (Variables.Setpoint = 21.5;) y los tags con Connector.Driver.Device.Tag.Write(value). Las lecturas no pasan por un filtro de calidad: compruebe .State() y proteja los huecos con ?? antes de operar." El script se guarda solo con cada pulsación de tecla y se valida cada medio segundo; el mensaje aparece bajo la indicación. La validación nunca ejecuta el script.
Un script es JavaScript corriente en modo estricto (variables locales, if, bucles, funciones, Math, Date, JSON) sobre el mismo espacio de direcciones y la misma superficie de lectura que las expresiones, con dos diferencias. Las lecturas no pasan por el filtro de calidad: un hueco se lee como null, así que compruebe .State() y proteja la aritmética con ??; manejar una lectura mala es para lo que sirven las acciones. Y un script puede leer variables de expresión (su valor publicado); solo una expresión no las puede referenciar.
Lo que una acción puede escribir
Exactamente dos construcciones cambian la planta, y las dos pasan por el punto único de escritura anotado en el diario:
| Escritura | Forma | Destino |
|---|---|---|
| Asignación de memoria | Variables.Setpoint = 21.5; o Variables.Forno.Setpoint = 21.5; |
Una variable de memoria, con sus niveles de carpeta incluidos. El valor se convierte al tipo de salida de la variable y se marca para retención cuando la variable es retentiva. |
| Escritura de tag | Connector.Simulated.Pump.Cmd.Write(true); |
Un tag en vivo. El valor es un valor de ingeniería: viaja hacia atrás por la cadena de conversión del tag hasta el valor bruto que acepta el dispositivo. |
Una escritura es de paso directo: lo que se aplicó antes de un fallo se queda aplicado, y el diario muestra cada escritura como valor antiguo a valor nuevo bajo el origen Acción. Una escritura fallida lanza un error y aborta esa ejecución, con el motivo en su resultado:
- "La escritura en 'X' se rechazó: el valor no es finito." (un NaN o un infinito)
- "'Tag' no está materializado en el connector." (un dispositivo deshabilitado, o un tag que el servidor integrado no lleva)
- "No se pudo convertir 'value' para 'Tag'."
- "'X' está protegida contra escritura por '
<holder>'." (una receta en marcha o un enclavamiento retienen el origen) - "Falló la escritura en 'Tag'. ¿Está el servidor en marcha?"
- "No se encontró la variable 'X'." y "'Variables.X' es una variable de expresión: se calcula, nunca se escribe."
Lo que la validación rechaza
| Mensaje | Causa |
|---|---|
| Se necesita un script. | El editor está vacío. |
| Error del script: … | El texto no se puede analizar. |
| Las direcciones deben ser estáticas: se accede a 'Root' con un segmento calculado. | Variables[name] o cualquier segmento que no sea literal. |
| Dirección incompleta '…'. | Una referencia demasiado corta para nombrar un punto. |
| No se encontró 'X'. | Una lectura, o un destino de asignación, que no resuelve nada. |
| Asigne a la propia variable: Variables.Name = value. | El lado izquierdo del = nombra un miembro, o va más adentro de lo que llega la dirección de una variable. |
| 'X' es una variable de expresión: se calcula, nunca se escribe. | Asignar a una variable de expresión. |
| Los puntos de 'Connector' son de solo lectura. Escriba los tags con Connector.Driver.Device.Tag.Write(value). | Asignar a cualquier raíz que no sea Variables (Process tiene su propio mensaje). |
| Los puntos de Process son de solo lectura en las acciones; los comandos de ensayo y las escrituras de preparación no se admiten desde scripts. | Asignar a un punto de Process, o llamar a Write sobre él. |
| Los comandos de ensayo de Process no se pueden llamar desde las acciones; los puntos de comando exponen valores de disponibilidad de solo lectura. | Llamar a Process.<Model>.<Unit>.Commands.Start() o a cualquier otro punto de comando; un punto Commands solo lee si el comando se podría ejecutar ahora. |
| Los operadores ++ y -- no se admiten en los puntos. Use Variables.Name = Variables.Name.ValueToReal() + 1. | Variables.N++. |
| Write(value) es la escritura del tag: Connector.Driver.Device.Tag.Write(value). | Write llamado sobre algo que no es una dirección de tag. |
Las variables locales de JavaScript (let x = 1; x = x + 1;) no las toca ninguna de estas reglas.
Ejecutar
Ejecutar es el verbo inicial de la barra sobre una acción abierta; se dibuja solo para un rol con Operar Logic y se pone en gris con "Runtime detenido" mientras la estación es de solo lectura (el bloqueo de ingeniería no lo pone en gris: ejecutar es operar, no configurar). Cuando el rol tiene además Configurar Logic, el borrador del editor se guarda primero y la ejecución corre la definición guardada; sin ese permiso, la ejecución corre la definición duradera (los campos son de solo lectura, así que las dos nunca difieren).
Toda ejecución corre en la única cola de la lógica con un motor de scripts nuevo, así que entre ejecuciones no se filtra ningún estado y una ejecución nunca se intercala con un ciclo, con otra acción ni con una escritura del operador. Una ejecución se aborta al pasar de 500 ms ("El script se abortó: superó el límite de tiempo de 500 ms (¿bucle infinito?)."), de 100.000 sentencias o de 4 MB de memoria, cada uno con un mensaje que nombra el límite. Una acción deshabilitada falla sin llegar a ejecutarse ("La acción está deshabilitada."); un runtime detenido contesta "El runtime de la lógica no está en ejecución." El registro de acciones informa "Ejecución correcta en 12 ms." o "Error en la ejecución: <reason>". Solo el fallo llega a la consola de Eventos, bajo el nombre de la acción y junto a lo que la invocó: Manual para el verbo, el nombre del disparador para una ejecución programada. Se anota como advertencia la primera vez, se resume mientras siga fallando por la misma causa, y se anota una vez más cuando se recupera, y esa línea de recuperación es la única entrada que una ejecución correcta escribe ahí. Una ejecución que simplemente sale bien, y todos los valores que escribe, se escriben solo en la captura detallada: un script que escribe en cada ciclo produce valores por millares, y una consola llena de ellos es una consola en la que nadie puede leer las noticias de la estación.
El carril ÚLTIMA EJECUCIÓN muestra cuándo corrió la acción por última vez (o "Nunca se ha ejecutado."), "Duración: N ms", el último error en una nota de precaución, y el recordatorio "Las ejecuciones se hacen en la única cola de la lógica. Solo una ejecución fallida llega a la consola de Eventos; una ejecución correcta, y todos los valores que escribe, se guardan para la captura detallada. Los disparadores invocan las acciones según su programación." El carril pertenece a la acción viva: un guardado automático nunca lo vacía; un reinicio del runtime sí.
Comandos
| Comando | Qué hace | En gris cuando | No se dibuja cuando |
|---|---|---|---|
| Ejecutar | Guarda el borrador (con Configurar Logic) y encola una ejecución. | El runtime está detenido. | El rol no tiene Operar Logic. |
| Habilitar / Deshabilitar | Cambia Habilitado; una acción deshabilitada rechaza Ejecutar y deja inactivo todo disparador vinculado a ella. | La estación está bloqueada o de solo lectura. | El rol no tiene Configurar Logic. |
| Copiar | Duplica la acción en la raíz Acciones con un nombre libre y abre la copia, que no tiene ninguna ejecución anotada ni ningún disparador vinculado. | La estación está bloqueada o de solo lectura. | El rol no tiene Configurar Logic. |
| Eliminar la acción | Pregunta "¿Eliminar 'X'? Esto quita la acción. Esta acción no se puede deshacer." Un disparador vinculado a ella se queda sin vínculo, no se elimina. | La estación está bloqueada o de solo lectura. | El rol no tiene Configurar Logic. |
El panel de la raíz Acciones lista todas las acciones con su estado en la columna Valor: "Habilitado · última ejecución <when>", con "· error" cuando la última ejecución falló, o "Deshabilitado".
Lo que las acciones no hacen
No despachan comandos de ensayo de Process, no preparan un procedimiento ni añaden un comentario a un ensayo (esos puntos son valores de disponibilidad y de preparación de solo lectura); no reconocen alarmas; no corren en paralelo; no guardan estado entre ejecuciones y no comparten funciones; y no las dispara ningún cambio de valor ni ninguna condición, solo Ejecutar, el intervalo de un disparador o un botón de un panel de control.