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
La documentazione è disponibile anche in Italiano
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
La documentazione è disponibile anche in Italiano
Chiaro esempio su come esportare e/o importare in WinCC tramite basicScript o cScript
Le informazioni sono reperibili nella FAQ 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
La documentazione è in Inglese
Siemens riporta nella FAQ 11769423 come comandare dall’esterno con pulsanti custom le funzioni disponibili nella toolbar dell’Alarm Control sia la versione 7 che per il vecchio controllo denominato Classic presente nella versione 6.
La documentazione è 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)
FAQ Siemens su come controllare lo stato della comunicazione
L’esempio prevede uno script in cScript.
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.
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);
E’ disponibile in inglese il manuale di istruzioni del connectivity pack al seguente indirizzo:
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.
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:
Altre personalizzazioni e controlli possono in questo modo essere implementati per modificare o controllare l’input dell’operatore.
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
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
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.
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:
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)
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.
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”);
}
Commenti recenti