WinCC上可以很方便的编写VB脚本和C脚本 - 图文 -

从版本V6起,WinCC同时提供了C 和VB 两套脚本系统,使脚本功能更加丰富、易用。

首先C脚本功能实在是太强大了,除了系统提供的标准函数和系统函数外,还可以直接调用API函数,再加上可以直接使用ODK函数,,就连VBS中的Method调用也可以通过特别的办法实现,可谓是无所不能。当然缺点也是有的,不支持自动列出函数或者方法,编写程序多有不便。

自版本V6起又增加了VB脚本,它使用起来较为简单,而且入门很快。VBS自身的功能并不强,除了一些基本的函数和WinCC自身的对象(比如

HMIRuntime.Tags),剩下的功能全部都得通过COM组件进行扩展,比如我们很熟悉的Excel、fso、wscript.shell等等,通过这些组件使得WinCC访问Windows的接口得以增加,但是访问WinCC底层东西却没有(比如用户登陆、报表打印等),这是VBS美中不足的地方,希望下一版本能够改进,^_^。

VBS的另外一个弱点就是无法直接调用API函数,只能通过其他的方法解决。

网上常见的方法应该是通过dynwrap.dll先注册再调用,比如:

Dim UserWrap

Set UserWrap = CreateObject(\

' CallMessageBoxA(), first register the API function

UserWrap.Register \

\

' now call the function

UserWrap.MessageBoxA Null, \

\

dynwrap的下载地址我已经找不到了,大家可以上网搜索。另外安装

DriveMonitor后就会有这个文件,详细用法在DriveMonitor帮助信息中也可以找到。

另外我试过利用Excel代为声明,VBS调用Excel的宏来实现,这是一篇我写的关于VBS结合EXCEL调用API函数的心得总结,内容太长我就不贴了,直接见附件,附件DOC附有本文档用到的Excel文件、VBS文件以及C函数。

全局C脚本里面对PLC的值进行读取和更新,有对数据库的操作,但有的时候发现设备不动作,点击按钮进入状态界面(用于显示PLC的状态),观察PLC的值。此时设备就会继续动作,按钮中未写任何脚本,只是用直接连接来给一个内部变量赋值以用于切换画面?

怀疑是全局脚本中对数据库的操作阻塞了脚本的运行,不知道是不是原因啊?为什么点击按钮后又能解除呢?恳请高人帮忙啊?[/quote]不知道您使用的是全局脚本项目函数,还是全局动作呢?如果在画面中调用的是全局项目函数,应该属于画面的脚本线程,切换画面的时候,重新启动新的画面周期,执行该画面中的脚本,前一画面中未执行的脚本队列被释放。

如果您怀疑是数据库的操作阻塞了进程,您可以在脚本中屏蔽掉操作数据库的代码,观察是否还出现阻塞的现象;也可以在您的全局脚本中加入printf函数,输出到GSC诊断窗口中,判断是否发生阻塞。

一般来说,如果您在一个项目中组态的动作(包括全局动作或画面中周期调用的动作)不能被正确或及时地处理,例如,动作的触发周期为2秒钟,但是执行该脚本所需要的时间为5秒钟,这样大量动作累积起来,不能处理的动作被输入队列。如果在脚本队列中的任务数目达到了5000,那么路径

“:\\Siemens\\WinCC\\Diagnose”下的WinCC“ WinCC_Sys_xx.log”的诊断文件可能会显示错误消息“s cript: More than 5000 actions in work”。详细信息请参见如下链接:http://support.automation.siemens.com/CN/view/zh/2357302或者http://support.automation.siemens.com/CN/view/zh/14612355。

另外,关于WinCC对C脚本的诊断方法有很多,以下几种仅供参考,在WinCC的帮助文档中可以找到更多详细的内容:

1.GSC运行系统:提供关于所有(全局脚本)动作的动态特性信息。

2.GSC诊断:按调用的顺序输出printf指令,可以将变量的数值和错误信息等输出到诊断窗口。

3.ApDiag工具:WinCC自带的诊断工具 “ApDiag.exe” 对故障和性能问题进行了详细的分析,关于如何使用诊断工具“APDiag”来调试C脚本,请参见如下链接:http://support.automation.siemens.com/CN/view/zh/22892912。

全局C脚本里面对PLC的值进行读取和更新,有对数据库的操作,但有的时候发现设备不动作,点击按钮进入状态界面(用于显示PLC的状态),观察PLC的值。此时设备就会继续动作,按钮中未写任何脚本,只是用直接连接来给一个内部变量赋值以用于切换画面?

怀疑是全局脚本中对数据库的操作阻塞了脚本的运行,不知道是不是原因啊?为什么点击按钮后又能解除呢?恳请高人帮忙啊?

请问高人一个问题:两个全局C脚本,其中一个被阻塞了,另一个会怎样,是不是也会被阻塞?多个全局脚本是独立的单线程吗?[/quote]虽然WinCC的全局脚本(对应于进程 Gscrt.exe - Global s cript Runtime)与画面中的脚本分别运行在不同的进程,但是全局脚本的各个动作同时运行在同一个线程中,其中一个动作发生阻塞,会影响另外一个动作。

可以设计两个全局脚本动作,进行如下的测试:

动作1:每隔2秒钟执行一次,变量1加1。

动作2:每隔2秒钟执行一次,变量2加1,使用Sleep函数延迟5秒钟。

结论:使用输入\\输出域显示两个变量,两个变量都是大约每隔5秒钟加1(如果没有Sleep函数,两个变量都是大约每隔2秒钟加1)。因此,全局脚本的多个动作是互相影响的。

联系入党客服:77662525#qq.com(#替换为@)