cScript

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

Di |2009-10-03T11:53:46+02:00Ottobre 3rd, 2009|BasicScript, cScript, Esempi WinCC, Graphics Designer|0 Commenti

Rilevare la posizione del mouse

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 |2009-07-28T17:20:14+02:00Luglio 28th, 2009|BasicScript, cScript, Esempi WinCC, Graphics Designer|0 Commenti

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.

Di |2009-05-28T00:00:25+02:00Maggio 28th, 2009|cScript, Esempi WinCC|0 Commenti

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

Di |2009-05-08T12:55:22+02:00Maggio 8th, 2009|cScript, Esempi WinCC|0 Commenti

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

Di |2009-02-14T12:15:18+02:00Febbraio 14th, 2009|cScript, Esempi WinCC|0 Commenti

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.

Di |2009-01-08T16:01:07+02:00Gennaio 8th, 2009|Alarm Logging, cScript|0 Commenti

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)

Di |2008-08-12T00:00:25+02:00Agosto 12th, 2008|BasicScript, cScript, Documentazione|0 Commenti

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.

Di |2008-07-24T00:00:00+02:00Luglio 24th, 2008|cScript, Esempi WinCC|0 Commenti

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”);
}

Di |2008-03-08T00:00:38+02:00Marzo 8th, 2008|BasicScript, cScript|0 Commenti

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

Di |2008-03-08T00:00:03+02:00Marzo 8th, 2008|Alarm Logging, cScript|1 Commento

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

Di |2008-02-25T00:00:33+02:00Febbraio 25th, 2008|cScript, DataBase|0 Commenti

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 6

bEnable = 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)

Di |2008-02-23T00:00:49+02:00Febbraio 23rd, 2008|cScript|0 Commenti
Torna in cima