|
Istruzioni
Le segnalazioni di servizio in WinCC vengono generate automaticamente in occasione delle operazioni su campi di I/O se durante la progettazione dei campi di I/O è stata impostata la proprietà "Segnalazione di servizio Si".
Viene però spesso espresso il desiderio che le segnalazioni servizio vengano emesse anche in occasione della pressione di un pulsante o di altri oggetti - questo è possibile con l'utilizzo di alcune funzioni del WinCC Open Development Kit (WinCC ODK).
Questo articolo mostra l'impiego delle funzioni ODK "MSRTCreateMsg()" e "MSRTSetComment()", per generare segnalazioni servizio durante la runtime. Queste funzioni possono essere utilizzate sino a WinCC V6.0 SP4 compreso. Da WinCC V6.2 occorre utilizzare la funzione ODK "MSRTCreateMsgInstanceWithComment()" (vedi l'articolo 24325381)!
Attenzione! Nella migrazione di un vecchio progetto può essere necessario sostituire i richiami delle funzioni "MSRTCreateMsg()" e "MSRTSetComment()" con "MSRTCreateMsgInstanceWithComment()"!
La struttura della segnalazione di servizio per questo esempio è determinata fissa dal sistema. Lo script in questo articolo crea durante la runtime una segnalazione di servizio con il numero di segnalazione 12508141, il vecchio valore ed il nuovo valore in Prozeßwert_2 opp. Prozeßwert_3 ed un commento alla segnalazione.
Nella funzione "BedienMeldB" questi richiami API sono stati raccolti e alimentati in modo che sia raggiunta una funzionalità uguale alla segnalazione di servizio del campo di I/O.
1. Alimentazione della funzione "BedienMeldB"
Se la funzione viene richiamata con l'evento "Clic del mouse” su un pulsante o su un altro oggetto, allora essa potrebbe essere alimentata nel modo seguente:
double wert_old=0;
double wert_new=1;
char comment[128]="Pressione del pulsante33";
BedienMeldB(comment,wert_old,wert_new);
oppure
BedienMeldB("Pressione del pulsante10",0,0);
La funzione deve essere alimentata con la stringa di commento, con valore nuovo e vecchio, dove questi valori possono anche essere semplicemente trasferiti con 0, se non è stata scritta alcuna variabile.
Un trasferimento del Variable-ID, come esso viene impiegato nel campo I/O, non è stato previsto, poiché esso non può essere rilevato
Una registrazione nel Logbook non viene eseguita da questa funzione.
2. La funzione "BedienMeldB"
#pragma code ("Kernel32.DLL");
BOOL GetComputerNameA(LPSTR Computername, LPDWORD size);
BOOL GetLocalTime(SYSTEMTIME* stTime);
#pragma code();
#include "M_GLOBAL.H"
#include "msrtapi.h"
// =======================================================
// Function: BedienMeldB()
// =======================================================
// Description: Function to create user specific operator messages
// Call e.g. released by a Button: BedienMeldB(CommentText,W_old,W_new);
// =======================================================
void BedienMeldB(char* CommentText,double doValueOld, double doValueNew)
{
CMN_ERROR g_sErr;
LPCMN_ERROR pError = &g_sErr; /* Global Error Block */
BOOL fRet = TRUE;
DWORD dwBufSize;
static DWORD l_svID = 0;
//Connection ID to Alarmlogging
DWORD dwVarID=0;
// Tag-ID set to 0
MSG_RTCREATE_STRUCT MsgCreate;
MSG_COMMENT_STRUCT MsgComment;
SYSTEMTIME stTime;
GetLocalTime(&stTime);
// Get time/date
MsgCreate.dwMsgNr = MSG_SINGLE_OPERATION;
// Operator Message Number
MsgComment.dwMsgNr = MSG_SINGLE_OPERATION;
// Operator Message Number
MsgCreate.stMsgTime = stTime;
MsgComment.stTime = stTime;
MsgCreate.wPValueUsed = 7;
// 3 Process Tags(0..2)
MsgCreate.dPValue[0] = dwVarID;
// Tag-ID
MsgCreate.dPValue[1] = doValueOld;
// previous value
MsgCreate.dPValue[2] = doValueNew;
// current value
MsgCreate.dwMsgState = MSG_STATE_COME;
// state "COME"
strcpy(MsgComment.szText, CommentText);
strcpy(MsgComment.szUser, GetTagChar("@CurrentUser"));
// assign logged user
// get computer name
dwBufSize = sizeof(MsgComment.szComputerName);
GetComputerNameA(MsgComment.szComputerName, &dwBufSize);
printf("ComputerName: %s \r\n",MsgComment.szComputerName);
do {
if(l_svID==0) {
fRet= MSRTStartMsgService(&l_svID, NULL, NULL, 0, NULL, pError);
// activate service
if(!fRet) break;
printf("Alarm Connected %d \r\n", l_svID);
}
fRet = MSRTCreateMsg(l_svID, &MsgCreate, pError) ;
// create message
// Create comment
if(fRet == FALSE){
printf("MSRTCreateMsg_Error %s \r\n",pError->szErrorText);
}
else {
MSRTSetComment(l_svID, &MsgComment, pError);
}
break;
} while(TRUE);
fRet=MSRTStopMsgService(l_svID,pError);
// cancel service
printf("StopMsgService %d %s \r\n",fRet,pError->szErrorText);
if (fRet==TRUE)
l_svID=0;
}
Avvertenza
In WinCC ODK si trova anche una funzione nella quale si può indicare il server come parametro di richiamo. Nell’esempio in alto si utilizza il server standard.
Informazioni sullo ODK si trovano nell’articolo con ID 9652128.
Tenere conto anche dell’articolo 24325381.
|