WinCC C語言腳本推薦
切換按鈕
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.gdzxks.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");
S7-200的特殊存儲器SM | |
1、 SMB0字節:(係統狀態位) SM0.0 PLC運行時這一位始終為l,是常0N繼電器。 SM0.l PLC首次掃描時為1一個掃描周期。用途之一是調用初始化使用。 SM0.2 若保持數據丟失,該位為1一個掃描周期。 SM0.3 開機進入RUN方式將ON一個掃描周期。 SM0.4 該位提供了一個... |
如何備份s7-300plc程序 | |
備份S7-300程序 1:打開Simatic manager, File>New雙擊打開; 2:點擊 Browse , 出現一個新窗口如下; 選擇一個目錄/創建一個新文件夾來保存備份。 3:接下來,進入option菜單,出現一個下拉列表,如下圖所示。 選擇PG/PC接口選項。 4:一個新的窗口將打... |
在西門子PLC中讀取或搜索Tag的過程 | |
1:打開Siemens Simatic Manager 2:搜索所需的PLC程序,然後按OK。 3:點擊S7程序,然後點擊符號如下圖所示。 4:將打開一個新窗口並按ok。 5:打開菜單Find and Replace 輸入所需查詢的tag。假設我們需要一個溫度變送器,所以輸入temp文本。 然後點擊Find... |
西門子plc程序暫停功能怎麼實現 | |
這個沒有做過數控係統開發的,根本不知道這裏麵的門道。注意,對於運動控製特別是有位置控製的話,暫停並不是將當前脈衝停止即可,大多數情況下必須有個減速暫停功能,否則會造成伺服報警或步進丟步。當然大多數PLC能實現此功能,點動情況實際上就是這樣操作... |
西門子PLC用少數IO接口連接更多按鈕的方法 | |
西門子PLC為例說明用少數IO接口連接更多按鈕的方法。 接線如圖一所示: 梯形圖如圖二所示: 在這個例子中使用了SB0到SB5共6個按鈕,占用6個輸入口。操作時,按下按鈕SB0,再分別按其它按鈕,可以得到5個按鈕信號;不按按鈕SB0,操作其它按鈕,又可以得到5個按鈕... |
- 西門子plc鎖存型延時通定時器指令
- 如何使用西門子s7-200模擬器去測試程序
- 西門子S7-200 PLC編程軟件操作圖解
- 西門子s7-200plc怎麼控製直流電機
- 西門子S7-1200的PLC來控製電磁閥的動作
- fbd編程常用功能塊
- 西門子STEP7軟件中加減乘除指令
- 西門子300編程中FB塊用到C或者T之後多次
- 西門子S7300模擬量I/O使用圖解
- 如何設置西門子EM222擴展模塊
- 西門子S7-200能控製多少個伺服
- 西門子S7200四則運算指令表詳解
- S7-200如何通過向導設定PID教程
- step7安裝提示重啟怎麼解決
- 西門子S7300用異或指令實現一鍵啟停
- 西門子PLC生產日期和生命周期含義說明
- 西門子300PLC與溫控表怎樣連接通訊
- WinCC C語言腳本推薦
- 博圖軟件支持所有西門子型號都能組態嗎
- 西門子PLC編程中的FB、FC、DB、OB是什麼