La chaîne de conversion
La conversion typée que chaque tag partage, de la lecture brute à la valeur physique, les deux politiques de lecture invalide, les actions de dépassement de plage, les transformations booléenne et textuelle, et comment une écriture remonte les étapes.
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.
D'abord le brut
La chaîne part de la valeur brute convertie vers le type de donnée du tag, 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 ferme 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 propre case; une étape désactivée laisse passer son entrée, et la carte montre la valeur courante à la sortie de chaque étape, pour que vous suiviez une lecture en direct à travers le calcul :
| Étape | Par défaut | Ce qu'elle fait |
|---|---|---|
| Mise à l'échelle | activée | mis à l'é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 enregistrée ne doivent jamais se contredire. |
| Étalonnage | désactivé | Une seconde paire linéaire appliquée à la valeur mise à l'échelle : étalonné = mis à l'échelle × Angulaire + Linéaire. Tenue à part de la mise à l'échelle pour qu'un ajustement d'avant et d'après ne dérange pas le calcul de la plage, et gouvernée par sa propre permission; voir Étalonnage. Un Angulaire de 0 y est refusé de la même façon. |
| Lecture non valide | toujours montrée | Deux politiques pour les lectures qui ne portent aucun nombre exploitable (ci-dessous). Ce n'est pas une case : son « désactivé » est déjà l'une des réponses. |
| Limites | désactivées | Jugent la valeur face à Mini (0 par défaut) et Maxi (100 par défaut) et appliquent l'action de dépassement choisie (ci-dessous). Les bornes sont normalisées : un Mini au-dessus du Maxi n'échoue donc jamais, c'est la plus petite des deux qui fait plancher. |
| Décimales | activées | Arrondit à Décimales chiffres, 2 par défaut, acceptées 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 (par défaut) | Le NaN poursuit sa route intact et saute entièrement l'étape Limites, quelle que soit l'action que cette étape 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 coupé, 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 offrir que les deux premières politiques : une valeur de remplacement déclarée est un nombre, et la lecture de ces types n'en est pas un.
| Politique | Effet |
|---|---|
| Afficher l'erreur (par défaut) | Le tag lit vide et sa qualité devient mauvaise, si bien que la panne se voit partout en même temps. |
| 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 à ce moment que le nombre a été mesuré. Rien n'est conservé avant la première lecture; le tag lit vide d'ici là. |
| Remplacer par une valeur | Le nombre déclaré est présenté tel que déclaré : il n'y a aucune lecture à faire passer par les étapes, il n'est donc ni mis à l'échelle, ni étalonné, ni arrondi, seulement converti vers le type de la valeur physique. Offerte pour les types numériques et le booléen, dont la lecture peut venir d'un nombre; pas pour String, DateTime, Guid ni ByteString. |
Une valeur de remplacement n'est jamais silencieuse : la carte Valeur en direct écrit pourquoi (« Dernière valeur correcte, maintenue tant que l'équipement ne répond pas. »), le point en direct passe à l'ambre, le serveur OPC UA intégré publie la valeur avec un statut de substitution plutôt qu'un simple Bonne, 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 l'exige : 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 montre. La lecture elle-même reprend le point dès que l'équipement répond, et désactiver la valeur de remplacement aussi. Choisir une valeur de remplacement, c'est choisir la disponibilité : les alarmes et les expressions continuent donc de juger le point comme s'il avait une valeur; ce que cela coûte est payé 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 montrer », jamais « l'équipement est-il là ». Une valeur de remplacement déclarée hors 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 lit vide et sa qualité devient mauvaise, pendant que le serveur OPC UA intégré garde sur le nœud la dernière valeur de l'équipement avec UncertainLastUsableValue plutôt que Bonne, 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 reçue, et la prochaine lecture reçue 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 ambre 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 plage
Les actions de Limites pour une valeur hors de Mini et Maxi :
| Action | La valeur devient | Qualité |
|---|---|---|
| Valeur nulle | Un vide (aucune valeur). | bonne |
| Écrêter (par 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. Offerte seulement pour les tags Float et Double, dont le type sait la représenter; elle laisse une voie Process classer la valeur invalide. Une action NaN laissée sur un tag entier par une écriture d'agent ou une sauvegarde restaurée retombe sur le vide de Null. |
Un défaut de limite entre dans la qualité effective du tag : le point en direct, les expressions de propriété et les alarmes voient donc tous la valeur hors limites comme mauvaise sans câblage supplémentaire, et la carte Conversion écrit « 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, texte et autres types
Les types non numériques ont leurs propres transformations dans la même carte Conversion :
- Booléen : Inverser annonce la négation logique de la valeur brute.
- Texte : 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'à la fin, et des bornes hors plage sont ramenées dans la plage plutôt que de faire échouer.
- Tout autre type (DateTime, Guid, ByteString) passe inchangé. Sa carte Conversion ne contient 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.
Montrer l'erreur et conserver la dernière bonne valeur s'appliquent à tous les types; remplacer par une valeur n'est offert que pour les tags numériques et booléens, si bien qu'un tag String, DateTime, Guid ou ByteString ne la 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 : ramener dans Mini et Maxi quand les Limites sont activées (une écriture est toujours ramenée dans la plage, jamais abandonnée, quelle que soit l'action de limite), désétalonner ((valeur − Linéaire) ÷ Angulaire), défaire la mise à l'échelle de la même façon, puis convertir 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 est destructeur et n'est pas remonté. Une entrée booléenne réapplique Inverser. Une sous-chaîne de texte n'existe que pour l'affichage : une écriture de texte envoie donc la valeur entière telle quelle; DateTime, Guid et ByteString passent inchangés. 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.