CSCP — CloudScale Communication Protocol
Référence des commandes CSCP pour Neutron : structure des messages, pesage, configuration, comptage, contrôle pondéral et I/O numériques.
PRECIZ · NEUTRON OPC UA
Intégration OPC UA pour Neutron : connexions sécurisées, données de pesage en direct, capture stable et intégration PLC/SCADA.
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
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. |
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.
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 :
Interface | Utilisation |
|---|---|
Variables en direct et abonnements | Afficher ou surveiller en continu des valeurs individuelles |
| Obtenir les onze champs de mesure d’un même instantané actuel |
| Figer une nouvelle mesure valide et stable et la récupérer par identifiant de requête |
Connectez-vous à la page locale de configuration Neutron ou à l’utilitaire Bluetooth. Utilisez HTTPS ou Bluetooth authentifié pour gérer certificats et utilisateurs.
Sélectionnez l’interface réseau et relevez son adresse IP attribuée.
Laissez l’acquisition de la balance activée dans les réglages Scale.
Ouvrez l’onglet OPC UA. Le micrologiciel doit indiquer qu’OPC UA est disponible.
Pour l’accès chiffré, créez d’abord un utilisateur dans Users & permissions.
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.
Cliquez sur Save. Copiez l’adresse de connexion avec Copy endpoint.
Exemple de point de terminaison :
opc.tcp://192.168.50.73:4840Ajoutez le point de terminaison comme serveur dans UAExpert.
En mode chiffré, choisissez Basic256Sha256 / SignAndEncrypt et l’authentification Username/Password. En mode non protégé, choisissez None et Anonymous.
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.
Connectez-vous et parcourez Objects → CS-NEUTRON Scale. Le NodeId de l’objet est Scale ; son nom affiché est CS-NEUTRON Scale.
Glissez Gross, Net, Tare, Stable, Status, ErrorCode et Unit dans Data Access View.
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.
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.
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.
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.
Ouvrez les réglages OPC UA de Neutron par HTTPS ou Bluetooth authentifié.
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.
Choisissez Read only ou Read and execute commands.
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.
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.
Dans le client, comparez l’empreinte SHA-256 du certificat Neutron à celle affichée dans l’interface de configuration, puis marquez-le comme fiable.
Tentez la connexion chiffrée. Neutron rejette un certificat d’application client inconnu et le liste dans Certificates comme rejected.
Cliquez sur Refresh certificates and users, comparez l’empreinte du client et cliquez sur Approve pour ce certificat.
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.
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.
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 :
Choisissez Create and download CSR. La CSR utilise la clé existante de l’appareil.
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.
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.
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.
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.
URI de l’espace de noms fabricant :
urn:preciz:cs-neutron:weighing:1Ré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.GrossLa 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.
Emplacement de navigation | NodeId chaîne de l’objet |
|---|---|
Objects / CS-NEUTRON Scale |
|
Objects / Device |
|
Objects / Server | Espace de noms standard 0, NodeId numérique |
Les méthodes doivent être appelées avec Scale comme ObjectId parent et le NodeId de la méthode comme MethodId.
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.
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.
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.
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.
NodeId chaîne | Type | Unité | Description |
|---|---|---|---|
| Double | Scale.Unit | Poids brut arrondi |
| Double | Scale.Unit | Poids net arrondi |
| Double | Scale.Unit | Tare appliquée |
| Double | Scale.Unit | Poids brut haute résolution non arrondi |
| Int32 | Points ADC | Valeur ADC existante de la balance copiée avec l’instantané ; aucune lecture matérielle supplémentaire |
| Boolean | — | Indicateur de stabilité de la balance |
| UInt16 | — | État de l’indication ; tableau ci-dessous |
| UInt16 | — | Erreur native ; 1 signifie aucune erreur |
| String | — | Unité configurée, comme kg ou g |
| UInt16 | décimales | Nombre de décimales du poids affiché |
| Double | Scale.Unit | Échelon de pesage actif |
| Double | Scale.Unit | Portée de l’étendue active |
| UInt16 | — | Réglage FT actif, 1–1023 |
| 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.
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.
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 |
Les propriétés ont les NodeId chaîne fabricant suivants. Leurs BrowseNames sont dans l’espace de noms 0, par exemple 0:EngineeringUnits.
Motif du NodeId chaîne | Type | Signification |
|---|---|---|
| EUInformation | Métadonnées d’unité |
| Range | Plage d’ingénierie Low/High |
| 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.
NodeId chaîne | Type | Description |
|---|---|---|
| UInt32 | Identifiant de la dernière commande de tare/zéro/filtre acceptée |
| UInt16 | 0 inactif ; 1 en file ; 2 en cours ; 3 réussi ; 4 échoué |
| String | Réponse native ou motif de rejet |
| UInt32 | Identifiant de la dernière demande de capture stable acceptée |
| 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.
NodeId chaîne | Type | Description |
|---|---|---|
| String | PRECIZ |
| String | Modèle de l’appareil |
| String | MID |
| String | Version du micrologiciel |
| String | Version matérielle |
| 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.
Les chemins suivants sont relatifs à Objects / Server et utilisent l’espace de noms 0.
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.
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.
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.
NodeId chaîne de la méthode | Arguments d’entrée | Sortie | Autorisation |
|---|---|---|---|
| Aucun | Onze champs de mesure, section 8.1 | Lecture |
| TimeoutMs: UInt32 | RequestId: UInt32 | Exécution |
| RequestId: UInt32 | Onze champs de mesure, section 8.1 | Lecture |
| Aucun | RequestId: UInt32 | Exécution |
| Value: Double | RequestId: UInt32 | Exécution |
| Aucun | RequestId: UInt32 | Exécution |
| Aucun | RequestId: UInt32 | Exécution |
| Value: UInt16 | RequestId: UInt32 | Exécution |
| Enabled: Boolean | RequestId: UInt32 | Exécution |
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.
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.
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.
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.
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.
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.
Pour TareCurrent, SetTare, Zero, ClearTare, SetChannel, SetFilter et SetHRFilter :
Appelez la méthode et conservez son RequestId retourné.
Lisez ou abonnez-vous à LastCommandId, LastCommandState et LastCommandResult.
N’associez le résultat qu’à un LastCommandId correspondant.
L’état 3 signifie réussite ; l’état 4 signifie échec. Les états 1 et 2 sont en attente.
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é.
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.
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é.
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.
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.
Conservez le UInt32 RequestId retourné.
Appelez GetCapturedMeasurement(RequestId) avec cet identifiant. Pendant l’attente, il retourne BadWaitingForInitialData. Répétez à un intervalle modéré, comme 100 ms.
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.
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.
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.
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.
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.
Regarder le tutoriel Neutron NS OPC UA sur YouTube
Parcourez CS-NEUTRON Scale, faites un clic droit sur CaptureStableWeight et choisissez Call.
Saisissez TimeoutMs 5000 et cliquez sur Call. Notez le RequestId retourné.
Ouvrez GetCapturedMeasurement et saisissez le même RequestId.
Cliquez sur Call. Si la capture est en attente, rappelez GetCapturedMeasurement avec le même identifiant.
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.
Installez le paquet client dans un environnement virtuel Python :
python -m pip install asyncuaPré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.
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.
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 LastCommandResultAssociez 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.
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 |
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 |
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.
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.
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.
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.
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).
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.
Référence des commandes CSCP pour Neutron : structure des messages, pesage, configuration, comptage, contrôle pondéral et I/O numériques.
Référence Neutron Modbus RTU/TCP pour l’intégration PLC, SCADA et HMI : connexion, adressage, registres, calibrage et commande de trieuse pondérale automatique.
Besoin d’aide pour logiciel, connectivité ou utilisation ? Décrivez le problème pour que nous aidions à la prochaine étape.