Actions

L'éditeur d'action : identité et emplacement, le bloc de script, ce qu'un script peut lire et écrire, chaque message de validation, le verbe Exécuter et sa journalisation, Activer et Désactiver, Copier et Supprimer, et les limites d'une exécution.

Afficher en Markdown

Une action est un bloc d'instructions JavaScript qui lit l'espace d'adressage et écrit des variables mémoire et des tags. Les actions sont le chemin d'écriture de Logic : elles s'exécutent à la demande (Exécuter), sur un déclencheur, ou depuis un Bouton de tableau de bord qui leur est associé. Sélectionnez une action sous la section Actions de la colonne Logic (ou créez-en une avec Nouveau… > Nouvelle action) pour ouvrir son éditeur; lire demande Voir Logic, modifier Configurer Logic, exécuter Piloter Logic.

L'en-tête montre la marque de l'action, le nom, la ligne « Un script que vous exécutez à la demande, ou qu'un déclencheur exécute pour vous, et qui écrit des variables et des tags. » et un badge Désactivée tant que l'action est éteinte. La colonne du formulaire porte IDENTITÉ et SCRIPT; le rail porte DERNIÈRE EXÉCUTION.

Identité

Champ Ce que c'est Valeurs et valeur par défaut Effet
Nom Le nom affiché et le libellé sous lequel une exécution est journalisée. Texte libre; une nouvelle action s'appelle ActionN; un nom vide s'enregistre comme Action. S'enregistre automatiquement à chaque frappe. Les actions sont référencées par identité : le renommage ne réécrit rien et ne casse rien.
Ligne d'emplacement Où l'action est classée, en toutes lettres : Actions / Startup / Walk setpoint. Lecture seule. Une action n'a pas d'adresse; la ligne est un endroit, jamais quelque chose à taper dans une expression. Changez-la avec Déplacer vers dans l'arborescence.
Description (facultative) Texte libre. Vide par défaut. Aucun.

Script

La carte SCRIPT est l'éditeur de script, avec l'indication « Instructions JavaScript (let, if, for, fonctions). Écrivez les variables mémoire par affectation (Variables.Setpoint = 21.5;) et les tags avec Connector.Driver.Device.Tag.Write(valeur). Les lectures ne passent pas la barrière de qualité : vérifiez .State() et protégez les vides avec ?? avant tout calcul. » Le script s'enregistre automatiquement à chaque frappe et est validé toutes les demi-secondes; le message apparaît sous l'indication. La validation n'exécute jamais le script.

Un script est du JavaScript ordinaire en mode strict (variables locales, if, boucles, fonctions, Math, Date, JSON) sur le même espace d'adressage et la même surface de lecture que les expressions, avec deux différences. Les lectures ne passent pas la barrière de qualité : un vide se lit comme null, alors vérifiez .State() et protégez le calcul avec ??; traiter une mauvaise lecture est justement ce à quoi servent les actions. Et un script peut lire des variables d'expression (leur valeur publiée); seule une expression ne peut pas les référencer.

Ce qu'une action peut écrire

Exactement deux constructions modifient l'installation, et les deux passent par le canal d'écriture journalisé :

Écriture Forme Cible
Affectation en mémoire Variables.Setpoint = 21.5; ou Variables.Forno.Setpoint = 21.5; Une variable mémoire, niveaux de dossier compris. La valeur est convertie vers le type de sortie de la variable et marquée pour la rémanence quand la variable est rémanente.
Écriture de tag Connector.Simulated.Pump.Cmd.Write(true); Un tag vivant. La valeur est une valeur physique : elle remonte à l'envers la chaîne de conversion du tag jusqu'à la valeur brute que l'équipement accepte.

Une écriture est immédiate : ce qui s'est appliqué avant un échec reste appliqué, et le journal montre chaque écriture de l'ancienne vers la nouvelle valeur sous la source Action. Une écriture en échec lève une erreur, ce qui interrompt cette exécution avec la raison dans son issue :

  • « L'écriture dans « X » a été rejetée: la valeur n'est pas finie. » (NaN ou infini)
  • « « Tag » n'est pas matérialisé dans le connecteur. » (un équipement désactivé, ou un tag que le serveur intégré ne porte pas)
  • « « value » n'a pas pu être converti pour « Tag ». »
  • « « X » est protégé en écriture par « <qui la retient> ». » (une recette en cours ou un verrouillage retient la source)
  • « L'écriture dans « Tag » a échoué. Le serveur fonctionne-t-il? »
  • « La variable « X » est introuvable. » et « « Variables.X » est calculée: seules les variables de mémoire sont écrites. »

Ce que la validation refuse

Message Cause
Un script est obligatoire. L'éditeur est vide.
Erreur de script : … Le texte ne s'analyse pas.
Les adresses doivent être statiques : « Root » est atteint par un segment calculé. Variables[name] ou tout segment qui n'est pas un littéral.
Adresse incomplète « … ». Une référence trop courte pour nommer un point.
« X » est introuvable. Une lecture, ou une cible d'affectation, qui ne se résout vers rien.
Affectez à la variable elle-même : Variables.Nom = valeur. La partie gauche du = nomme un membre, ou descend plus bas que ne va l'adresse d'une variable.
« X » est une variable d'expression : elle est calculée, jamais écrite. Une affectation à une variable d'expression.
Les points « Connector » sont en lecture seule. Écrivez les tags avec Connector.Driver.Device.Tag.Write(valeur). Une affectation à une racine autre que Variables (Process a son propre message).
Les points Process sont en lecture seule dans les actions; les commandes d'essai et les écritures de préparation ne sont pas prises en charge par les scripts. Une affectation à un point Process, ou un appel de Write sur un point Process.
Les commandes d'essai de Process ne peuvent pas être appelées depuis une action; les points de commande n'exposent que des valeurs de disponibilité en lecture seule. L'appel de Process.<Model>.<Unit>.Commands.Start() ou de tout autre point de commande; un point Commands ne fait que dire si la commande pourrait s'exécuter maintenant.
Les opérateurs ++ et -- ne sont pas pris en charge sur les points. Employez Variables.Nom = Variables.Nom.ValueToReal() + 1. Variables.N++.
Write(valeur) est l'écriture d'un tag : Connector.Driver.Device.Tag.Write(valeur). Write appelé sur autre chose qu'une adresse de tag.

Les variables locales de JavaScript (let x = 1; x = x + 1;) ne sont touchées par aucune de ces règles.

Exécuter

Exécuter est le verbe de tête de la barre au-dessus d'une action ouverte; il n'est dessiné que pour un rôle qui détient Piloter Logic et il est grisé avec « Runtime arrêté » pendant que la station est en lecture seule (le verrou d'ingénierie ne le grise pas : exécuter est du pilotage, pas de la configuration). Quand le rôle détient aussi Configurer Logic, le brouillon de l'éditeur est enregistré d'abord et l'exécution porte sur la définition enregistrée; sans cette permission, l'exécution porte sur la définition durable (les champs sont en lecture seule, donc les deux ne diffèrent jamais).

Chaque exécution se fait sur l'unique file de la logique avec un moteur de script neuf : aucun état ne fuit d'une exécution à l'autre, et une exécution ne s'intercale jamais dans un cycle, dans une autre action ni dans une écriture de l'opérateur. Une exécution est interrompue au-delà de 500 ms (« Le script a été interrompu : il a dépassé la limite de 500 ms (boucle infinie ?). »), de 100 000 instructions ou de 4 MB de mémoire, chacune avec un message qui nomme la limite. Une action désactivée échoue sans s'exécuter (« L'action est désactivée. »); un runtime arrêté répond « Le runtime de la logique ne fonctionne pas. » Le journal des actions signale « Exécution réussie en 12 ms. » ou « Échec de l'exécution : <raison> ». Seul l'échec parvient à la console Événements, sous le nom de l'action et avec ce qui l'a lancée : Manuel pour le verbe, le nom du déclencheur pour une exécution planifiée. Il est journalisé comme un avertissement la première fois, résumé tant qu'il échoue pour la même cause, et noté une fois encore au rétablissement, et cette ligne de rétablissement est la seule entrée qu'une exécution réussie y écrive jamais. Une exécution qui réussit simplement, et chaque valeur qu'elle écrit, ne vont qu'à la capture détaillée : un script qui écrit à chaque cycle produit des valeurs par milliers, et une console qui en est pleine est une console où personne ne lit les nouvelles de la station.

Le rail DERNIÈRE EXÉCUTION montre quand l'action s'est exécutée pour la dernière fois (ou « Jamais exécutée. »), « Durée : N ms », la dernière erreur dans une note de prudence, et le rappel « Les exécutions se font sur l'unique file de la logique. Seule une exécution en échec parvient à la console des événements; une exécution qui réussit, et chaque valeur qu'elle écrit, sont conservées pour la capture détaillée. Les déclencheurs lancent les actions selon leur planification. » Le rail appartient à l'action vivante : un enregistrement automatique ne le vide jamais; un redémarrage du runtime, si.

Commandes

Commande Ce qu'elle fait Grisée quand Non dessinée quand
Exécuter Enregistre le brouillon (avec Configurer Logic) et met une exécution en file. Runtime arrêté. Le rôle n'a pas Piloter Logic.
Activer / Désactiver Bascule Activée; une action désactivée refuse Exécuter et laisse inactif chaque déclencheur qui lui est associé. Station verrouillée ou en lecture seule. Le rôle n'a pas Configurer Logic.
Copier Duplique l'action à la racine Actions sous un nom libre et ouvre la copie, qui n'a aucune exécution enregistrée et aucun déclencheur associé. Station verrouillée ou en lecture seule. Le rôle n'a pas Configurer Logic.
Supprimer l'action Demande « Supprimer « X »? Cela retire l'action. Cette action est irréversible. » Un déclencheur qui lui était associé reste sans action, il n'est pas supprimé. Station verrouillée ou en lecture seule. Le rôle n'a pas Configurer Logic.

Le volet de la racine Actions liste chaque action avec son état dans la colonne Valeur : « Activée · dernière exécution <quand> », avec « · erreur » quand la dernière exécution a échoué, ou « Désactivée ».

Ce que les actions ne font pas

Elles ne lancent pas les commandes d'essai de Process, ne préparent pas une procédure et n'ajoutent pas de commentaire d'essai (ces points ne sont que des valeurs de disponibilité et de préparation, en lecture seule); elles n'acquittent pas les alarmes; elles ne s'exécutent pas en parallèle; elles ne gardent aucun état d'une exécution à l'autre et ne partagent aucune fonction; et elles ne partent ni sur un changement de valeur, ni sur une condition, mais seulement par Exécuter, par l'intervalle d'un déclencheur ou par un bouton de tableau de bord.