<strong id="dm055"></strong>

<optgroup id="dm055"></optgroup>
<optgroup id="dm055"></optgroup>

<acronym id="dm055"></acronym>
      <acronym id="dm055"><sup id="dm055"></sup></acronym>
    1. <legend id="dm055"></legend>

      電工之家_電工基礎知識學習網站
      當前位置:電工之家 > 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.a2115.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的內置超級電...
      亚洲资源