如何通过用户指定动作产生操作员输入消息在 WinCC V6.0 SP4以前(包括)版本?

使用说明:
当在 WinCC 中组态 I/O 域时,如果设置了“ Operator Input Yes ” 属性,那么操作员输入消息会自动产生。
但是,在点击按钮或其他对象时常常也有产生操作员输入消息的要求。这个功能可以借助一些 WinCC ODK 函数来实现。n

本条目说明了如何使用 ODK 函数“MSRTCreateMsg()”“MSRTSetComment()” 在运行系统中创建操作员输入消息。这些函数既可以在 WinCC V6.0 SP4 以前(包括)版本中使用。WinCC V6.2 以上版本必需使用 ODK 函数“MSRTCreateMsgInstanceWithComment()”(参见条目 24325381)。n

警告!
当移植一个老版本项目时,必须用“MSRTCreateMsgInstanceWithComment()”替换“MSRTCreateMsg()”和 “MSRTSetComment()” 函数。n

本例中操作员输入消息的结构已在系统中预定义了。C 脚本在运行时会产生编号为 12508141 的操作员输入消息,并在过程值 _2 和过程值 _3 中显示老值和新值,同时也会显示消息的注释。n

函数“ OpInputB ” 中包含了这些API的调用,可以完成和 IO 域的操作员输入一样的功能。

1.使用 "OpInputB" 函数

如果在按钮或其他对象的“鼠标点击”事件中调用此函数,可以按下面来编写:

double value_old=0;
double value_new=1;
char* comment="Operation of button33";
OpInputB(comment,value_old,value_new);

或者
char* comment="Operation of button10";
OpInputB(comment,0,0);n

此函数要带有注释字符串和老值及新值,如果没有变量被写,直接给它们赋 0 即可。

用于 I/O 域的变量 ID 的传送无法提供,因为它无法确定。
在日志中没有该函数的条目。

2. “ OpInputB ” 函数

#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;
//Coection 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 rn",MsgComment.szComputerName);
do {
if( l_svID==0) {
fRet= MSRTStartMsgService( &l_svID, NULL, NULL, 0, NULL, pError );
// activate service
if(!fRet) break;
printf( "Alarm Coected %d rn", l_svID );
}
fRet = MSRTCreateMsg( l_svID, &MsgCreate, pError ) ;
// create message
// Create comment
if(fRet == FALSE ){
printf("MSRTCreateMsg_Error %s rn",pError->szErrorText);
}
else {
MSRTSetComment( l_svID, &MsgComment, pError );
}

break;
} while(TRUE);

fRet=MSRTStopMsgService(l_svID,pError);
// cancel service
printf("StopMsgService %d %s rn",fRet,pError->szErrorText);
if (fRet==TRUE)
l_svID=0;
}

注意:
在 WinCC ODK 中有一个函数允许服务器传输调用函数。在以上例子中使用了缺省服务器。
关于 ODK 的信息见于条目 ID 9652128 .
也可参看条目 ID 24325381.

原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc335335.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2020年11月5日 下午12:03
下一篇 2021年4月12日 上午12:00

相关推荐

发表回复

登录后才能评论