# OPC DA

> Un client per i server OPC Data Access classici su COM/DCOM, che gira in un processo ausiliario a 32 bit, con indirizzamento per ID elemento e una scansione dei server di una macchina.

Il driver **OPC DA** è un client per i server OPC Data Access classici (versioni 1.0, 2.05a e 3.0), i server COM attraverso cui gateway di PLC meno recenti, sistemi SCADA e simulatori pubblicano ancora i loro dati. Un server si indica con la macchina su cui gira e con il suo ProgID, per esempio `Matrikon.OPC.Simulation.1`, e ogni tag con l'ID elemento del server. Aggiungi il driver e i suoi dispositivi nella pagina [Connector](connector).

## Dispositivo {#device}

| Campo | Significato | Predefinito |
| --- | --- | --- |
| **Indirizzo host** | Il nome o l'indirizzo del computer su cui gira il server OPC DA. Vuoto indica questo computer, dove gira la maggior parte dei server classici. | vuoto: questo computer |
| **Server / Chiave** | Il ProgID del server, così come il produttore lo registra in Windows, per esempio `Matrikon.OPC.Simulation.1`. | `OPC.Server.1` |
| **Intervallo di interrogazione (ms)** | Ogni quanto la stazione legge i tag del dispositivo, a meno che un tag non fissi un intervallo proprio. | 1000 |

L'indirizzo del dispositivo si compone dai due, per esempio `opc.da://localhost/Matrikon.OPC.Simulation.1`. Non c'è una porta: COM trova il server tramite la registrazione di Windows stesso.

## Indirizzamento dei tag {#tag-addressing}

Un tag si indirizza con il suo **ID elemento**, digitato come testo libero e inviato al server esattamente come è scritto, per esempio `Random.Real8` o `Channel1.Device1.Tag1`. Gli ID elemento sono quelli del server stesso; la sua documentazione o una scansione li elenca. La stazione aggiunge ogni elemento a un gruppo del dispositivo la prima volta che un tag lo legge, e lo legge dall'apparecchiatura, non dalla cache del server.

## Tipi di dato {#data-types}

Il selettore **Tipo di dato** offre i tipi che un elemento OPC DA contiene: Boolean, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64, Float, Double, String e DateTime. Ogni lettura viene convertita nel tipo del tag, quindi scegli il tipo che il server dichiara per l'elemento, lo stesso che una scansione propone: un elemento reale a 64 bit letto come Float perde precisione, e letto come Double la conserva. Un valore che il tipo del tag non può contenere, come un testo che non è un numero o un array, lascia il tag senza valore. In OPC DA una data non porta un fuso orario, e la stazione la legge e la scrive come UTC.

Ogni valore con cui il server risponde porta la sua qualità. Un valore di buona qualità (Good) arriva al tag. Uno di qualità incerta (Uncertain) o di cattiva qualità (Bad) lascia il tag senza valore, e la riga del diario della lettura fallita nomina la qualità con le parole della specifica OPC DA, per esempio `Bad: not connected (0x0008)` oppure `Uncertain: last usable value (0x0044)`. Un elemento la cui lettura fallisce lascia il suo tag senza valore, e gli altri tag del dispositivo continuano a leggere.

## Rilevamento {#discovery}

**Rileva** elenca i server OPC DA registrati su un computer: digita il suo nome o il suo indirizzo nella destinazione della scansione, oppure lasciala vuota per questo computer. Ogni server viene offerto come dispositivo, e il suo spazio degli indirizzi viene percorso: ogni elemento che contiene viene offerto come tag in sola lettura, con il tipo che il server dichiara per esso: un reale a 64 bit come Double, un intero a 16 bit senza segno come UInt16, e così via per ogni tipo qui sopra, con un valore monetario come Double. Un elemento che non dichiara alcun tipo viene offerto come String, che legge qualunque valore; un elemento di un tipo che nessun tag legge, come un array, non viene offerto, e la scansione lo conta tra ciò che ha lasciato fuori. Vedi [Rilevamento](connector-discovery) per come i candidati vengono scelti e aggiunti.

La scansione chiede i server all'enumeratore dei server OPC (OpcEnum), tramite le librerie proxy e stub di OPC DA registrate su questo computer. Finché ne manca una, la scansione non elenca nulla e dice cosa manca, con i passi di [Installare gli OPC Core Components](#installing-the-opc-core-components).

## Scritture {#writes}

I tag il cui **Accesso** è Lettura e scrittura oppure Sola scrittura si possono scrivere, sullo stesso elemento che la lettura usa. Il valore viene inviato nel tipo in cui il server tiene l'elemento (nel tipo del tag stesso quando il server non lo dice), convertito dal valore del tag senza passare per un testo, così una stazione in qualunque lingua invia lo stesso numero. Un numero intero fuori dall'intervallo del tipo dell'elemento viene rifiutato prima di inviare qualcosa, mai tagliato al valore più vicino che il tipo può contenere. Una scrittura che il server rifiuta torna rifiutata, con il motivo quando è uno che la stazione sa dire (un elemento che non accetta scritture, un valore che l'elemento non accetta, un elemento che il server non conosce, un accesso negato) e altrimenti con il codice di errore del server, per esempio `OPC DA 0x80004005`; il diario conserva il codice del server in ogni caso. OPC DA non ha comandi: un dispositivo di questo driver non ne offre nessuno.

## Il processo ausiliario a 32 bit {#the-32-bit-helper}

I server OPC DA si raggiungono tramite un client COM a 32 bit, che la stazione a 64 bit non può caricare. Per questo il driver gira in un processo ausiliario tutto suo, `Lab.Desktop.DriverBridge.exe`, che la stazione avvia la prima volta che un dispositivo o una scansione OPC DA ne ha bisogno, o che la stazione verifica gli OPC Core Components, e chiude quando il Connector si ferma. Nell'uso del driver non cambia nulla: i suoi dispositivi e tag vengono letti, scritti, scansionati e annotati nel diario come quelli di qualunque altro.

Se il processo ausiliario si ferma, i suoi dispositivi mostrano l'errore "Il processo ausiliario a 32 bit del driver OPC DA si è fermato. La stazione lo avvia di nuovo, e il dispositivo si ricollega tramite esso.", la pagina Eventi conserva il suo codice di uscita, e i loro tag perdono i valori. La stazione avvia di nuovo il processo ausiliario, dopo una pausa che cresce finché continua a fermarsi, e i dispositivi si ricollegano da soli tramite esso. Una scrittura che era in viaggio quando il processo ausiliario si è fermato torna fallita, dicendo che non si sa se il valore abbia raggiunto l'apparecchiatura. Nessun altro driver e nessun'altra parte della stazione si ferma con esso.

## Prima di iniziare {#before-you-start}

- La stazione non installa alcun componente OPC. L'enumeratore dei server OPC (OpcEnum) e le librerie proxy e stub di OPC DA arrivano con il server OPC DA, o con gli OPC Core Components. La stazione verifica da sola se sono registrati e, finché ne manca uno, dice come installarli: vedere [Installare gli OPC Core Components](#installing-the-opc-core-components).
- Un server su un altro computer si raggiunge tramite DCOM, che entrambi i computer devono consentire per l'account Windows con cui gira la stazione: permessi DCOM, regole del firewall e lo stesso account o un dominio attendibile. Questa configurazione si fa in Windows e mai nella stazione: vedere [Preparare un server remoto](#prepare-a-remote-server).
- Il driver gira solo su Windows.

## Installare gli OPC Core Components {#installing-the-opc-core-components}

La stazione verifica da sola, nel processo ausiliario a 32 bit, se questo computer ha l'enumeratore dei
server OPC (OpcEnum) e le librerie proxy e stub di OPC DA registrati per i programmi a 32 bit: la prima
volta che lo chiede la pagina del driver, la pagina di uno dei suoi dispositivi o l'agente, e di nuovo
ogni 30 secondi finché ne manca uno. Finché il Connector non è avviato, non si sa se ci sono, e non se ne
dice nulla. Finché ne manca uno:

| Dove | Cosa dice |
| --- | --- |
| La pagina del driver | Un avviso di attenzione, "Gli OPC Core Components mancano su questo computer", con i passi qui sotto. Il suo link apre la pagina della OPC Foundation nel browser del computer. |
| La pagina di ogni dispositivo | Lo stesso avviso, a meno che il dispositivo sia online. |
| Una scansione | Non elenca nulla e dice cosa manca: la riga che chiude la scansione rimanda all'avviso, e `device_discover` dell'agente dà i passi in inglese. |
| L'ultimo errore di un dispositivo la cui connessione fallisce | Cosa manca e gli stessi passi, in inglese, come sono scritte le cause proprie del driver. |
| L'agente | `driver_capabilities` li dà sotto `prerequisite`, con `installed` a false. |

Per installarli:

1. Eseguire di nuovo il programma di installazione del server OPC DA: di solito li installa.
2. Altrimenti, aprire la pagina [Core Components](https://opcfoundation.org/developer-tools/samples-and-tools-classic/core-components/) della OPC Foundation e scaricare gli OPC Core Components Redistributables. Solo un utente registrato può scaricarli: se la pagina dice che non si ha il permesso di scaricare il file, accedere con "Login" o creare un account con "Create Account" sulla stessa pagina.
3. Prendere `opc-core-components-redistributable-<version>-x86-x64.msi` su Windows a 64 bit, che contiene anche i componenti a 32 bit, e quello che finisce con `-x86.msi` solo su Windows a 32 bit.
4. Eseguirlo come amministratore e riavviare il computer se il programma di installazione lo chiede.

Entro 30 secondi dall'installazione l'avviso scompare, la scansione elenca i server OPC DA e i
dispositivi di questo driver si collegano con la configurazione che hanno, senza riavviare Ganter Lab.

## Preparare un server remoto {#prepare-a-remote-server}

Un server su questo computer non ha bisogno d'altro. Un server su un altro computer si raggiunge
tramite DCOM, che non lascia entrare nulla da un altro computer finché entrambi non sono
predisposti. La predisposizione si fa in Windows su entrambi i computer, da un amministratore di
ciascuno, mai nella stazione:

1. Usare lo stesso account Windows con la stessa password su entrambi i computer (l'account con cui
   gira la stazione), oppure un account di dominio noto a entrambi.
2. Sul computer del server, eseguire `dcomcnfg` e aprire **Component Services > Computers > My
   Computer > Properties > COM Security**. In **Access Permissions** e in **Launch and Activation
   Permissions**, sia in **Edit Limits** sia in **Edit Default**, concedere a quell'account ogni
   diritto remoto. In **Edit Limits** di **Access Permissions**, concedere anche **Remote Access** ad
   ANONYMOUS LOGON, che serve all'enumeratore dei server OPC (OpcEnum).
3. Sempre lì, in **My Computer > DCOM Config**, aprire le Properties del server OPC e di OpcEnum
   e, nella loro scheda Security, personalizzare i tre permessi con lo stesso account.
4. Sul computer della stazione, eseguire anche `dcomcnfg` e, in **Edit Limits** di **Access
   Permissions**, concedere **Remote Access** all'account con cui gira il server OPC: il server
   richiama la stazione.
5. Sul computer del server, in Windows Defender Firewall, consentire in ingresso la porta TCP 135 e i
   programmi del server OPC e di OpcEnum (`OpcEnum.exe`), e verificare in **Servizi** che OpcEnum
   sia in esecuzione e si avvii automaticamente.

**Edit Default** non cambia nulla finché **Edit Limits** nega il diritto: impostarli entrambi. DCOM
risponde sulla porta 135 e poi porta le chiamate su una porta scelta da Windows, quindi un firewall
tra i due computer che apre solo la 135 blocca ancora il server.

| Che cosa risponde Windows | Che cosa dice la pagina del dispositivo |
| --- | --- |
| Accesso negato (0x80070005) | «*host* rifiuta questa stazione via DCOM», con l'account con cui gira la stazione e i passi da 1 a 4 |
| Il server RPC non è disponibile (0x800706BA) | «*host* non risponde a DCOM»: il computer è spento o irraggiungibile, il suo firewall blocca DCOM, oppure OpcEnum non vi è in esecuzione, con il passo 5 |

Ogni avviso prende il posto dell'errore del dispositivo e scompare da solo appena il server si
collega. Il diario tecnico e l'agente leggono gli stessi passi in inglese. Un server su questo
computer non viene mai segnalato così.

Dove l'impianto non consente DCOM, un wrapper o tunnel che serve il server OPC DA in OPC UA, sul
computer del server, lo evita del tutto: la stazione legge allora il server con il driver
[OPC UA](driver-opc-ua).
