Categorie
cScript Esempi WinCC

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

Categorie
Alarm Logging 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.

Categorie
Alarm Logging cScript

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.

Categorie
BasicScript cScript

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.

 

Categorie
BasicScript cScript Documentazione

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)

Categorie
cScript Esempi WinCC

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.

Categorie
BasicScript cScript

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

Categorie
Alarm Logging cScript

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

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

Categorie
cScript

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