题外话
近日,发现了一张有助于大家理解OA架构的图,在此分享给大家
有关OA架构的文章大家可以参考 WinCC OA前言-透视OA软件架构
Control 脚本执行流程
我们知道 control 脚本 作为OA系统里的粘合剂,帮助WinCC OA 实现了在线开发,在使用过程中难免对contrtol的执行步骤及流程有所困惑,比如全局变量该怎么设置,
今天就带领大家仔细研究下control的启动及加载流程.
流程图
上图总结了 control 运行的流程, 我们现在假设有一个string类型的变量tag1,需要在 Control Manager 及Panels 中访问,
OK ,让我们操练起来
1) 创建全局变量 tag1
我们在项目的Liraries文件夹下 创建了globalTest.ctl文件
2) Control Manager 引用并修改
我们在control manager 启动文件里 添加了jiang.ctl
jiang.ctl 负责引入 刚刚创建的globalTest.ctl 库文件 并修改tag1内容,
3) 创建第一个测试用panel
新建一个测试用panel script1.pnl 并在ScopeLib 里 引用“globalTest.ctl”,同时我们定义一个tag2
我们在initialize 事件里分别打印 tag1 及tag2
重启Control Manager 及运行script1.pnl 注意观察LogViewer
我们看到 全局变量 都打印出来了 但是在control manager 里面修改的内容 script1.pnl并没有拿到
重点
前几篇文章 我们说过 WinCC OA 里的Control Manager 与User Interface(本文的gedi),都是独立的进程,
OA为了让全局变量更加安全可控,并没有采用全局共享内存的方法,而是在每个进程引用全局变量的时候,分别拷贝一份副本供自己使用
因此 自定义的库文件jiang.ctl里面的tag1 才会出现上图现象,但是相同进程里的操作是同一份全局变量,我们可以做个小实验
4) 创建嵌入式panel并测试
1)让我们新建一个script2.pnl,同样在ScopeLib里使用#uses "globalTest.ctl"引用全局变量,之后在面板里面放置一个按钮, 按钮用来打印tag1并加上标记
2) 将script2.pnl 拖拽放入script1.pnl
3) 在script1.pnl内新增一个按钮 打印tag1 并加上标记panel1 marked;
运行这个复合面板 script1.pnl 打印结果如下
三次点击 分别都加上了各自的印记
思考?
如何在Control Manager 与 User Interface 里同时操作一个全局变量?
还记得我们说过 Control Manager 与User interface 都是通过EV 发送及接受消息的,结合之前说过的 定时器 ,相信大家一定会想到方法