Acciones

El editor de la acción: identidad y ubicación, el bloque de script, lo que un script puede leer y escribir, todos los mensajes de validación, el verbo Ejecutar y su registro, Activar y Desactivar, Copiar y Eliminar, y los límites de una ejecución.

Ver como Markdown

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: se ejecutan a solicitud (Ejecutar), por un disparador, o desde un Botón de panel de control conectado 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; leerlo necesita Ver Logic, editarlo Configurar Logic, y ejecutarlo Operar Logic.

El encabezado muestra la marca de acción, el nombre, la línea "Un script que usted ejecuta a solicitud, o que un disparador ejecuta por usted, y que escribe variables y tags." y una pastilla Desactivado mientras la acción está apagada. La columna del formulario lleva IDENTIDAD y SCRIPT; el riel lleva ÚLTIMA EJECUCIÓN.

La identidad

Campo Qué es Valores / valor inicial Efecto
Nombre El nombre visible y el rótulo bajo el que se registra una ejecución. Texto libre; una acción nueva es ActionN; un nombre en blanco se guarda como Action. Se guarda solo con cada tecla. Las acciones se referencian por identidad, así que renombrarlas no reescribe nada ni rompe nada.
Línea de ubicación Dónde está archivada la acción, en palabras: Acciones / Arranque / Mover la consigna. De solo lectura. Una acción no tiene dirección; la línea es un lugar, nunca algo que se escriba en una expresión. Cámbiela con Mover a en el árbol.
Descripción (opcional) Texto libre. Vacía al inicio. Ninguno.

El script

La tarjeta SCRIPT es el editor de scripts con la pista "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: verifique .State() y proteja los huecos con ?? antes de operar." El script se guarda solo con cada tecla y se valida cada medio segundo; el mensaje aparece debajo de la pista. La validación nunca ejecuta el script.

Un script es JavaScript ordinario en modo estricto (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 la compuerta de calidad: un hueco se lee como null, así que verifique .State() y proteja la aritmética con ??; atender una lectura mala es justamente para lo que sirven las acciones. Y un script sí 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 modifican la planta, y las dos pasan por el punto único de escritura que queda registrado:

Escritura Forma Destino
Asignación de memoria Variables.Setpoint = 21.5; o Variables.Horno.Setpoint = 21.5; Una variable de memoria, con los niveles de carpeta incluidos. El valor se fuerza 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 toma el dispositivo.

Una escritura es de paso directo: lo que se aplicó antes de una falla se queda aplicado, y el diario técnico muestra cada escritura como valor anterior a valor nuevo bajo la fuente Acción. Una escritura fallida lanza un error y aborta esa ejecución, con el motivo en su resultado:

  • "Se rechazó la escritura en 'X': el valor no es finito." (NaN o infinito)
  • "'Tag' no está materializado en el connector." (un dispositivo desactivado, o un tag que el servidor integrado no lleva)
  • "No se pudo convertir 'value' para 'Tag'."
  • "'X' está protegida contra escritura por '<quien la retiene>'." (una corrida de receta o un enclavamiento retienen la fuente)
  • "Falló la escritura en 'Tag'. ¿El servidor está en marcha?"
  • "No se encontró la variable 'X'." y "'Variables.X' es una variable de expresión: se calcula, nunca se escribe."

Lo que rechaza la validación

Mensaje Causa
Se necesita un script. El editor está vacío.
Error del script: … El texto no se puede interpretar.
Las direcciones deben ser estáticas: se accede a 'Root' con un segmento calculado. Variables[nombre] 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 a nada.
Asigne a la propia variable: Variables.Name = value. El lado izquierdo del = nombra un miembro, o baja más de lo que puede 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 corrida y las escrituras de preparación no se admiten desde scripts. Asignar a un punto de Process, o llamar Write sobre él.
Los comandos de corrida de Process no se pueden llamar desde las acciones; los puntos de comando exponen valores de preparación de solo lectura. Llamar Process.<Modelo>.<Unidad>.Commands.Start() o 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 tocan 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 queda en gris con "Runtime detenido" mientras la estación está en 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 él, la ejecución corre la definición permanente (los campos son de solo lectura, así que las dos nunca difieren).

Cada ejecución se hace en la única cola de la lógica con un motor de scripts nuevo, así que no se filtra estado entre ejecuciones y una ejecución nunca se intercala con un ciclo, con otra acción ni con una escritura de operador. Una ejecución se aborta pasados 500 ms ("El script se abortó: superó el límite de tiempo de 500 ms (¿bucle infinito?)."), 100,000 sentencias o 4 MB de memoria, cada uno con un mensaje que nombra el límite. Una acción desactivada falla sin ejecutarse ("La acción está desactivada."); 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: <motivo>". A la consola de Eventos llega solo la falla, bajo el nombre de la acción junto con lo que la invocó: Manual para el verbo, el nombre del disparador para una ejecución programada. Se registra 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 novedades de la estación.

El riel ÚLTIMA EJECUCIÓN muestra cuándo se ejecutó 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 riel pertenece a la acción viva: un guardado automático nunca lo deja en blanco; un reinicio del runtime sí.

Los comandos

Comando Qué hace 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.
Activar / Desactivar Cambia Activado; una acción desactivada rechaza Ejecutar y deja inactivo a cada disparador vinculado a ella. La estación está bloqueada o en 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 registrada ni ningún disparador vinculado. La estación está bloqueada o en 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 en 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: "Activado · última ejecución <cuándo>", con "· error" cuando la última ejecución falló, o "Desactivado".

Lo que las acciones no hacen

No lanzan comandos de corrida de Process, no preparan un procedimiento ni agregan un comentario a una corrida (esos puntos son valores de preparación y de disponibilidad de solo lectura); no reconocen alarmas; no corren en paralelo; no guardan estado entre ejecuciones ni comparten funciones; y no se lanzan por cambios de valor ni por condiciones, solo con Ejecutar, con el intervalo de un disparador o con un botón de panel de control.