wincc的n个经典问题解答之三 点击:12998 | 回复:56



如火

    
  • 精华:172帖
  • 求助:0帖
  • 帖子:803帖 | 5249回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2005-12-27 17:23:00
楼主
部分非本人原创,整理在一起旨在给大家提供方便!

41:用C编程解决授权点数不够用的问题(acsun提供)

      当需要的工艺参数超过WinCC版本限制的Tag数目,可以用C语言编程实现多个工艺参数打包成一个Tag传送.例如某个配料称重系统有146个参数超过了WinCC的128个Tag的限制就可以用C语言编程决这一问题而不需要购买更高的授权.

基本思想就是把多个参数在下位机内存中连续排列然后在WinCC中定义一个Tag它的长度是多个参数之和取得这个Tag后编程将其分成多个参数

例如下位机有两个参数LTN44001和LTN44023都是16位整数分别存放在DD99.DW146和DD99.DW148
在WinCC中定义一个外部Tag命名为PackageTag类型为32位整数并联地址为DD99.DBD146再定义两个内部tag名为LTN44001和LTN44023在 Global Script全局脚本中C语言编程如下
Union
{
Long Dword
Int Word[2]
}union
Union.Dword=GetTagDword("PackageTag")
SetTagWord("LTN44001",Union.Word[0])
SetTagWord("LTN44023",Union.Word[0])
这样两个参数LTN44001和LTN44023就通过一个Tag传送上来了理论上只要下位机内存足够可以传送任意数量的参数而不受WinCC版本外部Tag数目的限制.

42:如何在WinCC里用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:\\SIEMENS\\Common\\SQLANY\\ISQL-q-b-c

UID=DBA;PWD=SQL;DBF=E:\\testsql\\testsqlRT.DB;

DBN=CC_testsql_99-12-03_12:48:26R;

READ

E:\\testsql\\test.sql";

printf("%s\r\n",a);

ProgramExecute(a);

}

下面是一个简单的SQL文件内容:

select * from pde#hd#t#test;

output to E:\\test2.txt FORMAT ascii
注意:文件名及路径中不要带空格。


43:如何整点启动归档? 
在"Global Script"下的Project functions编写函数:cyclicarchive 

BOOL cyclicarchive()

{

#pragma code ("kernel32.dll");

void GetLocalTime (SYSTEMTIME* lpst);

#pragma code();

SYSTEMTIME time;

Int t1;

GetLocalTime(&time);

t1=time.wMinute;

if(t1==00)

{

SetTagBit("startarchive",1);

return(BOOL)(GetTagBit("startarchive"));

}



在Tagloging中的"Properties of process tag"中的"Archive Tag"tab下的Archiving type选择Cycle-selective,在"Event"标签下的"Start Event"内选择cyclicarchive函数。 


44:如何在按键组合被禁用的情况下,从WinCC运行环境进入WinCC Control Center? 
最好是做一个按钮,该按钮需要用用户权限保护,在该钮中编写如下C-action: 

低于WinCC 5.0版本:

#pragma code ("user32.dll");

BOOL SetForegroundWindow(HWND);

#pragma code();

HWND handle;

handle=FindWindow("MCPFrameWndClass",NULL);

If (!SetForegroundWindow(handle))

Printf ("\r\n SetForeground fails");

WinCC 5.0版本以及更高的版本:

#pragma code("user32.dll");

BOOL SetForegroundWindow(HWND);

#pragma code();

HWND handle;

handle=FindWindow("WinCCExplorerFrameWndClass",NULL);

If (!SetForegroundWindow(handle))

Printf ("\r\n SetForeground fails"); 

45: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&



王琨

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 38回
  • 年度积分:0
  • 历史总积分:86
  • 注册:2006年11月05日
发表于:2006-11-05 08:07:00
21楼
谢谢,非常感谢!!

刘正刚

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 216回
  • 年度积分:0
  • 历史总积分:237
  • 注册:2006年11月10日
发表于:2006-11-12 15:04:00
22楼
永远支持激情如火。

刘正刚

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 216回
  • 年度积分:0
  • 历史总积分:237
  • 注册:2006年11月10日
发表于:2006-11-12 15:56:00
23楼
永远支持。

贾古庄

  • 精华:0帖
  • 求助:0帖
  • 帖子:21帖 | 202回
  • 年度积分:0
  • 历史总积分:204
  • 注册:2006年2月27日
发表于:2006-11-12 17:18:00
24楼
很好

yuhoucaihong

  • 精华:0帖
  • 求助:0帖
  • 帖子:13帖 | 546回
  • 年度积分:0
  • 历史总积分:5061
  • 注册:2003年5月28日
发表于:2006-11-12 17:48:00
25楼
支持

goldmike

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 26回
  • 年度积分:0
  • 历史总积分:26
  • 注册:2005年6月01日
发表于:2006-11-22 12:59:00
26楼
全部下载好了,谢谢楼主

吉玉木

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 71回
  • 年度积分:0
  • 历史总积分:112
  • 注册:2006年5月09日
发表于:2006-11-23 16:11:00
27楼
全部收藏好了,谢谢楼主

新学徒工

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 134回
  • 年度积分:0
  • 历史总积分:198
  • 注册:2004年2月16日
发表于:2006-12-08 17:01:00
28楼
先收下,慢慢的学吧.

supman

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 444回
  • 年度积分:0
  • 历史总积分:525
  • 注册:2006年11月16日
发表于:2006-12-09 10:41:00
29楼
学习中

XIAO菜

  • 精华:8帖
  • 求助:0帖
  • 帖子:75帖 | 1108回
  • 年度积分:0
  • 历史总积分:1610
  • 注册:2002年7月18日
发表于:2006-12-09 14:12:00
30楼
我也顶一下,向高手学习一下

gongkongedit

  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2007-01-09 09:31:00
31楼
i 服 乐 you !

a_i

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 28回
  • 年度积分:0
  • 历史总积分:58
  • 注册:2002年10月17日
发表于:2007-01-22 17:12:00
32楼
谢谢

唐山味儿不浓

  • 精华:7帖
  • 求助:0帖
  • 帖子:99帖 | 714回
  • 年度积分:0
  • 历史总积分:1899
  • 注册:2005年11月15日
发表于:2007-01-23 14:04:00
33楼
斑竹厉害

masz0223

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 122回
  • 年度积分:0
  • 历史总积分:291
  • 注册:2007年4月14日
发表于:2007-04-27 18:15:00
34楼
你是我偶像啊

云海感冒了

  • 精华:0帖
  • 求助:0帖
  • 帖子:13帖 | 587回
  • 年度积分:0
  • 历史总积分:708
  • 注册:2006年3月31日
发表于:2007-04-28 15:35:00
35楼
可以给我一份吗?yunhai2006@163.com 谢谢!

supman

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 444回
  • 年度积分:0
  • 历史总积分:525
  • 注册:2006年11月16日
发表于:2007-05-07 16:25:00
36楼
谢谢

aihua

  • 精华:0帖
  • 求助:1帖
  • 帖子:30帖 | 547回
  • 年度积分:10
  • 历史总积分:1583
  • 注册:2005年7月01日
发表于:2007-07-16 21:31:00
37楼
留着以后学习用了,太感谢了
楼主真厉害

Jack_军

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 73回
  • 年度积分:1288
  • 历史总积分:2066
  • 注册:2003年9月13日
发表于:2007-07-17 06:53:00
38楼
谢谢楼主

如火

  • 精华:172帖
  • 求助:0帖
  • 帖子:803帖 | 5249回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2007-08-22 16:17:00
39楼
51:使用 SIMATIC WinCC V6.0,可以通过工程师站(ES)更新运行中的操作站(OS)的 WinCC 工程。
在通过工程师站(ES)的更新过程中,操作站保持运行并且继续访问过程。
在 WinCC 工程中所作的改动可以事先在工程师站中进行测试和调整,这种测试会对过程产生影响。然后就可以将改动后的 WinCC 工程下载到操作站。

为了加载在线改变,需要操作站和工程师站拥有同样的工程。

在工程师站配置 WinCC 工程,并使用项目复制器将其复制到操作站。此时操作站可以连接到过程,并进入运行状态。
在工程师站,可以对工程作进一步的调整。为此在 WinCC 资源管理器中打开“加载在线修改”选项。该设置在“加载在线修改”编辑器的弹出菜单中:
( 17 KB )


图 1

现在可以在工程师站配置新画面、变量等,并测试其功能。可以在工程师站激活或者取消激活工程,无论如何这都不会影响操作站。
在完成配置后,请将工程下载到操作站。
在“加载在线修改”的弹出菜单中,选择“开始下载”:
( 17 KB )


图 2

“远程计算机”对话框打开。指定操作站计算机名称并单击“OK”确定。
( 5 KB )


图 3

现在,数据开始向操作站传送。在传送期间操作站继续监视过程。
一旦“OK”按钮再次激活,说明数据已经传送完毕。错误信息在对话框中显示。
( 8 KB )


图 4

现在,已经将工程师站调整后的项目下载到了操作站。请在操作站作一次画面切换以加载正在等待更新的画面。
若要在工程师站关闭“加载在线修改”,可以在“加载在线修改”编辑器的弹出菜单中选择“复位”。

czl123

  • 精华:0帖
  • 求助:0帖
  • 帖子:8帖 | 143回
  • 年度积分:0
  • 历史总积分:197
  • 注册:2005年10月28日
发表于:2007-08-24 20:35:00
40楼
谢谢了

热门招聘
相关主题

官方公众号

智造工程师