| 作者 | 主题 |
|---|---|
|
二排 游民 经验值:114 发帖数:100 精华帖:0 |
楼主
主题:如何用wincc做操作记录?有中文内容的注释。
比如
1、20070508 12:00 操作员1 进行手动操作 2、20070508 12:01 操作员1 进行自动操作 3、…… |
|
yhgcqzd 侠士 经验值:1210 发帖数:341 精华帖:3 |
楼
主题:回复:如何用wincc做操作记录?有中文内容的注释。
对按钮对象的操作,可以自动添加到报警/信息记录中,以下程序在WinCC V6.0 SP2中通过。
1 使用说明: 当在WinCC中组态IO域时,如果设置了"Operator Input Yes" 属性,那么操作员输入消息会自动产生。 但是, 在点击按钮或其他对象时常常也有产生操作员输入消息的要求。这个功能可以借助一些WinCC ODK函数来实现。 本文说明了如何使用 WinCC ODK 函数在运行时产生操作员输入消息。这些函数既可以在WinCC V6中使用,也同样适用于更老的版本 (比如: WinCC V4 或 V5)。 本例中操作员输入消息的结构已在系统中预定义了。本例中的C脚本在运行时会产生编号为128的操作员输入消息,并在过程值_2 和过程值_3中显示老值和新值,同时也会显示消息的注释。 函数"OpInputB"中包含了这些API的调用,可以完成和IO域的操作员输入一样的功能。 2 建立报警信息 打开报警记录编辑器然后创建一条类别为“系统,没有确认类型”的“操作员输入消息”报警消息。您可以为该消息任意指定一个消息编号。在该例中将使用的消息编号为“ 128 ”。 在“Text”页中,输入如下信息: 非常重要 @100%s@ = Computer name (max. 16 characters)。 @101%s@ = Application name (max. 32 characters) @102%s@ = User name (max. 16 characters) @103%s@ = Comment (max. 256 characters) to the message in the long-term archive window. . To do his, a comment must be entered in the alarm. 3 从画面中的按钮或其它对象调用 如果在按钮或其他对象的鼠标点击事件中调用此函数,可以按下面来编写: double value_old=10; //在PV Block2中显示旧值。 double value_new=11; //在PV Block3中显示新值。 char* comment="Operation_yhg"; //在WinCC Message中显示 操作说明。 OpInputB(comment,value_old,value_new); //调用OpInputB()项目函数。 此函数要带有注释字符串和老值及新值,如果没有变量被写,直接给它们赋 0 即可。 4 从画面应用窗口中的按钮或其它对象调用 如果在应用出口中的按钮或其他对象的鼠标点击事件中调用此函数,可以按下面来编写: 4.1 在画面中调出应用窗口的对象中,加入以下红色部分 #include "apdefap.h" void OnLButtonUp(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nFlags, int x, int y) { SetVisible("main.Pdl","SubWin",0); //关闭图形窗口 SetVisible("main.Pdl","SubWin1",0); //关闭图形窗口 SetPictureName("main.Pdl","SubWin","PID.PDL"); //定义调出子图形名称 SetVisible("main.Pdl","SubWin",1); //显示图形窗口 SetText("PID.PDL","TAG","Feeder8 No.2 Temp. Ctrl."); //设置说明文字 SetText("PID.PDL","UserName",GetTagCharWait("@CurrentUser")); //在PID画面中,设置名称为“UserName”的静态文字对象的内容为目前登录的用户名 SetMax("PID.PDL","PVBar",1400); //设定PV棒图上限 SetMin("PID.PDL","PVBar",0); //设定PV棒图上下限 SetZeroPointValue("PID.PDL","PVBar",0); //Return-Type: BOOL SetMax("PID.PDL","SPBar",1400); //Return-Type: BOOL SetMin("PID.PDL","SPBar",0); //设定PV棒图上下限 SetZeroPointValue("PID.PDL","SPBar",0); //Return-Type: BOOL SetMax("PID.PDL","OUTBar",100); //Return-Type: BOOL SetMin("PID.PDL","OUTBar",0); //设定PV棒图上下限 } 4.2 从应用窗口中的按钮或其它对象调用 如果在应用出口中的按钮或其他对象的鼠标点击事件中调用此函数,可以按下面来编写: #include "apdefap.h" void OnLButtonUp(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName, UINT nFlags, int x, int y) { #define val1 ".MODE" char comment[29]; //char User_Name[10]; double value_old=0; double value_new=1; //strcpy(User_Name,GetText("PID.PDL","UserNmae")); //Return: Current User Name) if (GetFlashBackColor(lpszPictureName,"Auto")) //Return-Type: BOOL { SetFlashBackColor(lpszPictureName,"Auto",0); //Green SetBackColor(lpszPictureName,"Auto",0x0000FF00); //Return-Type: BOOL SetBackColor(lpszPictureName,"Man",0x00C0C0C0); //Return-Type: BOOL SetTagBit(".MODE",FALSE); //Return-Type: BOOL strcat(strcpy(comment,GetText("PID.PDL","TAG"))," be change to AUTO Mode"); //Return-Type: char* ) OpInputB(comment,1,0); } else { SetFlashBackColor(lpszPictureName,"Man",0); //Green SetBackColor(lpszPictureName,"Man",0x00FFFF00); //Return-Type: BOOL SetBackColor(lpszPictureName,"Auto",0x00C0C0C0); //Return-Type: BOOL SetTagBit(".MODE",TRUE); //Return-Type: BOOL strcat(strcpy(comment,GetText("PID.PDL","TAG"))," be change to MAN Mode"); //Return-Type: char* ) OpInputB(comment,0,1); } SetVisible(lpszPictureName,"OK",0); //Return-Type: BOOL } 5 "OpInputB" 函数 在C-Editor中建立以下项目函数: #include "apdefap.h" void OpInputB(char* CommentText, double doValueOld, double doValueNew) { #pragma code ("kernel32.dll") BOOL GetLocalTime(SYSTEMTIME* stTime); BOOL GetComputerNameA(LPSTR Computername, LPDWORD size); #pragma code() #include "M_GLOBAL.H" #include "msrtapi.h" SYSTEMTIME stTime; GetLocalTime(&stTime); // Get time/date { 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; MsgCreate.dwMsgNr = 128; // Operator Message Number MsgComment.dwMsgNr = 128; ; // Operator Message Number MsgCreate.stMsgTime = stTime; MsgComment.stTime = stTime; MsgCreate.wPValueUsed = 6; // Process Value Block2.3 be used 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" MsgCreate.wTextValueUsed = 0x001F; strcpy( MsgComment.szText, CommentText ); strcpy( MsgComment.szUser, GetTagChar("@CurrentUser")); //Return-Type: char* strcpy( MsgComment.szUser, GetText("PID.PDL","UserName")); // 从应用窗口调用函数时。 //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; } } 运行画面: |