WINCC脚本实例.docx

上传人:b****8 文档编号:30410004 上传时间:2023-08-14 格式:DOCX 页数:30 大小:33.28KB
下载 相关 举报
WINCC脚本实例.docx_第1页
第1页 / 共30页
WINCC脚本实例.docx_第2页
第2页 / 共30页
WINCC脚本实例.docx_第3页
第3页 / 共30页
WINCC脚本实例.docx_第4页
第4页 / 共30页
WINCC脚本实例.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

WINCC脚本实例.docx

《WINCC脚本实例.docx》由会员分享,可在线阅读,更多相关《WINCC脚本实例.docx(30页珍藏版)》请在冰豆网上搜索。

WINCC脚本实例.docx

WINCC脚本实例

1、问:

如何触发计算机扬声器的声音?

  答:

编写如下C-Action:

  #pragmacode("kernel32.dll");

  BOOLBeep(DWORDdwFreq,DWORDdwDuration);

  #pragmacode();

  Beep(500,500);

  

  2、问:

如何通过C脚本来确定报警信息?

  答:

首先必须在画面中插入报警控件,可以用如下两种方式来确认信息:

  〔1〕、确认单条信息

  4版本和高于此版本的WinCC

  BOOLOnBtnSinglAckn〔char*lpszPictureName,char*lpszObjectName〕

  5版本和高于此版本的WinCC

  BOOLAXC_OnBtnSinglAckn〔char*lpszPictureName,char*lpszObjectName〕

  〔2〕、确认报警窗口所有可见的报警

  4版本和低于此版本的WinCC

  BOOLOnBtnVisibleAckn〔char*lpszPictureName,char*lpszObjectName〕 

  5版本和高于此版本的WinCC

  BOOLAXC_OnBtnVisibleAckn〔char*lpszPictureName,char*lpszObjectName〕

   

  3、问:

如何在WinCC中读取系统时间?

  答:

通过如下C-Action:

  #pragmacode("kernel32.dll");

  VoidGetLocalTimes(SYSTEMTIME*lpst);

  #pragmacode();

  SYSTEMTIMEtime;

字串7

  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"

  voidonClick(char*lpszPictureName,char*lpszObjectName,

  char*lpszPropertyName)

  {ProgramExcute("c:

\\win98\\control.exetimedate.cpl");}

  其中执行的程序路径,需根据具体情况填写。

   

  5、问:

如何在WinCC中调用SQL语言?

  答:

1、创立一个SQL文件,此文件在ISQL中建立,文件包含所要执行的SQL语句。

Windows对话框实现。

具体如下:

  2、在WinCC中用CScript调用上述SQL文件,如下所示:

  #include"apdefap.h"

  voidOnLButtonDown(char*lpszPictureName,

  char*lpszObjectName,字串2

  char*lpszPropertyName,

  UINTnFlags,intx,inty)

  {

  char*a="c:

\\siemens\\mon\\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*frompde#hd#t#test;

  outputtoe:

\\test2.txtFORMATascii

  注意:

文件名及路径中不要带空格。

  

  6、问:

如何整点启动归档?

  答:

在"GlobleScript"下的Projectfunction编写程序函数:

cyclicarchive

  BOOLcyclicarchive()

  {

  #pragmacode("kernel.dll");

  voidGetLocalTime(SYSTEMTIME*lpsz);

  #pragmacode();

  SYSTEMTIMEtime;

  Intt1;

  GetLocalTime(&time);

  T1=time.wMinute;

  If(t1==00)

  {

  SetTagBit("startarchive",1);

  Return(BOOL)(GetTagBit("startarchive"));

  }

  }

  在Tagloging中的"Propertiesofprocesstag"中的"archivetag"Tab下的Archivetype选择Cycle-selective,在"Event"标签下的"StartEvent"选择cyclicarchive函数。

  

  

  7、问:

HowcanIsetandresetaWinCCvariablebymouseclickwithCscript"

  答:

ThefollowingfunctionshowshowyoucanalternatelysetandresetaWinCCvariablebymouseclick.

  #include"apdefap.h"

  voidOnClick(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName)

  {

  BOOLz;

  z=GetTagBit("MyBitVariable");

  if(z==0)

  SetTagBit("MyBitVariable",1);

  else

  SetTagBit("MyBitVariable",0);

  }

  

  

  8、问:

HowcanIprogramawaitingfunction(Sleep)inWinCC"

  答:

Thefollowingsampleprogramshowshowthe"Sleep"isused.

  #pragmacode("Kernel32.dll")

  voidSleep(intmilliseconds);

  #pragmacode()

  Sleep(1000);//timespecificationinmilliseconds

  Warning:

  IfyouuseSleep(),processingtheCscriptisinterruptedforthetimeindicated.Requestsfortheinterruptedfunctioncannotbeprocessedduringthistime.

  

    字串1

  9、问:

HowcanIoutputaSIMATICtimerminutesandsecondsinWinCC"

  答:

IfyouwanttooutputaSIMATICTimerinminutesandsecondsinWinCC,theninWinCCpleaseuseastatictextintheGraphicsDesignertowhichyouinterfacethefollowingaction:

  char*_main(char*lpszPictureName,char*lpszObjectName,char*lpszPropertyName)

  {

  char*p;

  DWORDhilf;

  intmin,sec;

  p=SysMalloc(10);

  hilf=GetTagDWord("Time");

  min=hilf/60000;

  sec=hilf%60000/1000;

  sprintf(p,"%dmin%dsec",min,sec);

  returnp;

  }

  The"Time"variablelinkedtotheI/Ofieldmusthavethefollowingproperties:

  •Datatype"32-bitvaluewithoutsign"

  •Formatadaptation"DwordToSimaticBCDTimer"

  •Address:

dataarea"Times"andaddressing"Word"

  10:

快捷地切换画面

  通常要将所有的设备都显示在一画面里是不可能的,所以将设备按照处理工艺的功能步骤分级在多画面,以一个污水处理厂为例分为电泳线、前处理线、生化线、加药线等,之间的切换使用按钮的鼠标动作来实现。

这对于用WinCC现成的鼠标动作来实现是很简单的,但是不是要在每图上都使用一样数量且位置排列顺序一致的按钮呢?

(出于对操作的一致性考虑,不能让操作人员在不同的图上,不同的位置找想要操作的按钮)这个问题的解决我们使用WinCC的脚本编程,在按钮动作中调用它的部函数来实现。

首先,组态一幅背景画面,其中包括要显示的静态文本、OLE(例如,时钟)、所有的图形切换按钮及推出关机按钮。

第二,在背景画面中插入智能对象(SmartObject)中的画面窗口(Picture Window),并且使其的尺寸与其分级画面一样。

第三,在相应的切换按钮的属性->事件->鼠标动作中编写如下C语言脚本代码:

       #include\"apdefap.h\"

       voidonClick(char*lpszPictureName,

       char*lpszObjectName,char*lpszPropertyName)

       {字串2

       SetPictureName(\"背景画面\",\"画面窗口\",\"电泳处理线\");

       }//\"背景画面\"即为始终显示地静态背景的属性名,\"画面窗口\"即为在背景画//面中插入地画面窗口(Picture

     Window)属性名,\"电泳处理  线\"即为分级画面//的名称

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

字串3

  11:

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

字串7

  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*

字串2

     lpszPropertyName)

       {

       staticintx=25,y,z;//x为半径的初始值为25,y为切换变量,z为搅拌机运行状态变量

       z=GetTagBit(\"202搅拌机运行\");//取得PLC搅拌机的运行状态

       if(z!

=0)

       {

       switch(y)

       {

       case0:

       x=x-4;

       if(x<=0)

       y=1;

       break;

       default:

       x=x+4;

       if(x>=25)

       y=0;

       break;

       }

       }

       returnx;字串6

       }字串3

  13:

语音报警的组态

  在工业现场平安是极其重要的,无论从那个角度讲我们应该利用一切手段减少故障的发生。

在故障已经发生的时候,应该在第一时间以多种方式通知操作人员有故障发生。

现代微处理计算机的处理速度可以完全胜任对于图形,语音地同时处理。

所以我们可以利用计算机的声卡和音箱在有故障发生的时候产生语言报警,但是问题是WinCC本身并不能产生语音的功能,而且其部的上千个函数也没有提供处理声音的函数。

解决这个问题的方法归功于微软开发的WinCC与操作系统地完美结合,因为在WinCC中可以直接调用Windows的API函数。

实现的具体C脚本代码如下:

       long_main(char*lpszPictureName,char*lpszObjectName,char*

     lpszPropertyName)

       {

       #pragmacode(\"Winmm.dll\")

       voidWINAPIPlaySoundA(char*pszSound,char*hmode,DWORDdwflay);

       #pragmacode()

       if(GetTagBit(\"112排泥备泵故障\"))

       PlaySoundA(\"d:

\\\\\\\\winnt\\\\\\\\media\\\\\\\\Mircosoftsound.wav\",NULL,8);

       return1020;

       }字串1

  有一个值得主意的问题是此段代码的参加点,通过反复屡次的实践得出结论,即这个点必须加在始终显示于屏幕上的任何图形元素的属性中,这样才能到达语言报警的预期效果。

  14:

当为WinCC指定PC名时应注意什么"

  解答:

  计算机名不能包含特殊字符如空格、退格和下划线,并前13个字符必须是唯一的。

由于操作系统的原因,名字的长度不能超过15个字符。

因此推荐只使用atoz,AtoZ,0to9这些字符。

必须以子母开头。

  从SIMATICWinCCV6.0起,有如下限制:

计算机名可包含下划线。

然而,当使用DNS主机名时,不能使用下划线。

字串5

  15:

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

D801?

  解答:

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

字串2

  16:

和plc用S7通讯怎样去除错误代码8304?

  解答:

  WinCC运行时的画面不再更新,WinCC的日志文件中有错误代码8304,这个错误码说明WinCC和S7连接出现问题。

  解决方法:

  停顿AS站的循环读效劳,在"WinCCExplorer>变量管理>SIMATICS7PROTOCOLSUITE"

中。

右键单击出现问题的S7连接,选择"系统参数",去除复选框“周期管理>通过PLC〞的选择。

字串4

  17:

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

  解答:

由于在WinCC动态值域对话框中的布尔数学体系运算符,您可以根据C脚本惯例运用这些符号。

下面是符号及其意思的概括:

与位比拟&

与表达式比拟&&

或位比拟|

或表达式比拟||

非  !

字串5

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

字串3

  18:

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

  解答:

  可以使用OCX“SpinButton〞实现这个功能。

下面描述了如何合并和联系这个对象。

  在WinCC图形编辑器中,插入一个“Control〞类型的小对象。

在翻开的窗口中选择进入MicrosoftForms2.0SpinButton并以OK来确认。

  右击翻开对象“SpinButton〞的属性。

在控制属性中使用您想要的变量来连接“Value〞属性。

但要注意:

  使用第三方的ActiveX控件会导致错误(例如存丧失,性能降低,系统阻塞)。

"软件应用者应该对由于使用第三方ActiveX控件而造成的任何问题负责。

  ActiveX控件事件连接C脚本

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

如果这个事件名少于5个字符长,那么C脚本不被执行。

字串7

  19:

重新启动后,不使用登录窗口如何以一个缺省用户的身份自动登录?

怎样确保运行期间有个缺省用户始终处于登入状态?

即使另外一个用户已经预先退出。

  解答:

  重新启动以及在运行期间,您希望HMI系统到达最小的实用性而不使用登录窗口。

然而,对于高级操作,登录功能应当保存。

此外,如果没有用户登录,那么有一个缺省的用户自动登录。

缺省用户的权限可以在用户管理器中根据需要设定。

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

将附件中的函数“Silentlogin.pas〞复制到工程中的“PAS〞子文件夹中。

 

在工程中选择GlobalScript>CEditor>Actions>GlobalActions并翻开全局动作(GlobalAction)“Silentlogin.pas〞。

在“PWRTSilentLogin(“Login〞,“Password〞);〞一行中,用缺省的用户名替换用户“Login〞,用缺省用户的口令代替“Password〞。

编译和保存C脚本。

 

用变量CurrentUser设置一个变量触发器,周期选择为“2s〞。

这确保了系统不会因脚本而负荷过重。

在所述的例子中,变量CurrentUser(包含当前登录的用户)每隔2秒钟被询问一次观察有无变化。

只有当用户变化时才调用脚本,例如当前用户退出时。

字串1

确保已经在计算机的属性“Startup〞选项卡上激活了“GlobalScriptRuntime〞。

字串7

  除此之外,SIMATICPCS7(SIMATICPCS7V6.0SP1及更高版本)用户还需执行以下步骤:

将系统画面Wele.pdl复制到一个平安的位置,以便可以恢复原始画面。

使用GraphicsDesigner翻开画面Wele.pdl。

翻开保存在选定画面中的C脚本,(右击)>Event>PictureObject>Miscellaneous>OpenPicture)。

注释掉“PASSLoginDialog(Screen);〞一行,以//作为注释的前缀。

编译C脚本。

保存系统画面Wele.pdl。

字串4

  20:

如何进展WinCC和S7之间的时间同步"字串1

  答复:

下面的方法只能进展时间设置而不能完成时间同步的功能。

因为必须考虑到延迟,比方报文的处理时间,C脚本的运行时间等,因此这个方法在精度方面不如真正的时间同步准确。

  1.创立一个数据块,其中有一个"DATE_AND_TIME"类型的变量和一个布尔变量。

当元素"Flag"在WinCC中被置1,程序就调用系统函数SFC0 "SET_CLK"。

DB1中的触发变量"Flag"(DB1.DBX8.0)在WinCC脚本中被SetTagBitWait("DB1_FLAG",TRUE)置1。

因此仅当此C脚本在WinCC中被调用时,时间才被设置。

SFC0必须先添加到Step7程序的块文件夹中。

在此段程序中,DB块中的各个时间变量被写到作为SFC0参数的"DATE_AND_TIME"类型的本地变量"DateAndTime"中。

用"SET_CLK"设置完时钟后,触发变量"Flag"被复位。

注意:

在此段程序中,本地变量"DateAndTime"存储在以0为起始地址的本地数据堆栈中。

如果不得已要把这个变量分配到别的地址,同时对传送指令参数化时,必须要考虑到地址分配的问题。

  2.为“年〞新建一个"Unsigned8-bitvalue"类型的变量,对其进展格式变换ByteToBCDByte,然后为其在DB块中选择相应的字节地址:

 在WinCC中创立剩下的变量。

选择"Unsigned16-bitvalue"类型然后改变格式为WordToBCDByte,然后在DB块中选择实际的字节地址。

字串8

  3.最后,在WinCC中创立一个C脚本来读取系统时间并进展拆分,然后把它们写到DB1中。

S7PLC中的时钟设置是被脚本中的"DBI_FLAG"变量触发的。

  21:

WINCC--如何在程序中动态修改用户密码

    1、点击“开场〞--"“设置〞--"“控制面板〞--"“管理工具〞--"“数据源〔ODBC〕〞

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1