winccn个经典问题解答之三_第1页
winccn个经典问题解答之三_第2页
winccn个经典问题解答之三_第3页
winccn个经典问题解答之三_第4页
winccn个经典问题解答之三_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、如有帮助欢迎下载支持wincc的n个经典问题解答之三 作者: 激情如火,2005-12-27 17:23:00 发表于:Siemens自 好友 发送留言部分非本人原创,整理在一起旨在给大家提供方便!41:用C编程解决授权点数不够用的问题(acsun提供)当需要的工艺参数超过 WinC或本限制的Tag数目,可以用C语言编程实现多个工艺 146个参数超过了 WinCC勺128个Tag的限制就可以用C语言编程决这一问题而不需要购买更高的基本思想就是把多个参数在下位机内存中连续排列然后在WinCCt定义一个Tag它的长度是多个例如下位机有两个参数 LTN44001和LTN44023<B是16位整

2、数分别存放在 DD99.DW146口 DD99D 在 WinCC中定义一个外部 Tag命名为PackageTag类型为32位整数并联地址为 DD99.DBD146!定 在Global Script全局脚本中C语言编程如下 UnionLong DwordInt Word2unionUnion.Dword=GetTagDword("PackageTag")SetTagWord("LTN4400T',Union.Word0)SetTagWord("LTN44023”,Union.Word0)这样两个参数LTN4400侪口 LTN44023a通过一个Ta

3、g传送上来了理论上只要下位机内存足够可以传 限制.42:如何在 WinCCS用C语言调用SQL语言?1、创建一个SQL文件。此文件在ISQL中创建,文件内容是所希望执行的 SQL®句。2、在WinCC的C Script中编写程序调用此SQL±件,如以下程序所示:# i nclude "apdefap.h"void OnLButtonDown(char* lpszPictureName,char* lpszObjectName,char* lpszPropertyName,UINT nFlags, int x, int y)char*a="C:S

4、IEMENSCommonSQLANYISQL-q-b-cUID=DBA;PWD=SQL;DBF=E:testsqltestsqlRT.DB;DBN=CC_testsql_99-12-03_12:48:26R;READE:testsqltest.sql"printf("%srn",a);ProgramExecute(a);下面是一个简单的SQL文件内容:select * from pde#hd#t#test;output to E:test2.txt FORMATascii注意:文件名及路径中不要带空格。43:如何整点启动归档?在"GlobalScript

5、"下的 Project functions 编写函数:cyclicarchiveBOOL cyclicarchive()#pragma code ("kernel32.dll");void GetLocalTime (SYSTEMTIME* lpst);#pragma code();SYSTEMTIMEtime;Int t1;GetLocalTime(&time);t1=time.wMinute;if(t1=00)SetTagBit("startarchive",1);return(BOOL)(GetTagBit("start

6、archive");在 Tagloging 中的"Properties of process tag" 中的"Archive Tag”tab 下的 Archiving t "Start Event"内选择 cyclicarchive 函数。44:如何在按键组合被禁用的情况下,从 WinCCl行环境进入 WinCC Control Center ?最好是做一个按钮,该按钮需要用用户权限保护,在该钮中编写如下C-action :低于WinCC 5.0版本:#pragma code ("user32.dll");BOOL

7、 SetForegroundWindow(HWND);#pragma code();HWNDhandle;handle=FindWindow("MCPFrameWndClass",NULL);If (!SetForegroundWindow(handle)Printf ("rn SetForeground fails");WinCC 5.0版本以及更高的版本:#pragma code("user32.dll");BOOL SetForegroundWindow(HWND);#pragma code();HWNDhandle;handl

8、e=FindWindow("WinCCExplorerFrameWndClass",NULL);If (!SetForegroundWindow(handle)Printf ("rn SetForeground fails");45:WinCC如何实现鼠标 OnMouseOVe事件?用 WINDOWAPI数GetCusorPos获取当前鼠标位置,用 GetWindowRect函数获取窗口位置,两 脚本(设定为1s定时刷新),然后获取要 OnMouseOve事件的物体的位置,并与鼠标位置相比较# i nclude "apdefap.h"

9、int gscAction( void ) #pragma code("user32.dll");BOOL GetCusorPos(POINT lpPoint);获取鼠标的位置(绝对位置-对应屏幕分辨率)BOOL GetWindowRect(HWND hwnd,LPRECT lpRect); / 获取税体位置 #pragma code();POINT pPos;RECT rRec;HWNDhwnd;BOOL bRet,bRet2;long lLeft,lTop,lWidth,lHeight;long lX,lY;char szStr100;hwnd=FindWindow(N

10、ULL,"WinCC-Runtime - ");/ 如语言为中文应为"WinCC 运行系统-"if (hwnd=0) printf("rnError! 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;/ 鼠

11、标 位置/如果为非全屏模式,需将上述数值中的高height判断减去标题栏的宽度/printf("The Current Cusor Pos is x:%d,y:%drn",pPos.x,pPos.y); /printf("The Cusor Pos in Window is x:%d,y:%drn",pPos.x-lLeft2,pPos.y-lTop2 lLeft=GetLeft("NewPdl0.Pdl","Text1");/Return - Type :long intlTop=GetTop("New

12、Pdl0.Pdl","Text1");/Return - Type :long intlWidth=GetWidth("NewPdl0.Pdl","Text1");/Return - Type :long intlHeight=GetHeight("NewPdl0.Pdl","Text1");/Return - Type :long intif (lX>=lLeft)&&(lY>=lTop)&&(lX<=lLeft+lWidth)&am

13、p;&(lY<=lTop+lHeight)sprintf(szStr,"%d,%d”,lX,lY);SetText("NewPdl0.Pdl","Text1",szStr);/Return - Type :char* printf("TheText1 Pos is x:%d,y:%drn",lLeft2,lTop-lTop2);over:return 0; 46:如何实现ASP与 WinCC V6数据库sql server 2000的连接?WinCC V6用ODKa取DSNJg, 后生成网址字符串,再用 she

14、llExecuteA 函数打开网页/-#pragma code("shell32.dll") long ShellExecuteA(HWND,LPCTSTR,LPCTSTR,LPCTSTR,LPCTSTR,int);#pragma code()char dsnStr100;HWNDhwnd;sprintf(dsnStr," http:/dcount/test.asp?dsnStr=%s" ,GetDSN(1);/Return-Typrintf("rn%s",dsnStr); hwnd=FindWindow(NULL,"Win

15、CC - Runtime ");ShellExecuteA(hwnd,"open",dsnStr,NULL,"C:",SW_SHOWNORMAL);/-ASPTJ面需要注意的是连接字符串的形式与普通acess ODBCf太一样,而且需要用户名和密码由于WINCC寸装的sa用户的密码暂时不知道,所以必须用SQL Server EnterPrise Manager 可以了!否则会出现错误提示 Microsoft OLE DB Provider for SQL Server 错误'80040e4d' Login failed for

16、user 'sa'. 'dsnStr=request("dsnStr") set conn=server.createobject("adodb.connection") set rs=server.createobject("adodb.recordset") conn.Provider = "sqloledb" conn.open "Server=DCOUNTWINCC;Database=" & dsnStr & "UID=dcount;pw

17、d=;" rs.open "select * from test",conn,1,1 response.write rs.recordcount do while not rs.eof& rs("f2")& "-& rs("f3")response.write rs("f1")& "-rs.movenextloop rs.close conn.close47:如何在退出WINC媪控时直接关闭电脑?1 .利用动态向导2 .在脚本中力口入DMExitWinC

18、CEx (DM_SDMODE_SYSTEM)J 以48:如何通过WINCC API函数读出当前报警消息?1、使用GMsgFunction中读出当前报警信息的ID (dwMsgNr ;2、使用MSRTGetMsgCSDa函数读出该报警信息ID对应文本库TEXTLIB中的文本ID (.3、使用MSRTGetMsgTexfi数读出该文本ID的文本。信息到达处理:如果读取文本成功,则置文本变量MSG信息离去处理:如果MsgNr与上一次相同,则复位 MSG如果不是,则继续保持信息。具体函数说明请看ODKC档BOOL GMsgFunction( char* pszMsgData) #pragma code

19、("msrtcli.dll") # i nclude "msrtapi.h"#pragma code();MSG_TEXT_STRUCtMeld;MSG_CSDATA_STRUCT;CMN_ERROR err;BOOL bRet;DWORDdwTextID1;DWORDdwMsgNum;char szMsg255;#define TAG_MSG"MSG"MSG_RTDATA_STRUmRT;memset( &mRT, 0, sizeof( MSG_RTDATA_STRUCT );if( pszMsgData != NULL )

20、 printf( "Meldung : %s rn", pszMsgData );sscanf( pszMsgData, "%ld,%ld,%04d.%02d.%02d,%02d:%02d:%02d:%03d,%ld, %&mRT.dwMsgNr,&mRT.dwMsgState,/ Meldungsnummer/ Status MSG&mRT.stMsgTime.wYear, &mRT.stMsgTime.wMonth, &mRT.stMsgTime.wDay, &mRT.stMsgTime.wHour, &

21、mRT.stMsgTime.wMinute, &mRT.stMsgTime.wSecond, &mRT.stMsgTime.wMilliseconds, &mRT.dwTimeDiff, &mRT.dwCounter, &mRT.dwFlags, &mRT.wPValueUsed, &mRT.wTextValueUsed );/ Tag/ Monat/ Jahr/ Stunde/ Minute/ Sekunde/ Millisekunde/ Zeitdauer der/ Interner Meldunc/ Flags( intern/*i

22、f (mRT.dwMsgState=MSG_STATE_COMEM/、到达处理dwMsgNum=mRT.dwMsgNr;printf("rnTheAlarm Message No is %d !rn",dwMsgNum);bRet=MSRTGetMsgCSData(dwMsgNum,&sM,&err);if (bRet=TRUE)dwTextID1=sM.dwTextID0;printf("rnTheTextID of The MessageNr %d is%d !9bRet=MSRTGetMsgText(1,dwTextID1,&tMel

23、d,&err); if (bRet=TRUE)sprintf(szMsg,"%s",tMeld.szText);printf("rnThe Text of TextID %d if (mRT.dwMsgState=MSG_STATE_GOfT息离去处理dwMsgNum=mRT.dwMsgNr;if (dwMsgNum=GetTagDWord(TAG_MSG_NR)tTagChar(TAG_MSG,"");/*/ Meldungsdaten einlesen/ Prozesswerte lesen, fallsgew?§ ?1n

24、schtprintf("Nr :%d, St: %x, %d-%d-%d %d:%d:%d.%d, Dur: %d, Cnt %d, Fl 9mRT.dwMsgNr, mRT.dwMsgState, mRT.stMsgTime.wDay, mRT.stMsgTime.wMonth, mRT. mRT.stMsgTime.wHour, mRT.stMsgTime.wMinute, mRT.stMsgTime.wSecond, mRT.stMsg. mRT.dwCounter, mRT.dwFlags );SetTagChar(TAG_MSG,szMsg);return( TRUE );

25、49:如何实现用户登陆日志(wincc中用c脚本实现?)(柳树成林原创)用户登陆日志:(包括用户的登陆退出信息,以便查询在什么时间段是哪个用户在使用这个监控# i nclude "apdefap.h"int gscAction( void )#pragma code("kernel32.dll")VOID GetLocalTime(LPSYSTEMTIME lpSystemTime);#pragma code()char* username;char buf128;static char preuser128;unsigned a,b,c,d,e,f;FILE* fp;SYSTEMTIMEsysTime;读取系统时间,并且复制给变量a,b,c,d,e,fGetLocalTime(&sysTime);a=sysTime.wHour;b=sysTime.wMinute;c=sysTime.wSecond;f=s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论