Vue d'ensemble

Les points Meta sont configurés en créant un "contexte" de points existants, ils deviennent accessible après l'exécution d'un script. Les points de ce contexte peuvent être n'importe quel point existants, y compris le point en cours d'édition. (Le point actuel doit être enregistré pour apparaître dans liste de points

Configuration du point

Type de donnée détermines the type qui sera renvoyé par le script.

Contexte script définit les points nécessaire pour l'exécution du script. A chaque point ajouté est affecté un champ Var, qui sera le nom de la variable du point dans le script. Ces noms de variables doivent être conformes au nom de variable ECMAScript: Elle doivent par une lettre ou trait de soulignement, et ne doivent pas contenir d'espace. D'autres contraintes peuvent s'appliquer. Vous recevrez des validation ou exception d'exécution du script si les variables ne sont pas correctement définies. Pour ajouter un point au contexte, sélectionnez le dans la liste et cliquez sur l'icône . Pour supprimer un point cliquez sur l'icône associé au point . Les points inutiles ne doivent pas être ajoutés au contexte car cela entrainera une consommation de mémoire supplémentaire dans la préparation des données. Des variables inutiles peuvent provoquer l'exécution involontaire de script. (Voir "exécution de script " ci-dessous.) Parfois, il peut être utile d'inclure une variable script dans le contexte afin de déclencher l'exécution d'un script.

Scripts

La fenêtre Script est l'espace ou sont écrit les scripts à exécuter. Les scripts doivent être conformes à la norme ECMAScript, et doivent toujours retourner une valeur. Exemple de script élémentaire:

return x.value;

... x est le nom d'une variable définie dans le contexte du script. La valeur retournée est simplement la valeur actuelle du point auquel 'x' fait référence. Les fonctions mathématiques typiques peuvent être utilisées. Exemple plus complexe:

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

Cela renvoie la racine carrée de la valeur du 'x' multipliée par 3. (Note: l'objet Math est définei par JavaScript. consultez la documentation ECMAScript pour plus d'informations.) Des scripts complexes peuvent être écrits incluant des variables locales, des boucles, et des expressions logiques. Par exemple:

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;

Ce qui précède n'est pas destiné à calculer une valeur utile mais plutôt de démontrer le potentiel des scripts complexes.

En complément du contexte ECMAScript, Scada-LTS peut aussi comporter des fonctions globales utiles y compris max(), min(), avg(), et sum(). (Ces fonctions sont implémentées dans un fichier de script situé dans WEB-INF/scripts/scriptFunctions.js. Ce fichier peut être modifié ou amélioré en ajoutant si nécessaire vos propres fonctions globales. Ce fichier est chargé au démarrage de Scada-LTS, chaque modification demande donc un redémarrage pour être prise en compte.) Pour les utiliser, il suffit de les appeler à partir de votre script, par exemple:

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

Ceci renvoie les valeurs maximales des valeurs actuelles 'x', 'y', et 'z'. N'importe quel nombre de paramètres peuvent être donnés à ces fonctions globales.

Une fois le script écrit, cliquez sur l'icône pour l'exécuter et tenter de calculer le résultat.

Valeurs de temps

On peut aussi utiliser le timestamp de la dernière valeur dans le script. Les champs suivants sont utilisables:

p.time
retourne le timestamp de la valeur en milliseconde à partir de la date de référence 01/01/1970 à 00:00:00
p.millis
0-999 milliseconde de p.time
p.second
0-60
p.minute
0-60
p.hour
0-23
p.day
1-28,31
p.dayOfWeek
1-7 ou 1 correspond au dimanche
p.dayOfYear
1-365,366
p.month
1-12
p.year
sur 4 digits

Pour définir explicitement le timestamp d'une valeur, Déclarez la variable TIMESTAMP du contexte avant l'instruction return. La valeur de cette variable doit être en milliseconde par rapport à la date de référence 01/01/1970 00:00:00 UTC. Par exemple:

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

Objets contexte

Dans la terminologie JavaScript la variable var est en réalité un objet. Un objet est un conteneur de valeurs et fonctions qui peuvent être référencées par les noms de propriété. Pour obtenir la descriptions des propriétés disponibles pour une utilisation dans un script, utilisez la propriété help , e.g.:

return x.help;

Ce script est plus efficace pour les données de type alphanumerique, mais ce n'est pas obligatoire. La propriété help property est identique à la fonction toString(), qui est disponible pour tous les objets du contexte et pas seulement dans les variables du script.

La propriété de la valeur est la valeur actuelle du point. Le type de la valeur JavaScript est identique au type de Scada-LTS: Binaire devient booléen, Numerique devient flottant, Multi-états devient entier, et Alphanumerique devient chaine.

Chaque variable de script implémente aussi 4 fonctions. Les objets retournés par ces fonctions dépendent du type de donnée du point auquel se réfere la variable. Encore une fois, la propriété help peut être utilisé pour obtenir la description de l'objet retourné. Pour le paramètre "periodType" de toutes les fonctions ci-dessous, les variables globales pré-definies suivantes peuvent être utilisées: SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, et YEAR.

La fonction ago() retourne la valeur du point à un instant passé. Par exemple, l'appel "x.ago(HOUR, 3)" retourne la valeur qu'avait le point exactement 3 heures auparavant.

La fonction past() retourne un object contenant des statistiques sur une période maintenant terminée. Ci-dessous une description des divers objets statistiques.

Les fonctions prev() et previous() sont identiques; la dernière est fournie pour une plus grande facilité linguistique. Les fonctions retournent le même objet statistique que past(), mais sur une plage de temps différente. Les débuts et fin de périodes sont définies pour correspondre au type de période. Par exemple, si la période est de type HOURLY et égale à 1, et si la fonction est lancée à 18:05, le laps de temps utilisé sera de 17:00 (inclus) à 18:00 (exclus). Pour une période de 3,ce serait de 15:00 à 18:00. Egalement, MONTH commence à minuit le premier jour du mois précédent et se termine le dernier jour du mois précédent (pour les périodes = à 1). Les autres périodes fonctionnes de la même façon. WEEK commence le lundi à minuit conformément aux standards de la norme ISO.

Objets statistiques

Les objets statistiques sont retournés par les fonctions past(), prev(), et previous(). (voir "Objets contexte" ci-dessus.) Les propriétés des objets retournés dépendent du type de donnée du point à partir duquel ils sont générés. Les valeurs de temps des objects sont stockés comme des entiers, mais représentent le nombre de milliseconde depuis le 1 Jan 1970 minuit.

L'objet AnalogStatistics est retourné par des points Numeriques. Il contient les propriétés suivantes:

Par exemple, le script suivant retourne la valeur minimum de 'n' de la dernière heure:

return n.past(HOUR).minimum;

L'objet StartsAndRuntimeList object est retourné par les points binaires et multi-états. Il contient les propriétés suivantes:

Chaque objet StartAndRuntime a les propriétés suivantes:

Pour accéder à un objet spécifique StartAndRuntime de la liste, utilisez la fonction get(). Par exemple, la ligne suivante retourne la proportion de temps pour laquelle 'b' était à l'état 'false' durant les 2 mois précédents.

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

L'objet ValueChangeCounter est retourné par des points Alphanumerique. Il possede la propriété unique changes, qui est le nombre de changement du point pendant la période. Par exemple, la ligne suivante retourne le nombre de changement 'b' dans les 45 dernières minutese number of times.

return b.previous(MINUTE, 45);

Pour plus de commodités, si un objet var script est retourné par un script, c'est sa valeur actuelle qui sera utilisée. Ainsi, le script suivant retournera la valeur actuelle de 'x':

return x;

Cependant, le script ne retournera pas la somme de 'x' et 'y':

return x + y;

... Il faudrait pour ce script:

return x.value + y.value;

Exécution de scripts

Chaque fois qu'un script est exécuté à partir d'un point, le résultat est affecté au point comme une valeur de mise à jour. Le temps (la date ?) d'exécution d'un script peut être contrôlé avec la valeur Update event. Le paramètre "Context update" déclenche le script à chaque mise à jour d'un point du contexte. Les autres paramètres déclenche l'exécution du script à une date prévue.

Le paramètre Délai d'exécution peut être renseigné pour empêcher l'exécution multiple et non désirée d'un script. En général plusieurs points interviennent dans un contexte, Si vous utilisez l'option "Mise à jour contexte" l'exécution du script se lancera achaque fois qu'un point du contexte est mis à jour. De même si les déclenchement du script est basé sur le temps, le script risque de s'exécuter avant la mise à jour des points, et retourner des résultats tendancieux. Le retard d'exécution de script peut apporter des résultats plus fiables. Si vous utilsez "Mise à jour contexte" pour l'exécution, le script se lancera x secondes après la dernière mise à jour d'un point du contexte. Pour une exécution basée sur le temps, le script se lancera x secondes après l'évènement défini.

Die Einstellung Context change bewirkt, dass das Skript immer dann ausgeführt wird, wenn ein Punkt innerhalb seines Kontexts geändert wird.

Plus d'exemples

Le script suivant calcul la moyenne horaire de roulement des points 'n1' et 'n2':

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

Ce script calcule le nombre de pulsations journalière à pertir d'un compteur incrémental de pulsations (avec l'option "Start of day"):

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

Le prochain script n'est pas très utile en pratique, mais il est néanmoins intéressant. Il retourne les nombres 1, 2, et 3 de façon cyclique, le changement aléatoire n'intervient qu'une fois toutes les 100 exécutions.

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

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

Ce script renvoie la somme des valeurs entières des 2 points numériques points 'r' et 't':

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