Categorie
DataBase Esempi WinCC

Refresh dati UserArchive Control

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)

Categorie
BasicScript Documentazione Esempi WinCC

WinCC & Data Mining: insieme per migliorare la produzione

WinCC & Data Mining: insieme per migliorare la produzione.

La domanda che ci si pone spesso è la seguente: “Ma da tutti quei dati che lo SCADA raccoglie, si può trarre qualche informazione?”. Beh, la risposta è sicuramente e senza ombra di dubbio, SI !

Ci sono delle tecniche statistiche studiatissime in molti ambiti e oramai ben sviluppate anche su computer, per estrarre informazioni su grandi moli di dati. Queste tecniche sono raggruppate sotto la disciplina del Data Mining.

Quindi quello che ora vi chiederete è: ma che informazioni posso trarre dai dati? Quello che si trova dall’uso di queste tecniche non sono spesso informazioni scontate, ma ben si, tempi, procedure e decisioni sul come comportarsi per migliorare il processo produttivo.

Qui non voglio dilungarmi troppo su queste temi che sono ampiamente usati in ambiti dirigenziali, ma vorrei solo proporre una integrazione tra il WinCC e il Data Miner per Server SQL di Microsoft.

Una volta letto questo articolo vorrei che fosse chiaro come possono interagire due prodotti che sembrerebbero non avere niente da dirsi, ma che in realtà possono coesistere ed essere molto utili in ambito decisionale. Si pensi, ad esempio, alla direzione di una azienda che vuole monitorare la produzione di una propria linea produttiva, o più semplicemente controllare i fermi macchina, i tempi di lavorazione, le cause di guasto e monitorare i tempi di ciclo di un certo prodotto di una certa filiera di produzione.   

Avendo a disposizione uno SCADA professionale, configurato e pienamente funzionale si avrà a disposizione un DATABASE fornitissimo di dati. Ricordiamo che WinCC viene venduto con la licenza di SQL Server: uno dei migliori DBMS di casa Microsoft.
Ovviamente le variabili di interesse devono essere memorizzate in modo tale da poter essere reperibili: ricordiamo che la Siemens non lascia libero accesso a tutte le variabili. Questo discorso viene rimandato in altra sede, oppure leggetevi l’articolo WinCC & ADO reperibile in questo sito.

Una volta che sia hanno a disposizione i dati, possiamo cominciare la fase di DATA MINING sui dati, ovvero “scavare” nei dati per cercare di capire quali informazioni possono venire utili. Useremo per questa fase il Data Mining Engine di casa Microsoft.

Procediamo con il connettersi al sistema di servizio dei Servizi di Analisi che usa la metodologia  ADO standard. La macchina client deve avere i Servizi di Analisi OLE per il provider di DB (MSOLAP90.DLL) installato come viene spiegato nelle guide. Questo sistema di servizio deve essere configurato ad accettare sessioni per l’utilizzo di modelli per il data mining, e l’utente deve avere almeno dei permessi su un database sul sistema di servizio.

Il nostro esempio sarà incentrato sulla costruzione di un modello per prevedere l’andamento di una serie temporale: ad esempio la produzione tra 2 mesi piuttosto che il numero di fermi macchina previsti tra 6 mesi.

Con VBA programmiamo ADO per connetterci al servizio di sistema:

Dim conn As New ADODB.Connection
Conn.Open “Provider=MSOLAP90;Location=MyServer;” & _“Initial Catalog=MyDatabase”

A questo punto bisognerà creare una classe di TimeSeriesMining che serve per la creazione del modello. Il modello creato in questo esempio ha una colonna per ogni colonna (o fila) nella selezione di dati. Per questo modello ovviamente la Chiave sarà il Tempo ed ogni altra colonna avranno il tipo contenuto “Continuo” e uso “Predice”.

CREATE MINING MODEL TimeSeriesModel
(
[Date] DATETIME KEY TIME,
[Retail Food Total] DOUBLE CONTINUOUS PREDICT,
[Retail Food] DOUBLE CONTINUOUS PREDICT
) USING Microsoft_Time_Series

Qui di seguito propongo uno script da utilizzare sotto MS Excel oppure da utilizzare sotto WinCC se pur con qualche accorgimento.
 

‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
Public Sub CreateModel(ModelName As String, Key As String, _
DataRange As Range, RowsAsRows As Boolean)

‘ Creazione di un modello per la time series mining da Excel
‘’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’’
‘ inizializza variabili
On Error GoTo onerror
Dim strCreate As String
Dim strInsert As String
Dim cmd As New ADODB.Command
Dim param As ADODB.Parameter
Dim i As Integer
Dim xmla As New XMLARowsetGen
m_strModelName = ModelName

‘ Creo XMLA rowset a partire da un specifico range
xmla.FillRowset DataRange, RowsAsRows

‘ inizializzo, creo e inseriscoi comandi
strCreate = “CREATE SESSION MINING MODEL “ & ModelName & “( “
strInsert = “INSERT INTO “ & ModelName & “ ( “

‘ Add columns.
For i = 0 To xmla.ColumnCount – 1
If i > 0 Then
strCreate = strCreate & “ ,”
strInsert = strInsert & “ ,”
End If
strCreate = strCreate & _
“[“ & NormalizeName(xmla.ColumnName(i)) & “]”
strInsert = strInsert & “[“ & NormalizeName(xmla.ColumnName(i)) & “]”
strCreate = strCreate & “ “ & BuildOLEDBDMType(xmla.ColumnType(i))

If Key = xmla.ColumnName(i) Then
strCreate = strCreate & “ KEY TIME”
Else
strCreate = strCreate & “ CONTINUOUS PREDICT”
End If
Next
‘ Completo la creazione del modello
strCreate = strCreate & “) USING Microsoft_Time_Series”
‘ Completo il commando di inserzione.
strInsert = strInsert & “) @InputRowset”
‘ Eseguo il comando
cmd.ActiveConnection = m_cnAS
cmd.CommandText = strCreate
cmd.Execute
‘ Eseguo la interrogazione.
cmd.CommandText = strInsert
cmd.NamedParameters = True
cmd.Execute
End If
End Sub

Questo script darà in output una serie di valori che potranno essere visualizzati  in qualche grafico anche sotto WinCC.

(MB)

Categorie
cScript DataBase

Connessioni ADO da cScript

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

Categorie
BasicScript DataBase Text Libray

Accesso alla textlibrary di WinCC tramite ADO di Microsoft

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:

  1. Attraverso il Connectivity Pack di Siemens si accedono ai dati, ma richiede l’acquisto di una licenza a parte.
  2. Si memorizzano i dati direttamente da una pagina Runtime di WinCC attraverso l’uso di ADO della Microsoft, verso un qualsiasi DBMS (MySQL,Access,…)

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.

PASSO 1

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.

PASSO 2

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 If

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