您的位置:控制工程论坛网论坛 » 教程与手册 » wincc的n个经典问题解答之一

dqfxm2003

dqfxm2003   |   当前状态:离线

总积分:3995  2024年可用积分:0

注册时间: 2005-10-21

最后登录时间: 2011-01-14

空间 发短消息加为好友

wincc的n个经典问题解答之一

dqfxm2003  发表于 2008/8/1 8:31:07      6061 查看 25 回复  [上一主题]  [下一主题]

手机阅读

1、问: 如何触发计算机扬声器的声音? 
  答: 编写如下C-Action:
  #pragma code("kernel32.dll");
  BOOL Beep(DWORD dwFreq,DWORD dwDuration);
  #pragma code();
  Beep(500,500);
1楼 0 0 回复
  • dqfxm2003

    dqfxm2003   |   当前状态:离线

    总积分:3995  2024年可用积分:0

    注册时间: 2005-10-21

    最后登录时间: 2011-01-14

    空间 发短消息加为好友

    dqfxm2003   发表于 2006/5/3 9:35:31

    答: 首先必须在画面中插入报警控件,可以用如下两种方式来确认信息:
      (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)
    2楼 回复本楼

    引用 dqfxm2003 2006/5/3 9:35:31 发表于2楼的内容

  • dqfxm2003

    dqfxm2003   |   当前状态:离线

    总积分:3995  2024年可用积分:0

    注册时间: 2005-10-21

    最后登录时间: 2011-01-14

    空间 发短消息加为好友

    dqfxm2003   发表于 2006/5/3 9:35:55

    答: 通过如下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);
    3楼 回复本楼

    引用 dqfxm2003 2006/5/3 9:35:55 发表于3楼的内容

  • dqfxm2003

    dqfxm2003   |   当前状态:离线

    总积分:3995  2024年可用积分:0

    注册时间: 2005-10-21

    最后登录时间: 2011-01-14

    空间 发短消息加为好友

    dqfxm2003   发表于 2006/5/3 9:36:23

    答: 通过调用Windows对话框实现。具体如下:
      #include"apdefap.h"
      void onClick(char*lpszPictureName,char*lpszObjectName,
      char*lpszPropertyName)
      {ProgramExcute("c:\\win98\\control.exe timedate.cpl");}
      其中执行的程序路径,需根据具体情况填写。
    4楼 回复本楼

    引用 dqfxm2003 2006/5/3 9:36:23 发表于4楼的内容

  • dqfxm2003

    dqfxm2003   |   当前状态:离线

    总积分:3995  2024年可用积分:0

    注册时间: 2005-10-21

    最后登录时间: 2011-01-14

    空间 发短消息加为好友

    dqfxm2003   发表于 2006/5/3 9:36:57

    答: 1、创建一个 SQL文件,此文件在ISQL中建立,文件内包含所要执行的SQL语句。Windows对话框实现。具体如下:
      2、在WinCC中用C Script 调用上述SQL文件,如下所示:
      #include"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);
      ProgramExcute(a);
      }
      下面是一个简单的SQL文件内容:
      select *from pde#hd#t#test;
      output to e:\\test2.txt FORMAT ascii
      注意:文件名及路径中不要带空格。
    5楼 回复本楼

    引用 dqfxm2003 2006/5/3 9:36:57 发表于5楼的内容

  • dqfxm2003

    dqfxm2003   |   当前状态:离线

    总积分:3995  2024年可用积分:0

    注册时间: 2005-10-21

    最后登录时间: 2011-01-14

    空间 发短消息加为好友

    dqfxm2003   发表于 2006/5/3 9:37:19

    答: 在"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中的"Properties of process tag"中的"archive tag"Tab下的Archive type选择Cycle-selective,在"Event"标签下的"StartEvent"内选择cyclicarchive函数。
    6楼 回复本楼

    引用 dqfxm2003 2006/5/3 9:37:19 发表于6楼的内容

  • dqfxm2003

    dqfxm2003   |   当前状态:离线

    总积分:3995  2024年可用积分:0

    注册时间: 2005-10-21

    最后登录时间: 2011-01-14

    空间 发短消息加为好友

    dqfxm2003   发表于 2006/5/3 9:38:06

    答: The following function shows how you can alternately set and reset a WinCC variable by mouse click.
      #include "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); 
      }
    7楼 回复本楼

    引用 dqfxm2003 2006/5/3 9:38:06 发表于7楼的内容

  • dqfxm2003

    dqfxm2003   |   当前状态:离线

    总积分:3995  2024年可用积分:0

    注册时间: 2005-10-21

    最后登录时间: 2011-01-14

    空间 发短消息加为好友

    dqfxm2003   发表于 2006/5/3 9:38:34

    答: 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.
    8楼 回复本楼

    引用 dqfxm2003 2006/5/3 9:38:34 发表于8楼的内容

  • dqfxm2003

    dqfxm2003   |   当前状态:离线

    总积分:3995  2024年可用积分:0

    注册时间: 2005-10-21

    最后登录时间: 2011-01-14

    空间 发短消息加为好友

    dqfxm2003   发表于 2006/5/3 9:39:09

    答: 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"
    9楼 回复本楼

    引用 dqfxm2003 2006/5/3 9:39:09 发表于9楼的内容

  • dqfxm2003

    dqfxm2003   |   当前状态:离线

    总积分:3995  2024年可用积分:0

    注册时间: 2005-10-21

    最后登录时间: 2011-01-14

    空间 发短消息加为好友

    dqfxm2003   发表于 2006/5/3 9:39:41

    通常要将所有的设备都显示在一张画面里是不可能的,所以将设备按照处理工艺的功能步骤分级在多张画面内,以一个污水处理厂为例分为电泳线、前处理线、生化线、加药线等,之间的切换使用按钮的鼠标动作来实现。这对于用WinCC现成的鼠标动作来实现是很简单的,但是不是要在每张图上都使用相同数量且位置排列顺序一致的按钮呢?(出于对操作的一致性考虑,不能让操作人员在不同的图上,不同的位置找想要操作的按钮)这个问题的解决我们使用WinCC的脚本编程,在按钮动作中调用它的内部函数来实现。首先,组态一幅背景画面,其中包括要显示的静态文本、OLE(例如,时钟)、所有的图形切换按钮及推出关机按钮。第二,在背景画面中插入智能对象(Smart Object)中的画面窗口(Picture  Window),并且使其的尺寸与其分级画面相同。第三,在相应的切换按钮的属性->事件->鼠标动作中编写如下C语言脚本代码:

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

            这样就能方便快捷地切换画面。
    10楼 回复本楼

    引用 dqfxm2003 2006/5/3 9:39:41 发表于10楼的内容

  • dqfxm2003

    dqfxm2003   |   当前状态:离线

    总积分:3995  2024年可用积分:0

    注册时间: 2005-10-21

    最后登录时间: 2011-01-14

    空间 发短消息加为好友

    dqfxm2003   发表于 2006/5/3 9:40:13

    11:必须始终显示的报警记录,用画面颜色闪烁来提示操作者有故障发生,可以用同样的C语言脚本(当然不是加在鼠标动作中)在背景画面的底部留下一条类似Windows状态栏的报警栏,当出现故障报警的时候在报警栏显示最近一条报警记录,操作人员可以利用按钮切换到主报警记录画面了解故障的完全信息。
    11楼 回复本楼

    引用 dqfxm2003 2006/5/3 9:40:13 发表于11楼的内容

总共 , 当前 /, 123【下一页】