L’esempio riportato nella FAQ 55741262 spiega come inserire una curva in un oggetto di visualizzazione trend di WinCC Professional 11

L’esempio riporta gli script in cScript e in basicScript

http://support.automation.siemens.com/WW/view/en/55741262

La documentazione è disponibile anche in Italiano

 

La procedura riportata nella FAQ 55622122 spiega le tre tecniche per acquisire gli allarmi in WinCC 11 e successivi.

image

http://support.automation.siemens.com/WW/view/en/55622122

La documentazione è disponibile anche in Italiano

 

Chiaro esempio su come esportare e/o importare in WinCC tramite basicScript o cScript

image

Le informazioni sono reperibili nella FAQ 850338

http://support.automation.siemens.com/WW/view/en/850338

Le informazioni sono disponibili anche in Italiano

 

Esempi in basicScript e cScript utili per esportare dei valori dei trend in formato CSV sono disponibili nella FAQ 56098724

http://support.automation.siemens.com/WW/view/en/56098724

La documentazione è in Inglese

 

Un esempio su come esportare dati con le funzioni del Connectivity Pack

http://support.automation.siemens.com/WW/view/en/38132261

L’esempio è corredato da documentazione in inglese e da codice sorgente utilizzabile da WinCC 7.0 SP1

 

FAQ Siemens su come creare un file html da BasicScript con valori di Tag WinCC

http://support.automation.siemens.com/WW/view/en/44252767

L’esempio è un buon punto di partenza per creare informazioni visualizzabili su sistemi mobili come cellulari, tablet, ecc..

 

Con la versione 7.0 è stato introdotto l’oggetto RulerControl.

Il RulerControl viene utilizzato per visualizzare informazioni di OnlineTrendControl e OnlineTableControl.

Per “leggerere” le informazioni visualizzate dal RulerControl da BasicScript occorre da prima istanziare l’oggetto

Set RulerControl = ScreenItems(“Control1″)

Successivamente puntare alla riga desiderata (per esempio la prima riga)

Set Penna = RulerControl.GetRow(1)

Infine puntare alla colonna desiderata (per esempio la terza colonna)

Penna_Valore = Penna.CellText(3)

In questo modo si riporta il valore in una variabile di BasicScript che puo’ essere utilizzata per altri scopi.

 

Di seguito un esempio sull’uso delle regular expression in VBS di WinCC mirato alla ricerca sostituzione all’interno di una stringa.

Function ReplaceString(str1, patrn, replStr)
Dim regEx ‘ Crea variabili
Set regEx = New RegExp  ‘ crea regular expression.
regEx.Pattern = patrn  ‘ Set pattern.
regEx.IgnoreCase = True  ‘ non case sensitive
regEx.Global = True  ‘ setta ricerca a tutta la stringa.
ReplaceString = regEx.Replace(str1, replStr) ‘ esegui sostituzione
End Function

Qui una semplice idea che puo’ essere personalizzata in vari modi per la manipolazione di stringhe.

(GG)

 

Interessante FAQ siemens sull’uso di WinCC OLE DB Provider reperibile al seguente indirizzo:

http://support.automation.siemens.com/WW/view/it/35840700

Un altro esempio è reperibile al seguente indirizzo

http://support.automation.siemens.com/WW/view/it/38132261

La documentazione si riferisce a WinCC 6.2 e 7.0 e comprende esempi e descrizioni dettagliate.

 

Per chiudere (nascondere) una Picture Window tramite un pulsante presente al suo interno esistono vari modi.

Il piu semplice e veloce e’ usare una direct connection che imposta (source) come costante 0 la proprietà (targhet) display della Current Window.

Tramite VBS

Item.Parent.Parent.Visible = False

Tramite cScript

SetVisible(“nomePWContenitore”,”nomePW”,FALSE);

 

Puo’ essere utile avere la posizione del mouse da script.

Seguire la seguente procedura come esempio.

  1. Inserire dalla libreria HMI Symbol Library l’oggetto Basic Shapes \ Banner
  2. Impostare la proprietà Stile su Trasparente
  3. Usare l’evento MouseOver per avere le coordinate del mouse

L’evento MouseOver dell’oggetto viene chiamato passando tra i parametri anche le coordinate del mouse.

In questo semplice modo sono possibili iterfacce di selezione degli oggetti a video come liste o altro.

 

Di seguito un frammento di esempio per inviare email da WinCC

Dim strFrom
Dim strTo
Dim strSub
Dim strBody
Dim strSMTP
Dim objEmail
strFrom = “mittente@dominio1.it”
strTo = “destinatario@dominio2.it”
strSub = “Oggetto del messaggio”
strBody = “Testo del messaggio”

‘Inserisci l’indirizzo IP o il nome del server SMTP
strSMTP = “192.192.192.192″

Set objEmail = CreateObject(“CDO.Message”)
objEmail.From = strFrom
objEmail.To = strTo
objEmail.Subject = strSub
objEmail.Textbody = strBody
objEmail.Configuration.Fields.Item(“http://schemas.microsoft.com/cdo/configuration/sendusing”) = 2
objEmail.Configuration.Fields.Item(“http://schemas.microsoft.com/cdo/configuration/smtpserver”) = strSMTP

‘Per modificare la porta usare la riga seguente, normalmente non necessaria con valori default
‘objEmail.Configuration.Fields.Item(“http://schemas.microsoft.com/cdo/configuration/smtpserverport”) = 25
objEmail.Configuration.Fields.Update

Le applicazioni sono molteplici sia per l’assistenza (per esempio inviare una email in caso di riavvio del sistema) sia per l’operatore.

 

La fornitissima FAQ di Siemens riporta un articolo su come effettuare il riempimento orizzontale degli oggetti.

Articolo con ID:12730269     Data:2008-03-29

Praticamente si simula il riempimento variando la proprietà di posizione X e la dimensione dell’oggetto.

 

 

Per prima cosa desideriamo ringraziare alcuni di Voi, che ci hanno segnalato questo argomento come articolo da pubblicare sul nostro Blog. Naturalmente Vi incoraggiamo a scriverci anche solo per esprimere le vostre opinioni.
Come avete letto dal titolo, in questo articolo cercheremo di confrontare il C-script e VB-Script per le versioni di WinCC 6.x in poi, compresa la nuova e tanto attesa versione 7.

Cominciamo con il precisare la differenza tra “azioni” e “funzioni”; in quanto ad alcuni non è ancora ben chiara…

Innanzitutto le azioni vengono utilizzate per attività di background, quali p. es. stampe giornaliere di protocolli, il monitoraggio di variabili o l’esecuzione di calcoli.

Le funzioni sono porzioni di codice che possono venire utilizzate in più punti, la cui definizione però si effettua in un punto solo. WinCC mette a disposizione numerose funzioni, liberamente utilizzabili e visibili direttamente nel riquadro a sinistra dell’editor della funzione. Inoltre è possibile scrivere funzioni ed azioni proprie, utilizzando l’ambiente Global Script e selezionando uno dei 2 ambienti che WinCC mette a disposizione: C-Script e VB-Sscript.

In WinCC è possibile utilizzare parallelamente VBScript e C-Script, ma non intersecare i due tipi di script:

  • all’interno di una pagina e di un progetto si possono progettare sia script VBS che script C: cioè posso associare ad un specifico evento un’azione C mentre per un altro tipo di evento un’altra funzione VBS
  • gli script C non si possono richiamare negli script VBS e viceversa.
  • in VBS sono a disposizione interfacce interne per variabili e oggetti di pagina, mentre nell’ambiente C è anche possibile accedere ad altri sottosistemi di WinCC (per es. i protocolli).

Inoltre da tenere presente che il tipo di dati delle variabili VBS è sempre VARIANT, mentre in C-Script si possono decidere il tipo di dati opportuno (char, double,ecc…)

In VBS di WinCC, contrariamente a C, non viene fatta alcuna differenziazione fra azioni locali (valide per tutto il progetto) e azioni globali (valide per tutto il computer). Un’azione progettata è sempre valida globalmente. Tenere presente che le lunghezze dei nomi degli oggetti dinamizzati in Graphics Designer  è spesso fonte di errori!!! Infatti tali lunghezze sono limitate a circa 200 caratteri, e che nei file script ogni carattere speciale utilizzato nel nome di un oggetto viene trasformato in 5 caratteri.

Dietro un X iniziale, il carattere speciale viene rappresentato in codice esadecimale a 4 cifre.

Se con un’azione VBS si dinamizza una proprietà dell’oggetto attraverso il valore di ritorno di uno script, il valore della proprietà dell’oggetto viene scritto soltanto se è cambiato rispetto all’ultima esecuzione script. In tal caso, non viene considerato se il valore è stato modificato da un’altra posizione.

Fate quindi attenzione quando dinamizzate una proprietà tramite valore di ritorno, in quanto non dovranno essere modificate in altri punti da C-Script o VB-Script

Per quanto rigurada le funzioni e le variabili globali in C, c’è solo da dire che la capacità di memoria massima disponibile di 64 KByte.
Inoltre tenere a mente che non è ammesso definire una variabile C in più posizioni. Per maggior chiarezza e per evitare definizioni doppie, è opportuno quindi definire le variabili C globali solo
in una posizione. Per definirla in una sola posizione basta fare così:

extern int a; //La variabile a viene dichiarata esterna

Oltretutto, con C-Script, a differenza di VBS, ho la possibilità di usare delle DLL proprie (Dynamic Link Libraries). Le funzioni comprese in DLL esistenti possono essere rese utilizzabili per funzioni ed azioni integrando la funzione o l’azione interessata.

Per utilizzare una DLL basta inserire all’inizio della funzione o dell’azione il seguente codice:

#pragma code(“<Nome>.dll”)
<Tipo di valore di retorno> <Nome di funzione 1>(…);
<Tipo di valore di ritorno> <Nome di funzione 2>(…);
.
.
.
<Tipo di valore di ritorno> <Nome di funzione n>(…);
#pragma code()

Per chi vuole sviluppare DLL ad hoc, ricordiamo che la struttura della DLL deve essere creata con allineamento a 1 byte. Inoltre la DLL deve trovarsi in una directory bin o in un percorso definito nelle variabili del sistema PATH.

Tale variabile viene definita tramite le proprietà di sistema del sistema operativo.

Un’ ultimo confronto possiamo farlo in termini di prestazioni tra VB-Script e C-Script: tale confronto viene anche riportato nella guida in linea di WinCC e sono test fatti direttemente da Siemens.

Nella guida in linea di WinCC è dedicato un capitolo “Prestazioni” dove sono comparati i tempi di esecuzione per ogni singola azione nei due ambienti.

Quello che subito salta all’occhio è che C-Script è preferibile in buona parte dei casi. Ma un attento programmatore potrebbe ottimizzare il tempo di esecuzione dei script scegliendo di volta in volta l’ambiente più appropriato.

Per adesso, mi fermo qui con questa carrellata su questi ambienti Script. Purtroppo l’argomento è molto vasto e il tempo per scrivere poco.

(MB)

 

Può essere comodo per migliorare la lettura del codice utilizzare due semplici funzioni per leggere o scrivere una tag in BasicScript

Di seguito il codice per leggere

Function GetTag(TagName)
Dim objTag
Set objTag = HMIRuntime.Tags(TagName)
GetTag=objTag.Read
End Function

E il codice per scrivere

Sub SetTag(TagName, TagValue)
Dim objTag
Dim iRit
Set objTag = HMIRuntime.Tags(TagName)
iRit=objTag.Write(TagValue)
End Sub

Niente di nuovo o sofisticato, ma solo la possibilità di utilizzare la vecchia sintassi del cScript per chi passa frequentemente da un ambiente all’altro risulterà piu’ ordinato il codice BasiScript.

 

E’ possibile che ci sia l’esigenza di accedere alle tag di WinCC e/o impostare il valore di una tag dal linguaggio VBScript.

VBScript è usato nella programmazione di pagine HTML formattate secondo lo standard Microsoft ASP.

La tecnica descritta puo’ essere usata anche nel linguaggio di scripting di Windows denominato WSH e ovviamente in VisualBasic.

Più in generale in tutti i linguaggi che prevedono l’uso della funzione

createobject

Quello che in definitiva ci manca è il nome del riferimento WinCC all’oggetto COM

Di seguito un esempio di codice per leggere una Tag

set mcp = createobject(“Wincc-Runtime-Project”)

var1=mcp.getvalue(“NewTag”) 

Di seguito un esempio per scrivere una Tag di WinCC

set mcp = createobject(“Wincc-Runtime-Project”)

var1=mcp.setvalue(“NewTag_1″,123)

Questo da la possibilità di produrre in una pagina HTML i valori delle Tag ed eventualmente settarne il valore.

formattando opportunaente con il codice HTML la rappresentazione si possono creare dei rapporti di stato presentabili con un browser.

 

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)

 

Microsoft Forms 2.0 ComboBox Control è presente se è installato Microsoft Office.

Può essere utile perche’ WinCC non dispone dell’oggetto ComboBox

Per popolare l’oggetto serve usare il metodo .AddItem

Dim combo1
Set combo1 = ScreenItems(“combo1”)
combo1.AddItem “Red”

Inoltre il ComboBox puo’ essere configurato per usare colonne multiple. Per popolare le colonne aggiuntive serve usare la proprietà .List (laproprietà ha due parametri colonne e righe)

Dim combo1
Set combo1 = ScreenItems(“combo1”)
combo1.AddItem “Red”
combo1.List(0,1) = “Blue”

Infine ricordate che la proprietà .List è allineata a zero. Significa che il primo elemento ha come indice dell’array 0

Un esempio tratto dal sito WinCC.net è disponibile qui

 

Per scrivere un file usando BasicScript

Dim fso, MyFile
Set fso = CreateObject(“Scripting.FileSystemObject”)
Set MyFile = fso.CreateTextFile(“c:\testfile.txt”, True)

MyFile.WriteLine(CStr(Time)&” , “&CStr(HMIRuntime.Tags(“Tag1″).Read))
MyFile.Close

Diversamente in cScript si possono usare le funzioni standard

{
FILE * fp;
DWORD dw;
float fl;

fp = fopen(“C:\\variables.txt”,”w”);
if (fp!=NULL)
{
dw=GetTagDouble(“DwordTag”);
fl=GetTagFloat(“FloatTag”);
fprintf(fp,”%d\r\n”,dw);
fprintf(fp,”%f\r\n”,fl);
fclose(fp);
}
else printf(“%s”,”File failed”);
}

 

Dal sito WinCC.net un prezioso esempio su come effettuare query su database dall’interno di WinCC utilizzando BasicScript.

(SG)