TECHNIQUE DE PESAGE · DÉVELOPPEMENT INTERNE · ASSISTANCE
+386 2 320 33 46info@preciz.si

PRECIZ · NEUTRON OPC UA

Neutron OPC UA — manuel d’intégration

Intégration OPC UA pour Neutron : connexions sécurisées, données de pesage en direct, capture stable et intégration PLC/SCADA.

Versions du manuel

Version du manuel : 1.0 · Date de publication : 18 octobre 2026
S’applique au micrologiciel Neutron 2.5.0 avec prise en charge OPC UA · Modèle d’information du fabricant 1.3.0

Tableau 1

Version

Date de publication

Modifications

1.0

18 octobre 2026

Première édition du manuel Neutron OPC UA. Modèle d’information NodeSet2 1.3.0 avec ActiveChannel pour lire le canal actif et SetChannel pour sélectionner le canal 1–4.

Vidéo : Neutron OPC UA

PRECIZ est membre de l’OPC Foundation

PRECIZ est officiellement inscrit comme membre de l’OPC Foundation. Voir l’inscription officielle de PRECIZ dans l’annuaire des membres de l’OPC Foundation.

1. Présentation et fonctions prises en charge

Neutron de PRECIZ fournit un serveur OPC UA pour l’intégration aux PLC, SCADA, MES et applications PC. L’interface utilise la communication OPC UA Client/Server sur UA-TCP avec encodage UA Binary.

Le serveur fournit :

  • Poids brut, net, tare et poids brut haute résolution en direct, ADC brut, stabilité, état de la balance, code d’erreur et unité.

  • Métadonnées de mesure : échelon, décimales, portée, unités d’ingénierie et plage d’ingénierie.

  • Identification de l’appareil et informations standard du serveur OPC UA.

  • Abonnements aux changements de données pour les valeurs en direct.

  • Lecture cohérente de onze champs de mesure provenant d’un même instantané.

  • Capture et récupération asynchrones d’une nouvelle mesure stable.

  • Tarage, tare prédéfinie, mise à zéro et effacement de la tare.

  • Réglage du filtre FT et du hachage ADC FC.

    Lisez le canal de pesage actif avec ActiveChannel et sélectionnez le canal 1–4 avec SetChannel (NodeSet2 1.3.0).

  • Deux sessions client simultanées.

  • Communication chiffrée en option, confiance des certificats d’application et autorisations de lecture ou de lecture et exécution de commandes.

Toutes les variables de processus exposées sont en lecture seule. Les opérations passent par les méthodes. L’interface ne fournit pas l’exécution arbitraire de commandes natives, le calibrage, la commande des sorties, le choix d’application, les résultats de comptage, l’historique, les événements ni OPC UA PubSub. Le modèle d’information est propre au fabricant PRECIZ, et non le modèle compagnon OPC UA Weighing ou Device Integration.

Trois façons d’obtenir une mesure répondent à des besoins distincts :

Tableau 2

Interface

Utilisation

Variables en direct et abonnements

Afficher ou surveiller en continu des valeurs individuelles

ReadMeasurement

Obtenir les onze champs de mesure d’un même instantané actuel

CaptureStableWeight puis GetCapturedMeasurement

Figer une nouvelle mesure valide et stable et la récupérer par identifiant de requête

2. Démarrage rapide

2.1 Activer le serveur

  1. Connectez-vous à la page locale de configuration Neutron ou à l’utilitaire Bluetooth. Utilisez HTTPS ou Bluetooth authentifié pour gérer certificats et utilisateurs.

  2. Sélectionnez l’interface réseau et relevez son adresse IP attribuée.

  3. Laissez l’acquisition de la balance activée dans les réglages Scale.

  4. Ouvrez l’onglet OPC UA. Le micrologiciel doit indiquer qu’OPC UA est disponible.

  5. Pour l’accès chiffré, créez d’abord un utilisateur dans Users & permissions.

  6. Dans Settings, activez le serveur, choisissez le mode de sécurité et conservez le port 4840 et l’intervalle minimal 100 ms pour la première connexion.

  7. Cliquez sur Save. Copiez l’adresse de connexion avec Copy endpoint.

Exemple de point de terminaison :

opc.tcp://192.168.50.73:4840

2.2 Se connecter avec UAExpert

  1. Ajoutez le point de terminaison comme serveur dans UAExpert.

  2. En mode chiffré, choisissez Basic256Sha256 / SignAndEncrypt et l’authentification Username/Password. En mode non protégé, choisissez None et Anonymous.

  3. Pour l’accès chiffré, comparez le certificat Neutron et marquez-le comme fiable. Si Neutron ne fait pas encore confiance au certificat client, suivez la section 4.2 puis reconnectez-vous.

  4. Connectez-vous et parcourez Objects → CS-NEUTRON Scale. Le NodeId de l’objet est Scale ; son nom affiché est CS-NEUTRON Scale.

  5. Glissez Gross, Net, Tare, Stable, Status, ErrorCode et Unit dans Data Access View.

  6. Dans le menu contextuel Data Access View, réglez l’intervalle de publication de l’abonnement et celui d’échantillonnage des éléments surveillés, initialement à 100 ms.

N’utilisez une valeur que si son OPC UA StatusCode est Good. ErrorCode=1 signifie que la balance native n’a pas d’erreur. Status=1 ou Status=3 décrit une indication stable.

3. Connexion et configuration

3.1 Point de terminaison et réseau

Le point de terminaison a la forme opc.tcp://<assigned-device-IP>:<port>. Utilisez l’adresse de l’interface Wi-Fi, Ethernet ou LTE sélectionnée. L’onglet OPC UA affiche l’adresse et propose un bouton de copie. Une adresse IP stable simplifie l’intégration.

Il n’est pas nécessaire de configurer l’adresse IP du PLC dans l’appareil. Autorisez le trafic TCP entrant sur le port choisi. Le client doit disposer d’une route réseau vers Neutron ; une adresse LTE derrière le NAT de l’opérateur n’est pas automatiquement accessible hors de ce réseau. Utilisez un réseau routé approprié, un APN privé ou un VPN.

3.2 Réglages

Tableau 3

Réglage

Clé

Valeur par défaut

Valeurs / effet

OPC UA disponible

OUB

Selon le micrologiciel

Lecture seule : 0 absent, 1 disponible

Prise en charge de la sécurité

OUS

Selon le micrologiciel

Lecture seule : 0 absent, 1 disponible

Serveur OPC UA

OUE

Désactivé

0 désactivé, 1 activé

Port TCP

OUP

4840

1024–65535 ; choisissez un port de service inutilisé

Intervalle minimal de mise à jour

OUI

100 ms

10–5000 ms ; intervalle minimal d’échantillonnage et de publication accepté par le serveur

Sécurité de la connexion

OUM

Non protégée

0 None/anonymous ; 1 Basic256Sha256/SignAndEncrypt avec nom d’utilisateur/mot de passe

Accès anonyme aux commandes

OUC

Désactivé

En mode non protégé uniquement : 0 lecture seule ; 1 toutes les commandes prises en charge sont autorisées

Enregistrer les réglages OPC UA redémarre le service OPC UA et déconnecte ses clients. Modifier les utilisateurs ou la confiance redémarre aussi le service. Reconnectez-vous après ces changements. Les réglages existants d’IP, de balance et d’horloge sont réutilisés.

L’intervalle minimal est une limite inférieure, pas une période de transmission fixe ni une garantie de latence de bout en bout. Les clients demandent leurs propres intervalles et doivent utiliser les valeurs révisées retournées par le serveur.

4. Sécurité et autorisations

4.1 Modes de connexion

Tableau 4

Mode

Politique / sécurité des messages

Authentification

Autorisation des commandes

Non protégée

None / None

Anonymous

Contrôlée par Anonymous command access

Chiffré

Basic256Sha256 / SignAndEncrypt

Nom d’utilisateur et mot de passe ; certificat d’application client de confiance

Contrôlée par l’autorisation de l’utilisateur

En mode chiffré, les sessions anonymes et la connexion utilisateur par certificat ne sont pas prises en charge. Le certificat de l’application client identifie le logiciel client ; il ne remplace pas l’authentification par nom d’utilisateur/mot de passe. Le PIN de configuration web et le certificat HTTPS sont distincts des identifiants et certificats OPC UA.

Utilisez le mode non protégé sur un réseau isolé de confiance. Il ne chiffre pas les données et n’authentifie pas les utilisateurs individuellement.

4.2 Première connexion chiffrée

  1. Ouvrez les réglages OPC UA de Neutron par HTTPS ou Bluetooth authentifié.

  2. Ajoutez un utilisateur. Les noms comportent 1–64 lettres ASCII, chiffres, traits de soulignement ou traits d’union et sont sensibles à la casse. Les mots de passe comportent 12–128 caractères. Jusqu’à huit utilisateurs sont pris en charge ; aucun compte OPC UA par défaut n’existe.

  3. Choisissez Read only ou Read and execute commands.

  4. Activez OPC UA chiffré et enregistrez. L’horloge doit être synchronisée et au moins un utilisateur doit exister. Le démarrage sécurisé attend la synchronisation de l’horloge.

  5. Au premier démarrage sécurisé, Neutron génère sa clé privée et un certificat d’application autosigné RSA-2048 valable cinq ans.

  6. Dans le client, comparez l’empreinte SHA-256 du certificat Neutron à celle affichée dans l’interface de configuration, puis marquez-le comme fiable.

  7. Tentez la connexion chiffrée. Neutron rejette un certificat d’application client inconnu et le liste dans Certificates comme rejected.

  8. Cliquez sur Refresh certificates and users, comparez l’empreinte du client et cliquez sur Approve pour ce certificat.

  9. Reconnectez-vous avec le nom d’utilisateur et le mot de passe.

Le client doit faire confiance à Neutron avant de pouvoir atteindre l’étape d’envoi de son propre certificat. L’approbation ne contourne pas les validations d’expiration, signature, usage de clé ou URI d’application.

4.3 Autorisations

Tableau 5

Opération

Lecture seule

Lecture et exécution de commandes

Lire les variables / s’abonner

Oui

Oui

ReadMeasurement

Oui

Oui

GetCapturedMeasurement

Oui

Oui

CaptureStableWeight

Non

Oui

TareCurrent, SetTare, Zero, ClearTare

Non

Oui

SetFilter, SetHRFilter, SetChannel

Non

Oui

Écrire les variables / administrer utilisateurs ou certificats par OPC UA

Non

Non

Les rôles enregistrés Reader et Operator correspondent à ces deux autorisations. Il n’existe pas de niveaux d’autorisation par commande. En mode chiffré, l’autorisation utilisateur s’applique ; OUC est ignoré. En mode non protégé, OUC autorise toutes les commandes prises en charge ou aucune.

Cinq échecs de connexion entraînent un blocage des connexions de 30 secondes sur tout le serveur. Cela peut aussi affecter temporairement les autres utilisateurs. Les mots de passe sont stockés sous forme de hachages PBKDF2-HMAC-SHA256 salés ; l’interface d’administration n’exporte ni mots de passe ni clés privées.

4.4 Identité de l’appareil, certificats CA et renouvellement

L’URI d’application de Neutron est :

urn:preciz:cs-neutron:<MID>

Le certificat généré contient cet URI, le nom d’hôte <MID>.local en minuscules et l’IP de l’appareil au moment de la génération. Conservez une adresse stable ou émettez un certificat de remplacement contenant les adresses utilisées par les clients.

Un certificat CA n’est pas nécessaire pour les certificats d’application autosignés explicitement approuvés. Pour une PKI gérée par l’entreprise :

  1. Choisissez Create and download CSR. La CSR utilise la clé existante de l’appareil.

  2. Faites émettre par la CA un certificat d’application OPC UA conservant l’URI d’application dans SAN, les usages étendus serveur/client et les usages de signature numérique/chiffrement de clé appropriés.

  3. Importez-le comme CA-signed device certificate. Sa clé privée doit correspondre à la clé existante de Neutron. Installez la chaîne CA nécessaire dans le client.

  4. Pour approuver les clients dont les certificats sont émis par une CA, importez la racine émettrice comme Trusted client certificate or CA. Importez les CA intermédiaires comme Intermediate issuer CA. Une entrée d’émetteur intermédiaire seule n’accorde pas la confiance.

  5. Si la révocation est contrôlée, importez les CRL signées par la CA comme Certificate revocation list et mettez-les à jour avant expiration. Importez d’abord les CA émettrices.

Les imports pris en charge sont PEM ou DER, jusqu’à 8192 octets par fichier. Chaque magasin de certificats fiables, rejetés, d’émetteurs et de CRL contient jusqu’à 12 entrées. Supprimez les anciennes entrées rejetées lorsque ce magasin est plein. Les dates et la signature de l’émetteur des CRL installées sont vérifiées ; une CRL expirée fait rejeter les nouvelles connexions concernées. Sans CRL installée, la révocation n’est pas contrôlée. Les CRL ne sont pas téléchargées automatiquement ; la gestion OCSP et GDS n’est pas fournie.

Renouvelez un certificat en créant une CSR puis en important le certificat renouvelé. Un certificat d’appareil expiré empêche le démarrage sécurisé. Replace device identity supprime clé/certificat/CSR actuels et génère une nouvelle identité au prochain démarrage sécurisé ; les clients doivent lui refaire confiance. Utilisateurs et clients approuvés sont conservés.

Utilisateurs et magasins de certificats sont conservés lors des redémarrages normaux et mises à jour OTA. Effacer le système de fichiers de l’appareil les supprime. Avant de transférer la propriété de l’appareil, supprimez explicitement les anciens utilisateurs et entrées de confiance.

5. Espace d’adressage et représentation des données

5.1 Espace de noms et NodeId

URI de l’espace de noms fabricant :

urn:preciz:cs-neutron:weighing:1

Résolvez cet URI dans Server/NamespaceArray à chaque connexion. Ne codez pas en dur l’index d’espace de noms 1 ou 2. Le suffixe de version :1 appartient à l’URI stable de l’espace de noms ; la version du modèle téléchargeable est 1.3.0.

Exemples de formes de la même variable :

nsu=urn:preciz:cs-neutron:weighing:1;s=Scale.Gross
ns=2;s=Scale.Gross

La forme numérique n’est valide que si le serveur attribue actuellement cet URI à l’index 2. Si le client n’accepte pas la syntaxe nsu=, résolvez l’URI et construisez le NodeId à index numérique. Les identifiants fabricant sont des chaînes sensibles à la casse, y compris les points dans Scale.Gross.

Tableau 6

Emplacement de navigation

NodeId chaîne de l’objet

Objects / CS-NEUTRON Scale

Scale

Objects / Device

Device

Objects / Server

Espace de noms standard 0, NodeId numérique i=2253

Les méthodes doivent être appelées avec Scale comme ObjectId parent et le NodeId de la méthode comme MethodId.

5.2 Unités et précision numérique

Gross, Net et Tare sont exportés comme valeurs Double normalisées au nombre de décimales configuré. HR est le poids brut haute résolution avant arrondi d’affichage, pas le poids net ni l’ADC brut. Chaque poids utilise l’actuelle Scale.Unit ; OPC UA ne convertit pas les unités. Un type de transport Double n’augmente pas la précision du capteur.

Les valeurs binaires à virgule flottante ne représentent pas exactement tous les nombres décimaux. Formatez les poids affichés avec Scale.Decimals et utilisez Scale.Division comme pas de pesage. HR peut apparaître en notation scientifique : 9.31e-5 kg signifie 0.0000931 kg.

5.3 Temps, instantanés et qualité

Neutron copie les dernières valeurs de pesage dans l’instantané OPC UA environ toutes les min(OUI, 50) millisecondes, selon la disponibilité de l’acquisition. Lire ou s’abonner ne déclenche pas une autre conversion ADC.

SourceTimestamp indique l’heure de l’instantané de mesure lorsque l’horloge de l’appareil est synchronisée. Il est absent avant synchronisation. ServerTimestamp est l’horodatage fourni par le serveur pour la DataValue ; il n’est pas nécessairement égal à SourceTimestamp. Les horodatages OPC UA utilisent UTC.

Des lectures distinctes ou notifications d’abonnement peuvent concerner différents instantanés. Utilisez ReadMeasurement ou un résultat capturé lorsque les champs doivent appartenir ensemble. Une valeur surveillée inchangée ne doit pas nécessairement produire une nouvelle notification à chaque intervalle.

Tableau 7

StatusCode de DataValue

Signification / action client

Good

Valeur utilisable ; contrôlez Stable et l’état natif si nécessaire

BadNoCommunication

Aucun instantané ou plus de deux secondes sans nouvel instantané ; rejetez la mesure en direct

BadSensorFailure

Erreur de balance native ; consultez ErrorCode

BadOutOfRange

Sous-charge ou surcharge ; rejetez la mesure

La qualité s’applique aux poids, à ADC et Stable. Status, ErrorCode et Unit restent lisibles pendant les erreurs natives, mais deviennent périmés si les instantanés s’arrêtent. Les diagnostics des commandes/captures restent lisibles indépendamment de la qualité de la balance en direct. Les métadonnées sont des informations de configuration ; leur état Good n’établit pas la validité du résultat de pesage en direct.

6. Référence des données

Toutes les entrées ci-dessous sont en lecture seule. Les NodeId sont des identifiants chaîne du fabricant sauf mention de l’espace de noms standard 0. Toutes les entrées scalaires ont ValueRank −1.

6.1 Mesure en direct et configuration

Tableau 8

NodeId chaîne

Type

Unité

Description

Scale.Gross

Double

Scale.Unit

Poids brut arrondi

Scale.Net

Double

Scale.Unit

Poids net arrondi

Scale.Tare

Double

Scale.Unit

Tare appliquée

Scale.HR

Double

Scale.Unit

Poids brut haute résolution non arrondi

Scale.ADC

Int32

Points ADC

Valeur ADC existante de la balance copiée avec l’instantané ; aucune lecture matérielle supplémentaire

Scale.Stable

Boolean

—

Indicateur de stabilité de la balance

Scale.Status

UInt16

—

État de l’indication ; tableau ci-dessous

Scale.ErrorCode

UInt16

—

Erreur native ; 1 signifie aucune erreur

Scale.Unit

String

—

Unité configurée, comme kg ou g

Scale.Decimals

UInt16

décimales

Nombre de décimales du poids affiché

Scale.Division

Double

Scale.Unit

Échelon de pesage actif

Scale.Capacity

Double

Scale.Unit

Portée de l’étendue active

Scale.Filter

UInt16

—

Réglage FT actif, 1–1023

Scale.HRFilter

Boolean

—

Réglage FC : false désactivé, true activé ; commande le hachage ADC

ADC n’est pas un balayage distinct par capteur. Aucune variable mV n’est exposée. Malgré son nom, HRFilter commande la fonction FC/hachage ADC existante, et non un filtre logiciel appliqué exclusivement à la variable OPC UA HR.

6.2 État natif de la balance

Tableau 9

Scale.Status

Signification

0

Sous-charge

1

Dans la plage du zéro

2

Instable

3

Stable

4

Surcharge

255

Instantané non initialisé

Utilisez Scale.Stable comme indicateur de stabilité. Scale.Status et OPC UA StatusCode sont des concepts distincts ; un état natif de 3 n’est pas un code de qualité OPC UA.

6.3 Codes d’erreur natifs

Tableau 10

Scale.ErrorCode

Signification

1

Aucune erreur

99

Délai de commande dépassé

98

Commande inconnue

97

Balance désactivée

96

Calibrage manquant

95

Données métrologiques manquantes

94

Erreur du registre d’état ADC

93

Erreur de référence ADC

92

Erreur de mode de conversion ADC

91

Erreur de configuration de l’horloge ADC

90

Erreur de configuration monocycle ADC

89

Erreur de configuration du filtre de réjection ADC

88

Incompatibilité du filtre ADC

87

Erreur de configuration du canal ADC

86

Incompatibilité du hachage ADC

85

Erreur du mode bipolaire ADC

84

Erreur de configuration de la référence externe ADC

83

Incompatibilité du gain ADC

82

Erreur du filtre de moyennage ADC

6.4 Propriétés de mesure

Les propriétés ont les NodeId chaîne fabricant suivants. Leurs BrowseNames sont dans l’espace de noms 0, par exemple 0:EngineeringUnits.

Tableau 11

Motif du NodeId chaîne

Type

Signification

Scale.Gross.EngineeringUnits, Scale.Net.EngineeringUnits, Scale.Tare.EngineeringUnits, Scale.HR.EngineeringUnits

EUInformation

Métadonnées d’unité

Scale.Gross.EURange, Scale.Net.EURange, Scale.Tare.EURange, Scale.HR.EURange

Range

Plage d’ingénierie Low/High

Scale.Gross.ValuePrecision, Scale.Net.ValuePrecision, Scale.Tare.ValuePrecision

Double

Nombre de décimales exporté, égal à Decimals

EURange vaut [0, Capacity], sauf Net qui utilise [-Capacity, Capacity]. La plage d’ingénierie est une métadonnée, pas une instruction de limitation des valeurs. ValuePrecision est un nombre de décimales, pas l’échelon ni une spécification de précision. HR n’a pas de propriété ValuePrecision.

EngineeringUnits utilise les codes UN/CEFACT pour kg (4933453), g (4674125), lb (4997714) et oz (5197402). Les autres symboles d’unité ont UnitId −1 et un espace de noms de norme vide. Actualisez les métadonnées après modification des unités, de l’étendue ou de la configuration de la balance.

6.5 Diagnostics des commandes et captures

Tableau 12

NodeId chaîne

Type

Description

Scale.LastCommandId

UInt32

Identifiant de la dernière commande de tare/zéro/filtre acceptée

Scale.LastCommandState

UInt16

0 inactif ; 1 en file ; 2 en cours ; 3 réussi ; 4 échoué

Scale.LastCommandResult

String

Réponse native ou motif de rejet

Scale.LastCaptureId

UInt32

Identifiant de la dernière demande de capture stable acceptée

Scale.LastCaptureState

UInt16

0 inactif ; 1 en attente ; 2 terminé ; 3 délai dépassé

Les identifiants de commande et de capture ont des séquences distinctes. Tous deux sont partagés entre clients, locaux au service en cours et remis à zéro au redémarrage du service.

6.6 Identification de l’appareil

Tableau 13

NodeId chaîne

Type

Description

Device.Manufacturer

String

PRECIZ

Device.Model

String

Modèle de l’appareil

Device.SerialNumber

String

MID

Device.SoftwareRevision

String

Version du micrologiciel

Device.HardwareRevision

String

Version matérielle

Device.DeviceName

String

Nom configuré de l’appareil

Les valeurs d’identité sont chargées au démarrage d’OPC UA. Redémarrez le service après modification du nom pour actualiser DeviceName.

6.7 Informations standard du serveur

Les chemins suivants sont relatifs à Objects / Server et utilisent l’espace de noms 0.

Tableau 14

Chemin de navigation

Type / valeur

ServerArray

String[] ; l’index 0 est l’URI d’application de l’appareil

NamespaceArray

String[] ; l’index 0 est l’espace de noms OPC UA, l’index 1 l’URI d’application de l’appareil ; résolvez l’URI fabricant dans ce tableau

ServerStatus

ServerStatusDataType

ServerStatus/StartTime, CurrentTime

DateTime, déclaré UtcTime

ServerStatus/State

ServerState ; 0 Running en fonctionnement normal

ServerStatus/SecondsTillShutdown

UInt32 ; 0 lorsqu’aucun arrêt n’est prévu

ServerStatus/ShutdownReason

LocalizedText

ServerStatus/BuildInfo

BuildInfo: ProductUri, ManufacturerName, ProductName, SoftwareVersion, BuildNumber, BuildDate

ServiceLevel

Byte ; 255 en fonctionnement normal

Auditing

Boolean; false

VendorServerInfo

Objet d’informations fabricant

ServerRedundancy/RedundancySupport

RedundancySupport; 0 None

ServerCapabilities/ServerProfileArray

String[] ; URI des profils/facettes d’implémentation

ServerCapabilities/LocaleIdArray

LocaleId[]; en

ServerCapabilities/MinSupportedSampleRate

Duration en ms ; minimum OUI actif

ServerCapabilities/MaxBrowseContinuationPoints

UInt16 ; 5 par session

ServerCapabilities/SoftwareCertificates

SignedSoftwareCertificate[] ; vide

ServerCapabilities/ModellingRules, AggregateFunctions

Dossiers

ServerCapabilities/OperationLimits

Limites par requête indiquées à la section 9

Les variables tableau standard ont ValueRank 1 et ArrayDimensions [0] ; zéro indique une longueur maximale non spécifiée. ServerProfileArray identifie la cible d’implémentation Micro Embedded Device 2017 et les facettes de transport/méthodes/sécurité actives. Cet identifiant de profil n’est pas une marque de certification OPC Foundation.

6.8 Canal actif — ActiveChannel

Scale.ActiveChannel est une variable UInt16 indiquant le canal de pesage actif. Elle est en lecture seule ; sélectionnez un canal avec Scale.SetChannel. NodeSet2 1.3.0 permet de sélectionner les canaux 1–4. Résolvez l’URI de l’espace de noms à la connexion comme indiqué en section 5.1.

7. Méthodes et exécution des commandes

7.1 Résumé des méthodes

Appelez chaque méthode sur l’objet parent Scale. Fournissez des arguments scalaires avec les types OPC UA exacts indiqués ; ne remplacez pas un argument UInt32 ou Boolean par String, Int32 ou Double.

SetChannel utilise Channel: UInt16 (1–4) et retourne RequestId: UInt32 ; voir la section 7.9.

Tableau 15

NodeId chaîne de la méthode

Arguments d’entrée

Sortie

Autorisation

Scale.ReadMeasurement

Aucun

Onze champs de mesure, section 8.1

Lecture

Scale.CaptureStableWeight

TimeoutMs: UInt32

RequestId: UInt32

Exécution

Scale.GetCapturedMeasurement

RequestId: UInt32

Onze champs de mesure, section 8.1

Lecture

Scale.TareCurrent

Aucun

RequestId: UInt32

Exécution

Scale.SetTare

Value: Double

RequestId: UInt32

Exécution

Scale.Zero

Aucun

RequestId: UInt32

Exécution

Scale.ClearTare

Aucun

RequestId: UInt32

Exécution

Scale.SetFilter

Value: UInt16

RequestId: UInt32

Exécution

Scale.SetHRFilter

Enabled: Boolean

RequestId: UInt32

Exécution

7.2 TareCurrent

Tare le poids brut stable actuel avec l’opération native T. La tare prend la valeur du brut et le net devient zéro ; le point zéro du brut n’est pas modifié. La balance doit accepter l’opération de tare stable avant l’expiration du délai de commande.

Exemple avec 1.11 kg sur la balance : Gross reste à 1.11 kg, Tare devient 1.11 kg et Net devient 0.00 kg. Une réponse native de réussite ressemble à T S 1.11 kg.

7.3 SetTare

Définit une tare prédéfinie en Scale.Unit avec l’opération native TA. Value doit être finie, non négative, au plus égale à 1,000,000,000 et à la portée. La tare appliquée est arrondie à l’échelon de la balance. Lisez Scale.Tare après exécution pour obtenir la valeur appliquée. Exemple d’entrée : Double 0.250 lorsque Unit est kg.

7.4 Zero

Exécute l’opération native Z, sous réserve de stabilité et de la plage zéro configurée. En cas de réussite, le point zéro est ajusté et la tare appliquée/prédéfinie existante est effacée. La réponse native de réussite est Z A. Cette opération est distincte de TareCurrent.

7.5 ClearTare

Exécute l’opération native TAC, supprimant les tares appliquée et prédéfinie. Gross est conservé et Net redevient égal à Gross. Aucun argument d’entrée.

7.6 SetFilter

Value est UInt16, 1–1023 inclus. Cette opération règle FT pour le canal actif par le gestionnaire existant de configuration du filtre. Zéro et les valeurs supérieures à 1023 retournent BadOutOfRange. Exemple : UInt16 512.

7.7 SetHRFilter

Enabled est Boolean : true active FC/le hachage ADC, false le désactive. Une valeur numérique envoyée avec un type OPC UA numérique n’est pas un Boolean et est rejetée.

FT et FC sont activés et enregistrés pour le canal actif par les gestionnaires natifs de configuration. Un échec de vérification matérielle produit un résultat de commande en échec. L’acquisition peut s’interrompre pendant l’application du réglage. Lisez Scale.Filter ou Scale.HRFilter après exécution pour connaître le réglage actif.

7.8 Séquence de commande asynchrone

Pour TareCurrent, SetTare, Zero, ClearTare, SetChannel, SetFilter et SetHRFilter :

  1. Appelez la méthode et conservez son RequestId retourné.

  2. Lisez ou abonnez-vous à LastCommandId, LastCommandState et LastCommandResult.

  3. N’associez le résultat qu’à un LastCommandId correspondant.

  4. L’état 3 signifie réussite ; l’état 4 signifie échec. Les états 1 et 2 sont en attente.

  5. Lisez les valeurs de processus/configuration concernées après une exécution réussie.

Un résultat Call Good confirme l’acceptation, pas l’achèvement. Une seule de ces commandes peut être en file/en cours à la fois ; une autre reçoit BadResourceUnavailable. Les conditions existantes de stabilité, disponibilité, occupation et les verrouillages applicatifs restent applicables.

L’emplacement de commande et les diagnostics du dernier résultat sont communs à l’appareil. Coordonnez les émetteurs si deux clients peuvent envoyer des commandes : une commande ultérieure peut remplacer les derniers diagnostics terminés avant leur lecture par un autre client. Ce n’est pas un historique de commandes.

Les identifiants de requête ne sont pas des identifiants d’opération durables. Après une perte de connexion, inspectez l’état de la balance avant de réessayer une commande au résultat inconnu. Un redémarrage du service efface les diagnostics et annule les commandes de balance OPC UA inachevées ; il n’annule pas une tare, un zéro ou un changement de réglage déjà réalisé.

7.9 SetChannel — sélectionner un canal de pesage

Appelez Scale.SetChannel sur l’objet Scale. Son argument d’entrée Channel est un UInt16 scalaire de valeur 1–4 ; les autres valeurs sont rejetées. L’argument de sortie RequestId est un UInt32.

L’appel nécessite l’autorisation de commande et réinitialise la balance. Coordonnez-le avec les autres commandes et suivez la séquence asynchrone de la section 7.8. Lisez le canal sélectionné dans Scale.ActiveChannel.

8. Mesures cohérentes et capture stable

8.1 Sortie de ReadMeasurement

ReadMeasurement() retourne immédiatement le dernier instantané valide. Il n’attend pas la stabilité et ne demande pas une nouvelle lecture ADC. GetCapturedMeasurement retourne la même signature de sortie pour un résultat stable figé.

Tableau 16

Position (à partir de zéro)

Argument

Type OPC UA

Signification

0

MeasurementId

UInt64

Numéro de séquence de l’instantané

1

Gross

Double

Poids brut

2

Net

Double

Poids net

3

Tare

Double

Tare appliquée

4

HR

Double

Poids brut haute résolution

5

Stable

Boolean

Stabilité de cet instantané

6

Status

UInt16

État natif de la balance

7

ErrorCode

UInt16

Code d’erreur natif de la balance

8

Unit

String

Unité de ce résultat

9

Timestamp

DateTime

Heure UTC de l’instantané, ou zéro sans synchronisation

10

TimeSynchronized

Boolean

Indique si Timestamp est utilisable comme heure calendaire

Tous les champs appartiennent au même instantané. MeasurementId augmente à chaque instantané OPC UA, pas à chaque conversion ADC physique, et est réinitialisé avec le service. Préservez la précision UInt64 lors du stockage. ADC, métadonnées et filtres sont des nœuds en direct distincts, non inclus dans ce résultat de méthode à onze champs.

Si TimeSynchronized est false, n’interprétez pas Timestamp comme une date calendaire. ReadMeasurement retourne BadNoCommunication, BadSensorFailure ou BadOutOfRange si l’instantané en direct est absent/périmé, présente une erreur native ou est hors plage.

8.2 CaptureStableWeight et GetCapturedMeasurement

  1. Appelez CaptureStableWeight(TimeoutMs) avec UInt32 100–60000 ms. Par exemple, 5000 laisse jusqu’à cinq secondes pour obtenir une mesure stable valide. Zéro est invalide.

  2. Conservez le UInt32 RequestId retourné.

  3. Appelez GetCapturedMeasurement(RequestId) avec cet identifiant. Pendant l’attente, il retourne BadWaitingForInitialData. Répétez à un intervalle modéré, comme 100 ms.

  4. En cas de réussite, stockez le résultat à onze champs avec le RequestId de capture.

Vous pouvez aussi vous abonner à LastCaptureId et LastCaptureState, puis récupérer le résultat lorsque la requête correspondante atteint l’état 2.

Tableau 17

LastCaptureState

Signification

0

Inactif

1

En attente

2

Terminé ; résultat disponible

3

Délai dépassé

L’instantané capturé doit être publié après le début de la requête et être stable, récent, sans erreur native et dans la plage. Les instantanés invalides sont ignorés jusqu’à réception d’un instantané approprié ou expiration du délai. Si la balance est déjà stable, le prochain instantané valide peut achever immédiatement la capture ; aucune transition instable-stable ni durée de maintien supplémentaire n’est nécessaire.

L’opération ne tare ni ne met à zéro la balance et ne bloque pas les autres clients. Une seule capture peut être en attente. Un résultat figé unique est partagé par tous les clients pour tout l’appareil. Il reste inchangé même si le poids en direct change ou devient indisponible. Une nouvelle capture remplace la requête/le résultat précédent. Il n’existe pas d’historique des captures.

Tableau 18

Résultat de GetCapturedMeasurement

Signification

Good

Résultat figé retourné

BadWaitingForInitialData

Capture correspondante toujours en attente

BadTimeout

Capture correspondante expirée sans mesure stable valide

BadNotFound

Identifiant nul, inconnu, remplacé ou indisponible après redémarrage

BadNoData

Aucun résultat terminé pour l’état de capture correspondant

Utilisez le RequestId de capture comme entrée de GetCapturedMeasurement, pas le MeasurementId du résultat. La capture peut se terminer après la déconnexion de son client initiateur. Elle peut être récupérée après reconnexion avec le même identifiant si le service OPC UA est resté actif. Un redémarrage efface captures en attente, résultats stockés et identifiants ; coordonnez les demandes entre clients.

9. Abonnements, temporisation et limites de capacité

9.1 Temporisation

Tableau 19

Paramètre

Signification

OUI

Limite inférieure configurée pour l’échantillonnage et la publication

Intervalle d’échantillonnage

Fréquence d’échantillonnage d’un élément surveillé

Intervalle de publication

Fréquence à laquelle l’abonnement peut publier les notifications en file

Taille de file

Nombre de notifications conservées par élément surveillé

Keepalive

Indique un abonnement actif en l’absence de notifications

Commencez par 100–250 ms et une file de taille 1 pour l’affichage en direct. Pour la mise à jour la plus rapide disponible, réglez OUI sur 10 ms, reconnectez-vous après l’enregistrement et demandez 10 ms d’échantillonnage/publication. Utilisez les intervalles révisés du serveur dans la logique client.

Échantillonner plus vite que l’acquisition physique ne crée pas de nouvelles mesures. Latence réseau, chiffrement, charge client et réglages de publication influent sur le temps de réponse observé. Server Status / Response Time d’UAExpert n’est pas l’intervalle d’échantillonnage ou de publication de l’abonnement.

9.2 Capacité et limites par requête

Tableau 20

Ressource

Limite

SecureChannels

4 au total, y compris le chevauchement des reconnexions

Sessions

2 simultanées

Délai de session

Délai négocié maximal de 30 secondes

Abonnements

4 au total ; 2 par session

Éléments surveillés

64 au total ; 32 par abonnement

File d’élément surveillé

1–16 valeurs par élément

Requêtes Publish en attente

4 par session

File de retransmission

16 messages par abonnement

Points de continuation de navigation

5 par session

Échantillonnage/publication minimum

OUI, 10–5000 ms ; par défaut 100 ms

Opérations Read / Write / Browse

32 par requête

Opérations RegisterNodes / TranslateBrowsePaths

32 par requête

Opérations d’appel de méthode Call

8 par requête

Opérations d’éléments surveillés

32 par requête

Ces totaux s’appliquent au serveur sauf indication par session/abonnement. Si la file de requêtes Publish est pleine, la plus ancienne requête en attente reçoit BadTooManyPublishRequests pour permettre l’ajout d’une nouvelle. Les acquittements et Republish utilisent la file de retransmission bornée. La limite d’opérations Write ne rend pas modifiables les variables en lecture seule.

Fermez proprement les sessions. Un client déconnecté peut laisser sa précédente session occuper une place jusqu’à expiration. Réutilisez/réactivez une session existante si cela est pris en charge ; sinon attendez son expiration. Une nouvelle instance du serveur ne peut pas réactiver une session antérieure au redémarrage : créez une session, résolvez les espaces de noms et recréez les abonnements. Les clients TCP ne consommant pas les données peuvent être déconnectés après un délai d’envoi d’une seconde.

10. Exemples d’intégration

10.1 UAExpert : capture stable

  1. Regarder le tutoriel Neutron NS OPC UA sur YouTube

    Parcourez CS-NEUTRON Scale, faites un clic droit sur CaptureStableWeight et choisissez Call.

  2. Saisissez TimeoutMs 5000 et cliquez sur Call. Notez le RequestId retourné.

  3. Ouvrez GetCapturedMeasurement et saisissez le même RequestId.

  4. Cliquez sur Call. Si la capture est en attente, rappelez GetCapturedMeasurement avec le même identifiant.

  5. Lisez Gross, Net, Tare, HR, Stable, Status, ErrorCode, Unit et Timestamp dans le résultat retourné. Laissez la demande de capture existante active pendant l’attente ; ne lancez pas de nouvelles captures répétées.

10.2 Python : connexion sécurisée, lecture cohérente et capture facultative

Installez le paquet client dans un environnement virtuel Python :

python -m pip install asyncua

Préparez un certificat d’application client OPC UA et une clé privée. Son URI d’application SAN doit correspondre à CLIENT_URI ci-dessous. Approuvez son certificat sur Neutron et téléchargez celui de Neutron sous neutron.der. Remplacez point de terminaison, utilisateur et URI client par vos valeurs. Le fichier de clé privée de cet exemple est accessible au client Python ; ce n’est pas la clé privée de Neutron.

import asyncio
import getpass

from asyncua import Client, ua
from asyncua.crypto.security_policies import SecurityPolicyBasic256Sha256
from asyncua.ua.uaerrors import UaStatusCodeError

URL = "opc.tcp://192.168.50.73:4840"
NS_URI = "urn:preciz:cs-neutron:weighing:1"
CLIENT_URI = "urn:example:neutron-client"
FIELDS = ("MeasurementId", "Gross", "Net", "Tare", "HR", "Stable",
          "Status", "ErrorCode", "Unit", "Timestamp", "TimeSynchronized")
CAPTURE = False  # Set True when logged in with command permission.


async def main():
    client = Client(URL, timeout=10)
    client.application_uri = CLIENT_URI
    await client.set_security(
        SecurityPolicyBasic256Sha256,
        certificate="client.der",
        private_key="client-key.pem",
        server_certificate="neutron.der",
        mode=ua.MessageSecurityMode.SignAndEncrypt,
    )
    client.set_user(input("Username: "))
    client.set_password(getpass.getpass("Password: "))

    async with client:
        ns = await client.get_namespace_index(NS_URI)
        scale = client.get_node(ua.NodeId("Scale", ns))

        def method(name):
            return ua.NodeId("Scale." + name, ns)

        values = await scale.call_method(method("ReadMeasurement"))
        result = dict(zip(FIELDS, values))
        print("Current snapshot:", result)

        if CAPTURE:
            request_id = await scale.call_method(
                method("CaptureStableWeight"),
                ua.Variant(5000, ua.VariantType.UInt32),
            )
            deadline = asyncio.get_running_loop().time() + 7
            while True:
                try:
                    values = await scale.call_method(
                        method("GetCapturedMeasurement"),
                        ua.Variant(request_id, ua.VariantType.UInt32),
                    )
                    print("Capture", request_id, dict(zip(FIELDS, values)))
                    break
                except UaStatusCodeError as exc:
                    if exc.code != ua.StatusCodes.BadWaitingForInitialData:
                        raise
                    if asyncio.get_running_loop().time() >= deadline:
                        raise TimeoutError("Client capture wait expired") from exc
                    await asyncio.sleep(0.1)


asyncio.run(main())

ReadMeasurement nécessite des données en direct valides. Les exceptions comme BadSensorFailure ou BadOutOfRange doivent être gérées par l’application appelante. BadTimeout de GetCapturedMeasurement signifie que le délai de capture du serveur a expiré ; ce n’est pas une raison de réutiliser une ancienne mesure comme nouvelle capture réussie.

10.3 Python : s’abonner au poids en direct

Le code suivant fonctionne dans une connexion async with client établie. Le gestionnaire vérifie la qualité avant d’utiliser la valeur.

class WeightHandler:
    def datachange_notification(self, node, value, data):
        status = data.monitored_item.Value.StatusCode
        if status.is_good():
            print(node.nodeid.to_string(), value)
        else:
            print("Invalid measurement:", status)


ns = await client.get_namespace_index(NS_URI)
gross = client.get_node(ua.NodeId("Scale.Gross", ns))
subscription = await client.create_subscription(100, WeightHandler())
try:
    await subscription.subscribe_data_change(gross, queuesize=1)
    await asyncio.sleep(30)
finally:
    await subscription.delete()

L’intervalle de publication demandé est de 100 ms. Configurez l’échantillonnage des éléments surveillés via la bibliothèque client selon les besoins et respectez les valeurs révisées du serveur.

10.4 Séquence d’intégration PLC

Utilisez les blocs client OPC UA fournis par le fabricant du PLC. Résolvez les NodeId chaîne avec l’URI d’espace de noms du fabricant. La séquence suivante est indépendante du fabricant, pas une implémentation dans un langage PLC particulier :

CONNECT -> TRUST / AUTHENTICATE -> RESOLVE NAMESPACE URI
        -> RESOLVE Scale object and required variable/method NodeIds
        -> CREATE SUBSCRIPTION -> MONITOR LIVE DATA

On a stable-result request:
  Call Scale.CaptureStableWeight(TimeoutMs := UInt32(5000))
  Save returned RequestId
  Call Scale.GetCapturedMeasurement(RequestId)
    BadWaitingForInitialData -> wait 100 ms and repeat retrieval
    Good                    -> store the eleven fields as one record
    BadTimeout              -> report no stable result
    Other failure           -> handle the error; do not use old data

On tare request:
  Call Scale.TareCurrent()
  Save returned command RequestId
  Wait for matching LastCommandId and LastCommandState 3 or 4
  On success read Gross / Net / Tare; on failure read LastCommandResult

Associez UInt64 MeasurementId à un type entier PLC approprié. N’envoyez pas de substitut numérique de Boolean à SetHRFilter. Sérialisez commandes et propriété de capture stable dans le PLC/l’application lorsque plusieurs clients sont autorisés à commander.

11. Dépannage, téléchargements et compatibilité

11.1 Erreurs de connexion et de méthode

Tableau 21

Symptôme / état

Signification et action

BadCommunicationError / connexion refusée

Vérifiez qu’OPC UA est activé, l’IP/le port, la route réseau choisie et le pare-feu. Le journal de démarrage doit contenir OPC UA listening on port ...

BadCertificateUntrusted

Approuvez Neutron dans le client et le certificat client dans Neutron, ou installez la chaîne CA appropriée

Erreurs de date/URI du certificat

Synchronisez les horloges et utilisez un certificat avec dates valides et URI d’application configuré du client

BadIdentityTokenRejected / BadUserAccessDenied

Utilisez le nom d’utilisateur/mot de passe correct et l’autorisation de commande requise ; attendez la fin du blocage de 30 secondes après les échecs répétés

BadTooManySessions / limite de sessions atteinte

Deux places sont occupées ; déconnectez un autre client ou attendez l’expiration d’une session abandonnée

BadNodeIdUnknown

Résolvez à nouveau l’URI fabricant, vérifiez le NodeId chaîne sensible à la casse et la compatibilité micrologiciel/modèle

BadTypeMismatch

Utilisez exactement le type d’argument scalaire de la section 7.1

BadOutOfRange sur CaptureStableWeight

Le délai doit être UInt32 100–60000 ; zéro est invalide

BadOutOfRange sur SetFilter / SetTare

Utilisez FT 1–1023 ou une tare finie non négative ne dépassant ni la portée ni 1e9

BadResourceUnavailable

L’emplacement de commande ou capture est occupé ; attendez son opération actuelle

Le Call de commande est Good mais l’opération échoue

Vérifiez LastCommandState et LastCommandResult correspondants ; Good n’acquitte que la mise en file

BadNotWritable lors de l’écriture de variables

Les variables de processus sont en lecture seule ; utilisez la méthode prise en charge

Capture BadWaitingForInitialData

Continuez de récupérer le même identifiant de capture ; le serveur attend un échantillon stable valide

Capture BadTimeout

Aucun échantillon stable approprié n’est arrivé avant l’échéance

Capture BadNotFound

Utilisez le RequestId de capture retourné ; une capture plus récente ou un redémarrage a invalidé l’ancien identifiant

ServerCapabilities absent après changement de micrologiciel

Actualisez l’espace d’adressage ou reconnectez-vous avec un nouveau projet client pour supprimer les résultats de navigation en cache

Mesures vides/périmées

Laissez l’acquisition de la balance activée, consultez ErrorCode et l’état natif, et vérifiez la qualité DataValue

11.2 Téléchargements et manuels associés

NodeSet2 décrit l’espace d’adressage fabricant, les arguments des méthodes, les références et types pour les outils de modèle hors ligne. Ses index d’espace de noms sont locaux au fichier XML ; résolvez l’URI sur l’appareil en fonctionnement. Le XML contient des définitions de modèle, pas des mesures actuelles ni une sauvegarde des utilisateurs/certificats/réglages. Les intervalles d’exécution et autorisations suivent la configuration active de l’appareil.

11.3 Compatibilité des versions

Tableau 22

Modèle d’information

Ajouts à l’interface

1.0

Valeurs de pesage de base et méthodes tare/zéro

1.1.0

Métadonnées de mesure, identification, mesure cohérente et capture stable

1.2.0

ADC, valeurs FT/FC et SetFilter/SetHRFilter

1.3.0

ActiveChannel et SetChannel pour lire le canal actif et sélectionner le canal 1–4.

L’URI d’espace de noms reste urn:preciz:cs-neutron:weighing:1. Les signatures des méthodes existantes sont conservées ; ReadMeasurement/GetCapturedMeasurement retournent onze champs. Choisissez un micrologiciel avec OPC UA et les fonctions nécessaires à l’intégration. Une version sans OPC UA ne peut pas exposer de point de terminaison.

Questions fréquentes

Neutron prend-il en charge OPC UA chiffré ?

Oui. Choisissez Basic256Sha256 / SignAndEncrypt, utilisez un nom d’utilisateur et un mot de passe et établissez une confiance mutuelle des certificats d’application. Le mode non protégé None/Anonymous est aussi disponible.

Comment obtenir une mesure stable cohérente ?

Appelez CaptureStableWeight avec un délai UInt32 de 100–60000 ms, conservez son RequestId et récupérez le résultat à onze champs par GetCapturedMeasurement avec le même identifiant. Pendant l’attente, répétez la récupération plutôt que lancer une autre capture.

Un appel de méthode Good signifie-t-il que la commande est terminée ?

Pour les commandes de tare, zéro et filtre, Good confirme l’acceptation. Faites correspondre LastCommandId au RequestId retourné et attendez LastCommandState 3 (réussite) ou 4 (échec).

Quel URI d’espace de noms et quelle version de modèle utiliser ?

Résolvez urn:preciz:cs-neutron:weighing:1 dans NamespaceArray à chaque connexion. Le modèle d’information téléchargeable est en version 1.3.0 ; un index numérique d’espace de noms comme 2 n’est qu’un exemple.

Besoin d’aide ?

Besoin d’aide pour logiciel, connectivité ou utilisation ? Décrivez le problème pour que nous aidions à la prochaine étape.

Préparer une demande →