CSCP — CloudScale Communication Protocol
Guida ai comandi CSCP per Neutron: struttura dei messaggi, pesatura, configurazione, conteggio, controllo del peso e I/O digitali.
PRECIZ · NEUTRON OPC UA
Integrazione OPC UA per Neutron: connessioni sicure, dati di pesatura in tempo reale, acquisizione stabile e integrazione PLC/SCADA.
Versione del manuale: 1.0 · Data di pubblicazione: 18 ottobre 2026
Si applica a: firmware Neutron 2.5.0 con supporto OPC UA · Modello informativo del produttore 1.3.0
Versione | Data di pubblicazione | Modifiche |
|---|---|---|
1.0 | 18 ottobre 2026 | Prima edizione del manuale Neutron OPC UA. Modello informativo NodeSet2 1.3.0 con ActiveChannel per leggere il canale attivo e SetChannel per selezionare il canale 1–4. |
PRECIZ è un membro ufficialmente registrato di OPC Foundation. Visualizza la voce ufficiale PRECIZ nell’elenco dei membri di OPC Foundation.
Neutron di PRECIZ offre un server OPC UA per l’integrazione con PLC, SCADA, MES e applicazioni PC. L’interfaccia utilizza la comunicazione OPC UA Client/Server su UA-TCP con codifica UA Binary.
Il server offre:
Peso lordo, netto, tara e lordo ad alta risoluzione in tempo reale, ADC grezzo, stabilità, stato della bilancia, codice di errore e unità.
Metadati di misura: divisione, decimali, portata, unità ingegneristiche e intervallo ingegneristico.
Identificazione del dispositivo e informazioni standard del server OPC UA.
Sottoscrizioni alle variazioni dei dati per i valori in tempo reale.
Lettura coerente della misura con undici campi di un’unica istantanea.
Acquisizione e recupero asincroni di una nuova misura stabile.
Operazioni di tara, tara preimpostata, azzeramento e cancellazione della tara.
Impostazione del filtro FT e del chopping ADC FC.
Leggete il canale di pesatura attivo con ActiveChannel e selezionate il canale 1–4 con SetChannel (NodeSet2 1.3.0).
Due sessioni client simultanee.
Comunicazione cifrata opzionale, attendibilità dei certificati applicativi e autorizzazioni utente per la lettura o per la lettura e l’esecuzione dei comandi.
Tutte le variabili di processo esposte sono di sola lettura. Le operazioni vengono eseguite tramite metodi. L’interfaccia non offre esecuzione arbitraria di comandi nativi, taratura, controllo delle uscite, selezione dell’applicazione, risultati del conteggio, storico, eventi o OPC UA PubSub. Il modello informativo è un modello proprietario PRECIZ, non il modello complementare OPC UA Weighing o Device Integration.
Tre modi di ottenere una misura rispondono a finalità diverse:
Interfaccia | Utilizzo |
|---|---|
Variabili in tempo reale e sottoscrizioni | Visualizzare o monitorare continuamente i singoli valori |
| Ottenere tutti gli undici campi di misura da un’unica istantanea attuale |
| Memorizzare una nuova misura valida e stabile e recuperarla tramite ID della richiesta |
Collegatevi alla pagina di configurazione locale di Neutron o all’utilità di configurazione Bluetooth. Utilizzate HTTPS o Bluetooth autenticato per gestire certificati e utenti.
Selezionate l’interfaccia di rete e rilevate l’indirizzo IP assegnato.
Mantenete attiva l’acquisizione della bilancia nelle impostazioni Scale.
Aprite la scheda OPC UA. Il firmware deve indicare che OPC UA è disponibile.
Per l’accesso cifrato, create prima un utente in Users & permissions.
In Settings, attivate il server, selezionate la modalità di sicurezza e mantenete la porta 4840 e l’intervallo minimo di 100 ms per la prima connessione.
Fate clic su Save. Copiate l’indirizzo di connessione con Copy endpoint.
Esempio di endpoint:
opc.tcp://192.168.50.73:4840Aggiungete l’endpoint come server in UAExpert.
In modalità cifrata selezionate Basic256Sha256 / SignAndEncrypt e l’autenticazione Username/Password. In modalità non protetta selezionate None e Anonymous.
Per l’accesso cifrato, confrontate il certificato di Neutron e rendetelo attendibile. Se il certificato del client non è ancora considerato attendibile da Neutron, seguite la sezione 4.2 e riconnettetevi.
Collegatevi e aprite Objects → CS-NEUTRON Scale. Il NodeId dell’oggetto è Scale; il nome visualizzato è CS-NEUTRON Scale.
Trascinate Gross, Net, Tare, Stable, Status, ErrorCode e Unit in Data Access View.
Utilizzate il menu contestuale di Data Access View per impostare l’intervallo di pubblicazione della sottoscrizione e quello di campionamento degli elementi monitorati, inizialmente 100 ms.
Utilizzate un valore soltanto quando il relativo StatusCode OPC UA è Good. ErrorCode=1 indica che la bilancia nativa non ha errori. Status=1 o Status=3 descrive un’indicazione stabile.
L’endpoint ha la forma opc.tcp://<assigned-device-IP>:<port>. Utilizzate l’indirizzo dell’interfaccia Wi-Fi, Ethernet o LTE selezionata. La scheda OPC UA mostra l’indirizzo e offre un pulsante per copiarlo. Un indirizzo IP stabile semplifica l’integrazione.
Non è necessario configurare nel dispositivo l’indirizzo IP del PLC. Consentite il traffico TCP in entrata verso la porta selezionata. Il client deve disporre di un percorso di rete verso Neutron; un indirizzo LTE dietro NAT dell’operatore non è automaticamente raggiungibile dall’esterno di tale rete. Utilizzate una rete instradata adeguata, un APN privato o una VPN.
Impostazione | Chiave | Predefinito | Valori / effetto |
|---|---|---|---|
OPC UA disponibile | OUB | Dipende dal firmware | Sola lettura: 0 assente, 1 disponibile |
Supporto della sicurezza | OUS | Dipende dal firmware | Sola lettura: 0 assente, 1 disponibile |
Server OPC UA | OUE | Disattivato | 0 disattivato, 1 attivato |
Porta TCP | OUP | 4840 | 1024–65535; selezionate una porta di servizio non utilizzata |
Intervallo minimo di aggiornamento | OUI | 100 ms | 10–5000 ms; intervallo minimo di campionamento e pubblicazione accettato dal server |
Sicurezza della connessione | OUM | Non protetta | 0 None/anonymous; 1 Basic256Sha256/SignAndEncrypt con nome utente/password |
Accesso anonimo ai comandi | OUC | Disattivato | Solo in modalità non protetta: 0 sola lettura; 1 tutti i comandi supportati consentiti |
Il salvataggio delle impostazioni OPC UA riavvia il servizio OPC UA e disconnette i client. Anche le modifiche a utenti e attendibilità riavviano il servizio. Riconnettetevi dopo queste modifiche. Vengono riutilizzate le impostazioni esistenti di IP del dispositivo, bilancia e orologio.
L’intervallo minimo è un limite inferiore, non un periodo fisso di trasmissione né una garanzia di latenza complessiva. I client richiedono i propri intervalli e devono utilizzare i valori rivisti restituiti dal server.
Modalità | Politica / sicurezza dei messaggi | Autenticazione | Autorizzazione ai comandi |
|---|---|---|---|
Non protetta | None / None | Anonymous | Controllato da Anonymous command access |
Cifrata | Basic256Sha256 / SignAndEncrypt | Nome utente e password; certificato applicativo del client attendibile | Controllato dall’autorizzazione dell’utente |
In modalità cifrata non sono supportate sessioni anonime né l’autenticazione utente basata su certificati. Il certificato applicativo del client identifica il software client; non sostituisce l’autenticazione con nome utente e password. Il PIN della configurazione web e il certificato HTTPS sono separati dalle credenziali e dai certificati OPC UA.
Utilizzate la modalità non protetta su una rete isolata e attendibile. Non cifra i dati e non autentica i singoli utenti.
Aprite le impostazioni OPC UA di Neutron tramite HTTPS o Bluetooth autenticato.
Aggiungete un utente. I nomi utente contengono 1–64 lettere ASCII, cifre, trattini bassi o trattini e distinguono maiuscole e minuscole. Le password contengono 12–128 caratteri. Sono supportati fino a otto utenti; non esiste un account OPC UA predefinito.
Selezionate Read only o Read and execute commands.
Attivate OPC UA cifrato e salvate. L’orologio del dispositivo deve essere sincronizzato e deve esistere almeno un utente. L’avvio sicuro attende la sincronizzazione dell’orologio.
Al primo avvio sicuro Neutron genera la propria chiave privata e un certificato applicativo autofirmato RSA-2048, valido per cinque anni.
Nel client confrontate l’impronta SHA-256 del certificato di Neutron con quella visualizzata nell’interfaccia di configurazione, quindi rendetelo attendibile.
Tentate la connessione cifrata. Neutron rifiuta un certificato applicativo del client sconosciuto e lo elenca in Certificates come rejected.
Fate clic su Refresh certificates and users, confrontate l’impronta del client e fate clic su Approve per quel certificato.
Riconnettetevi con nome utente e password.
Il client deve considerare attendibile Neutron prima di poter proseguire fino all’invio del proprio certificato. L’approvazione non esclude la verifica di scadenza, firma, utilizzo della chiave o URI dell’applicazione.
Operazione | Sola lettura | Lettura ed esecuzione dei comandi |
|---|---|---|
Lettura delle variabili / sottoscrizione | Sì | Sì |
ReadMeasurement | Sì | Sì |
GetCapturedMeasurement | Sì | Sì |
CaptureStableWeight | No | Sì |
TareCurrent, SetTare, Zero, ClearTare | No | Sì |
SetFilter, SetHRFilter, SetChannel | No | Sì |
Scrivere variabili / amministrare utenti o certificati tramite OPC UA | No | No |
I ruoli memorizzati Reader e Operator corrispondono a queste due autorizzazioni. Non esistono livelli di autorizzazione per singolo comando. In modalità cifrata si applica l’autorizzazione dell’utente; OUC viene ignorato. In modalità non protetta OUC autorizza tutti i comandi supportati oppure nessuno.
Cinque accessi falliti provocano un blocco degli accessi di 30 secondi per l’intero server. Ciò può temporaneamente interessare anche altri utenti. Le password degli utenti vengono memorizzate come hash PBKDF2-HMAC-SHA256 con salt; l’interfaccia di amministrazione non esporta password o chiavi private.
L’URI applicativo di Neutron è:
urn:preciz:cs-neutron:<MID>Il certificato generato include questo URI, il nome host <MID>.local in minuscolo e l’IP del dispositivo al momento della generazione. Mantenete stabile l’indirizzo oppure emettete un certificato sostitutivo che contenga gli indirizzi utilizzati dai client.
Non serve un certificato CA per certificati applicativi autofirmati esplicitamente considerati attendibili. Per una PKI gestita dall’azienda:
Selezionate Create and download CSR. La CSR utilizza la chiave esistente del dispositivo.
Fate emettere dalla CA un certificato applicativo OPC UA che mantenga l’URI applicativo nel SAN e gli usi estesi della chiave server/client e gli usi di firma digitale e cifratura della chiave appropriati.
Importatelo come CA-signed device certificate. La relativa chiave privata deve corrispondere alla chiave esistente di Neutron. Installate nel client la catena CA richiesta.
Per considerare attendibili i client con certificati emessi da una CA, importate la radice emittente come Trusted client certificate or CA. Importate le CA intermedie come Intermediate issuer CA. La sola presenza di una CA intermedia nell’archivio degli emittenti non conferisce attendibilità.
Se si utilizza il controllo delle revoche, importate le CRL firmate dalla CA come Certificate revocation list e aggiornatele prima della scadenza. Importate prima le CA emittenti.
Sono supportate importazioni PEM o DER, fino a 8192 byte per file. Ciascun archivio di certificati attendibili, rifiutati, emittenti e CRL contiene fino a 12 voci. Rimuovete le voci rifiutate obsolete quando l’archivio è pieno. Per le CRL installate vengono controllate date e firma dell’emittente; le CRL scadute causano il rifiuto delle nuove connessioni interessate. Senza CRL installate, il controllo delle revoche non viene eseguito. Le CRL non vengono scaricate automaticamente; non sono offerte la gestione OCSP e GDS.
Rinnovate un certificato creando una CSR e importando il certificato rinnovato. Un certificato del dispositivo scaduto impedisce l’avvio sicuro. Replace device identity rimuove chiave, certificato e CSR attuali e genera una nuova identità all’avvio sicuro successivo; i client devono considerarla nuovamente attendibile. Utenti e client attendibili vengono mantenuti.
Utenti e archivi dei certificati restano disponibili dopo normali riavvii e aggiornamenti OTA. La cancellazione del filesystem del dispositivo li rimuove. Prima di trasferire la proprietà del dispositivo, rimuovete esplicitamente gli utenti precedenti e le voci di attendibilità.
URI del namespace del produttore:
urn:preciz:cs-neutron:weighing:1Risolvete questo URI in Server/NamespaceArray a ogni connessione. Non impostate nel codice un indice di namespace fisso pari a 1 o 2. Il suffisso di versione :1 appartiene all’URI stabile del namespace; la versione del modello scaricabile è 1.3.0.
Esempi di forme per la stessa variabile:
nsu=urn:preciz:cs-neutron:weighing:1;s=Scale.Gross
ns=2;s=Scale.GrossLa forma numerica è valida soltanto quando il server assegna attualmente questo URI all’indice 2. Se un client non accetta la sintassi nsu=, risolvete l’URI e costruite il NodeId con indice numerico. Gli identificatori del produttore sono stringhe che distinguono maiuscole e minuscole, compresi i punti in Scale.Gross.
Posizione nell’albero | NodeId String dell’oggetto |
|---|---|
Objects / CS-NEUTRON Scale |
|
Objects / Device |
|
Objects / Server | Namespace standard 0, NodeId numerico |
I metodi devono essere richiamati con Scale come ObjectId padre e con il NodeId del metodo come MethodId.
Gross, Net e Tare vengono esportati come valori Double normalizzati al numero di decimali configurato. HR è il peso lordo ad alta risoluzione prima dell’arrotondamento del display, non il peso netto né l’ADC grezzo. Ogni peso utilizza l’unità attuale Scale.Unit; OPC UA non converte le unità. Il tipo di trasporto Double non aumenta la precisione del sensore.
I valori binari in virgola mobile non rappresentano esattamente ogni decimale. Formattate i pesi visualizzati utilizzando Scale.Decimals e utilizzate Scale.Division come passo di pesatura. HR può apparire in notazione scientifica: 9.31e-5 kg significa 0.0000931 kg.
Neutron copia gli ultimi valori di pesatura nell’istantanea OPC UA approssimativamente ogni min(OUI, 50) millisecondi, secondo la disponibilità dell’acquisizione. Letture e sottoscrizioni non avviano un’altra conversione ADC.
SourceTimestamp identifica l’istante dell’istantanea di misura quando l’orologio del dispositivo è sincronizzato. È assente prima della sincronizzazione. ServerTimestamp è il riferimento temporale fornito dal server per il DataValue; non deve necessariamente coincidere con SourceTimestamp. I riferimenti temporali OPC UA utilizzano UTC.
Letture separate o notifiche di sottoscrizione possono riferirsi a istantanee diverse. Utilizzate ReadMeasurement o un risultato acquisito quando i campi devono appartenere alla stessa misura. Un valore monitorato invariato non deve necessariamente produrre una nuova notifica a ogni intervallo.
DataValue StatusCode | Significato / azione del client |
|---|---|
Good | Il valore è utilizzabile; controllate Stable e lo stato nativo secondo necessità |
BadNoCommunication | Nessuna istantanea o più di due secondi senza una nuova istantanea; scartate la misura in tempo reale |
BadSensorFailure | Errore nativo della bilancia; controllate ErrorCode |
BadOutOfRange | Sottocarico o sovraccarico; scartate la misura |
La qualità si applica a pesi, ADC e Stable. Status, ErrorCode e Unit restano leggibili durante errori nativi della bilancia, ma diventano obsoleti se le istantanee si interrompono. La diagnostica di comandi e acquisizioni resta leggibile indipendentemente dalla qualità della bilancia in tempo reale. I metadati sono informazioni di configurazione; il loro stato Good non dimostra che il risultato di pesatura in tempo reale sia valido.
Tutte le voci seguenti sono di sola lettura. I NodeId sono identificatori stringa del produttore, salvo quelli indicati come namespace standard 0. Tutte le voci scalari hanno ValueRank −1.
NodeId String | Tipo | Unità | Descrizione |
|---|---|---|---|
| Double | Scale.Unit | Peso lordo arrotondato |
| Double | Scale.Unit | Peso netto arrotondato |
| Double | Scale.Unit | Tara applicata |
| Double | Scale.Unit | Peso lordo ad alta risoluzione non arrotondato |
| Int32 | Conteggi ADC | Valore ADC esistente della bilancia copiato nell’istantanea; nessuna lettura hardware aggiuntiva |
| Boolean | — | Indicatore di stabilità della bilancia |
| UInt16 | — | Stato dell’indicazione; tabella seguente |
| UInt16 | — | Errore nativo; 1 significa nessun errore |
| String | — | Unità configurata, ad esempio kg o g |
| UInt16 | decimali | Numero di decimali del peso visualizzato |
| Double | Scale.Unit | Divisione di pesatura attiva |
| Double | Scale.Unit | Portata del campo attivo |
| UInt16 | — | Impostazione FT attiva, 1–1023 |
| Boolean | — | Impostazione FC: false disattivato, true attivato; controlla il chopping ADC |
ADC non è una scansione separata per ciascuna cella di carico. Non viene esposta alcuna variabile mV. Nonostante il nome, HRFilter controlla la funzione esistente FC/chopping ADC, non un filtro software applicato esclusivamente alla variabile HR di OPC UA.
Scale.Status | Significato |
|---|---|
0 | Sottocarico |
1 | Entro l’intervallo di zero |
2 | Instabile |
3 | Stabile |
4 | Sovraccarico |
255 | Istantanea non inizializzata |
Utilizzate Scale.Stable come indicatore di stabilità. Scale.Status e StatusCode OPC UA sono concetti separati; uno stato nativo pari a 3 non è un codice di qualità OPC UA.
Scale.ErrorCode | Significato |
|---|---|
1 | Nessun errore |
99 | Timeout del comando |
98 | Comando sconosciuto |
97 | Bilancia disattivata |
96 | Taratura mancante |
95 | Dati metrologici mancanti |
94 | Errore del registro di stato ADC |
93 | Errore del riferimento ADC |
92 | Errore della modalità di conversione ADC |
91 | Errore di configurazione dell’orologio ADC |
90 | Errore di configurazione del ciclo singolo ADC |
89 | Errore di configurazione del filtro di reiezione ADC |
88 | Mancata corrispondenza del filtro ADC |
87 | Errore di configurazione del canale ADC |
86 | Mancata corrispondenza del chopping ADC |
85 | Errore della modalità bipolare ADC |
84 | Errore di configurazione del riferimento esterno ADC |
83 | Mancata corrispondenza del guadagno ADC |
82 | Errore del filtro di media ADC |
Le proprietà hanno i seguenti NodeId String del produttore. I relativi BrowseName si trovano nel namespace 0, ad esempio 0:EngineeringUnits.
Schema del NodeId String | Tipo | Significato |
|---|---|---|
| EUInformation | Metadati dell’unità |
| Range | Intervallo ingegneristico Low/High |
| Double | Numero di decimali esportato, uguale a Decimals |
EURange è [0, Capacity], tranne per Net che utilizza [-Capacity, Capacity]. L’intervallo ingegneristico è un metadato, non un’istruzione per limitare i valori. ValuePrecision è il numero di decimali, non la divisione né una specifica di precisione. HR non ha una proprietà ValuePrecision.
EngineeringUnits utilizza i codici UN/CEFACT per kg (4933453), g (4674125), lb (4997714) e oz (5197402). Gli altri simboli di unità hanno UnitId −1 e un namespace standard vuoto. Aggiornate i metadati dopo modifiche a unità, campo o configurazione della bilancia.
NodeId String | Tipo | Descrizione |
|---|---|---|
| UInt32 | ID dell’ultimo comando di tara/azzeramento/filtro accettato |
| UInt16 | 0 inattivo; 1 in coda; 2 in esecuzione; 3 riuscito; 4 fallito |
| String | Risposta nativa o motivo del rifiuto |
| UInt32 | ID dell’ultima richiesta di acquisizione stabile accettata |
| UInt16 | 0 inattivo; 1 in attesa; 2 completato; 3 timeout |
Gli ID dei comandi e delle acquisizioni sono sequenze separate. Entrambe sono condivise da tutti i client, locali al servizio in esecuzione e azzerate al riavvio del servizio.
NodeId String | Tipo | Descrizione |
|---|---|---|
| String | PRECIZ |
| String | Modello del dispositivo |
| String | MID |
| String | Versione del firmware |
| String | Versione dell’hardware |
| String | Nome del dispositivo configurato |
I valori di identificazione vengono caricati all’avvio di OPC UA. Riavviate il servizio dopo aver modificato il nome del dispositivo per aggiornare DeviceName.
I percorsi seguenti sono relativi a Objects / Server e utilizzano il namespace 0.
Percorso di esplorazione | Tipo / valore |
|---|---|
ServerArray | String[]; l’indice 0 è l’URI applicativo del dispositivo |
NamespaceArray | String[]; l’indice 0 è il namespace OPC UA, l’indice 1 è l’URI applicativo del dispositivo; risolvete l’URI del produttore in questo array |
ServerStatus | ServerStatusDataType |
ServerStatus/StartTime, CurrentTime | DateTime, dichiarato UtcTime |
ServerStatus/State | ServerState; 0 Running durante il normale funzionamento |
ServerStatus/SecondsTillShutdown | UInt32; 0 quando non è previsto alcun arresto |
ServerStatus/ShutdownReason | LocalizedText |
ServerStatus/BuildInfo | BuildInfo: ProductUri, ManufacturerName, ProductName, SoftwareVersion, BuildNumber, BuildDate |
ServiceLevel | Byte; 255 durante il normale funzionamento |
Auditing | Boolean; false |
VendorServerInfo | Oggetto delle informazioni del produttore |
ServerRedundancy/RedundancySupport | RedundancySupport; 0 None |
ServerCapabilities/ServerProfileArray | String[]; URI dei profili/facet di implementazione |
ServerCapabilities/LocaleIdArray | LocaleId[]; en |
ServerCapabilities/MinSupportedSampleRate | Durata in ms; minimo OUI attivo |
ServerCapabilities/MaxBrowseContinuationPoints | UInt16; 5 per sessione |
ServerCapabilities/SoftwareCertificates | SignedSoftwareCertificate[]; vuoto |
ServerCapabilities/ModellingRules, AggregateFunctions | Cartelle |
ServerCapabilities/OperationLimits | Limiti per richiesta elencati nella sezione 9 |
Le variabili array standard hanno ValueRank 1 e ArrayDimensions [0]; zero indica una lunghezza massima non specificata. ServerProfileArray identifica il target di implementazione Micro Embedded Device 2017 e i facet attivi di trasporto, metodi e sicurezza. Questo identificatore di profilo non è un marchio di certificazione OPC Foundation.
Scale.ActiveChannel è una variabile UInt16 che mostra il canale di pesatura attualmente attivo. È di sola lettura; selezionate un canale tramite Scale.SetChannel. NodeSet2 1.3.0 supporta la selezione dei canali 1–4. Risolvete l’URI del namespace alla connessione, come descritto nella sezione 5.1.
Richiamate ogni metodo sull’oggetto padre Scale. Fornite argomenti scalari con i tipi OPC UA esatti indicati; non sostituite String, Int32 o Double a un argomento UInt32 o Boolean.
SetChannel utilizza Channel: UInt16 (1–4) e restituisce RequestId: UInt32; vedere la sezione 7.9.
NodeId String del metodo | Argomenti di ingresso | Uscita | Autorizzazione |
|---|---|---|---|
| Nessuno | Undici campi di misura, sezione 8.1 | Lettura |
| TimeoutMs: UInt32 | RequestId: UInt32 | Esecuzione |
| RequestId: UInt32 | Undici campi di misura, sezione 8.1 | Lettura |
| Nessuno | RequestId: UInt32 | Esecuzione |
| Value: Double | RequestId: UInt32 | Esecuzione |
| Nessuno | RequestId: UInt32 | Esecuzione |
| Nessuno | RequestId: UInt32 | Esecuzione |
| Value: UInt16 | RequestId: UInt32 | Esecuzione |
| Enabled: Boolean | RequestId: UInt32 | Esecuzione |
Esegue la tara del peso lordo stabile attuale tramite l’operazione nativa T. Imposta la tara uguale al lordo e il netto diventa zero; non modifica il punto di zero del lordo. La bilancia deve accettare l’operazione di tara stabile entro il timeout del comando.
Esempio con 1.11 kg sulla bilancia: Gross resta 1.11 kg, Tare diventa 1.11 kg e Net diventa 0.00 kg. Una risposta nativa riuscita è simile a T S 1.11 kg.
Imposta una tara preimpostata in Scale.Unit tramite l’operazione nativa TA. Value deve essere finito, non negativo, non superiore a 1.000.000.000 e non superiore alla portata. La tara applicata viene arrotondata alla divisione della bilancia. Leggete Scale.Tare al termine per ottenere il valore applicato. Esempio di ingresso: Double 0.250 quando Unit è kg.
Esegue il comando nativo Z, secondo la stabilità e l’intervallo di zero configurato. Se riesce, il punto di zero viene regolato e la tara applicata o preimpostata esistente viene cancellata. La risposta nativa riuscita è Z A. Questa operazione è distinta da TareCurrent.
Esegue il comando nativo TAC, rimuovendo la tara applicata e preimpostata. Gross viene mantenuto e Net torna uguale a Gross. Non vi sono argomenti di ingresso.
Value è UInt16, 1–1023 inclusi. Imposta FT per il canale di pesatura attivo tramite il gestore esistente della configurazione del filtro. Zero e valori superiori a 1023 restituiscono BadOutOfRange. Esempio: UInt16 512.
Enabled è Boolean: true attiva il chopping FC/ADC, false lo disattiva. Un valore numerico inviato con un tipo OPC UA numerico non è un Boolean e viene rifiutato.
FT e FC vengono attivati e salvati per il canale attivo tramite i gestori di configurazione nativi. Un errore della verifica hardware produce un esito del comando non riuscito. L’acquisizione può interrompersi durante l’applicazione dell’impostazione. Leggete Scale.Filter o Scale.HRFilter al termine per conoscere l’impostazione attiva.
Per TareCurrent, SetTare, Zero, ClearTare, SetChannel, SetFilter e SetHRFilter:
Richiamate il metodo e conservate il RequestId restituito.
Leggete LastCommandId, LastCommandState e LastCommandResult oppure sottoscrivete le relative notifiche.
Associate il risultato soltanto a un LastCommandId corrispondente.
Lo stato 3 significa successo; lo stato 4 significa errore. Gli stati 1 e 2 indicano operazioni in attesa.
Leggete i valori di processo o configurazione interessati dopo il completamento riuscito.
Un risultato Call Good conferma l’accettazione, non il completamento. Soltanto uno di questi comandi può essere in coda o in esecuzione alla volta; un altro riceve BadResourceUnavailable. Restano validi i vincoli esistenti di stabilità, disponibilità, stato occupato e interblocchi applicativi della bilancia.
Lo slot del comando e la diagnostica dell’ultimo risultato sono condivisi dall’intero dispositivo. Coordinate chi invia i comandi se due client possono farlo: un comando successivo può sostituire la diagnostica dell’ultimo completato prima che un altro client la legga. Non costituisce uno storico dei comandi.
Gli ID delle richieste non sono identificatori persistenti delle operazioni. Dopo una perdita di connessione, controllate lo stato della bilancia interessato prima di riprovare un comando il cui esito è sconosciuto. Il riavvio del servizio cancella la diagnostica e annulla i comandi della bilancia gestiti da OPC UA ancora incompleti; non annulla una tara, un azzeramento o una modifica delle impostazioni già completati.
Richiamate Scale.SetChannel sull’oggetto Scale. Il suo argomento di ingresso Channel è uno scalare UInt16 con valore 1–4; gli altri valori vengono rifiutati. L’argomento di uscita RequestId è un UInt32.
La chiamata richiede l’autorizzazione ai comandi e reinizializza la bilancia. Coordinate l’esecuzione con gli altri comandi e seguite la sequenza asincrona della sezione 7.8. Leggete il canale selezionato da Scale.ActiveChannel.
ReadMeasurement() restituisce immediatamente l’ultima istantanea valida. Non attende la stabilità e non richiede una nuova lettura ADC. GetCapturedMeasurement restituisce la stessa struttura di uscita per un risultato stabile memorizzato.
Posizione (indice iniziale zero) | Argomento | Tipo OPC UA | Significato |
|---|---|---|---|
0 | MeasurementId | UInt64 | Numero progressivo dell’istantanea |
1 | Gross | Double | Peso lordo |
2 | Net | Double | Peso netto |
3 | Tare | Double | Tara applicata |
4 | HR | Double | Peso lordo ad alta risoluzione |
5 | Stable | Boolean | Stabilità di questa istantanea |
6 | Status | UInt16 | Stato nativo della bilancia |
7 | ErrorCode | UInt16 | Codice di errore nativo della bilancia |
8 | Unit | String | Unità di questo risultato |
9 | Timestamp | DateTime | Ora UTC dell’istantanea, oppure zero se non sincronizzata |
10 | TimeSynchronized | Boolean | Indica se Timestamp è utilizzabile come data e ora di calendario |
Tutti i campi appartengono a un’unica istantanea. MeasurementId aumenta per ogni istantanea OPC UA, non per ogni conversione ADC fisica, e si azzera con il servizio. Conservate la precisione UInt64 quando lo memorizzate. ADC, metadati e filtri sono nodi in tempo reale separati e non sono inclusi nel risultato a undici campi di questo metodo.
Se TimeSynchronized è false, non interpretate Timestamp come una data di calendario. ReadMeasurement restituisce BadNoCommunication, BadSensorFailure o BadOutOfRange quando l’istantanea in tempo reale è assente o obsoleta, presenta un errore nativo oppure è fuori campo.
Richiamate CaptureStableWeight(TimeoutMs) con UInt32 100–60000 ms. Ad esempio, 5000 consente fino a cinque secondi per una misura valida e stabile. Zero non è valido.
Conservate il RequestId UInt32 restituito.
Richiamate GetCapturedMeasurement(RequestId) utilizzando quell’ID. Durante l’attesa restituisce BadWaitingForInitialData. Ripetete a un intervallo moderato, ad esempio 100 ms.
In caso di successo, memorizzate il risultato a undici campi insieme al RequestId dell’acquisizione.
In alternativa, sottoscrivete LastCaptureId e LastCaptureState, quindi recuperate il risultato quando la richiesta corrispondente raggiunge lo stato 2.
LastCaptureState | Significato |
|---|---|
0 | Inattivo |
1 | In attesa |
2 | Completato; risultato disponibile |
3 | Timeout |
L’istantanea acquisita deve essere pubblicata dopo l’avvio della richiesta e deve essere stabile, recente, priva di errori nativi ed entro il campo. Le istantanee non valide vengono saltate finché ne arriva una adeguata o scade il timeout. Se la bilancia è già stabile, l’istantanea valida successiva può completare subito l’acquisizione; non serve una transizione da instabile a stabile né un ulteriore periodo di mantenimento.
L’operazione non esegue la tara o l’azzeramento della bilancia e non blocca gli altri client. Può essere in attesa una sola acquisizione. Esiste un solo risultato memorizzato per l’intero dispositivo, condiviso da tutti i client. Rimane invariato anche se il peso in tempo reale cambia o diventa indisponibile. L’avvio di una nuova acquisizione sostituisce richiesta e risultato precedenti. Non esiste uno storico delle acquisizioni.
Risultato di GetCapturedMeasurement | Significato |
|---|---|
Good | Risultato memorizzato restituito |
BadWaitingForInitialData | Acquisizione corrispondente ancora in attesa |
BadTimeout | Acquisizione corrispondente scaduta senza una misura valida e stabile |
BadNotFound | L’ID è zero, sconosciuto, sostituito o non più disponibile dopo il riavvio |
BadNoData | Nessun risultato completato per lo stato dell’acquisizione corrispondente |
Utilizzate il RequestId dell’acquisizione, non il MeasurementId del risultato, come ingresso di GetCapturedMeasurement. L’acquisizione può terminare dopo la disconnessione del client che l’ha avviata. Può essere recuperata dopo la riconnessione con lo stesso ID se il servizio OPC UA è rimasto in esecuzione. Il riavvio del servizio cancella acquisizioni in attesa, risultati memorizzati e ID; coordinate le richieste di acquisizione tra client.
Parametro | Significato |
|---|---|
OUI | Limite inferiore configurato per campionamento e pubblicazione |
Intervallo di campionamento | Frequenza di campionamento di un elemento monitorato |
Intervallo di pubblicazione | Frequenza con cui la sottoscrizione può pubblicare le notifiche in coda |
Dimensione della coda | Numero di notifiche conservate per elemento monitorato |
Keepalive | Indica una sottoscrizione attiva quando non ci sono notifiche |
Iniziate con 100–250 ms e dimensione della coda 1 per una visualizzazione in tempo reale. Per l’aggiornamento più rapido disponibile, impostate OUI a 10 ms, riconnettetevi dopo il salvataggio e richiedete campionamento e pubblicazione a 10 ms. Utilizzate gli intervalli rivisti dal server nella logica del client.
Campionare più rapidamente della frequenza fisica di acquisizione non crea nuove misure. Latenza di rete, cifratura, carico del client e impostazioni di pubblicazione influiscono sul tempo di risposta osservato. Server Status / Response Time di UAExpert non è l’intervallo di campionamento o pubblicazione della sottoscrizione.
Risorsa | Limite |
|---|---|
SecureChannels | 4 complessivi, inclusa la sovrapposizione durante la riconnessione |
Sessioni | 2 simultanee |
Timeout della sessione | Timeout massimo negoziato di 30 secondi |
Sottoscrizioni | 4 complessive; 2 per sessione |
Elementi monitorati | 64 complessivi; 32 per sottoscrizione |
Coda degli elementi monitorati | 1–16 valori per elemento |
Richieste Publish in attesa | 4 per sessione |
Coda di ritrasmissione | 16 messaggi per sottoscrizione |
Punti di continuazione Browse | 5 per sessione |
Campionamento/pubblicazione minimi | OUI, 10–5000 ms; predefinito 100 ms |
Operazioni Read / Write / Browse | 32 per richiesta |
Operazioni RegisterNodes / TranslateBrowsePaths | 32 per richiesta |
Operazioni Method Call | 8 per richiesta |
Operazioni sugli elementi monitorati | 32 per richiesta |
Si tratta di totali per l’intero server, salvo quando è indicato un ambito per sessione o sottoscrizione. Se la coda delle richieste Publish è piena, la richiesta in attesa più vecchia riceve BadTooManyPublishRequests, così può essere accodata una nuova richiesta. Conferme e Republish operano sulla coda di ritrasmissione limitata. Il limite delle operazioni Write non rende scrivibili le variabili di sola lettura.
Chiudete correttamente le sessioni. Un client disconnesso può lasciare la sessione precedente a occupare uno slot fino alla scadenza. Riutilizzate o riattivate una sessione esistente, se supportato; altrimenti attendete la scadenza. Una nuova istanza del server non può riattivare una sessione precedente al riavvio del servizio: create una sessione, risolvete i namespace e ricreate le sottoscrizioni. I client TCP che non ricevono i dati possono essere disconnessi dopo una scadenza di invio di un secondo.
Guardate il tutorial Neutron NS OPC UA su YouTube
Aprite CS-NEUTRON Scale, fate clic con il pulsante destro su CaptureStableWeight e selezionate Call.
Inserite TimeoutMs 5000 e fate clic su Call. Annotate il RequestId restituito.
Aprite GetCapturedMeasurement e inserite lo stesso RequestId.
Fate clic su Call. Se l’acquisizione è in attesa, richiamate GetCapturedMeasurement con lo stesso ID.
Leggete Gross, Net, Tare, HR, Stable, Status, ErrorCode, Unit e Timestamp dal risultato restituito. Lasciate in esecuzione la richiesta di acquisizione esistente durante l’attesa; non avviate ripetutamente nuove acquisizioni.
Installate il pacchetto client in un ambiente virtuale Python:
python -m pip install asyncuaPreparate un certificato applicativo del client OPC UA e la relativa chiave privata. Il relativo URI applicativo SAN deve corrispondere a CLIENT_URI qui sotto. Approvate il certificato su Neutron e scaricate il certificato di Neutron come neutron.der. Sostituite endpoint, nome utente e URI del client con i vostri valori. Il file della chiave privata di questo esempio è accessibile al client Python; non è la chiave privata di 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 richiede dati validi in tempo reale. Eccezioni come BadSensorFailure o BadOutOfRange devono essere gestite dall’applicazione chiamante. BadTimeout da GetCapturedMeasurement significa che il timeout di acquisizione del server è scaduto; non è un motivo per riutilizzare una vecchia misura memorizzata come nuova acquisizione riuscita.
Il codice seguente viene eseguito all’interno di una connessione async with client già stabilita. Il gestore verifica la qualità prima di utilizzare il valore.
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’intervallo di pubblicazione richiesto è 100 ms. Configurate il campionamento degli elementi monitorati tramite la libreria client secondo necessità e rispettate i valori rivisti dal server.
Utilizzate i blocchi client OPC UA forniti dal produttore del PLC. Risolvete i NodeId String tramite l’URI del namespace del produttore. Quella seguente è una sequenza indipendente dal produttore, non un’implementazione in uno specifico linguaggio di programmazione PLC:
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 LastCommandResultAssociate MeasurementId UInt64 a un tipo intero PLC appropriato. Non inviate a SetHRFilter un sostituto numerico di Boolean. Serializzate i comandi e la gestione dell’acquisizione stabile nel PLC o nell’applicazione quando più client hanno l’autorizzazione ai comandi.
Sintomo / stato | Significato e intervento |
|---|---|
BadCommunicationError / connessione rifiutata | Verificate che OPC UA sia attivo, IP e porta dell’endpoint, percorso di rete selezionato e firewall. Il registro di avvio deve contenere |
BadCertificateUntrusted | Rendete attendibile Neutron nel client e approvate il certificato del client in Neutron, oppure installate la catena CA appropriata |
Errori di validità temporale o URI del certificato | Sincronizzate gli orologi e utilizzate un certificato con date valide e con l’URI applicativo configurato del client |
BadIdentityTokenRejected / BadUserAccessDenied | Utilizzate nome utente e password corretti e l’autorizzazione ai comandi richiesta; attendete la fine del blocco di 30 secondi dopo ripetuti accessi falliti |
BadTooManySessions / limite delle sessioni raggiunto | Due slot sono occupati; disconnettete un altro client o attendete la scadenza di una sessione abbandonata |
BadNodeIdUnknown | Risolvete nuovamente l’URI del namespace del produttore, controllate maiuscole e minuscole del NodeId String e la compatibilità di firmware e modello |
BadTypeMismatch | Utilizzate il tipo scalare esatto dell’argomento indicato nella sezione 7.1 |
BadOutOfRange su CaptureStableWeight | Il timeout deve essere UInt32 100–60000; zero non è valido |
BadOutOfRange su SetFilter / SetTare | Utilizzate FT 1–1023 oppure una tara finita non negativa entro la portata e 1e9 |
BadResourceUnavailable | Lo slot del comando o dell’acquisizione è occupato; attendete l’operazione in corso |
Il Call del comando è Good ma l’operazione fallisce | Controllate LastCommandState e LastCommandResult corrispondenti; Good confermava soltanto l’inserimento in coda |
BadNotWritable durante la scrittura di variabili | Le variabili di processo sono di sola lettura; utilizzate il metodo supportato |
Acquisizione BadWaitingForInitialData | Continuate a recuperare lo stesso ID di acquisizione; il server attende un campione valido e stabile |
Acquisizione BadTimeout | Nessun campione stabile idoneo è arrivato prima della scadenza |
Acquisizione BadNotFound | Utilizzate il RequestId di acquisizione restituito; un’acquisizione più recente o il riavvio del servizio ha invalidato il vecchio ID |
ServerCapabilities assente dopo una modifica del firmware | Aggiornate lo spazio degli indirizzi o riconnettetevi con un nuovo progetto client per eliminare i risultati di esplorazione memorizzati nella cache |
Misure vuote o obsolete | Mantenete attiva l’acquisizione della bilancia, controllate ErrorCode e stato nativo e verificate la qualità del DataValue |
NodeSet2 descrive lo spazio degli indirizzi del produttore, gli argomenti dei metodi, i riferimenti e i tipi per gli strumenti di modellazione offline. Gli indici dei namespace sono locali al file XML; risolvete l’URI del namespace sul dispositivo in funzione. L’XML contiene definizioni del modello, non misure attuali né un backup di utenti, certificati o impostazioni. Gli intervalli in esecuzione e le autorizzazioni di esecuzione seguono la configurazione attiva del dispositivo.
Modello informativo | Aggiunte all’interfaccia |
|---|---|
1.0 | Valori di pesatura di base e metodi di tara/azzeramento |
1.1.0 | Metadati di misura, identificazione, misura coerente e acquisizione stabile |
1.2.0 | ADC, valori FT/FC e SetFilter/SetHRFilter |
1.3.0 | ActiveChannel e SetChannel per leggere il canale attivo e selezionare il canale 1–4. |
L’URI del namespace resta urn:preciz:cs-neutron:weighing:1. Le firme dei metodi esistenti vengono mantenute; ReadMeasurement/GetCapturedMeasurement restituiscono undici campi. Scegliete un firmware che contenga OPC UA e le funzioni richieste dall’integrazione. Una build del firmware senza OPC UA non può esporre un endpoint.
Sì. Selezionate Basic256Sha256 / SignAndEncrypt, utilizzate nome utente e password e stabilite l’attendibilità reciproca dei certificati applicativi. È disponibile anche la modalità non protetta None/Anonymous.
Richiamate CaptureStableWeight con un timeout UInt32 di 100–60000 ms, conservate il RequestId e recuperate il risultato a undici campi tramite GetCapturedMeasurement utilizzando lo stesso ID. Durante l’attesa, ripetete il recupero invece di avviare un’altra acquisizione.
Per i comandi di tara, azzeramento e filtro, Good conferma l’accettazione. Fate corrispondere LastCommandId al RequestId restituito e attendete LastCommandState 3 (successo) o 4 (errore).
Risolvete urn:preciz:cs-neutron:weighing:1 in NamespaceArray a ogni connessione. Il modello informativo scaricabile è la versione 1.3.0; un indice numerico del namespace come 2 è soltanto un esempio.
Guida ai comandi CSCP per Neutron: struttura dei messaggi, pesatura, configurazione, conteggio, controllo del peso e I/O digitali.
Riferimento Neutron Modbus RTU/TCP per l’integrazione PLC, SCADA e HMI: collegamento, indirizzamento, registri, calibrazione e controllo della selezionatrice ponderale automatica.
Vi serve aiuto con il software, la connettività o l’utilizzo di una soluzione? Descrivete il problema, così potremo aiutarvi a individuare il passo successivo.