您的位置:控制工程论坛网论坛 » 自动化软件 » wincc的n个经典问题解答之一

马军成

马军成   |   当前状态:在线

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

注册时间: 2006-12-01

最后登录时间: 2022-06-28

空间 发短消息加为好友

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

马军成  发表于 2007/8/7 22:02:34    精华  4526 查看 9 回复  [上一主题]  [下一主题]

手机阅读

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对话框实现。具体如下:
  #include"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文件,如下所示:
  #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
  注意:文件名及路径中不要带空格。
  
  
  
  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中的"Properties 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.
  #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);
  }
  
  
  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语言脚本代码:

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

        这样就能方便快捷地切换画面。

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

12:单个部件的组态

        WinCC在其内部的图库里集成很多的图形对象,如水箱、电机、阀门等等,对于污水处理用的最多的是水池,搅拌机等等。为了使组态画面贴近实际,能够更好的反应现场工况,图库里的元素并不能满足要求。我们可以利用WinCC的画图工具自己绘制适应实际的图形元素,并且使用C脚本使其产生动画效果。

        对于调节池,反应池等可以用矩形来表示,以图形的填充高度来示意其液位的高度。这里要注意的是一些数值地转化,由于一些仪表例如E+H的超声波液位计,是以4~20毫安的电流信号进入PLC,对于表的参数设定好以后4毫安就对应相应池子的液位最低点,而20毫安对应于池子的液位最高点。所以在显示数字高度的时候要将PLC相对4、20毫安的数值转化为实际池子的高度范围例如,0.5~5.5米。但是对于图形填充的时候是按照百分数来表示的所以还要将PLC数值转化为0~100%的度量范围。
       
        搅拌机的组态可以使用C脚本使其产生动画,在其运行时产生视觉上的旋转。实际上搅拌机的图形是用两个部分椭圆组成的,在椭圆的属性->几何->半径中加入代码如下:

        #include \"apdefap.h\"
        long _main(char* lpszPictureName, char* lpszObjectName, char* 
      lpszPropertyName)
        {
        static int x=25,y,z;//x为半径的初始值为25,y为切换变量,z为搅拌机运行状态变量
        z=GetTagBit(\"202搅拌机运行\"); //取得PLC搅拌机的运行状态
        if(z!=0)
        {
        switch(y)
        {
        case 0:
        x=x-4;
        if(x<=0)
        y=1;
        break;
        default :
        x=x+4;
        if(x>=25)
        y=0;
        break;
        }
        }
        return x;
        }

13:语音报警的组态

     在工业现场安全是极其重要的,无论从那个角度讲我们应该利用一切手段减少故障的发生。在故障已经发生的时候,应该在第一时间以多种方式通知操作人员有故障发生。现代微处理计算机的处理速度可以完全胜任对于图形,语音地同时处理。所以我们可以利用计算机的声卡和音箱在有故障发生的时候产生语言报警,但是问题是WinCC本身并不能产生语音的功能,而且其内部的上千个函数也没有提供处理声音的函数。解决这个问题的方法归功于微软开发的WinCC与操作系统地完美结合,因为在WinCC中可以直接调用Windows的API函数。实现的具体C脚本代码如下:

        long _main(char* lpszPictureName, char* lpszObjectName, char* 
      lpszPropertyName)
        {
        #pragma code(\"Winmm.dll\")
        void WINAPI PlaySoundA(char *pszSound,char *hmode,DWORD dwflay);
        #pragma code()
        if(GetTagBit(\"112排泥备泵故障\"))
        PlaySoundA(\"d:\\\\\\\\winnt\\\\\\\\media\\\\\\\\Mircosoft sound.wav\",NULL,8);
        return 1020; 
        }

    有一个值得主意的问题是此段代码的加入点,通过反复多次的实践得出结论,即这个点必须加在始终显示于屏幕上的任何图形元素的属性中,这样才能达到语言报警的预期效果。 
 
13:06:00
    14:当为WinCC指定PC名时应注意什么?

解答:

计算机名不能包含特殊字符如空格、退格和下划线,并前13个字符必须是唯一的。
由于操作系统的原因,名字的长度不能超过15个字符。
因此推荐只使用a to z, A to Z, 0 to 9这些字符。必须以子母开头。

从SIMATIC WinCC V6.0起,有如下限制:
计算机名可包含下划线。然而,当使用DNS主机名时,不能使用下划线。

15:和plc用S7通讯为什么产生连接错误代码:D801? 

解答:

    这个错误代码表示WinCC变量地址错误,检查每个变量的地址和通讯连接是否正确,如果变量的地址不属于控制器的地址范围,则会报这个错误代码。 

16:和plc用S7通讯怎样清除错误代码8304? 

解答:

WinCC运行时的画面不再更新,WinCC的日志文件中有错误代码8304,这个错误码表明WinCC和S7连接出现问题。 
解决方法:
停止AS站的循环读服务,在"WinCC Explorer > 变量管理 > SIMATIC S7 PROTOCOL SUITE"
中。右键单击出现问题的S7连接,选择"系统参数",清除复选框“周期管理>通过PLC”的选择。

17:在动态值域对话框中怎样才能按逻辑连接两个因变量到一个结果? 

解答:
由于在WinCC动态值域对话框中的布尔数学体系运算符,您可以根据C脚本惯例运用这些符号。
下面是符号及其意思的概括: 
与 位比较 & 
与 表达式比较 && 
或 位比较 | 
或 表达式比较 || 
非   ! 

通过Object > Properties > Dynamic进入WinCC动态值域对话框 ,> > 并右击"Dynamic Value Ranges dialog" 按照需要输入表达式即可。

18:WinCC图形编辑器中是否存在通过鼠标点击达到增加/减少变量值的对象? 

解答: 
可以使用OCX“SpinButton”实现这个功能。下面描述了如何合并和联系这个对象。 

在WinCC图形编辑器中,插入一个“Control”类型的小对象。在打开的窗口中选择进入Microsoft Forms 2.0 SpinButton并以OK来确认。

右击打开对象“SpinButton”的属性。在控制属性中使用您想要的变量来连接“Value”属性。
但要注意:
使用第三方的ActiveX控件会导致错误(例如内存丢失,性能降低,系统阻塞)。" 软件应用者应该对由于使用第三方ActiveX控件而造成的任何问题负责。

ActiveX控件事件连接C脚本
如果连接C脚本到ActiveX控件事件,那么应该确认这个事件名至少5个字符长。如果这个事件名少于5个字符长,那么C脚本不被执行。

19:重新启动后,不使用登录窗口如何以一个缺省用户的身份自动登录?怎样确保运行期间有个缺省用户始终处于登入状态?即使另外一个用户已经预先退出。 

解答:
重新启动以及在运行期间,您希望HMI系统达到最小的实用性而不使用登录窗口。然而,对于高级操作,登录功能应当保留。此外,如果没有用户 登录,则有一个缺省的用户自动登录。缺省用户的权限可以在用户管理器中根据需要设定。 

可使用下面的C脚本执行此项功能,请按照下列步骤进行: 

将附件中的函数“Silentlogin.pas”复制到项目中的“PAS”子文件夹中。  
在项目中选择Global Script > C Editor > Actions > Global Actions并打开全局动作(Global Action)“Silentlogin.pas”。 
在“PWRTSilentLogin (“Login”,“Password”);”一行中,用缺省的用户名替换用户“Login”,用 缺省用户的口令代替“Password”。 

编译和保存C脚本。  
用变量@CurrentUser设置一个变量触发器,周期选择为“ 2 s”。这确保了系统不会因脚本而负荷过重。在所述的例子中,变量 @CurrentUser(包含当前登录的用户)每隔 2 秒钟被询问一次察看有无变化。只有当用户变化时才调用脚本,例如当前用户退出时。 
确保已经在计算机的属性“Startup”选项卡上激活了“Global Script Runtime”。

除此之外,SIMATIC PCS 7(SIMATIC PCS 7 V6.0 SP1及更高版本)用户还需执行下列步骤: 

将系统画面@Welcome.pdl复制到一个安全的位置,以便可以恢复原始画面。 
使用Graphics Designer打开画面@Welcome.pdl。 
打开保存在选定画面中的C脚本,(右击)> Event > Picture Object > Miscellaneous > Open Picture)。 
注释掉“PASSLoginDialog(Screen);”一行,以 // 作为注释的前缀。 编译C脚本。 保存系统画面@Welcome.pdl。



 
    20:如何进行WinCC 和 S7之间的时间同步? 

回答:下面的方法只能进行时间设置而不能完成时间同步的功能。因为必须考虑到延迟,比如报文的处理时间,C 脚本的运行时间等,因此这个方法在精度方面不如真正的时间同步精确。 

   1.创建一个数据块 ,其中有一个 "DATE_AND_TIME" 类型的变量和一个布尔变量。当元素"Flag" 在WinCC中被置1,程序就调用系统函数SFC0  "SET_CLK"。D B1中的触发变量"Flag" ( DB1.DBX 8.0)在WinCC脚本中被SetTagBitWait("DB1_FLAG",TRUE) 置1。 因此仅当此C脚本在WinCC中被调用时,时间才被设置。SFC0 必须先添加到Step7程序的块文件夹中。 在此段程序中,DB块中的各个时间变量被写到作为 SFC0参数的"DATE_AND_TIME"类型的本地变量"DateAndTime"中。 用 "SET_CLK" 设置完时钟后,触 发变量"Flag"被复位。 注意: 在此段程序中,本地变量"DateAndTime"存储在以0为起始地址的本地数据堆栈中。如果不得已要把这个变量分配到别的地址,同 时对传送指令参数化时,必须要考虑到地址分配的问题。

   2.为“年”新建一个 "Unsigned 8-bit value"类型的变量,对其进行格式变换 ByteToBCDByte,然后为其在DB块中选择相应的字节地址:  在WinCC 中创建剩下的变量。 选择"Unsigned 16-bit value" 类型然后改变格式为 WordToBCDByte ,然后在DB块中选择实际的字节地址。

   3.最后,在WinCC中创建一个C脚本来读取系统时间并进行拆分,然后把它们写到DB1中。 S7 PLC中的时钟设置是被脚本中的"DBI_FLAG"变量触发的。
1楼 0 0 回复
总共 , 当前 /