电工基础

电工基础知识_电工技术-电工最常见电路

WinCC C语言脚本推荐

时间:2018-08-04 09:45来源:未知 作者:admin 点击:
切换按钮 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域的输

切换按钮
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");

(责任编辑:admin)
织梦二维码生成器
------分隔线----------------------------