切换按钮001SetTagBit(TE_BOOL,!GetTagBit(TE_BOOL));002BOOLAA=GetTagBit(TE_BOOL);if(A)SetTagBit(TE_BOOL,0);ElseSetTagBit(TE_BOOL,1);003SetTagBit(TE_BOOL,1-GetTagBit(TE_BOOL));IO域处的格式化输入输出在I/O域的输出值事件处的动作FloatF_TAG;F_TAG=GetTagFloat(TE_FLOAT);return(F_TAG/100);WINCC运行画面最小化HWNDWinCCHwnd;WinCCHwnd=FindWindow(PDLRTisAliveAndWaitsForYou,NULL);CloseWindow(WinCCHwnd);WINDOWS中提供的标准对话框{BOOLbool1;HWNDHwnd;intiRet;Hwnd=FindWindow(NULL,WinCC-运行系统-);if(!Hwnd)Hwnd=FindWindow(NULL,WinCC-运行系统-);if(!Hwnd)printf(\r\nGetWinCCHandleFailed!);iRet=MessageBox(Hwnd,确认合闸,确认对话框,MB_YESNOCANCEL|MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_SYSTEMMODAL);switch(iRet){caseIDYES:printf(userdoYES\r\n);SetTagBit(TE_QUEST,1);break;caseIDNO:printf(userdoNO\r\n);SetTagBit(TE_QUEST,0);break;caseIDCANCEL:printf(userdoCANCEL\r\n);break;}}本画框的功能是点击按钮的时候弹出windows询问对话框其中“确认合闸”为对话内容,对话框的名称为“确认对话框”用户不同显示不同的按钮你可以在用户管理器给每个用户不同的权限,使他们对按钮有不同的操作权,这是最简便的。但是如果一定要根据用户不同显示不同的按钮就要用C脚本了下面这段代码可以加在有两个按钮的画面的对象属性--事件--画面对象--其他--打开画面,三个用户名是user1,user2,user3,按钮名称是按钮1,按钮2,你可以自行修改,这里假设已经进行过用户登录的操作,当打开有这两个按钮的画面时执行下列脚本判断用户并显示相应的按钮if(strcmp(GetTagChar(@CurrentUser),user1)){}else{SetVisible(lpszPictureName,按钮1,TRUE);SetVisible(lpszPictureName,按纽2,FALSE);}if(strcmp(GetTagChar(@CurrentUser),user2)){}else{SetVisible(lpszPictureName,按钮1,FALSE);SetVisible(lpszPictureName,按钮2,TRUE);}if(strcmp(GetTagChar(@CurrentUser),user3)){}else{SetVisible(lpszPictureName,按钮1,TRUE);SetVisible(lpszPictureName,按钮2,TRUE);}strcmp是比较字符串的语句,比较文本变量只能用它,帮助里没有的,用它比较读取到的用户名GetTagChar(@CurrentUser)和三个用户名userX,你把这段语句加到一个按钮的鼠标动作里,看点击按钮会不会两个按钮现实和隐藏。登录登出对话框#pragmacode(useadmin.dll)#includePWRT_api.h#pragmacode()PWRTLogin('c');PWRTLogin参数必须是CHAR字符。它指定了显示对话框的监视器。如果只使用一个监视器,那么保留默认参数“c”或者指定“1”。#pragmacode(useadmin.dll)#includePWRT_api.h#pragmacode()PWRTLogout();PWRTLogin参数必须是CHAR字符。它指定了显示对话框的监视器。如果只使用一个监视器,那么保留默认参数“c”或者指定“1”。WinCC如何实现鼠标OnMouseOVer事件用WINDOWAPI函数GetCusorPos获取当前鼠标位置,用GetWindowRect函数获取窗口位置,两值相减得鼠标在WINCCframe上的相对位置。用全局脚本(设定为1s定时刷新),然后获取要OnMouseOver事件的物体的位置,并与鼠标位置相比较,如一致则触发自己定义的动作。#includeapdefap.hintgscAction(void){#pragmacode(user32.dll);BOOLGetCusorPos(POINTlpPoint);//获取鼠标的位置(绝对位置-对应屏幕分辨率)BOOLGetWindowRect(HWNDhwnd,LPRECTlpRect);//获取窗体位置#pragmacode();POINTpPos;RECTrRec;HWNDhwnd;BOOLbRet,bRet2;longlLeft,lTop,lWidth,lHeight;longlX,lY;charszStr[100];hwnd=FindWindow(NULL,WinCC-Runtime-);//如语言为中文应为WinCC运行系统-if(hwnd==0){printf(\r\nError!WinCcHandleis%d,hwnd);gotoover;}bRet=GetCursorPos(&pPos);if(bRet==0)gotoover;bRet2=GetWindowRect(hwnd,&rRec);if(bRet2==0)gotoover;lX=pPos.x-rRec.left;//鼠标对{置lY=pPos.y-rRec.top;//鼠标位置//如果为非全屏模式,需将上述数值中的高height判断减去标题栏的宽度//printf(TheCurrentCusorPosisx:%d,y:%d\r\n,pPos.x,pPos.y);//printf(TheCusorPosinWindowisx:%d,y:%d\r\n,pPos.x-lLeft2,pPos.y-lTop2);lLeft=GetLeft(NewPdl0.Pdl,Text1);//Return-Type:longintlTop=GetTop(NewPdl0.Pdl,Text1);//Return-Type:longintlWidth=GetWidth(NewPdl0.Pdl,Text1);//Return-Type:longintlHeight=GetHeight(NewPdl0.Pdl,Text1);//Return-Type:longintif((lX=lLeft)&&(lY=lTop)&&(lX=lLeft+lWidth)&&(lY=lTop+lHeight)){sprintf(szStr,%d,%d,lX,lY);SetText(NewPdl0.Pdl,Text1,szStr);//Return-Type:char*}//printf(TheText1Posisx:%d,y:%d\r\n,lLeft2,lTop-lTop2);over:return0;}退出WINCC监控时选择退出方式DMExitWinCCEx(DM_SDMODE_SYSTEM);或者使用动态向导通过给变量ExitSystem赋不同的数值实现不同的方式inta;a=GetTagWord(ExitSystem);//返回类型:WORDswitch(a){case1:MExitWinCCEx(DM_SDMODE_REBOOT);break;case2:DMExitWinCCEx(DM_SDMODE_SYSTEM);break;case4:ExitWinCC();break;////DMExitWinCCEx(DM_SDMODE_WINCC);break;case8:DMExitWinCCEx(DM_SDMODE_LOGOFF);break;}如何实现用户登陆日志wincc中用c脚本实现?#pragmacode(kernel32.dll)VOIDGetLocalTime(LPSYSTEMTIMElpSystemTime);#pragmacode()char*username;charbuf[128];staticcharpreuser[128];unsigneda,b,c,d,e,f;FILE*fp;SYSTEMTIMEsysTime;//读取系统时间,并且复制给变量a,b,c,d,e,fGetLocalTime(&sysTime);a=sysTime.wHour;b=sysTime.wMinute;c=sysTime.wSecond;f=sysTime.wYear;e=sysTime.wMonth;d=sysTime.wDay;username=GetTagChar(@CurrentUser);//得到当前用户名称fp=fopen(c:\\wincclog.txt,a+);//创建文件if(strcmp(username,preuser)!=0)//如果当前用户名称和前一个用户名不同{if((strcmp(username,)!=0)&&(strcmp(preuser,)==0))//如果当前用户名称不空同时前一个用户名为空{sprintf(buf,用户:%s\t登陆时间是:\t%d-%d-%d,%d-%d-%d\n,username,a,b,c,d,e,f);fputs(buf,fp);}else{if((strcmp(username,)==0)&&(strcmp(preuser,)!=0))//如果当前用户名称为空同时前一个用户名不空{sprintf(buf,用户:%s\t退出时间是:\t%d-%d-%d,%d-%d-%d\n,preuser,a,b,c,d,e,f);fputs(buf,fp);}else{sprintf(buf,用户:%s\t退出时间是:\t%d-%d-%d,%d-%d-%d\n,preuser,a,b,c,d,e,f);fputs(buf,fp);sprintf(buf,用户:%s\t登陆时间是:\t%d-%d-%d,%d-%d-%d\n,username,a,b,c,d,e,f);fputs(buf,fp);}}}strcpy(preuser,username);fclose(fp);return0;用户登陆日志:(包括用户的登陆退出信息,以便查询在什么时间段是哪个用户在使用这个监控软件)设置语言英语SetLanguage(0x409);法语SetLanguage(0x407);德语SetLanguage(0x40C);调用计算器如果在C脚本中仅仅有一句ProgramExecute(CALC.exe)此时不关计算器就切换画面,则计算器都在后台运行。所以在脚本中加入使计算器必须显示在WINDOW的激活层上。{HWNDHwnd;BOOLbRet;Hwnd=FindWindow(NULL,Calculator);if(!Hwnd){ProgramExecute(CALC.exe);Hwnd=FindWindow(NULL,Calculator);if(Hwnd){printf(\r\n%d,Hwnd);bRet=SetWindowPos(Hwnd,HWND_TOPMOST,300,300,200,200,SWP_NOSIZE);if(!bRet)printf(\r\nSetWindowPosError!);}}}修改密码{#pragmacode(UseGen.dll)#includeUSEG