Instrucciones:
Los avisos de servicio se crean automáticamente en el WinCC al manejar los campos de E/S, si en la configuración de dicho campo se ha ajustado la propiedad "Aviso de servicio - Sí".
Pero a veces también se desea activar avisos de servicio al pulsar un botón u otros objetos - Esto es posible mediante la utilización de algunas funciones del WinCC Open Development Kit (WinCC ODK).
Este artículo muestra la utilización de las funciones ODK "MSRTCreateMsg()" y "MSRTSetComment()" para crear avisos de servicio en modo Runtime. Estas funciones sólo se pueden utilizar hasta el WinCC V6.0 + SP4 incluida. A partir del WinCC V6.2, hay que utilizar la función "MSRTCreateMsgInstanceWithComment()" (consulta la página del Customer Support con número ID 24325381).
Atención: Al realizar la migración de un proyecto antiguo, hay que sustituir las llamadas a las funciones "MSRTCreateMsg()" y "MSRTSetComment()" por la llamada a la función "MSRTCreateMsgInstanceWithComment()" en caso necesario.
La estructura del aviso de servicio la define el sistema de forma fija para este ejemplo. El Script en C de este artículo crea un aviso de servicio en modo Runtime con el número 12508141, el cual muestra el valor antiguo y el valor nuevo en el Valor de proceso 2 y 3 respectivamente, y un comentario del aviso.
En la función "BedienMeldB", estas llamadas API se han agrupado y asignado de tal manera que se obtienen la misma funcionalidad que con los avisos de servicio de un campo de E/S.
1. Asignación de la función "BedienMeldB"
Si se llama a la función mediante el evento "Clic de ratón" de un botón o de cualquier otro objeto, se puede asignar de la siguiente manera:
double wert_old=0;
double wert_new=1;
char comment[128]="Pulsación del botón33";
BedienMeldB(comment,wert_old,wert_new);
o bien
BedienMeldB("Pulsación del botón10",0,0);
La función se tiene que asignar con la cadena del comentario y los valores antiguo y nuevo, a los cuales simplemente se les puede asignar el valor "0" en caso que no se escriba ninguna variable.
No se ha previsto la posibilidad de asignar un ID de variable, tal como se utiliza en los campos de E/S, ya que no se puede averiguar.
No se ha previsto la entrada de un valor en el Logbuch por parte de esta función.
2. Die Funktion "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()
// =======================================================
// Descripción: Función para crear mensajes de operador específicos de usuario
// Se llama asociada, por ejemplo, a un botón: 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;
}
Advertencia:
En el WinCC ODK, también se dispone de una función con la que se puede asignar el servidor como parámetro de llamada. En el ejemplo superior se utiliza un servidor estándar.
Información sobre el ODK está disponible en la página del Customer Support con número ID 9652128.
Tenga también en cuenta la página del Customer Support con número ID 24325381.
|