电工之家_电工基础知识学习网站
当前位置:电工之家 > plc > 西门子plc > 正文

WinCC C语言脚本推荐

时间:2018-05-24 07:14 来源:电工之家

切换按钮
001  SetTagBit("TE_BOOL",!GetTagBit("TE_BOOL"));
002  BOOL A
     A=GetTagBit("TE_BOOL");
     if(A)   SetTagBit("TE_BOOL",0);
     Else   SetTagBit("TE_BOOL",1);
003  SetTagBit("TE_BOOL ",1-GetTagBit("TE_BOOL ")); 
  
I O 域处的格式化输入输出
在I/O域的输出值事件处的动作
    Float F_TAG;
    F_TAG =GetTagFloat("TE_FLOAT");
    return(F_TAG /100);

WINCC运行画面最小化
 HWND WinCCHwnd;
 WinCCHwnd=FindWindow("PDLRTisAliveAndWaitsForYou",NULL);
 CloseWindow(WinCCHwnd);

WINDOWS中提供的标准对话框
{  BOOL bool1;
HWND Hwnd;
int iRet;
Hwnd = FindWindow(NULL,"WinCC-运行系统 - ");
if (!Hwnd) Hwnd = FindWindow(NULL,"WinCC-运行系统 - ");
if (!Hwnd) printf("\r\nGetWinCC Handle Failed!");
iRet=MessageBox(Hwnd,"确认合闸","确认对话框",MB_YESNOCANCEL|MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_SYSTEMMODAL);
switch (iRet)
{
case IDYES: printf("user do YES\r\n");
SetTagBit("TE_QUEST",1);
break;
case IDNO: printf("user do NO\r\n");
SetTagBit("TE_QUEST",0);
break;
case IDCANCEL: printf("user do CANCEL\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",你把这段语句加到一个按钮的鼠标动作里,看点击按钮会不会两个按钮现实和隐藏。


登录登出对话框
#pragma code ("useadmin.dll")
#include "PWRT_api.h"
#pragma code()
PWRTLogin('c');
PWRTLogin 参数必须是 CHAR 字符。它指定了显示对话框的监视器。如果只使用一个监视器,那么保留默认参数“c”或者指定“1”。

#pragma code ("useadmin.dll")
#include "PWRT_api.h"
#pragma code()
PWRTLogout();

PWRTLogin 参数必须是 CHAR 字符。它指定了显示对话框的监视器。如果只使用一个监视器,那么保留默认参数“c”或者指定“1”。
WinCC如何实现鼠标OnMouseOVer事件
用WINDOWAPI函数GetCusorPos获取当前鼠标位置,用GetWindowRect函数获取窗口位置,两值相减得鼠标在WINCC frame上的相对位置。用全局脚本(设定为1s定时刷新),然后获取要OnMouseOver事件的物体的位置,并与鼠标位置相比较,如一致则触发自己 定义的动作。
#i nclude "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("\r\nError! 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:%d\r\n",pPos.x,pPos.y);
//printf("The Cusor Pos in Window is x:%d,y:%d\r\n",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:%d\r\n",lLeft2,lTop-lTop2);
over:
return 0;
}
退出WINCC监控时选择退出方式

 DMExitWinCCEx (DM_SDMODE_SYSTEM);或者使用动态向导
通过给变量ExitSystem赋不同的数值实现不同的方式
int a; www.dgzj.com
a=GetTagWord("ExitSystem"); //返回类型:WORD
switch(a)
{
case 1 :  MExitWinCCEx (DM_SDMODE_REBOOT);   break;
case 2 :   DMExitWinCCEx (DM_SDMODE_SYSTEM);   break;
case 4 : ExitWinCC();break; ////DMExitWinCCEx (DM_SDMODE_WINCC);       break;
case 8 : DMExitWinCCEx (DM_SDMODE_LOGOFF);    break;
}
如何实现用户登陆日志wincc中用c脚本实现?

#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, "用户:%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);
return 0;

用户登陆日志:(包括用户的登陆退出信息,以便查询在什么时间段是哪个用户在使用这个监控软件)


设置语言
英语SetLanguage(0x409);
法语SetLanguage(0x407);
德语SetLanguage(0x40C);

调用计算器
如果在C脚本中仅仅有一句ProgramExecute("CALC.exe")
此时不关计算器就切换画面,则计算器都在后台运行。所以在脚本中加入使计算器必须显示在WINDOW的激活层上。

HWND Hwnd;
BOOL bRet;
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\nSetWindowPos Error!");
}
}
}


修改密码
{
#pragma code("UseGen.dll")
#include "USEGENAP.H"
#pragma code()
LPCMN_ERROR err;
if (PWGENConnect("CC_ass_04-09-21_16:35:22",err) )
{
if (PWGENChangePassword(GetTagChar("user"),GetTagChar("oldpassword"),GetTagChar("password"),err))
{
MessageBox(NULL,"密码修改成功!","提示",MB_OK|MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_SYSTEMMODAL);
}
else
{
MessageBox(NULL,"密码修改失败!","提示",MB_OK|MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_SYSTEMMODAL);
}
}
else
{
MessageBox(NULL,"建立连接失败","提示",MB_OK|MB_ICONEXCLAMATION|MB_SETFOREGROUND|MB_SYSTEMMODAL);
}
PWGENDisconnect(err);
}

#pragma code( "user32.dll" );
BOOL SetForegroundWindow(HWND);
#pragma code();
HWND handle;
handle=FindWindow("WinCCExplorerFrameWndClass",NULL);
if (!SetForegroundWindow(handle));
printf("\r\n SetForeground fails");

看过《WinCC C语言脚本推荐》的人还看了以下文章
西门子PLC控制花样喷泉形式编程实例 西门子PLC控制花样喷泉形式编程实例
通过西门子PLC控制花样喷泉的5种形式,通过5个按键控制5种形式: 1号位,按下第一种1~8顺序喷出,逆序收起,间隔2秒,循环。 2号位,按下第二种单数先喷出,然后双数喷出,一起收起,间隔2秒,循环。 3号位,先1278喷,在3456喷,全收,再3456喷,1278喷,全收...
西门子300怎样进行模块化编程 西门子300怎样进行模块化编程
西门子模块化编程首先了解FB块、FC块和SFC块。FB块拥有自己的专属数据块存储数据,FC块不具备,SFC是系统功能块。系统功能块是西门子开发的各种通用功能的模块,如与西门子其他器件的通讯控制,PID控制等等,我们需要某种功能时直接调用相应SFC即可。当然我...
熟悉电气柜接线想学西门子PLC怎么入手 熟悉电气柜接线想学西门子PLC怎么入手
干了两年电气柜接线,那对自动控制的基本概念应该有了,前提是你接的是自动化控制系统的电气柜,而不是那种配电柜!!!了解了继电控制回路,那对你学习PLC会有很大帮助!!不知道你 的文化水平如何,欧系PLC和计算机联系比较紧密,所以,你要学习以下计算机...
西门子s7-200PLC系统怎么样?功能有哪些 西门子s7-200PLC系统怎么样?功能有哪些
西门子s7-200PLC系统怎么样?功能有哪些 西门子S7-200PLC可以满足各种设备自动化控制需求,此系统也属于紧凑型可编程序控制器。系统的硬件构架主要由系统CPU模块和丰富的扩展模块构成。s7-200PLC除基本控制功能外还有其独到之处,这也是它受欢迎的原因之一吧...
西门子PLC的电池能用多久 西门子PLC的电池能用多久
西门子PLC的电池能用多久 西门子的CPU型号选用不同以及采用的数据保持的方式不同,PLC的电池的使用时长也会不同。 PLC的CPU内置电容保持数据 PLC的CPU内置超级电容,在短时间断电为数据保持和实时时钟提供电源。断电后,对于PLC的CPU221、CPU222的内置超级电...