wincc全套脚本总结.docx
《wincc全套脚本总结.docx》由会员分享,可在线阅读,更多相关《wincc全套脚本总结.docx(102页珍藏版)》请在冰豆网上搜索。
wincc全套脚本总结
——————1、wincc全局脚本动作-——-———隐藏控件——————
#include"apdefap.h”
intgscAction(void)
{
//WINCC:
TAGNAME_SECTION_START
//syntax:
#defineTagNameInAction"DMTagName"
//nextTagID:
1
//WINCC:
TAGNAME_SECTION_END
intvalue;
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:
#definePicNameInAction"PictureName"
//nextPicID:
1
//WINCC:
PICNAME_SECTION_END
return0;
}
=====================================================
说明:
在触发器里选择变量IM_in
-————-2、wincc全局脚本动作--—-提示框—----—
c:
\iknow\docshare\data\cur_work\http:
\blog.sina。
com。
cn\s\articlelist_1252243325_2_1.html
#include"apdefap.h"
intgscAction(void)
{
//WINCC:
TAGNAME_SECTION_START
//syntax:
#defineTagNameInAction”DMTagName”
//nextTagID:
1
//WINCC:
TAGNAME_SECTION_END
intvalue;
value=GetTagBit(”IM_in");
if(value==1)
{
MessageBox(NULL,"请确认三厅相关门是否关好,或者请解锁。
”,"提示框”,MB_OK|MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_SYSTEMMODAL);
}
//WINCC:
PICNAME_SECTION_START
//syntax:
#definePicNameInAction"PictureName"
//nextPicID:
1
//WINCC:
PICNAME_SECTION_END
return0;
}
=============================
说明:
在触发器中选择变量触发。
—-————3、趋势面板—-———-————
char*str_a=NULL;
intHi;
intLo;
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”,”ValueAxisEndValue",Hi);
—————--—————-————————-—-
——————4、获取位号———-—-——
SetTagChar(”TrendTagName1”,”ProcessValueArchive\\PT111”);//Return—Type:
BOOL
SetTagSWord(”TrendHi”,200);
SetTagSWord(”TrendLo",0);
SetTagByte("Trenden",1);
-——-——————————---———————
—————-5、调用登陆函数————--
#pragmacode("useadmin。
dll”)
#include”PWRT_API。
H”
#pragmacode()
if(strcmp(GetTagChar(”@CurrentUser"),"")==0)
{
PWRTLogin(’c');
}
-——-——-——-——--—--——--—-————————--—-—-
-—————6、时间同步——————
voidSetCpuTime()
{
#pragmacode(”kernel32.dll");
voidGetLocalTime(SYSTEMTIME*lpst);
#pragmacode();
SYSTEMTIMEtime
BOOLret;
//printf("StartfunctionSetCpuTime\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、对话框调用——————
BOOLA;
BOOLB;
HWNDhwnd=NULL;
intRetMsg;
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);
}
elseB=0;
}
else
{
}
-——-—---———-—-———-—-———-----——————-—-——-—-
-————-8、声音报警——----
#pragmacode(”Winmm.dll”)
VOIDWINAPIPlaySoundA(char*pszSound,char*hmode,DWORDdwflag);
#pragmacode()
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
全局动作
inta;inta1;
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中用CScript调用上述SQL文件,如下所示:
#include";apdefap。
h"
voidOnLButtonDown(char*lpszPictureName,
char*lpszObjectName,
char*lpszPropertyName,
UINTnFlags,intx,inty)
{
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*frompde#hd#t#test;
outputtoe:
test2。
txtFORMATascii
注意:
文件名及路径中不要带空格。
———-——11、设置或重置一个变量——————
voidOnClick(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName)
{
BOOLz;
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)
{
staticintx=25,y,z;//x为半径的初始值为25,y为切换变量,z为搅拌机运行状态变量
z=GetTagBit("202搅拌机运行";);//取得PLC搅拌机的运行状态
if(z!
=0)
{
switch(y)
{
case0:
x=x—4;
if(x<;=0)
y=1;
break;
default:
x=x+4;
if(x>=25)
y=0;
break;
}
}
returnx;
}
--——-—13、WINCC——如何在程序中动态修改用户密码——————
1、点击“开始”——》“设置”-—》“控制面板”—-》“管理工具”—-》“数据源(ODBC)”,打开ODBC数据源管理器
2、在用户DSN页面的用户数据源中找到与当前项目所关联的一项,其名称为“CC_项目名_项目建立日期时间”,记下该项的名称
3、在脚本中加入以下代码:
#pragmacode(”UseGen。
dll")
#include"USEGENAP.H”
#pragmacode()
LPCMN_ERRORerr;//定义的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事件-————-
用WINDOWAPI函数GetCusorPos获取当前鼠标位置,用GetWindowRect函数获取窗口位置,两值相减得鼠标在WINCCframe上的相对位置。
用全局脚本(设定为1s定时刷新),然后获取要OnMouseOver事件的物体的位置,并与鼠标位置相比较,如一致则触发自己定义的动作.
#include"apdefap。
h”
intgscAction(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(”rnError!
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:
%drn",pPos.x,pPos。
y);
//printf(”TheCusorPosinWindowisx:
%d,y:
%drn",pPos。
x—lLeft2,pPos.y-lTop2);
lLeft=GetLeft("NewPdl0。
Pdl”,"Text1");//Return—Type:
longint
lTop=GetTop("NewPdl0.Pdl”,”Text1");//Return—Type:
longint
lWidth=GetWidth("NewPdl0.Pdl”,"Text1”);//Return—Type:
longint
lHeight=GetHeight(”NewPdl0.Pdl”,”Text1");//Return—Type:
longint
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(”TheText1Posisx:
%d,y:
%drn",lLeft2,lTop—lTop2);
over:
return0;
}
———--———-—————-——-———-———--—————————-——
-—-———15、如何在退出WINCC监控时直接关闭电脑-—-———
1.利用动态向导
2。
在脚本中加入DMExitWinCCEx(DM_SDMODE_SYSTEM);也可以
——————16、过WINCCAPI函数读出当前报警消息——————
1、使用GMsgFunction中读出当前报警信息的ID(dwMsgNr);
2、使用MSRTGetMsgCSData函数读出该报警信息ID对应文本库TEXTLIB中的文本ID(dwTextID1);
3、使用MSRTGetMsgText函数读出该文本ID的文本。
信息到达处理:
如果读取文本成功,则置文本变量MSG。
信息离去处理:
如果MsgNr与上一次相同,则复位MSG,如果不是,则继续保持信息.
具体函数说明请看ODK文档
BOOLGMsgFunction(char*pszMsgData)
{
#pragmacode("msrtcli.dll”)
#include"msrtapi.h"
#pragmacode();
MSG_TEXT_STRUCTtMeld;
MSG_CSDATA_STRUCTsM;
CMN_ERRORerr;
BOOLbRet;
DWORDdwTextID1;
DWORDdwMsgNum;
charszMsg[255];
#defineTAG_MSG"MSG"
MSG_RTDATA_STRUCTmRT;
memset(&mRT,0,sizeof(MSG_RTDATA_STRUCT));
if(pszMsgData!
=NULL)
{
printf(”Meldung:
%srn”,pszMsgData);
sscanf(pszMsgData,"%ld,%ld,%04d.%02d。
%02d,%02d:
%02d:
%02d:
%03d,%ld,%ld,%ld,%d,%d”,
&mRT。
dwMsgNr,//Meldungsnummer
&mRT.dwMsgState,//StatusMSG_STATE_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,//ZeitdauerderanstehendenMeldung
&mRT.dwCounter,//InternerMeldungsz?
hler
&mRT。
dwFlags,//Flags(intern)
&mRT.wPValueUsed,
&mRT。
wTextValueUsed);
//**************************************************************************************codefordcount
if(mRT.dwMsgState==MSG_STATE_COME)//信息到达处理
{
dwMsgNum=mRT.dwMsgNr;
printf(”rnTheAlarmMessageNois%d!
rn”,dwMsgNum);
bRet=MSRTGetMsgCSData(dwMsgNum,&sM,&err);
if(bRet==TRUE)
{
dwTextID1=sM.dwTextID[0];
printf(”rnTheTextIDofTheMessageNr%dis%d!
rn”,dwMsgNum,dwTextID1);
bRet=MSRTGetMsgText(1,dwTextID1,&tMeld,&err);
if(bRet==TRUE)
{
sprintf(szMsg,”%s",tMeld.szText);
printf(”rnTheTextofTextID%dis%s!
rn",dwTextID1,szMsg);
}
}
}
if(mRT.dwMsgState==MSG_STATE_GO)//信息离去处理
{
dwMsgNum=mRT。
dwMsgNr;
if(dwMsgNum==GetTagDWord(TAG_MSG_NR))SetTagChar(TAG_MSG,"”);
}
//**************************************************************************************codefordcount
//Meldungsdateneinlesen
//Prozesswertelesen,fallsgew?
?
?
?
?
?
?
§?
?
?
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.s