Esportare archivi WinCC/CAS con WinCC OLE DB Provider
WinCC ha rilasciato un interessante documento (FAQ 35840700) che illustra le tecniche di esportazione dati
Il documento è disponibile in inglese
WinCC ha rilasciato un interessante documento (FAQ 35840700) che illustra le tecniche di esportazione dati
Il documento è disponibile in inglese
Spesso ci si chiede quale è il limite massimo di dati consentito in UserArchive
Siemens, a tal proposito, ha rilasciato una nota esplicativa sul limite di dati possibili in UserArchive (FAQ 78803223)
I limiti sono ridotti rispetto alla versione 7.0, maggiori informazioni sono reperibili nella guida in linea al capitolo “Prestazioni”.
Siemens ha pubblicato una raccolta ordinata di informazioni importanti sul TIA Portal (FAQ 65601780).
La pagina pubblicata è un riferimento a tutte le risorse, update e documentazioni relative al TIA Portal.
Tutto è ora consultabile dal seguente indirizzo:
La pagina pubblicata per ora è solo in inglese.
L’esempio mostra come inserire un nuovo record in una tabella di SQL Server utilizzando il comando SQL “INSERT INTO” in linguaggio cScript
#include “apdefap.h”
int dbInsertInto(char *szTable,char *szCampi,char *szValori)
{
#define GetObject GetObject
__object *objConnection=NULL;
__object *objRst=NULL;char strConnectionString[NC];
char strSQL[NC];
int NewID;printf(“dbInsertInto(%s,%s,%s)\r\n”,szTable,szCampi,szValori);
//connessione a database e query
sprintf(strConnectionString,”DRIVER=SQL Server;”
“UID=SYSTEM;”
“Trusted_Connection=Yes;”
“DATABASE=%sR;”
“WSID=%s;”
“SERVER=%s\\WINCC;”,
GetTagChar(“@ProjectDSN”),
GetTagChar(“@ServerName”),
GetTagChar(“@ServerName”));if(!GetTagBit(“@IsServerPc”))
strcat(strConnectionString,”LINKS=TCPIP;”);objConnection = __object_create(“ADODB.Connection”);
objConnection->ConnectionString = strConnectionString ;
objConnection->Open;objRst = __object_create(“ADODB.Recordset”);
objRst->CursorType = 0;
objRst ->LockType = 1;// trovo l’id da utilizzare
sprintf(strSQL,””);
sprintf(strSQL,”SELECT TOP 1 ID FROM UA#%s ORDER BY ID DESC”,szTable);objRst ->Open(strSQL, objConnection,0,1,1); //adCmdText
if((objRst ->eof && objRst ->bof))
NewID = 1;
else
NewID = objRst ->Fields->Item(“ID”)+1;//eseguo l’inserimeto del record
objRst ->Close;
__object_delete(objRst );sprintf(strSQL,”INSERT INTO UA#%s (ID,%s) VALUES (%d,%s);”,szTable,szCampi,NewID,szValori);
objConnection->Execute(strSQL);
objConnection->Close;
__object_delete(objConnection);return NewID;
}
La funzione viene chiamata con i parametri nome tabella, nome campi e valori, ritorna l’id del record
(NT)
Un esempio su come esportare dati con le funzioni del Connectivity Pack
L’esempio è corredato da documentazione in inglese e da codice sorgente utilizzabile da WinCC 7.0 SP1
Esempio su come esportare dati dagli archi vi WinCC o di CAS utilizzando una connessione OLE DB Provider
L’esempio e’ cmpleto di documentazione (in inglese) e del codice sorgente i C#
Si può progettare la Toolbarbuttons dello UserArchive (da 4.02) anche in una pagina esterna allo OCX.
Di seguito il link alla FAQ Siemens (FAQ. 729703):
Maggiori informazioni sul sito Siemens.
Interessante FAQ siemens sull’uso di WinCC OLE DB Provider reperibile al seguente indirizzo:
Un altro esempio è reperibile al seguente indirizzo
La documentazione si riferisce a WinCC 6.2 e 7.0 e comprende esempi e descrizioni dettagliate.
E’ disponibile in inglese il manuale di istruzioni del connectivity pack al seguente indirizzo:
Inserendo in una pagina UserArchiveControl collegato ad una tabella dello User Archive, tutto funziona bene utilizzando i comandi di WinCC e del controllo.
Ma se i dati nella tabella vengono inseriti utilizzando funzioni ADO con vbScript il controllo non mostra immediatamente i nuovi record inseriti ma occorre effettuare un cambio pagina per forzare il refresh.
Sembra che non esista un metodo refresh dell’oggetto.
Un modo per far rileggere i dati al controllo è utilizzare la proprietà di query del controllo stesso che si chiama “FilterSQL” (nel controllo UserArchive classic la proprietà si chiama “Filter”)
Impostando la proprietà da codice prima con il valore “ID=0” e immediatamente dopo al valore “ID>0” si eseguono due query sul controllo che di fatto aggiornano la visualizzazione senza dover ricaricare la pagina.
(SR)
Dal sito WinCC.net un prezioso esempio su come effettuare query su database dall’interno di WinCC utilizzando BasicScript.
(SG)
Di seguito un esempio di codice su come effettuare connessioni ADO utilizzando cScript
__object *cn, *rs;
int i,fields=10;
cn=__object_create(“ADODB.Connection”);
rs=__object_create(“ADODB.RecordSet”);
// Connect
cn->Open(“Provider=SQLOLEDB.1;Integrated Security=SSPI;Initial Catalog=Northwind;Data Source=(local)\\WinCC”);
if (cn->State == 0) printf (“DB Connect failed\n”);
else
{
rs->Open(“Select * FROM Products”,cn,1);
rs->MoveFirst;
while(!rs->eof) {
for(i=0;i<fields;i++) {printf(rs->Fields(i)->Value); printf (” “); }
printf(“\r\n”);
rs->MoveNext;
}
rs->Close;
cn->Close;
}
Anche se è piu’ agevole in BasicScript talvolta puo’ esssere necessario avere la chiamata al database nell’ambiente cScript
Uno dei problemi che un utente avanzato di WinCC può imbattersi è affrontare la gestione di dati all’interno del proprio progetto.
Ad esempio per monitorare con software esterni l’andamento della produzione piuttosto che controllare dei fermi macchina.
Le Tag, o variabili, di WinCC vengono memorizzate all’interno di uno dei migliori DBMS (Data Base Management System) in commercio: ovvero l’ SQL Server di Microsoft. Ma chi ha provato leggere tali dati avrà scoperto che tantissime variabili sono criptate: ovvero illegibili dall’utente finale.
Quindi le soluzioni che si prospettano sono 2:
ADO è un acronimo che stà per ActiveX Data Objects.
E’ stato concepito per fornire un’interfaccia API di alto livello per lavorare con OLE-DB. Esistono anche altri tipi di collegamento con un DB, ma viene preso in esame questo, per la facilità con cui verrà fatta l’integrazione in WinCC. Infatti con ADO la sequenza di comandi che il programmatore deve fare è molto semplice. L’utente genera direttamente un “command” da inviare all’oggetto ActiveX passando le informazioni necessarie direttamente all’oggetto. Per semplicità e praticità migliore, la maggior parte degli sviluppatori per essere tranquilli creano un oggetto di tipo “command” separato.
Ma vediamo come integrare il tutto in WinCC. In particolare vediamo ora come connetterci ad un database e fare le prima interrogazioni.
Nel VBS Editor del Global Script Editor è bene creare delle funzioni che verrano richiamate per la connessione con il DB. Questo per quanto detto prima: mantenere un certo ordine nei “command” che verrano passati all’oggetto ADO.
Ovviamente la connessione potevo farla ogni volta che devo mandare un command ma non è consigliato.
Creiamo una funzione di tipo sub con al solita sintassi:
Sub ConnesioneDB
End Sub
All’interno della Sub creo 2 oggetti: uno per il collegamento con l’oggetto ADO e un altro oggetto per i maneggiare i RECORD…
Set oggettoADO = CreateObject(“ADODB.Connection”)
Set oggettoRECORD = CreateObject(“ADODB.Recordset”)
Una volta creati gli oggetti abbiamo bisogno della stringa di connessione: questa ha una sintassi ben definita: ovvero come primo parametro va inserito il Provider, secondo la sorgenti dati e alla fine va inserito un parametro per la sicurezza…
Per un database di tipo Access è :
Provider=Microsoft.Jet.OLEDB.4.0
Data Source=path_del_DB + WinCC.mdb;
Persist Security Info = False
Ora, è molto importante creare una nuova funzione vuota, ad esempio:
Sub AttivaHandleDB
End Sub
lo scopo di questa funzione è solo quella di rendere attive le variabili globali che sono state dichiarate nel workspace della funzione richiamata.
Visualizzazione delle Text Library su di un oggetto in Runtime.
Abbiamo bisogno innanzitutto di sapere dove vengono archiviate le TextLibrary all’interno del DB di WinCC. Navigando all’interno del DB SQL Server di trova un DataBase che porta un nome del tipo:
CC_DB_Manip_Anno_Giorno_Mese_Ora_Minuti_Secondi(_R) dell’ ultima attivazione del progetto.
Cerchiamo quindi “dbo.TXTTable” contenente all’interno tutte le textLibrary del progetto con le relative traduzioni.
A questo punto creata una pagina con il Graphics Designer possiamo creare un pulsante che vada a leggere con una opportuna interrogazione il testo e la lingua che ci interessa. Ad esempio la seguente interrogazione associata ad un pulsante del Runtime WinCC mi restituisce la stringa in italiano associata al pulsante:
Sub OnButtonDown(Byval Item, Byval Flags, Byval x, Byval y)
Dim NoOfRecords
Set NoOfRecords = HMIRuntime.Tags(“NoOfRecords”)
Dim CurrentRec
Set CurrentRec = HMIRuntime.Tags(“CurrentRec”)
Dim TextID
Set TextID = HMIRuntime.Tags(“Testo_Lingua”)If CurrentRec.Read < NoOfRecords.Read Then
TabellaLingue.MoveNext
TextID.Write TabellaLingue.Fields(0).Value
CurrentRec.Write CurrentRec.Value + 1
End IfEnd Sub
NoOfRecords è un campo I/O che mostra semplicemente il numero del record che abbiamo correntemente visualizzato. “TabellaLigua” è state precedentemente inizializzata coma la tabella su cui andremo a fare le interrogazioni. Per navigare nelle colonne della tabella si usa la notazione del tipo: “nome_colonna”.Fields(numero_colonna).Value ,ricordando che numero colonna parte da zero come la notazione VBS impone. La variabile CurrentRec serve per mantenere in memoria la posizione della riga che si è andata e leggere.
(MB)