本帖最后由 自控技术FAQ 于 2026-5-17 07:36 编辑
WINCC C脚本是大家在组态项目时常用到的功能,但在使用过程中有这样那样的疑惑或问题,经常在各论坛看到相关帖子,此文总结一些相关内容,以供学习交流。
1全局脚本和画面脚本,有关执行问题
1.WINCC中的脚本分两块:画面中的脚本和全局动作脚本
只有在运行系统中需要执行全局动作脚本时,才需要在WINCC启动项中添加激活“全局脚本运行系统”。
就是说“全局脚本运行系统”激活与否不影响画面脚本的执行,和项目函数的调用及执行。如下图,在画面脚本中调用全局脚本中定义的项目函数add。
2.WINCC脚本的应用进程名为script.exe
WINCC中对于全局动作,所有脚本为同一线程。下面通过一个测试来验证。
脚本包含错误语句:除数为0(注意:此语法错误在脚本编译时不会报错,所以说写脚本时一定要细心,即使编译通过的脚本,在执行时也可能会出现问题)
两个脚本添加相同的触发器:如内部变量t2有变化时执行 (附:WINCC内部基本数据类型的变量,初始值默认为0,也可以在定义变量时设置) 这里必须要了解的一点,由变量变化触发的全局动作脚本或画面中的脚本,在“全局脚本运行系统”被激活或该脚本所在的画面被打开时,即使触发变量的值没有变化脚本都会执行一次,在组态的时候一定要注意。
在测试画面中添加一“GSC 诊断类型的应用程序窗口”,该窗口可以打印出脚本执行的相关信息。
当执行全局动作后,从GSC诊断窗口的信息可以看出,全局动作脚本a1、a2的线程ID一样的都是15848
既然知道了这一点,在写脚本的时候就要注意:如果有任意一个全局动作脚本无法返回,其它全局动作脚本都将无法执行。
改写a1、a2脚本如下:a1由变量t1有变化触发,使用while(1)让a1动作进入循环;a由变量t2有变化触发。并使用printf在GSC诊断窗口打印出脚本执行信息。
启动WINCC,首先点击按钮执行a1脚本,此时a1脚本执行并进入死循环。然后在点击按钮执行a2脚本,可GSC诊断窗口没有a2执行信息,说明a2脚本无法执行。
附:在测试过程中发现,当有脚本进入死循环后,在退出WINCC运行系统时,取消激活过程会卡死。 一直等到弹出如下界面,选择“退出动作”,才能继续完成WINCC退出。
由于篇幅限制,关于脚本全局C变量的使用、脚本中调用外部DLL,下篇文章分享给大家。
|