Visión general

Los meta puntos se configuran creando un "contexto" de puntos existentes, se hacen accesibles después de ejecutar un guión. Los puntos en este contexto pueden ser cualquier punto existente, incluyendo el punto que se está editando. (El punto actual debe ser guardado para que aparezca en la lista de puntos.

Configuración de puntos

Tipo de datos determina el tipo que será devuelto por el guión.

Contexto del guión define los puntos necesarios para la ejecución del guión. A cada punto añadido se le asigna un campo Var, que será el nombre de la variable del punto en el guión. Estos nombres de variables deben ser consistentes con el nombre de la variable ECMAScript: Deben estar con un guión bajo, y no deben contener espacios. Pueden aplicarse otras restricciones. Recibirá una validación de la ejecución del guión o excepciones si las variables no están correctamente definidas. Para añadir un punto al contexto, selecciónelo en la lista y haga clic en el icono . Para eliminar un punto, haga clic en el icono asociado al punto . No deben añadirse puntos innecesarios al contexto, ya que ello dará lugar a un consumo adicional de memoria en la preparación de los datos. Las variables innecesarias pueden causar la ejecución involuntaria del guión. (Véase "Ejecución del guión" más adelante). A veces puede ser útil incluir una variable de guión en el contexto para desencadenar la ejecución de un guión.

Guiones

La ventana Script es el espacio donde se escriben los guiones a ejecutar. Los scripts deben ser compatibles con ECMAScript, y siempre deben devolver un valor. Ejemplo de escritura elemental:

return x.value;

... x es el nombre de una variable definida en el contexto del guión. El valor devuelto es simplemente el valor actual del punto al que se refiere la "x". Se pueden utilizar las funciones matemáticas típicas. Un ejemplo más complejo:

return Math.sqrt(x.value * 3);

Esto devuelve la raíz cuadrada del valor 'x' multiplicada por 3. (Nota: el objeto Math está definido por JavaScript. ver la documentación de ECMAScript para más información). Se pueden escribir guiones complejos incluyendo variables locales, bucles y expresiones lógicas. Por ejemplo:

var t = x.value + y.value;
if (b.value) {
    for (var i=0; i<5; i++) {
        tmp += x.value - y.value;
    }
}
else {
    tmp = -tmp;
}
return tmp;

Lo anterior no tiene por objeto calcular un valor útil sino más bien demostrar el potencial de los guiones complejos.

Además del contexto ECMAScript, Scada-LTS también puede incluir útiles funciones globales como max(), min(), avg() y sum(). (Estas funciones se implementan en un archivo de script ubicado en WEB-INF/scripts/scriptFunctions.js. Este archivo puede ser modificado o mejorado añadiendo sus propias funciones globales si es necesario. Este archivo se carga cuando se inicia el Scada-LTS, por lo que cada modificación requiere un reinicio para ser tenida en cuenta). Para usarlos, sólo tienes que llamarlos desde tu guión, por ejemplo:

return max(x.value, y.value, z.value);

Esto devuelve los valores máximos de los valores actuales de "x", "y" y "z". Se puede dar cualquier número de parámetros a estas funciones globales.

Una vez escrito el guión, haz clic en el icono para ejecutarlo e intentar calcular el resultado.

Valores de tiempo

También puedes usar la marca de tiempo del último valor del guión. Se pueden utilizar los siguientes campos:

p.time
devuelve la marca de tiempo del valor en milisegundos a partir de la fecha de referencia 01/01/1970 a 00:00:00
p.millis
0-999 milisegundo de p.time
p.segundo
0-60
p.minuto
0-60
p.hora
0-23
p.día
1-28,31
p.díadelasemana
1-7 o 1 corresponde al domingo
p.díadelaño
1-365,366
p.mes
1-12
p.año
sur 4 digits

Para definir explícitamente la marca de tiempo de un valor, declare la variable de contexto TIMESTAMP antes de la declaración de retorno. El valor de esta variable debe ser en milisegundos relativo a la fecha de referencia 01/01/1970 00:00:00 UTC. Por ejemplo, el valor de esta variable debe ser en milisegundos:

TIMESTAMP = new Date().getTime();
return p.value + 1;

Objetos de contexto

En la terminología de JavaScript la variable var es en realidad un objeto. Un objeto es un contenedor de valores y funciones que puede ser referenciado por nombres de propiedades. Para obtener descripciones de las propiedades disponibles para su uso en un script, utilice la propiedad de ayuda, por ejemplo:

return x.help;

Este guión es más eficiente para los datos alfanuméricos, pero no es obligatorio. La propiedad help es idéntica a la función toString(), que está disponible para todos los objetos del contexto y no sólo en las variables del script.

La propiedad del valor es el valor actual del punto. El tipo del valor de JavaScript es idéntico al tipo de Scada-LT: Binario se convierte en booleano, Numérico se convierte en flotante, Multiestado se convierte en entero, y Alfanumérico se convierte en cadena.

Cada variable del guión también implementa 4 funciones. Los objetos devueltos por estas funciones dependen del tipo de datos del punto al que se refiere la variable. De nuevo, la propiedad de ayuda puede ser usada para obtener la descripción del objeto devuelto. Para el parámetro "periodType" de todas las funciones a continuación, se pueden utilizar las siguientes variables globales predefinidas: SEGUNDO, MINUTO, HORA, DÍA, SEMANA, MES y AÑO.

La función ago() devuelve el valor del punto en un momento dado. Por ejemplo, la llamada "x.ago(HOUR, 3)" devuelve el valor que tenía el punto hace exactamente 3 horas.

La función past() devuelve un objeto que contiene estadísticas sobre un período ahora terminado. A continuación se describen los diversos objetos estadísticos.

Las funciones prev() y previous() son idénticas; esta última está prevista para la facilidad lingüística. Las funciones devuelven el mismo objeto estadístico que el pasado(), pero en un rango de tiempo diferente. El comienzo y el final de los períodos se definen para que coincidan con el tipo de período. Por ejemplo, si el tipo de período es HORARIO e igual a 1, y la función se ejecuta a las 18:05, el rango de tiempo utilizado será desde las 17:00 (incluido) hasta las 18:00 (excluido). Durante un período de 3, sería de 15:00 a 18:00. Además, el MES comienza a medianoche del primer día del mes anterior y termina el último día del mes anterior (para los períodos = a 1). Los otros períodos funcionan de la misma manera. La semana comienza el lunes a medianoche de acuerdo con las normas ISO.

Objetos estadísticos

Los objetos estadísticos son devueltos por las funciones past(), prev() y previous(). (Ver "Objetos de contexto" más arriba.) Las propiedades de los objetos devueltos dependen del tipo de datos del punto desde el que se generan. Los valores de tiempo de los objetos se almacenan como números enteros, pero representan el número de milisegundos desde el 1 de enero de 1970 a medianoche.

El objeto Estadísticas analógicas es devuelto por puntos numéricos. Contiene las siguientes propiedades:

Por ejemplo, el siguiente guión devuelve el valor mínimo de 'n' para la última hora:

return n.past(HOUR).minimum;

El objeto StartsAndRuntimeList es devuelto por los puntos binarios y multiestatales. Contiene las siguientes propiedades:

Cada objeto StartAndRuntime tiene las siguientes propiedades:

Para acceder a un objeto específico de StartAndRuntime en la lista, usa la función get(). Por ejemplo, la siguiente línea devuelve la proporción de tiempo durante la cual 'b' estuvo en el estado 'falso' durante los 2 meses anteriores.

return b.past(MONTH, 2).get(false).proportion;

El objeto ValueChangeCounter es devuelto por puntos alfanuméricos. Tiene la propiedad única de cambios, que es el número de cambios del punto durante el período. Por ejemplo, la siguiente línea devuelve el número de cambios 'b' en los últimos 45 minutos número de veces.

return b.previous(MINUTE, 45);

Por comodidad, si un objeto de escritura var es devuelto por una escritura, se usará su valor actual. Por lo tanto, el siguiente guión devolverá el valor actual de "x":

return x;

Sin embargo, el guión no devolverá la suma de "x" e "y":

return x + y;

... Tendrías que estar para este guión:

return x.value + y.value;

Ejecución del guión

Cada vez que se ejecuta un guión desde un punto, el resultado se asigna al punto como un valor de actualización. La hora (fecha?) de ejecución de un guión puede ser controlada con el valor Actualizar evento. El parámetro "Actualización de contexto" activa el guión cada vez que se actualiza un punto de contexto. Los otros parámetros desencadenan la ejecución del guión en una fecha programada.

El parámetro Tiempo de ejecución puede ser configurado para prevenir la ejecución múltiple no deseada de un guión. Si utiliza la opción "Actualizar contexto", la ejecución del guión se lanzará cada vez que se actualice un punto del contexto. Además, si los disparadores del guión se basan en el tiempo, el guión puede ejecutarse antes de que se actualicen los puntos y devolver resultados sesgados. El retraso en la ejecución del guión puede llevar a resultados más fiables. Si utiliza "Actualizar contexto" para la ejecución, el guión se ejecutará x segundos después de la última actualización de un punto de contexto. Para la ejecución basada en el tiempo, el guión se ejecutará x segundos después del evento definido.

La configuración Context change hace que el script se ejecute cada vez que se cambia un punto dentro de su contexto.

Más ejemplos

El siguiente guión calcula el promedio de rotación horaria de los puntos "n1" y "n2":

return avg(b1.past(HOUR).average, b2.past(HOUR).average);

Este guión calcula el número de pulsos por día a partir de un contador de pulsos incremental (con la opción "Inicio del día"):

return pulse.value - pulse.ago(DAY);

El siguiente guión no es muy útil en la práctica, pero sin embargo es interesante. Devuelve los números 1, 2 y 3 cíclicamente, el cambio aleatorio se produce sólo una vez cada 100 ejecuciones.

var r = Math.random();
if (r > 0.01)
    return x.value;

if (x.value == 3)
    return 1;
return x.value + 1;

Esta escritura devuelve la suma de los valores enteros de los 2 puntos numéricos 'r' y 't':

return parseInt(t.value) + parseInt(r.value);