La chaîne de conversion

La conversion typée que partage chaque tag, de la lecture brute à la valeur physique, les deux politiques de lecture non exploitable, les actions hors limites, les transformations booléennes et de chaîne, et comment une écriture remonte les étapes.

Afficher en Markdown

Chaque tag partage une seule chaîne de conversion typée qui transforme la lecture brute en valeur physique. La chaîne vit dans le tag lui-même : la carte Conversion de la page Tags et la grille de l'équipement montrent les mêmes étapes, et la valeur qui arrive dans Logic, sur les tableaux de bord, dans l'enregistreur et dans ce que la station publie est celle qui sort de la dernière étape. Le nœud OPC UA public porte la valeur brute.

Le brut d'abord

La chaîne part de la valeur brute convertie vers le type de donnée du tag, et non de l'objet propre au pilote : un pilote qui remet 3,7 à un tag Int32 lit 4 en haut de la carte, et chaque étape continue à partir de ce 4. Une lecture que le type déclaré ne peut pas porter du tout (du texte là où un nombre est déclaré) est une lecture vide, jamais un zéro de remplacement. Les étapes calculent en nombres réels, et à l'autre bout la valeur physique prend son type :

Tag Valeur physique
Type de donnée entier, Mise à l'échelle et Étalonnage désactivés, ou activés avec un facteur de 1 et un décalage de 0 (comme naît tout tag) Le nombre entier lui-même, dans le type de donnée du tag.
Type de donnée entier, Mise à l'échelle ou Étalonnage qui change la valeur Un nombre réel (Double), arrondi par l'étape Décimales : un tag Int16 qui porte une température multipliée par dix lit 235 sur l'équipement et 23,5 mis à l'échelle par 0,1.
Float ou Double Le type de donnée du tag, si bien qu'un tag Float s'arrondit à ce qu'un flottant peut représenter.

Le type de donnée reste ce que portent l'équipement et le nœud OPC UA public. Activer ou désactiver la Mise à l'échelle ou l'Étalonnage change le type de la valeur physique à partir de ce moment : ce que l'enregistreur a déjà enregistré reste tel qu'enregistré, et une voie garde le type qu'elle déclare, si bien qu'une voie Entier enregistre la valeur arrondie à l'entier le plus proche et qu'une voie Décimal garde les décimales. La carte Conversion se referme sur la valeur fournie et signale quand un type entier que la Mise à l'échelle et l'Étalonnage laissent tel quel arrondit les décimales d'une borne sur laquelle Limites écrête.

Les étapes

Pour les types numériques, la chaîne est une suite d'étapes, chacune avec sa case ; une étape désactivée laisse passer son entrée, et la carte affiche la valeur courante à la fin de chaque étape pour que vous puissiez suivre une lecture en direct à travers le calcul :

Étape Défaut Ce qu'elle fait
Mise à l'échelle activée échelle = brut × Angulaire + Linéaire. Angulaire vaut 1 par défaut, Linéaire 0. Un Angulaire de 0 est refusé là où il est saisi (« Un facteur d'échelle de 0 mettrait chaque lecture à zéro. Saisissez le facteur multiplicateur (1 conserve la valeur). »), parce qu'il mettrait chaque lecture à zéro et que l'aperçu et la chaîne conservée ne doivent jamais se contredire.
Étalonnage désactivée Une seconde paire linéaire appliquée à la valeur mise à l'échelle : étalonné = échelle × Angulaire + Linéaire. Tenue à part de la mise à l'échelle pour qu'un ajustement avant/après ne dérange pas le calcul de plage, et gouvernée par sa propre permission ; voir Étalonnage. Un Angulaire de 0 est refusé de la même façon.
Lecture non valide toujours affichée Deux politiques pour les lectures qui ne portent aucun nombre utilisable (ci-dessous). Ce n'est pas une case : son « désactivé » est lui-même l'une des deux réponses.
Limites désactivée Juge la valeur face à Mini (0 par défaut) et Maxi (100 par défaut) et applique l'action hors limites choisie (ci-dessous). Les bornes sont normalisées, si bien qu'un Mini au-dessus du Maxi n'échoue jamais : la plus petite des deux est le plancher.
Décimales activée Arrondit à Décimales chiffres, 2 par défaut, accepté de 0 à 15.

Les deux étapes linéaires portent un assistant Deux points qui calcule la paire à partir de deux points de référence ; il est décrit pas à pas sur Étalonnage.

L'équipement a répondu sans nombre

Un thermocouple ouvert, une voie sans capteur : la lecture est arrivée, l'équipement parle, mais la mesure est NaN. Tags numériques seulement, et la qualité reste bonne dans les deux cas :

Politique Effet
Laisser passer (défaut) Le NaN poursuit son chemin intact et saute entièrement l'étape Limites, quelle que soit l'action qu'elle porte : les limites jugent des nombres, et il n'y en a pas ici. L'infini n'est pas un NaN et sature toujours sur la plage.
Remplacer par une valeur Le nombre déclaré prend la place à partir de cette étape et entre dans Limites, Décimales et la conversion finale comme n'importe quelle lecture.

L'équipement n'a pas répondu

Un délai dépassé, un câble sectionné, un équipement éteint, une exception du pilote. Tous les types, mais un tag qui lit du texte, un horodatage, un identifiant ou un bloc d'octets ne se voit proposer que les deux premières politiques : une valeur de remplacement déclarée est un nombre, et une lecture de ces types n'en est pas un.

Politique Effet
Afficher l'erreur (défaut) Le tag se lit vide et sa qualité devient mauvaise, si bien que le défaut apparaît partout d'un coup.
Maintenir la dernière valeur correcte La dernière lecture arrivée reste affichée, sans péremption, jusqu'à ce que l'équipement réponde de nouveau. Les horodatages continuent de désigner cette lecture, parce que c'est là que le nombre a été mesuré. Rien n'est maintenu avant l'arrivée de la première lecture ; le tag se lit vide d'ici là.
Remplacer par une valeur Le nombre déclaré est présenté tel quel : il n'y a aucune lecture à faire passer par les étapes, donc il n'est ni mis à l'échelle, ni étalonné, ni arrondi, seulement converti vers le type de la valeur physique. Proposé pour les types numériques et le booléen, dont la lecture peut naître d'un nombre ; pas pour String, DateTime, Guid ni ByteString.

Une valeur de remplacement n'est jamais silencieuse : la carte Valeur en direct en imprime la raison (« Dernière valeur correcte, maintenue tant que l'équipement ne répond pas. »), le point en direct passe à l'orange, le serveur OPC UA intégré publie la valeur avec un statut de substitution au lieu d'un Good simple, et un agent qui lit le tag avec tag_read apprend de quelle valeur de remplacement il s'agit (substitution). Elle reste publiée aussi longtemps que la politique le demande : un équipement qui continue de ne pas répondre ne fait pas alterner un client externe entre la valeur de remplacement et un échec de lecture, si bien que ce que ce client lit est ce que le volet affiche. La lecture elle-même reprend le point dès que l'équipement répond, et éteindre la valeur de remplacement fait de même. Choisir une valeur de remplacement, c'est choisir la disponibilité, si bien que les alarmes et les expressions continuent de juger le point comme s'il avait une valeur ; ce que cela coûte est remboursé au grand jour, parce que le journal enregistre toujours la lecture en échec et que l'état de santé signale toujours l'équipement hors ligne. Une valeur de remplacement répond à « qu'est-ce que ce point devrait afficher », jamais à « l'équipement est-il là ». Une valeur de remplacement déclarée en dehors des limites activées est signalée là où elle est saisie : « Hors des limites (de 0 à 100) : la valeur qui remplace une lecture en échec. »

Une lecture qui se tait compte comme une lecture en échec. Quand aucune nouvelle lecture n'arrive pendant l'intervalle de scrutation du tag plus 10 secondes, comme lorsqu'un équipement accepte la connexion puis cesse de répondre, la politique ci-dessus s'applique comme si la lecture avait échoué, pour tout ce qui lit le tag : les expressions de Logic, les tableaux de bord, ce qui est enregistré et les agents. Avec Afficher l'erreur, le tag se lit vide et sa qualité devient mauvaise, tandis que le serveur OPC UA intégré garde sur le nœud la dernière valeur de l'équipement avec UncertainLastUsableValue au lieu de Good, si bien qu'un client externe voit le nombre qu'il avait et sait que rien ne le renouvelle ; avec une valeur de remplacement, celle-ci est présentée et publiée comme ci-dessus. Les alarmes gardent leur état tant que la qualité est mauvaise, comme toujours. La carte Valeur en direct dit pourquoi (« Aucune nouvelle lecture n'est arrivée depuis l'horodatage de l'application. Le tag compte cela comme une lecture en échec. »), les horodatages continuent de dater la dernière lecture arrivée, et la prochaine lecture qui arrive rétablit le tag.

Un tag en écriture seule n'a aucune de ces politiques. La station ne le lit jamais, donc aucune lecture ne peut y échouer : tant que la station n'y a pas écrit, le tag n'a pas de valeur et le dit, sans valeur de remplacement, sans point orange et sans que rien soit publié à sa place sur OPC UA, et le volet ne dessine pas cette ligne pour lui. Une politique choisie pendant que le tag était lu reste enregistrée et est ignorée tant que le tag est en écriture seule ; elle s'applique de nouveau dès que l'accès est Lecture seule ou Lecture et écriture.

Les valeurs hors limites

Les actions de Limites pour une valeur en dehors du mini et du maxi :

Action La valeur devient Qualité
Valeur nulle Un vide (aucune valeur). bonne
Écrêter (défaut) La borne la plus proche. bonne
Erreur et valeur nulle Un vide. mauvaise (défaut de limite)
Erreur et écrêtage La borne la plus proche. mauvaise (défaut de limite)
NaN NaN. bonne. Proposée seulement pour les tags Float et Double, dont le type sait la représenter ; elle laisse une voie Process classer la valeur non exploitable. Une action NaN laissée sur un tag entier par une écriture d'agent ou une sauvegarde restaurée se dégrade vers le vide de Valeur nulle.

Un défaut de limite se replie dans la qualité effective du tag, si bien que le point en direct, les expressions de propriété et les alarmes voient tous la valeur hors limites comme mauvaise sans câblage supplémentaire, et la carte Conversion imprime « La valeur 130 est hors des limites (de 0 à 100). » Cela reste une condition du procédé plutôt qu'un problème de connexion, et l'état de santé de l'équipement ne compte pas l'équipement hors ligne pour autant.

Booléen, chaîne et autres types

Les types non numériques ont leurs propres transformations dans la même carte Conversion :

  • Booléen : Inverser rapporte la négation logique de la valeur brute.
  • Chaîne : Début de la sous-chaîne (à partir de 0) et Longueur (vide = jusqu'à la fin) découpent une fenêtre dans la chaîne brute ; une longueur vide va jusqu'au bout, et des bornes hors plage sont écrêtées plutôt que d'échouer.
  • Tout autre type (DateTime, Guid, ByteString) passe inchangé. Sa carte Conversion ne porte que l'étape Lecture non valide, avec la politique pour l'équipement qui n'a pas répondu, et un tag en écriture seule de ces types n'affiche aucune carte.

Afficher l'erreur et maintenir la dernière valeur correcte s'appliquent à tous les types ; remplacer par une valeur n'est proposé que pour les tags numériques et booléens, si bien qu'un tag String, DateTime, Guid ou ByteString ne le liste pas. Un remplacement déjà enregistré sur un tag de l'un de ces types, comme une version antérieure pouvait l'enregistrer, est obéi comme Afficher l'erreur, et le prochain enregistrement du tag, depuis le volet ou par un agent, met l'affichage de l'erreur à sa place. La politique NaN ne s'applique qu'aux tags numériques.

Une écriture remonte la chaîne

Le champ d'écriture de la carte Valeur en direct prend une valeur physique et remonte dans l'ordre les étapes activées et inversibles : écrêtage au mini et au maxi quand Limites est activée (une écriture est toujours écrêtée, jamais abandonnée, quelle que soit l'action de limite), désétalonnage ((valeur − Linéaire) ÷ Angulaire), retour d'échelle de la même façon, puis conversion vers le type du tag. Un tag entier dont la Mise à l'échelle ou l'Étalonnage change la valeur accepte une fraction : 123,4 sur un tag Int16 mis à l'échelle par 0,1 écrit 1234. Sans étape de ce genre, une fraction écrite dans un tag entier est arrondie à l'entier le plus proche, les moitiés loin de zéro (2,5 écrit 3). L'arrondi perd de l'information et n'est pas remonté. Une entrée booléenne réapplique Inverser. Une sous-chaîne n'est qu'un affichage, si bien qu'une écriture de chaîne envoie la valeur entière telle quelle ; DateTime, Guid et ByteString passent tels quels. Une valeur écrite par un client OPC UA externe sur le nœud public est déjà brute et ne traverse rien de tout cela.