1、11、wincc 全局脚本动作-隐藏控件#include “apdefap.h“int gscAction( void )/ WINCC:TAGNAME_SECTION_START/ syntax: #define TagNameInAction “DMTagName“/ next TagID : 1/ WINCC:TAGNAME_SECTION_ENDint value;value=GetTagBit(“IM_in“);/“IM_in“为触发的变量。if(value=1)SetVisible(“lianxi.pdl“,“按钮8“,TRUE);/lianxi.pdl 为控制对象所在画面名, “
2、按钮8”为对象名称elseSetVisible(“lianxi.pdl“,“按钮8“,FALSE);/lianxi.pdl/ WINCC:PICNAME_SECTION_START/ syntax: #define PicNameInAction “PictureName“/ next PicID : 1/ WINCC:PICNAME_SECTION_ENDreturn 0;=说明:在触发器里选择变量 IM_in2、wincc 全局脚本动作-提示框#include “apdefap.h“int gscAction( void )/ WINCC:TAGNAME_SECTION_START/ sy
3、ntax: #define TagNameInAction “DMTagName“/ next TagID : 1/ WINCC:TAGNAME_SECTION_ENDint value;2value=GetTagBit(“IM_in“);if(value=1)MessageBox(NULL,“请确认三厅相关门是否关好,或者请解锁。“,“提示框“,MB_OK|MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_SYSTEMMODAL);/ WINCC:PICNAME_SECTION_START/ syntax: #define PicNameInAction “Pic
4、tureName“/ next PicID : 1/ WINCC:PICNAME_SECTION_ENDreturn 0;=说明:在触发器中选择变量触发。3、趋势面板char * str_a = NULL;int Hi;int Lo;str_a = GetTagChar(“TrendTagName1“);Lo= GetTagSWord(“TrendLo“);Hi= GetTagSWord(“TrendHi“);SetPropWord(lpszPictureName,“qushi“,“TrendIndex“,0);SetPropChar(lpszPictureName,“qushi“,“Tren
5、dTagName“,str_a);SetPropWord(lpszPictureName,“qushi“,“ValueAxisBeginValue“,Lo);SetPropWord(lpszPictureName,“qushi“,“ValueAxisEndValue“,Hi);4、获取位号SetTagChar(“TrendTagName1“,“ProcessValueArchivePT111“); /Return-Type: BOOL SetTagSWord(“TrendHi“,200);SetTagSWord(“TrendLo“,0);SetTagByte(“Trenden“,1);5、调用
6、登陆函数#pragma code(“useadmin.dll“)#include “PWRT_API.H“#pragma code()if (strcmp(GetTagChar(“CurrentUser“),“)=0)PWRTLogin(c);3-6、时间同步void SetCpuTime()#pragma code(“kernel32.dll“);void GetLocalTime(SYSTEMTIME *lpst);#pragma code();SYSTEMTIME timeBOOL ret;/printf(“Start function SetCpuTimern“);GetLocalTi
7、me(ret= SetTagMultiWait(“%d%d%d%d%d%d%d“,“data_year“,time.wYear-2000,“data_month“,time.wMonth,“data_day“,time.wDay,“data_hour“,time.wHour,“data_MINUTE“,time.wMinute,“data_SECOND“,time.wSecond,“data_FLAG“,1)-7、对话框调用BOOL A;BOOL B;HWND hwnd=NULL;int RetMsg;A=GetTagBit(“TJ_ANNIU“);/Return-Type: BOOL hwn
8、d=FindWindow(NULL,“WinCC-运行系统 - “);if (A=0)4RetMsg =MessageBox (hwnd, “确定要停机?“, “停机警告“, MB_OKCANCEL|MB_SYSTEMMODAL|MB_SETFOREGROUND);if (RetMsg=IDOK)SetTagBit(“TJ_ANNIU“,1);MessageBox (hwnd, “停机“, “停机警告“, MB_OK|MB_SYSTEMMODAL|MB_SETFOREGROUND);SetTagBit(“TJ_ANNIU“,0);else B=0;else -8、声音报警#pragma cod
9、e(“Winmm.dll“) VOID WINAPI PlaySoundA(char* pszSound,char* hmode,DWORD dwflag);#pragma code()if(GetTagFloat(“LIST555“)500)PlaySoundA(“D:DCSDATACG_winccHornHorn_Attention.wav“,NULL,1);if(GetTagFloat(“LIST555“)=100) a1=0;SetTagDWord(“P“,a1);5然后用一个按钮控制二进制变量 Q,为启动信号。物体的 X 位置对应的是变量 P,设置为模拟量。当 P 为1的时候对应的
10、X 位置。P 为2的时候对应 X 的位置,以此类推,就可以做出物体移动画面了,要做全局脚本-10、 WinCC 中调用 SQL 语言 1、创建一个 SQL 文件,此文件在 ISQL 中建立,文件内包含所要执行的 SQL 语句。Windows 对话框实现。具体如下:2、在 WinCC 中用 C Script 调用上述 SQL 文件,如下所示:#includeapdefap.hvoid OnLButtonDown(char* lpszPictureName,char* lpszObjectName,char* lpszPropertyName,UINT nFlags,int x,int y)cha
11、r*a=c:siemenscommonSQLANYISQL-q-b-cUID=DBA;PWD=SQL;DBF=E:testsqltestsqlRT.DB;DBN=CC_testsql_99-12-03-12:48:26R;READE:testsqltest.sql;Printf(%srn,a);ProgramExcute(a);下面是一个简单的 SQL 文件内容:select *from pde#hd#t#test;output to e:test2.txt FORMAT ascii注意:文件名及路径中不要带空格。 11、设置或重置一个变量void OnClick(char* lpszPict
12、ureName, char* lpszObjectName, char* lpszPropertyName)BOOL z;z=GetTagBit(MyBitVariable);/获得变量值if (z=0) SetTagBit(MyBitVariable,1); /设置变量值elseSetTagBit(MyBitVariable,0); 12、运行时图形产生动态旋转#include apdefap.hlong _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)static int x=25,y,z;
13、/x 为半径的初始值为 25,y 为切换变量, z 为搅拌机运行状态变量6z=GetTagBit(202 搅拌机运行); /取得 PLC 搅拌机的运行状态if(z!=0)switch(y)case 0:x=x-4;if(x=0)y=1;break;default :x=x+4;if(x=25)y=0;break;return x; 13、WINCC-如何在程序中动态修改用户密码 1、点击“开始”- “设置” - “控制面板 ”- “管理工具”- “数据源(ODBC) ”,打开 ODBC 数据源管理器 2、在用户 DSN 页面的用户数据源中找到与当前项目所关联的一项,其名称为“CC_项目名_项目
14、建立日期时间”,记下该项的名称 3、在脚本中加入以下代码: #pragma code(“UseGen.dll“) #include “USEGENAP.H“ #pragma code() LPCMN_ERROR err; /定义的 LPCMN_ERROR 型变量 ,在函数调用中需使用 if (PWGENConnect(“CC_ass_04-09-21_16:35:22“,err) /建立与数据库的联接,其中CC_ass_04-09-21_16:35:22 用第二步中记下的名称取代 if (PWGENChangePassword(GetTagChar(“user“),GetTagChar(“ol
15、dpassword“),GetTagChar(“password“),err) /修改密码,user,oldpassword,password 分别为存贮用户名,原密码,新密码的内部变量,类型为文本变量 8 位字符集 /密码修改成功后的操作,如给用户提示等 PWGENDisconnect(err); /断开与数据库的联接 4、编译运行程序 5、工作完成 76、与用户管理相关的函数定义存贮在 APPLIB 目录下的 USEGENAP.H 文件中,可根据上面示例自行完成添加用户,修改权限等功能。 14、WinCC 如何实现鼠标 OnMouseOVer 事件 用 WINDOWAPI 函数 GetCu
16、sorPos 获取当前鼠标位置,用 GetWindowRect 函数获取窗口位置,两值相减得鼠标在 WINCC frame 上的相对位置。用全局脚本(设定为1s 定时刷新) ,然后获取要 OnMouseOver 事件的物体的位置,并与鼠标位置相比较,如一致则触发自己定义的动作。#include “apdefap.h“int gscAction( void ) #pragma code(“user32.dll“); BOOL GetCusorPos(POINT lpPoint); /获取鼠标的位置(绝对位置 -对应屏幕分辨率) BOOL GetWindowRect(HWND hwnd,LPREC
17、T lpRect); /获取窗体位置 #pragma code(); POINT pPos; RECT rRec; HWND hwnd; BOOL bRet,bRet2; long lLeft,lTop,lWidth,lHeight; long lX,lY; char szStr100;hwnd=FindWindow(NULL,“WinCC-Runtime - “); /如语言为中文应为“WinCC 运行系统-“if (hwnd=0) printf(“rnError! WinCc Handle is %d“,hwnd);goto over;bRet=GetCursorPos( if (bRet
18、=0) goto over;bRet2=GetWindowRect(hwnd, if (bRet2=0) goto over; lX=pPos.x-rRec.left; /鼠标 对 置 lY=pPos.y-rRec.top; /鼠标 位置 /如果为非全屏模式,需将上述数值中的高 height 判断减去标题栏的宽度 /printf(“The Current Cusor Pos is x:%d,y:%drn“,pPos.x,pPos.y); /printf(“The Cusor Pos in Window is x:%d,y:%drn“,pPos.x-lLeft2,pPos.y-lTop2); l
19、Left=GetLeft(“NewPdl0.Pdl“,“Text1“); /Return - Type :long int lTop=GetTop(“NewPdl0.Pdl“,“Text1“); /Return - Type :long int lWidth=GetWidth(“NewPdl0.Pdl“,“Text1“); /Return - Type :long int lHeight=GetHeight(“NewPdl0.Pdl“,“Text1“); /Return - Type :long intif (lX=lLeft) SetText(“NewPdl0.Pdl“,“Text1“,sz
20、Str); /Return - Type :char* /printf(“The Text1 Pos is x:%d,y:%drn“,lLeft2,lTop-lTop2); 8over: return 0; 15、如何在退出 WINCC 监控时直接关闭电脑 1.利用动态向导 2.在脚本中加入 DMExitWinCCEx (DM_SDMODE_SYSTEM);也可以 16、过 WINCC API 函数读出当前报警消息 1、使用 GMsgFunction 中读出当前报警信息的 ID(dwMsgNr) ; 2、使用 MSRTGetMsgCSData 函数读出该报警信息 ID 对应文本库 TEXTLI
21、B 中的文本ID(dwTextID1) ; 3、使用 MSRTGetMsgText 函数读出该文本 ID 的文本。 信息到达处理:如果读取文本成功,则置文本变量 MSG。 信息离去处理:如果 MsgNr 与上一次相同,则复位 MSG,如果不是,则继续保持信息。 具体函数说明请看 ODK 文档 BOOL GMsgFunction( char* pszMsgData) #pragma code(“msrtcli.dll“) i nclude “msrtapi.h“ #pragma code();MSG_TEXT_STRUCT tMeld; MSG_CSDATA_STRUCT sM; CMN_ERR
22、OR err; BOOL bRet; DWORD dwTextID1; DWORD dwMsgNum; char szMsg255; #define TAG_MSG “MSG“MSG_RTDATA_STRUCT mRT; memset( if( pszMsgData != NULL ) printf( “Meldung : %s rn“, pszMsgData ); sscanf( pszMsgData, “%ld,%ld,%04d.%02d.%02d,%02d:%02d:%02d:%03d,%ld, %ld, %ld, %d,%d“, /*code for dcount if (mRT.dw
23、MsgState=MSG_STATE_COME)/信息到达处理 dwMsgNum=mRT.dwMsgNr; printf(“rnThe Alarm Message No is %d !rn“,dwMsgNum); bRet=MSRTGetMsgCSData(dwMsgNum, if (bRet=TRUE) dwTextID1=sM.dwTextID0; printf(“rnThe TextID of The MessageNr %d is %d !rn“,dwMsgNum,dwTextID1); bRet=MSRTGetMsgText(1,dwTextID1, if (bRet=TRUE) s
24、printf(szMsg,“%s“,tMeld.szText); printf(“rnThe Text of TextID %d is %s !rn“,dwTextID1,szMsg); if (mRT.dwMsgState=MSG_STATE_GO)/信息离去处理 dwMsgNum=mRT.dwMsgNr; if (dwMsgNum=GetTagDWord(TAG_MSG_NR) SetTagChar(TAG_MSG,“); /*code for dcount/ Meldungsdaten einlesen/ Prozesswerte lesen, falls gew?1nscht prin
25、tf(“Nr : %d, St: %x, %d-%d-%d %d:%d:%d.%d, Dur: %d, Cnt %d, Fl %drn“ , mRT.dwMsgNr, mRT.dwMsgState, mRT.stMsgTime.wDay, mRT.stMsgTime.wMonth, mRT.stMsgTime.wYear, mRT.stMsgTime.wHour, mRT.stMsgTime.wMinute, mRT.stMsgTime.wSecond, mRT.stMsgTime.wMilliseconds, mRT.dwTimeDiff, 10mRT.dwCounter, mRT.dwFl
26、ags ) ;SetTagChar(TAG_MSG,szMsg);return( TRUE ); 17、实现用户登陆日志(wincc 中用 c 脚本实现?) 用户登陆日志:(包括用户的登陆退出信息,以便查询在什么时间段是哪个用户在使用这个监控软件)i nclude “apdefap.h“int gscAction( void ) #pragma code(“kernel32.dll“) VOID GetLocalTime(LPSYSTEMTIME lpSystemTime); #pragma code()char* username; char buf128; static char preu
27、ser128; unsigned a,b,c,d,e,f; FILE* fp; SYSTEMTIME sysTime;/读取系统时间,并且复制给变量 a,b,c,d,e,f GetLocalTime(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) fputs(buf, fp); else