Esportare dati dagli archivi tramite WinCC OLE DB Provider
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.
Chiudere una Picture Window
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);
Manuale WinCC/Connectivity Pack
E’ disponibile in inglese il manuale di istruzioni del connectivity pack al seguente indirizzo:
Rilevare la posizione del mouse
Puo’ essere utile avere la posizione del mouse da script.
Seguire la seguente procedura come esempio.
- Inserire dalla libreria HMI Symbol Library l’oggetto Basic Shapes \ Banner
- Impostare la proprietà Stile su Trasparente
- 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.
Campo I/O personalizzato
Potrebbe essere necessario utilizzare un campo I/O in modo personalizzato.
Per esempio controllare il valore di input dell’operatore e modificarlo prima di trasmetterlo alla Tag collegata al campo di I/O
Oppure ancora fare in modo che il campo di I/O visualizzi un valore letto da una prima Tag ma che un eventuale valore introdotto venga scritto in una Tag diversa dalla prima.
Per implementare questa e altre casistiche personalizzate occorre usare la funzione GetInputValueDouble() disponibile in cScript.
Per verificare e testarne la funzionalità seguire l’esempio di seguito descritto.
Disegnato un campo di I/O a video nella proprietà “valore in uscita” inserire questo codice CScript
return(GetTagWord(”NomeTagLettura”)/10);
con esecuzione del codice su trigger della stessa Tag “NomeTagLettura” con il tempo di scansione desiderato.
Nell’evento “Valore di Ingresso” (del gruppo Uscita/Ingresso) inserire questo codice CScript
double lValore;
lValore=GetInputValueDouble(lpszPictureName,lpszObjectName);
SetTagWord(”NomeTagScrittura”,lValore*10);
Con queste poche righe di codice si avrà il seguente funzionamento:
- il valore visualizzato dal campo I/O viene letto dalla Tag “NomeTagLettura” e diviso per 10 prima della visualizzazione.
- il valore introdotto nel campo di I/O verrà moltiplicato per 10 e scritto nella Tag “NomeTagScrittura”
Altre personalizzazioni e controlli possono in questo modo essere implementati per modificare o controllare l’input dell’operatore.
Disattivare WinCC da WSH
Puo’ essere necessario dover disattivare il runtime di WinCC da uno script Windows (WSH) per effettuare uno spegnimento ordinato per esempio in caso di mancanza di alimentazione.
Alcuni software di gestione UPS permettono l’esecuzione di Windows Script (.vbs) per effettuare alcune operazioni in modo ordinato e temporizzato prima di comandare la chiusura del SO.
In file .vbs inseriamo le seguenti istruzioni
dim mcp
set mcp = CreateObject(”WinCCRuntime-Project”)
mcp SetValue “Spegni”,1
set mcp = nothing
Questo codice non fa altro che settare il valore 1 nella tag “Spegni” di WinCC
Basterà triggherare dall’interno di WinCC tramite una action cScript la Tag “Spegni” e sul cambio di valore eseguire il seguente codice di chiurura runtime
DMExitWinCCEx(DM_SDMODE_POWEROFF)
Questa istruzione chiude WinCC e spegne il PC
Usare la tastiera a video
Per attivare la tastiera a video nei sistemi con touchscreen esiste un utility richiamabile con la funzione ProgramExecute()
TouchInputPC.EXE
L’utility prevede alcuni parametri all’avvio
-NoInfo (non viene visualizzato il fastidioso copyright)
-NumPadOff (default visualizzazione normale)
-NumPadOn (visualizzazione solo del pad numerico)
Per chiudere l’utility un sistema può essere terminare la’pplicazione con il taskkill di windows
taskkill /F /IM TouchInputPC.EXE
da esegure sempre con il ProgramExecute da cScript
Conoscere il numero di allarmi non riconosciuti
Spesso è utile conoscere il numero di allarmi non ancora riconosciuti.
Con il seguente codice cScript è possibile rilevare il numero di allarmi non ancora riconosciuti.
#include “apdefap.h”
char* _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
{
static char ret[59];
CMN_ERROR Error ;
DWORD dwCount ;
MSRTGetMsgQuit (&dwCount ,&Error);
sprintf(ret , “%ld”,dwCount);
return ret;
}
Come per l’esempio già pubblicato che riporta il numero di allarmi attivi si utilizzano funzioni documentatate nell’odk di WinCC.
Creare allarmi ed eventi personalizzati
La fornitissima FAQ di Siemens riporta un articolo su come creare un messaggio di allarme in runtime.
Molto utile per creare messaggi di evento o allarmi personalizzati.
Articolo con ID:218555 Data:2008-08-14
L’esempio utilizza alcune funzioni ODK.
Riempimento orizzontale
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.
VB-Script e C-Script
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)
SetTagByteBit e GetTagByteBit in cScript
Spesso è utile estrarre un bit da un byte per diminuire il numero di tag in scambio con il PLC
Di seguito il codice necessario per settare un bit all’interno di un byte
BOOL SetTagByteBit(char* pszTagDest, int iNumBit, short int iValue)
{
int iRit=TRUE;
char szTagDest[NC]; //contiene nome tag
int iAgg;iAgg=iNumBit;
//Crea nome destinazione
sprintf(szTagDest,”%s”,pszTagDest);if(iValue)
{
//Setta il bit
SetTagByteWait(szTagDest,GetTagByte(szTagDest) | (1<<iAgg));
}
else
{
//Resetta il bit
SetTagByteWait(szTagDest,GetTagByte(szTagDest) &~ (1<<iAgg));
}
return(iRit);}
Di seguito il codice necessario per ottenere lo stato di un bit all’interno di un byte.
BOOL GetTagByteBit(char* pszTagSource, int iNumBit)
{int iRit;
int iAgg;
char szTagSource[NC]; //contiene nome tag//Crea nome sorgente
sprintf(szTagSource,”%s”,pszTagSource);iAgg=iNumBit;
//Leggi valore
if(GetTagByte(szTagSource) & (1<<iAgg))
{
iRit=TRUE;
}
else
{
iRit=FALSE;
}
return(iRit);}
Le funzioni servono di esempio ma sono facilmente estendibili per la stessa operazione su una word o una doppiaword.
Scrivere un file da script
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”);
}
Conoscere il numero di allarmi attivi
Spesso e’ utile conoscere se ci sono allarmi attivi e anche il loro numero.
Con il seguente codice cScript è possibile conoscere il numero di allarmi nella coda degli alllarmi.
DWORD dwMsgService, dwMsgs;
MSRTStartMsgService( &dwMsgService, NULL, NULL, 0, NULL, NULL );
MSRTGetMsgActual( &dwMsgs, NULL );
MSRTStopMsgService( dwMsgService, NULL );
SetTagWord(”TagName”,dwMsgs);
Le funzioni sono documentate nell’ODK
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
Disabilitare i tasti speciali di Windows
E’ sempre noioso dovere abilitare e disabilitare i tasti speciali tipo CTRL+AL+CANC oppure CTRL+ESC
Se è molto utile che siano bloccati nell’uso quotidiano con il runtime a tutto schermo e’ altrettanto disagevole averli bloccati durante una sessione di teleassistenza o quando si pretende di avere il controllo totale sel Sistema Operativo per manutenzione.
Copio di seguito un frammento di codice che permette di abilitare e disabilitare queste combinazioni di tasti tramite una Action triggherata su tag interna globale @CurrentUser
#pragma code (”UseAdmin.DLL”)
#include “pwrt_api.h”
#pragma code()
#pragma code (”ALMXGINA.DLL”)
BOOL SetXGinaValue(unsigned int uiKey, BOOL *pbEnable, DWORD dwSize);
#pragma code()
BOOL bEnable;
BOOL bOK;
#define XGINA_ALLOW_SHUTDOWN 1
#define XGINA_ALLOW_LOGOUT 2
#define XGINA_ALLOW_CTL_ALT_DEL 3
#define XGINA_ALLOW_CTL_ESC 4
#define XGINA_ALLOW_ALT_ESC 5
#define XGINA_ALLOW_ALT_TAB 6bEnable = PWRTCheckPermission(36, TRUE);
bOK = SetXGinaValue(XGINA_ALLOW_SHUTDOWN , &bEnable , sizeof(bEnable ));
bOK = SetXGinaValue(XGINA_ALLOW_LOGOUT , &bEnable , sizeof(bEnable ));
bOK = SetXGinaValue(XGINA_ALLOW_CTL_ALT_DEL , &bEnable , sizeof(bEnable ));
bOK = SetXGinaValue(XGINA_ALLOW_CTL_ESC , &bEnable , sizeof(bEnable ));
bOK = SetXGinaValue(XGINA_ALLOW_ALT_ESC , &bEnable , sizeof(bEnable ));
bOK = SetXGinaValue(XGINA_ALLOW_ALT_TAB , &bEnable , sizeof(bEnable ));
Quando l’utente si loggherà nella security di WinCC se ha il pallino rosso di abilitazione nella riga 36 i tasti speciali vengono abilitati, altrimenti vengono diabilitati.
Prestare attenzione alla riga seguente
bEnable = PWRTCheckPermission(36, TRUE);
ritorna lo stato dell’abilitazione 36 (in questo esempio).
Utile anche per sapere da codice se l’utente ha una determinata abilitazione (per esempio per nascondere determinati pulsanti in funzione delle abilitazioni)
Uso API di Windows da cScript
Se desidero emettere un suono, di fatto suonare un file di tipo WAV, tramite la scheda audio il codice necessario in cScript e’ il seguente.
#pragma code (”Kernel32.dll”)
BOOL Beep( DWORD dwFreq, DWORD dwDuration);
#pragma code()#pragma code (”Winmm.dll “)
VOID WINAPI PlaySoundA (char* pszSound, char* hmode, DWORD dwflag);
#pragma code()if (GetTagBit(”Sirena”)>0)
{
PlaySoundA(”C:\\WINDOWS\\Media\\ding.wav”,NULL,1);
}
L’esempio sopra è inserito in una action globale triggherata sulla Tag “Sirena”
Questo è un esempio su come accedere all’uso delle API di Windows dall’interno del cScript di WinCC
Loading ...