控制工程师论坛

PLC与PAC

WINCC 经验

whs1
whs1

2009-02-20

WINCC 经验 (1)

1、问: 如何触发计算机扬声器的声音?
  答: 编写如下C-Action:
  #pragma code("kernel32.dll");
  BOOL Beep(DWORD dwFreq,DWORD dwDuration);
  #pragma code();
  Beep(500,500);
  
  2、问: 如何通过C脚本来确定报警信息?
  答: 首先必须在画面中插入报警控件,可以用如下两种方式来确认信息:
  (1)、确认单条信息
  4版本和高于此版本的WinCC
  BOOL OnBtnSinglAckn(char*lpszPictureName,char*lpszObjectName)
  5版本和高于此版本的WinCC
  BOOL AXC_OnBtnSinglAckn(char*lpszPictureName,char*lpszObjectName)
  
  (2)、确认报警窗口所有可见的报警
  4版本和低于此版本的WinCC
  BOOL OnBtnVisibleAckn(char*lpszPictureName,char*lpszObjectName)
  
  5版本和高于此版本的WinCC
  BOOL AXC_OnBtnVisibleAckn(char*lpszPictureName,char*lpszObjectName)
  
  
  3、问: 如何在WinCC中读取系统时间?
  答: 通过如下C-Action:
  #pragma code("kernel32.dll");
  Void GetLocalTimes(SYSTEMTIME*lpst);
  #pragma code();
  SYSTEMTIME time;
  GetLocalTime(&time);
  SetTagWord("Varname",time.wYear);
  SetTagWord("Varname",time.wMonth);
  SetTagWord("Varname",time.wDayOfWeek);
  SetTagWord("Varname",time.wDay);
  SetTagWord("Varname",time.wHour);
  SetTagWord("Varname",time.wMinute);
  SetTagWord("Varname",time.wSecond);
  SetTagWord("Varname",time.wMilliseconds);
  
  4、问: 如何经Windows对话框设置日期时间?
  答: 通过调用Windows对话框实现。具体如下:
  #i nclude"apdefap.h"
  void onClick(char*lpszPictureName,char*lpszObjectName,
  char*lpszPropertyName)
  {ProgramExcute("c:\\win98\\control.exe timedate.cpl");}
  其中执行的程序路径,需根据具体情况填写。
  
  
  5、问: 如何在WinCC中调用SQL语言?
  答: 1、创建一个 SQL文件,此文件在ISQL中建立,文件内包含所要执行的SQL语句。Windows对话框实现。具体如下:
  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=DBAWD=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);
  ProgramExcute(a);
  }
  下面是一个简单的SQL文件内容:
  select *from pde#hd#t#test;
  output to e:\\test2.txt FORMAT ascii
  注意:文件名及路径中不要带空格。
  
  
  
  6、问: 如何整点启动归档?
  答: 在"Globle Script"下的Project function编写程序函数:cyclicarchive
  BOOL cyclicarchive()
  {
  #pragma code("kernel.dll");
  void GetLocalTime(SYSTEMTIME*lpsz);
  #pragma code();
  SYSTEMTIME time;
  INT t1;
  GetLocalTime(&time);
  t1=time.wMinute;
  If(t1==00)
  {
  SetTagBit("startarchive",1);
  Return(BOOL) (GetTagBit("startarchive"));
  }
  }
  在Tagloging中的"roperties of process tag"中的"archive tag"Tab下的Archive type选择Cycle-selective,在"Event"标签下的"StartEvent"内选择cyclicarchive函数。
  
  
  7、问: How can I set and reset a WinCC variable by mouse click with C script?
  答: The following function shows how you can alternately set and reset a WinCC variable by mouse click.
  #i nclude "apdefap.h"
  void OnClick(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
  {
  BOOL z;
  z=GetTagBit("MyBitVariable");
  if (z==0)
  SetTagBit("MyBitVariable",1);
  else
  SetTagBit("MyBitVariable",0);
  }
  
  
  8、问: How can I program a waiting function (Sleep) in WinCC?
  答: The following sample program shows how the "Sleep" is used.
  #pragma code("Kernel32.dll")
  void Sleep(int milliseconds);
  #pragma code()
  Sleep(1000); //time specification in milliseconds
  Warning:
  If you use Sleep(), processing the C script is interrupted for the time indicated. Requests for the interrupted function cannot be processed during this time.
  
  
  
  9、问: How can I output a SIMATIC timer minutes and seconds in WinCC?
  答: If you want to output a SIMATIC Timer in minutes and seconds in WinCC, then in WinCC please use a static text in the Graphics Designer to which you interface the following action:
  char* _main(char* lpszPictureName, char* lpszObjectName, char* lpszPropertyName)
  {
  char *p;
  DWORD hilf;
  int min, sec;
  p=SysMalloc(10);
  hilf=GetTagDWord("Time");
  min=hilf/60000;
  sec=hilf%60000/1000;
  sprintf(p,"%d min %d sec",min,sec);
  return p;
  }
  The "Time" variable linked to the I/O field must have the following properties:
  ?Data type "32-bit value without sign"
  ?Format adaptation "DwordToSimaticBCDTimer"
  ?Address: data area "Times" and addressing "Word"
10:快捷地切换画面
        通常要将所有的设备都显示在一张画面里是不可能的,所以将设备按照处理工艺的功能步骤分级在多张画面内,以一个污水处理厂为例分为电泳线、前处理线、生化线、加药线等,之间的切换使用按钮的鼠标动作来实现。这对于用WinCC现成的鼠标动作来实现是很简单的,但是不是要在每张图上都使用相同数量且位置排列顺序一致的按钮呢?(出于对操作的一致性考虑,不能让操作人员在不同的图上,不同的位置找想要操作的按钮)这个问题的解决我们使用WinCC的脚本编程,在按钮动作中调用它的内部函数来实现。首先,组态一幅背景画面,其中包括要显示的静态文本、OLE(例如,时钟)、所有的图形切换按钮及推出关机按钮。第二,在背景画面中插入智能对象(Smart Object)中的画面窗口(Picture  Window),并且使其的尺寸与其分级画面相同。第三,在相应的切换按钮的属性->事件->鼠标动作中编写如下C语言脚本代码:

        #i nclude\"apdefap.h\"
        void onClick(char *lpsz PictureName,
        char *lpsz ObjectName,char *lpsz PropertyName)
        {
        SetPictureName(\"背景画面\", \"画面窗口\", \"电泳处理线\");
        } //\"背景画面\"即为始终显示地静态背景的属性名,\"画面窗口\"即为在背景画//面中插入地画面窗口(Picture  Window)属性名,\"电泳处理线\"即为分级画面//的名称

        这样就能方便快捷地切

回帖

评论4

总共 , 当前 /
首页 | 登录 | 注册 | 返回顶部↑
手机版 | 电脑版
版权所有 Copyright(C) 2016 CE China