文档库 最新最全的文档下载
当前位置:文档库 › wincc 全套脚本总结

wincc 全套脚本总结

wincc 全套脚本总结
wincc 全套脚本总结

——————1、wincc全局脚本动作-------隐藏控件——————

#include "apdefap.h"

int gscAction( void )

{

// WINCC:TAGNAME_SECTION_START

// syntax: #define TagNameInAction "DMTagName"

// next TagID : 1

// WINCC:TAGNAME_SECTION_END

int value;

value=GetTagBit("IM_in");//"IM_in"为触发的变量。

if(value==1)

{

SetVisible("lianxi.pdl","按钮8",TRUE);//lianxi.pdl为控制对象所在画面名,“按钮8”为对象名称

}

else

{

SetVisible("lianxi.pdl","按钮8",FALSE);//lianxi.pdl

}

// WINCC:PICNAME_SECTION_START

// syntax: #define PicNameInAction "PictureName"

// next PicID : 1

// WINCC:PICNAME_SECTION_END

return 0;

}

=====================================================

说明:在触发器里选择变量IM_in

——————2、wincc全局脚本动作----提示框——————

#include "apdefap.h"

int gscAction( void )

{

// WINCC:TAGNAME_SECTION_START

// syntax: #define TagNameInAction "DMTagName"

// next TagID : 1

// WINCC:TAGNAME_SECTION_END

int value;

value=GetTagBit("IM_in");

if(value==1)

{

MessageBox(NULL,"请确认三厅相关门是否关好,或者请解锁。","提示框",MB_OK|MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_SYSTEMMODAL);

}

// WINCC:PICNAME_SECTION_START

// syntax: #define PicNameInAction "PictureName"

// next PicID : 1

// WINCC:PICNAME_SECTION_END

return 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","TrendTagName",str_a);

SetPropWord(lpszPictureName,"qushi","ValueAxisBeginValue",Lo);

SetPropWord(lpszPictureName,"qushi","ValueAxisEndV alue",Hi); ————————————————————————

——————4、获取位号————————

SetTagChar("TrendTagName1","ProcessValueArchive\\PT111"); //Return-Type: BOOL SetTagSWord("TrendHi",200);

SetTagSWord("TrendLo",0);

SetTagByte("Trenden",1);

————————————————————————

——————5、调用登陆函数——————

#pragma code("useadmin.dll")

#include "PWRT_API.H"

#pragma code()

if (strcmp(GetTagChar("@CurrentUser"),"")==0)

{

PWRTLogin('c');

-------------------------------------

——————6、时间同步——————void SetCpuTime()

{

#pragma code("kernel32.dll");

void GetLocalTime(SYSTEMTIME *lpst);

#pragma code();

SYSTEMTIME time

BOOL ret;

//printf("Start function SetCpuTime\r\n");

GetLocalTime(&time);

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

hwnd=FindWindow(NULL,"WinCC-运行系统- ");

if (A==0)

RetMsg =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 code("Winmm.dll")

VOID WINAPI PlaySoundA(char* pszSound,char* hmode,DWORD dwflag);

#pragma code()

if(GetTagFloat("LIST555")>500)

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\Horn_Attention.wav",NULL,1);

if(GetTagFloat("LIST555")<300)

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\alsndmgr.wav",NULL,1);

-----------------------------------------------

——————9、水平移动——————

建立内部变量BOOL-Q,无符号32位-P

全局动作

int a;int a1;

a=GetTagBit("Q");a1=GetTagDWord("P");

if(a==1)

{

a1=a1+10;

}

if(a1>=100)

{

a1=0;

SetTagDWord("P",a1);

然后用一个按钮控制二进制变量Q,为启动信号。物体的X位置对应的是变量P,设置为模拟量。当P为1的时候对应的X位置。P为2的时候对应X的位置,以此类推,就可以做出物体移动画面了,要做全局脚本

-----------------------------------------------

——————10、WinCC中调用SQL语言——————

1、创建一个SQL文件,此文件在ISQL中建立,文件内包含所要执行的SQL语句。Windows 对话框实现。具体如下:

2、在WinCC中用C Script 调用上述SQL文件,如下所示:

#include"apdefap.h"

void OnLButtonDown(char* lpszPictureName,

char* lpszObjectName,

char* lpszPropertyName,

UINT nFlags,int x,int y)

{

char*a="c:siemenscommonSQLANYISQL-q-b-c

UID=DBA;PWD=SQL;DBF=E:testsqltestsqlRT.DB;

DBN=CC_testsql_99-12-03-12:48:26R;READ

E: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* lpszPictureName, char* lpszObjectName, char* lpszPropertyName) {

BOOL z;

z=GetTagBit("MyBitVariable");//获得变量值

if (z==0)

SetTagBit("MyBitVariable",1); //设置变量值

else

SetTagBit("MyBitVariable",0);

}

——————12、运行时图形产生动态旋转——————

#include "apdefap.h"

long _main(char* lpszPictureName, char* lpszObjectName, char*

lpszPropertyName)

{

static int x=25,y,z;//x为半径的初始值为25,y为切换变量,z为搅拌机运行状态变量

z=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_项目名_项目建立日期时间”,记下该项的名称

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("oldpassword"),GetTagChar ("password"),err)) //修改密码,user,oldpassword,password分别为存贮用户名,原密码,新密码的内部变量,类型为文本变量8位字符集

{

//密码修改成功后的操作,如给用户提示等

}

}

PWGENDisconnect(err); //断开与数据库的联接

4、编译运行程序

5、工作完成

6、与用户管理相关的函数定义存贮在APPLIB目录下的USEGENAP.H文件中,可根据上面示例自行完成添加用户,修改权限等功能。

——————14、WinCC如何实现鼠标OnMouseOVer事件——————

用WINDOW API函数GetCusorPos获取当前鼠标位置,用GetWindowRect函数获取窗口位置,两值相减得鼠标在WINCC frame上的相对位置。用全局脚本(设定为1s定时刷新),然后获取要OnMouseOver事件的物体的位置,并与鼠标位置相比较,如一致则触发自己定义的动作。

#include "apdefap.h"

int gscAction( void )

{

#pragma code("user32.dll");

BOOL GetCusorPos(POINT lpPoint); //获取鼠标的位置(绝对位置-对应屏幕分辨率)BOOL GetWindowRect(HWND hwnd,LPRECT lpRect); //获取窗体位置

#pragma code();

POINT pPos;

RECT rRec;

HWND hwnd;

BOOL bRet,bRet2;

long lLeft,lTop,lWidth,lHeight;

long lX,lY;

char szStr[100];

hwnd=FindWindow(NULL,"WinCC-Runtime - "); //如语言为中文应为"WinCC 运行系统-"

if (hwnd==0) {printf("rnError! WinCc Handle is %d",hwnd);goto over;}

bRet=GetCursorPos(&pPos);

if (bRet==0) goto over;

bRet2=GetWindowRect(hwnd,&rRec);

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);

lLeft=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 int

if ((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("The Text1 Pos is x:%d,y:%drn",lLeft2,lTop-lTop2);

over:

return 0;

} ———————————————————————————————————————

——————15、如何在退出WINCC监控时直接关闭电脑——————

1.利用动态向导

2.在脚本中加入DMExitWinCCEx (DM_SDMODE_SYSTEM);也可以

——————16、过WINCC API函数读出当前报警消息——————

1、使用GMsgFunction中读出当前报警信息的ID(dwMsgNr);

2、使用MSRTGetMsgCSData函数读出该报警信息ID对应文本库TEXTLIB中的文本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_ERROR err;

BOOL bRet;

DWORD dwTextID1;

DWORD dwMsgNum;

char szMsg[255];

#define TAG_MSG "MSG"

MSG_RTDATA_STRUCT mRT;

memset( &mRT, 0, sizeof( MSG_RTDA TA_STRUCT ) );

if( pszMsgData != NULL )

{

printf( "Meldung : %s rn", pszMsgData );

sscanf( pszMsgData, "%ld,%ld,%04d.%02d.%02d,%02d:%02d:%02d:%03d,%ld, %ld, %ld, %d,%d",

&mRT.dwMsgNr, // Meldungsnummer

&mRT.dwMsgState, // Status MSG_STA TE_COME, .._GO, .._QUIT, .._QUIT_SYSTEM

&mRT.stMsgTime.wYear, // Tag

&mRT.stMsgTime.wMonth, // Monat

&mRT.stMsgTime.wDay, // Jahr

&mRT.stMsgTime.wHour, // Stunde

&mRT.stMsgTime.wMinute, // Minute

&mRT.stMsgTime.wSecond, // Sekunde

&mRT.stMsgTime.wMilliseconds, // Millisekunde

&mRT.dwTimeDiff, // Zeitdauer der anstehenden Meldung

&mRT.dwCounter, // Interner Meldungsz?hler

&mRT.dwFlags, // Flags( intern )

&mRT.wPValueUsed,

&mRT.wTextValueUsed );

//***************************************************************************** *********code for dcount

if (mRT.dwMsgState==MSG_STATE_COME)//信息到达处理

{

dwMsgNum=mRT.dwMsgNr;

printf("rnThe Alarm Message No is %d !rn",dwMsgNum);

bRet=MSRTGetMsgCSData(dwMsgNum,&sM,&err);

if (bRet==TRUE)

{

dwTextID1=sM.dwTextID[0];

printf("rnThe TextID of The MessageNr %d is %d !rn",dwMsgNum,dwTextID1);

bRet=MSRTGetMsgText(1,dwTextID1,&tMeld,&err);

if (bRet==TRUE)

{

sprintf(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

}

printf("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,

mRT.dwCounter, mRT.dwFlags ) ;

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 buf[128];

static char preuser[128];

unsigned a,b,c,d,e,f;

FILE* fp;

SYSTEMTIME sysTime;

//读取系统时间,并且复制给变量a,b,c,d,e,f

GetLocalTime(&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, "用户:%st登陆时间是:t %d-%d-%d,%d-%d-%dn", username,a,b,c,d,e,f);

fputs(buf, fp);

}

else

{

if((strcmp(username, "") == 0)&&(strcmp(preuser, "") != 0)) //如果当前用户名称为空同时前一个用户名不空

{

sprintf(buf, "用户:%st退出时间是:t %d-%d-%d,%d-%d-%dn", preuser,a,b,c,d,e,f);

fputs(buf, fp);

}

else

{

sprintf(buf, "用户:%st退出时间是:t %d-%d-%d,%d-%d-%dn", preuser,a,b,c,d,e,f);

fputs(buf, fp);

sprintf(buf, "用户:%st登陆时间是:t %d-%d-%d,%d-%d-%dn", username,a,b,c,d,e,f);

fputs(buf, fp);

}

}

}

strcpy(preuser, username);

fclose(fp);

return 0;

}

——————18、全局脚本--声音报警——————#pragma code("Winmm.dll")

VOID WINAPI PlaySoundA(char* pszSound,char* hmode,DWORD dwflag);

#pragma code()

if (GetTagBit("XY")==0)

{

if(GetTagFloat("LIST555")>500) //热井液位

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\热井液位高1.wav",NULL,0);

}

if(GetTagFloat("LIST555")<300) //热井液位

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\热井液位低1.wav",NULL,0);

}

if(GetTagFloat("TE421A")>100 || GetTagFloat("TE421B")>100 || GetTagFloat("TE423A")>100 || GetTagFloat("TE423B")>100 || GetTagFloat("TE425")>100 || GetTagFloat("TE427")>100 || GetTagFloat("TE442")>100) //轴瓦温度

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\轴瓦温度高1.wav",NULL,0);

}

if(GetTagFloat("TIE485")>45) //冷油器出口油温

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\冷油器出口油温高.wav",NULL,0);

}

if(GetTagFloat("PT091")<0.5) //进汽压力

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\蒸汽压力低.wav",NULL,0);

}

if(GetTagFloat("PT109")>40) //真空低{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\排汽压力高.wav",NULL,0);

}

if(GetTagFloat("PT131")<0.13) //润滑油压力低

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\润滑油压力低1.wav",NULL,0);

}

if(GetTagFloat("PDT213")>0.05 || GetTagFloat("PDT215")>0.05 || GetTagBit("PDS071")==0 || GetTagBit("PDS073")==0) //滤油器差压

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\滤油器差压高.wav",NULL,0);

}

if(GetTagFloat("PT121")<0.65) //主油泵出口压力

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\主油泵出口压力低.wav",NULL,0);

}

if(GetTagFloat("LIST551")<-190) //油箱油位

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\油箱油位低.wav",NULL,0);

}

if(GetTagFloat("VE735A")>52 | GetTagFloat("VE737A")>52 | GetTagFloat("VE745A")>52 || GetTagBit("XE202")==1 || GetTagBit("XE204")==1 || GetTagBit("XE206")==1) //振动大

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\轴瓦振动高.wav",NULL,0);

}

if(GetTagFloat("ZE769")>0.4 || GetTagFloat("ZE769")<-0.4 || GetTagBit("ZE208")==1) //汽机转子轴向位移{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\轴相位移高.wav",NULL,0);

}

if(GetTagFloat("ZDE785")>3 || GetTagFloat("ZDE785")<-2 || GetTagBit("VE209")==1) //汽机转子胀差

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\胀差高.wav",NULL,0);

}

if(GetTagFloat("AI_0094")>3240) //转速{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\汽轮机转速高.wav",NULL,0);

}

if(GetTagBit("DI_0175")==1 || GetTagBit("DI_0180")==1) //保护跳闸

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\发电机保护跳闸.wav",NULL,0);

}

if(GetTagBit("DI_0177")==1 || GetTagBit("DI_0181")==1 ) //定子转子一点接地

{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\发电机转子接地.wav",NULL,0);

}

if(GetTagBit("DI_0176")==1) //过负荷{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\发电机过负荷.wav",NULL,0);

}

if(GetTagBit("DI_0182")==1) //失磁{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\发电机失磁.wav",NULL,0);

}

if(GetTagBit("SOE_15")==1) //ETS动作{

PlaySoundA("D:\\DCSDATA\\CG_wincc\\Horn\\ETS动作.wav",NULL,0);

}

}

----------------------------------------------------------------------------------------------

——————19、闪烁边框图片的脚本——————

Flash - 简短描述

使用Flash组中的函数可以修改或调用各种闪烁属性。

1.long int GetBackFlashColorOff(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName)函数,指定取消激活状态的闪烁背景色

读出闪烁颜色的实例

{

long int flashcol_on;

//获得背景闪烁颜色

Flash col_on = GetBackFlashColorOn(lpszPictureName,"Group 1");

//自定义代码

//在那里用户可以使用返回值做某事

}

GetBackFlashColorOn函数参数:

“lpszPictureName”是在其中组态该对象的画面的名称。

“Group 1”是该对象的名称。

1). 读出该对象的开状态的当前背景闪烁颜色以及flashcol_on中的缓冲区。

2). 执行处理返回值的自定义代码。

2. long int GetBackFlashColorOn(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName)函数,指定激活状态的背景闪烁颜色。

读出闪烁颜色的实例

{

long int flashcol_on;

//获得背景闪烁颜色

Flash col_on = GetBackFlashColorOn(lpszPictureName,"Group 1");

//自定义代码

//在那里用户可以使用返回值做某事

}

GetBackFlashColorOn函数参数:

“lpszPictureName”是在其中组态该对象的画面的名称。

“Group 1”是该对象的名称。

1). 读出该对象的开状态的当前背景闪烁颜色以及flashcol_on中的缓冲区。

2). 执行处理返回值的自定义代码。

3. long int GetBorderFlashColorOff(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName)函数,指定取消激活状态的边框或线闪烁颜色。

读出闪烁颜色的实例

{

long int flashcol_on;

//获得背景闪烁颜色

flashcol_on = GetBackFlashColorOn(lpszPictureName,"Group 1");

//自定义代码

//在那里用户可以使用返回值做某事

}

GetBackFlashColorOn函数参数:

“lpszPictureName”是在其中组态该对象的画面的名称。

“Group 1”是该对象的名称。

4. long int GetBorderFlashColorOn(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName)函数,指定激活状态的边框或线闪烁颜色。

读出闪烁颜色的实例

{

long int flashcol_on;

//获得背景闪烁颜色

flashcol_on = GetBackFlashColorOn(lpszPictureName,"Group 1");

//自定义代码

//在那里用户可以使用返回值做某事

}

GetBackFlashColorOn函数参数:

“lpszPictureName”是在其中组态该对象的画面的名称。

“Group 1”是该对象的名称。

5. BOOL GetFlashBackColor(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName)函数,指定是否激活背景闪烁。

读出“闪烁背景激活”属性的实例

{

BOOL bflash_col;

//了解闪烁是开还是关bflash

_col = GetFlashBackColor(lpszPictureName,"Group 1");

if(bflash_col)

{

// 自定义代码

// 闪烁是否被激活

}

else

{

// 自定义代码

// 闪烁是否被取消激活

}

}

GetFlashBackColor函数参数:

“lpszPictureName”是在其中组态该对象的画面的名称。

“Group 1”是该对象的名称。

1). 读出背景色闪烁是否被激活以及bflash_col中的缓冲区。

2). 根据该函数的返回值执行自定义代码。

——————20、I/0脚本——————

使用i_o组中的函数可以修改或调用影响输入和输出值的各种属性。

1.char* GetAssignments(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName)函数,对于列表,分配文本给数值范围

2.BOOL GetAssumeOnExit(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName)函数,使用I/O域时,它指定退出该域时是否应用输入的数值。

3.BOOL GetAssumeOnFull(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName)函数,使用I/O域时,它指定完成输入时是否应用输入的数值。

4. long int GetBitNumber(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName)函数,使用列表类型“位”时,它指定输出值中相关的位。

读出布尔型属性的实例

{

BOOL bHiddenInput;

//获得隐藏输入的状态bHiddenInput

= GetHiddenInput(lpszPictureName,"IO Field 1");

if(bHiddenInput)

{ // 自定义代码// 隐藏输入是否被激活

}

else

{

// 自定义代码// 隐藏输入是否被取消激活

}

}

GetHiddenInput函数参数:

“lpszPictureName”是在其中组态该对象的画面的名称。

“IO Field1”是该对象的名称。

1). 读出文本是否是粗体字以及bHiddenInput中的缓冲区。

2). 根据该函数的返回值执行自定义代码。

5. BOOL GetClearOnError(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName)函数,使用I/O域时,它指定错误输入后是否激活删除内容。

6. long int GetDataFormat(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName)函数,对于I/O域,它指定域内容的数据类型。

读出布尔型属性的实例

{

BOOL bHiddenInput;

//获得隐藏输入的状态bHiddenInput

= GetHiddenInput(lpszPictureName,"IO Field 1");

if(bHiddenInput)

{

// 自定义代码// 隐藏输入是否被激活

}

else

{

// 自定义代码// 隐藏输入是否被取消激活

}

}

——————21tag脚本——————

使用来自Tag组的函数可以设置或调用变量。

1. BOOL GetTagBitStateWait(Tag Tag_Name, PDWORD lp_dwstate)函数,

建立数据类型“二进制变量”的过程变量的数值。直接从PLC读取该数值。也返回变量的状态。

读出二进制类型变量的实例

{

DWORD dwstate;

BOOL bValue;

dwstate = 0xFFFFFFFF;

//获得该变量值//dwstate是变量状态bValue

= GetTagBitStateWait("gs_tag_bit",&dwstate);//创建包含该变量值的字符串

if (bValue)

{

// 自定义代码// 该变量的数值是否是true..

}

else

{

// 自定义代码// 该变量的数值是否是false

}

}

GetTagBitStateWait函数参数:

“gs_tag_bit”是该变量的名称。

“&dwstate”是应在其中存储变量状态的变量地址。

1). 读出该变量值以及bstate中的缓冲区。该函数将变量状态存储在dwstate中。

2). 根据该函数的返回值执行自定义代码。

——————22、Wincc项目脚本——————

使用来自WinCC组的函数可以在运行系统中定义各种设置。

使用System子组中的函数可以操作WinCC运行系统。

1. BOOL DeactivateRTProject()函数,取消激活该项目。

取消激活WinCC运行系统的实例

{

//取消激活运行系统

DeactivateRTProject ();

}

该函数取消激活WinCC运行系统。

2.BOOL ExitWinCC()函数,终止WinCC

3.退出WinCC的实例

{

//退出wincc

ExitWinCC ();

}该函数终止WinCC。

WinCC组包含影响整个WinCC系统的函数。

1. BOOL GetHWDiag(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName, LPCTSTR lpProperties)函数

运行时该函数可实现诊断的直接启动,由事件触发。必须在对象上组态、运用该事件。

如果该事件发生,硬件诊断功能从关联PLC的STEP7被启动。

为了使用该功能,必须满足下列条件:

? WinCC项目,带有从其进行访问的画面,而且STEP7项目必须在同一台计算机上。

? 必须将WinCC项目存储为STEP7项目(STEP7 Projekt\wincproj\WinCC Projekt)的子目录。

? 已将S7变量映射到WinCC。

2. BOOL GetHWDiagLevel(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName, LPCTSTR lpProperties, DWORD dwLevel)函数

根据在dwLevel下面指定的用户管理员功能号为激活的用户执行用户配置文件级测试。

之后,运行时诊断被直接启动并由事件触发,须在对象上组态该事件。

如果该事件发生,硬件诊断功能从关联PLC的STEP7被启动。

为了使用该功能,必须满足下列条件:

? 在WinCC中激活的用户必须有必要的用户配置文件级。

? WinCC项目,带有从其进行访问的画面,而且STEP7项目必须在同一台计算机上。

? 必须将WinCC项目存储为STEP7项目(STEP7 Projekt\wincproj\WinCC Projekt)的子目录.

? 已将S7变量映射到WinCC。

3. BOOL GetKopFupAwl(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName, LPCTSTR lpProperties)函数

该函数执行WinCC Step7编辑器“KFA”的网络激活。

执行该函数,完成两项子任务:

? 建立从WinCC访问网络所需要的数据。

? 将该数据传送到Step 7并使用AUTAPI定位Step 7程序中操作数的利用点。

4. BOOL GetKopFupAwlLevel(LPCTSTR lpszPictureName, LPCTSTR lpszObjectName,LPCTSTR lpProperties, DWORD dwLevel)函数

根据在dwLevel下面指定的用户管理员功能号为激活的用户执行用户配置文件级测试,然后访问Step 7编辑器“KFA”。

作为三项子任务执行该函数:

? 建立从WinCC进行网络访问所需要的数据。

? 在WinCC中为激活的用户执行用户配置文件级测试。

? 将该数据传送到Step 7并使用AUTAPI定位Step 7程序中操作数的利用点。

5. void OnDeactivateExecute()函数

终止WinCC时调用该函数。

由于它是标准函数,可以插入指令,然后执行它们。

6. void OnErrorExecute(CCAPErrorExecute ErrorExecute)函数

执行动作或函数而发生错误时由系统调用OnErrorExecute。

此函数能够确定出错的准确原因。

由系统调用该函数,并且不要求附加的调用命令。

由于包括作为标准函数的此函数,可以改变输出的类型。

7. void OnTime(CCAPTime time)函数

OnTime只能由系统调用。该函数给出所有动作的运行时间或确定哪个动作的运行时间超出了指定时间。通过APDIAG可以激活和取消激活时间测量。

由于此函数是一个标准函数,所以可以通过修改函数代码来改变输出的类型。

结构定义CCAPTime

typedef struct {

DWORD dwCurrentThreadID; 当前线程的线程ID

DWORD dwCode; 代码

BOOL bCycle; 周期/非周期

char* szApplicationName;应用程序的名称

char* szFunctionName; 函数的名称

LPVOID lpParam; 指向动作堆栈的指针

DWORD dwParamSize; 动作堆栈的大小

double dblTime;

DWORD dwFlags; 标记

} CCAPTime;

组成部分

dwCode

dwCode结构元素提供OnTime调用信息:

dwCode = 113 用每个动作的时间调用

dwCode = 114 用一个动作的超时调用

dwFlags

dwFlags结构元素提供输出类型的信息:

dwFlags = TRUE 结果被输出到文件中。

dwFlags = FALSE 结果被输出到诊断窗口中

——————23、Alarm脚本——————

Alarm组包含控制WinCC报警控件的函数。标准函数可用于工具栏中的每一个按钮。这些函数可用来创建自定义工具栏,例如选择画面,或者定义控件上的设置。

1.void AcknowledgeMessage(DWORD MsgNr)函数,确认消息系统中带编号的消息,该编号被传递为参数。

使用标准函数操作WinCC报警控件的实例

{//确认选择的报警记录消息

AcknowledgeMessage(GetTagWord("U08i_MsgNr"));

}

指定待确认的消息号。在本例中是从变量读取的。

2.BOOL AXC_OnBtnArcLong(char* lpszPictureName, char* pszMsgWin)函数,在消息窗口中该函数表示消息存储在长期归档中。

使用标准函数操作WinCC报警控件的实例

{// 跳转到WinCC报警控件中的第一条消息

AXC_OnBtnMsgFirst("gs_alarm_00","Control1");

}

AXC_OnBtnMsgFirst函数参数:

“gs_alarm_00”是在其中组态WinCC报警控件的画面的名称。

Control 1是WinCC报警控件的对象名。

3.BOOL AXC_OnBtnArcShort(char* lpszPictureName, char* pszMsgWin)函数,在消息窗口中该函数表示消息存储在短期归档中。

使用标准函数操作WinCC报警控件的实例

{// 跳转到WinCC报警控件中的第一条消息

AXC_OnBtnMsgFirst("gs_alarm_00","Control1");

}

AXC_OnBtnMsgFirst函数参数:

“gs_alarm_00”是在其中组态WinCC报警控件的画面的名称。

Control 1是WinCC报警控件的对象名。

4.BOOL AXC_OnBtnComment(char* lpszPictureName, char* pszMsgWin)函数

外部消息窗口操作,该函数显示先前所选消息的注释。

使用标准函数操作WinCC报警控件的实例

{// 跳转到WinCC报警控件中的第一条消息

AXC_OnBtnMsgFirst("gs_alarm_00","Control1");

}

AXC_OnBtnMsgFirst函数参数:

“gs_alarm_00”是在其中组态WinCC报警控件的画面的名称。

Control 1是WinCC报警控件的对象名。

5.BOOL AXC_OnBtnEmergAckn(char* lpszPictureName, char* pszMsgWin)函数,外部消息窗口操作,此函数打开确认对话框(紧急确认/复位)。

使用标准函数操作WinCC报警控件的实例

{// 跳转到WinCC报警控件中的第一条消息

AXC_OnBtnMsgFirst("gs_alarm_00","Control1");

}

AXC_OnBtnMsgFirst函数参数:

“gs_alarm_00”是在其中组态WinCC报警控件的画面的名称。

相关文档