TECNOLOGIA DI PESATURA · SVILUPPO INTERNO · ASSISTENZA
+386 2 320 33 46info@preciz.si

PRECIZ · NEUTRON OPC UA

Neutron OPC UA — manuale di integrazione

Integrazione OPC UA per Neutron: connessioni sicure, dati di pesatura in tempo reale, acquisizione stabile e integrazione PLC/SCADA.

Versioni del manuale

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

Tabella 1

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.

Video: Neutron OPC UA

PRECIZ è membro di OPC Foundation

PRECIZ è un membro ufficialmente registrato di OPC Foundation. Visualizza la voce ufficiale PRECIZ nell’elenco dei membri di OPC Foundation.

1. Panoramica e funzionalità supportate

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:

Tabella 2

Interfaccia

Utilizzo

Variabili in tempo reale e sottoscrizioni

Visualizzare o monitorare continuamente i singoli valori

ReadMeasurement

Ottenere tutti gli undici campi di misura da un’unica istantanea attuale

CaptureStableWeight seguito da GetCapturedMeasurement

Memorizzare una nuova misura valida e stabile e recuperarla tramite ID della richiesta

2. Avvio rapido

2.1 Attivare il server

  1. Collegatevi alla pagina di configurazione locale di Neutron o all’utilità di configurazione Bluetooth. Utilizzate HTTPS o Bluetooth autenticato per gestire certificati e utenti.

  2. Selezionate l’interfaccia di rete e rilevate l’indirizzo IP assegnato.

  3. Mantenete attiva l’acquisizione della bilancia nelle impostazioni Scale.

  4. Aprite la scheda OPC UA. Il firmware deve indicare che OPC UA è disponibile.

  5. Per l’accesso cifrato, create prima un utente in Users & permissions.

  6. 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.

  7. Fate clic su Save. Copiate l’indirizzo di connessione con Copy endpoint.

Esempio di endpoint:

opc.tcp://192.168.50.73:4840

2.2 Collegamento con UAExpert

  1. Aggiungete l’endpoint come server in UAExpert.

  2. In modalità cifrata selezionate Basic256Sha256 / SignAndEncrypt e l’autenticazione Username/Password. In modalità non protetta selezionate None e Anonymous.

  3. 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.

  4. Collegatevi e aprite Objects → CS-NEUTRON Scale. Il NodeId dell’oggetto è Scale; il nome visualizzato è CS-NEUTRON Scale.

  5. Trascinate Gross, Net, Tare, Stable, Status, ErrorCode e Unit in Data Access View.

  6. 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.

3. Connessione e configurazione

3.1 Endpoint e rete

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.

3.2 Impostazioni

Tabella 3

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.

4. Sicurezza e autorizzazioni

4.1 Modalità di connessione

Tabella 4

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.

4.2 Prima connessione cifrata

  1. Aprite le impostazioni OPC UA di Neutron tramite HTTPS o Bluetooth autenticato.

  2. 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.

  3. Selezionate Read only o Read and execute commands.

  4. 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.

  5. Al primo avvio sicuro Neutron genera la propria chiave privata e un certificato applicativo autofirmato RSA-2048, valido per cinque anni.

  6. Nel client confrontate l’impronta SHA-256 del certificato di Neutron con quella visualizzata nell’interfaccia di configurazione, quindi rendetelo attendibile.

  7. Tentate la connessione cifrata. Neutron rifiuta un certificato applicativo del client sconosciuto e lo elenca in Certificates come rejected.

  8. Fate clic su Refresh certificates and users, confrontate l’impronta del client e fate clic su Approve per quel certificato.

  9. 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.

4.3 Autorizzazioni

Tabella 5

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.

4.4 Identità del dispositivo, certificati CA e rinnovo

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:

  1. Selezionate Create and download CSR. La CSR utilizza la chiave esistente del dispositivo.

  2. 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.

  3. Importatelo come CA-signed device certificate. La relativa chiave privata deve corrispondere alla chiave esistente di Neutron. Installate nel client la catena CA richiesta.

  4. 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à.

  5. 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à.

5. Spazio degli indirizzi e rappresentazione dei dati

5.1 Namespace e NodeId

URI del namespace del produttore:

urn:preciz:cs-neutron:weighing:1

Risolvete 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.Gross

La 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.

Tabella 6

Posizione nell’albero

NodeId String dell’oggetto

Objects / CS-NEUTRON Scale

Scale

Objects / Device

Device

Objects / Server

Namespace standard 0, NodeId numerico i=2253

I metodi devono essere richiamati con Scale come ObjectId padre e con il NodeId del metodo come MethodId.

5.2 Unità e precisione numerica

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.

5.3 Tempo, istantanee e qualità

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.

Tabella 7

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.

6. Riferimento dei dati

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.

6.1 Misura in tempo reale e configurazione

Tabella 8

NodeId String

Tipo

Unità

Descrizione

Scale.Gross

Double

Scale.Unit

Peso lordo arrotondato

Scale.Net

Double

Scale.Unit

Peso netto arrotondato

Scale.Tare

Double

Scale.Unit

Tara applicata

Scale.HR

Double

Scale.Unit

Peso lordo ad alta risoluzione non arrotondato

Scale.ADC

Int32

Conteggi ADC

Valore ADC esistente della bilancia copiato nell’istantanea; nessuna lettura hardware aggiuntiva

Scale.Stable

Boolean

—

Indicatore di stabilità della bilancia

Scale.Status

UInt16

—

Stato dell’indicazione; tabella seguente

Scale.ErrorCode

UInt16

—

Errore nativo; 1 significa nessun errore

Scale.Unit

String

—

Unità configurata, ad esempio kg o g

Scale.Decimals

UInt16

decimali

Numero di decimali del peso visualizzato

Scale.Division

Double

Scale.Unit

Divisione di pesatura attiva

Scale.Capacity

Double

Scale.Unit

Portata del campo attivo

Scale.Filter

UInt16

—

Impostazione FT attiva, 1–1023

Scale.HRFilter

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.

6.2 Stato nativo della bilancia

Tabella 9

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.

6.3 Codici di errore nativi

Tabella 10

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

6.4 Proprietà di misura

Le proprietà hanno i seguenti NodeId String del produttore. I relativi BrowseName si trovano nel namespace 0, ad esempio 0:EngineeringUnits.

Tabella 11

Schema del NodeId String

Tipo

Significato

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

EUInformation

Metadati dell’unità

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

Range

Intervallo ingegneristico Low/High

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

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.

6.5 Diagnostica di comandi e acquisizioni

Tabella 12

NodeId String

Tipo

Descrizione

Scale.LastCommandId

UInt32

ID dell’ultimo comando di tara/azzeramento/filtro accettato

Scale.LastCommandState

UInt16

0 inattivo; 1 in coda; 2 in esecuzione; 3 riuscito; 4 fallito

Scale.LastCommandResult

String

Risposta nativa o motivo del rifiuto

Scale.LastCaptureId

UInt32

ID dell’ultima richiesta di acquisizione stabile accettata

Scale.LastCaptureState

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.

6.6 Identificazione del dispositivo

Tabella 13

NodeId String

Tipo

Descrizione

Device.Manufacturer

String

PRECIZ

Device.Model

String

Modello del dispositivo

Device.SerialNumber

String

MID

Device.SoftwareRevision

String

Versione del firmware

Device.HardwareRevision

String

Versione dell’hardware

Device.DeviceName

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.

6.7 Informazioni standard del server

I percorsi seguenti sono relativi a Objects / Server e utilizzano il namespace 0.

Tabella 14

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.

6.8 Canale attivo — ActiveChannel

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.

7. Metodi ed esecuzione dei comandi

7.1 Riepilogo dei metodi

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.

Tabella 15

NodeId String del metodo

Argomenti di ingresso

Uscita

Autorizzazione

Scale.ReadMeasurement

Nessuno

Undici campi di misura, sezione 8.1

Lettura

Scale.CaptureStableWeight

TimeoutMs: UInt32

RequestId: UInt32

Esecuzione

Scale.GetCapturedMeasurement

RequestId: UInt32

Undici campi di misura, sezione 8.1

Lettura

Scale.TareCurrent

Nessuno

RequestId: UInt32

Esecuzione

Scale.SetTare

Value: Double

RequestId: UInt32

Esecuzione

Scale.Zero

Nessuno

RequestId: UInt32

Esecuzione

Scale.ClearTare

Nessuno

RequestId: UInt32

Esecuzione

Scale.SetFilter

Value: UInt16

RequestId: UInt32

Esecuzione

Scale.SetHRFilter

Enabled: Boolean

RequestId: UInt32

Esecuzione

7.2 TareCurrent

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.

7.3 SetTare

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.

7.4 Zero

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.

7.5 ClearTare

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.

7.6 SetFilter

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.

7.7 SetHRFilter

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.

7.8 Sequenza asincrona dei comandi

Per TareCurrent, SetTare, Zero, ClearTare, SetChannel, SetFilter e SetHRFilter:

  1. Richiamate il metodo e conservate il RequestId restituito.

  2. Leggete LastCommandId, LastCommandState e LastCommandResult oppure sottoscrivete le relative notifiche.

  3. Associate il risultato soltanto a un LastCommandId corrispondente.

  4. Lo stato 3 significa successo; lo stato 4 significa errore. Gli stati 1 e 2 indicano operazioni in attesa.

  5. 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.

7.9 SetChannel — selezionare un canale di pesatura

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.

8. Misure coerenti e acquisizione stabile

8.1 Uscita di ReadMeasurement

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.

Tabella 16

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.

8.2 CaptureStableWeight e GetCapturedMeasurement

  1. 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.

  2. Conservate il RequestId UInt32 restituito.

  3. Richiamate GetCapturedMeasurement(RequestId) utilizzando quell’ID. Durante l’attesa restituisce BadWaitingForInitialData. Ripetete a un intervallo moderato, ad esempio 100 ms.

  4. 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.

Tabella 17

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.

Tabella 18

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.

9. Sottoscrizioni, temporizzazione e limiti di capacità

9.1 Temporizzazione

Tabella 19

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.

9.2 Capacità e limiti per richiesta

Tabella 20

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.

10. Esempi di integrazione

10.1 UAExpert: acquisizione stabile

  1. Guardate il tutorial Neutron NS OPC UA su YouTube

    Aprite CS-NEUTRON Scale, fate clic con il pulsante destro su CaptureStableWeight e selezionate Call.

  2. Inserite TimeoutMs 5000 e fate clic su Call. Annotate il RequestId restituito.

  3. Aprite GetCapturedMeasurement e inserite lo stesso RequestId.

  4. Fate clic su Call. Se l’acquisizione è in attesa, richiamate GetCapturedMeasurement con lo stesso ID.

  5. 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.

10.2 Python: connessione sicura, lettura coerente e acquisizione opzionale

Installate il pacchetto client in un ambiente virtuale Python:

python -m pip install asyncua

Preparate 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.

10.3 Python: sottoscrizione al peso in tempo reale

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.

10.4 Sequenza di integrazione PLC

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 LastCommandResult

Associate 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.

11. Risoluzione dei problemi, download e compatibilità

11.1 Errori di connessione e dei metodi

Tabella 21

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 OPC UA listening on port ...

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

11.2 Download e manuali correlati

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.

11.3 Compatibilità delle versioni

Tabella 22

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.

Domande frequenti

Neutron supporta OPC UA cifrato?

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.

Come ottengo un’unica misura stabile e coerente?

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.

Una chiamata al metodo con esito Good significa che il comando è completato?

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).

Quali URI del namespace e versione del modello devo utilizzare?

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.

Avete bisogno di aiuto?

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.

Prepara una richiesta →