技术论坛

 回复:如何用wincc做操作记录?有中文内容的注释。

返回主题列表
作者 主题
二排
游民

经验值:114
发帖数:100
精华帖:0
楼主    2007-05-08 16:44:02
主题:如何用wincc做操作记录?有中文内容的注释。
比如
1、20070508 12:00 操作员1 进行手动操作
2、20070508 12:01 操作员1 进行自动操作
3、……
yhgcqzd
侠士

经验值:1210
发帖数:341
精华帖:3
    2007-12-10 16:33:52
精华帖  主题:回复:如何用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;
}
}
运行画面:

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。