AVEVA PI
Riferimento del driver AVEVA PI - la PI Web API in HTTPS, autenticazione con token o Basic, indirizzamento AF e per punto PI, letture e scritture.
Il driver AVEVA PI legge e scrive un AVEVA PI System attraverso la PI Web API, l'interfaccia REST del sistema (JSON su HTTP). È un driver in modo client, cioè è Ganter Lab a collegarsi al servizio PI Web API, e il trasporto è HTTPS per impostazione predefinita: il driver mette le credenziali del dispositivo su ogni richiesta che fa, quindi una connessione non cifrata le pubblicherebbe. L'HTTP in chiaro esiste solo come scelta esplicita per il singolo dispositivo.
Un tag indirizza un attributo AF, un punto PI oppure uno stream grezzo della PI Web API, e ne legge il valore istantaneo, cioè quello corrente.
Campi di connessione
| Campo | Che cos'è | Formato | Predefinito |
|---|---|---|---|
| Indirizzo host | Il nome host o l'indirizzo IP del server PI Web API. | Nome host o IP | vuoto |
| Porta TCP | La porta TCP del servizio. Zero significa il valore predefinito del driver, 443. | numero di porta | 0 (= 443) |
| Percorso della risorsa | Il percorso di radice del servizio aggiunto dopo l'autorità. Vuoto, oppure una / sola, significa la radice standard della PI Web API, piwebapi. Qualunque altro percorso è il percorso che il driver apre, esattamente come è scritto: un servizio pubblicato dietro un proxy inverso su /pi si raggiunge a /pi, e non gli viene aggiunto nulla. Scrivi tutto il percorso di cui avrebbe bisogno un browser, piwebapi compreso dove il servizio risponde ancora lì. |
testo di percorso | vuoto (= piwebapi) |
| Invia in HTTP semplice | Fa scendere questo solo dispositivo da HTTPS all'HTTP in chiaro. Disattivato significa HTTPS, il trasporto normale della PI Web API. Il pannello ne dichiara la conseguenza: in HTTP semplice il token di autorizzazione o la password vengono inviati non cifrati a ogni richiesta. Usalo solo per una PI Web API che non risponde su nessun altro trasporto. | attivo / disattivo | disattivo |
| Nome utente | L'account per l'autenticazione HTTP Basic, usato solo quando non è impostato alcun token di autorizzazione. Vuoto (e senza token) lascia le richieste anonime. | Testo libero | vuoto |
| Password del dispositivo | La password abbinata al nome utente. Protetta a riposo per utente di Windows; un segreto inserito sotto un altro account Windows si presenta come illeggibile e va reinserito. | Testo libero | vuoto |
| Token di autorizzazione | Un token inviato come Authorization: Bearer … a ogni richiesta. Quando è impostato vince sulla coppia nome utente e password. Protetto a riposo allo stesso modo. |
Testo del token | vuoto |
Alla connessione il driver verifica la radice del servizio (HEAD, ripiegando su GET). In HTTPS il certificato TLS del servizio deve superare la normale convalida dei certificati di Windows. L'intervallo di interrogazione è configurabile: il valore predefinito del dispositivo (1000 ms) vale per ogni tag che non dichiari il proprio.
Indirizzamento dei tag
Il campo Percorso PI del tag accetta quattro forme:
| Forma | Ha l'aspetto di | Come viene risolta |
|---|---|---|
| Percorso di attributo AF | \\AFServer\Database\Element\SubElement\|Attribute |
Cercato una volta con attributes?path=… per ottenere il WebId dell'attributo |
| Percorso di punto PI | \\PIServer\TagName |
Cercato una volta con points?path=… per ottenere il WebId del punto |
| WebId | La stringa opaca del WebId stessa | Usata direttamente (riconosciuta come un gettone lungo senza \, \| né /) |
| URL relativo | streams/{webId}/value, streamsets/…, attributes?…, points?… |
Inviato tale e quale sotto la radice del servizio |
Le ricerche di percorso vengono tenute in cache per 12 ore, così l'interrogazione a
regime non le ripete. Per le prime tre forme la lettura esegue una GET sul valore
istantaneo dello stream (streams/{webId}/value) ed estrae il campo JSON Value; un
URL relativo viene letto alla lettera, quindi puntalo a un endpoint che risponda con un
documento di valore. Il risultato viene convertito nel tipo di dato dichiarato dal tag.
Insieme al campione si legge il verdetto proprio dell'archivio. Un valore che l'archivio marca come non buono, come dubbio oppure come sostituito (un numero inserito a mano invece che misurato) non è una lettura dell'apparecchiatura, quindi non viene pubblicato come tale: il tag passa a cattiva qualità e il motivo dice quale dei tre casi fosse. Lo stesso succede quando la risposta non porta alcun valore, oppure risponde con uno stato digitale invece che con un valore singolo, e in quel caso il nome dello stato fa parte del motivo. Al loro posto non viene inventato nulla, e nessun documento arriva come se fosse la misura.
Esempi:
\\PI-SRV01\FURNACE.TEMP: un classico punto PI.\\AF-SRV\Plant\Line 3\Furnace|Temperature: un attributo AF.streams/F1DPmNQx2kqBk0qbIVMoxAVBJw/value: un URL di stream grezzo, utile quando hai già il WebId da un altro strumento.
Scritture
I tag con una modalità di accesso scrivibile scrivono attraverso l'endpoint di stream
della PI Web API: una POST di {"Timestamp":"*","Value":…} (la marca temporale *
significa adesso) su streams/{webId}/value. La scrittura ha bisogno di un WebId
risolvibile, quindi funziona per i tag indirizzati per percorso AF, per percorso di
punto PI, per WebId e anche per un URL relativo streams/…: il WebId viene letto da
quell'URL e la scrittura arriva sull'endpoint di valore di quello stream, qualunque
sotto-risorsa di lettura (per esempio recorded) l'indirizzo portasse oltre. Tre forme
relative vengono rifiutate, perché ciascuna risponde con un documento invece che con il
valore di un solo stream e una scrittura indirizzerebbe la risorsa sbagliata:
streamsets/…, attributes?… e points?…. Il rifiuto nomina le forme accettate. Che
la scrittura arrivi dipende poi anche dal fatto che la PI Web API sia configurata per
le scritture e che l'account abbia accesso in scrittura al punto.
Il valore che scrivi nella casella di scrittura del tag è il valore ingegneristico; le fasi di conversione del tag vengono percorse all'indietro prima che il valore grezzo vada sul bus, come è descritto nella pagina Connector.
Tipi di dato supportati
Boolean, Int32, Int64, Float, Double e String. I punti PI numerici sono di solito Float o Double. Uno stato digitale non è un valore singolo, quindi un punto che risponde con uno si legge come cattiva qualità nominando lo stato, qualunque tipo il tag dichiari.
Comandi
Oltre a leggere e scrivere punti, a un endpoint della PI Web API si può chiedere di fare qualcosa, e quali richieste accetti è affare del servizio stesso. Dichiarane ciascuno sul dispositivo, nella scheda Comandi della sua pagina: un nome, l'URL relativo a cui viene inviato con una POST sotto la radice del servizio e, facoltativamente, il nome dell'unico valore che accetta, che viaggia come corpo della richiesta. Il verbo Invia della riga lo manda e riferisce quello che il servizio ha risposto; il comando diventa anche un metodo sul dispositivo nello spazio degli indirizzi OPC UA proprio di questa stazione.
Rilevamento
Il pulsante Rileva legge un solo servizio. Metti il suo indirizzo e l'elemento AF da
cui parte il percorso nella scheda Ambito della scansione della pagina del driver,
separati da un #: https://pi-host/piwebapi#\\AF-SRV\Plant\Line 3. La scansione
risolve quell'elemento, percorre ogni elemento sotto di lui e offre il dispositivo con
un punto per ogni attributo, ciascuno indirizzato dal proprio stream. La scansione legge
il servizio senza credenziali, perché gira prima che esista il dispositivo che le
porterebbe, quindi una PI Web API che autentica ogni richiesta non risponde nulla e il
dispositivo va aggiunto a mano: aggiungi il servizio per host e aggiungi i tag con i
loro percorsi AF o PI, come descrive il flusso per aggiungere un dispositivo nella
pagina Connector.