【万泉河】PLC全局变量M正确使用大法-2
我写过好几篇关于PLC程序里面建议不要用全局变量M的文章了。
这里就不一一转发了,感兴趣的同学自己去网上搜索到。
在讨论的过程中, 有反驳者找出的理由说,既然西门子在PLC里面设计了这块内存区,就是让人使用的,所以可以推论,你不让人使用M,肯定是没有道理的。
好吧,我们再通过本文再向大家演示一把正确使用M变量的大法。
先跑个题。
曾经有人在***里咨询调试WINCC程序的问题,问该如何逐行逐句调试,监控程序在相应的行的数据结果?
然后有人回答,用MSGBOX。
这回答是对的。 用MSGBOX可以的。
程序运行到相应的位置,通过MSGBOX弹出对话框, 对话框的内容显示关心的变量的值。

然而不是正确答案。
因为这样的话,有缺陷。为了调试增加的监控语句,会影响到程序的正常运行,所以一旦调通之后,需要赶紧屏蔽。然后程序再调试一段,又要再次关注程序在这个位置的运行值,还需要再来恢复一次。
如此不停的加断点,屏蔽,再加断点,再屏蔽,是很麻烦的。
而如果这个断点在循环语句里面, 那调试起来可累了。需要重复鼠标来点确定。
然而最麻烦的是, 如果哪一段功能调试完,忘了把这个断点删掉, 那将来对用户使用,就是个灾难。
所以,对正常的程序调试,不是个正确的处理办法。
正确的答案是用trace功能。
Trace功能各种编程语言都有。
在WINCC VBS里面指令为HMIRuntime.Trace, 而在C脚本里面,为printf指令。
方法是,在程序的需要的位置加入相应的指令,WINCC运行时,在运行画面中添加一个全局诊断的窗口,这些输出结果就在窗口中显示了。
这个画面窗口可以放在单独的画面中, 只在调试时程序员调出来查看。而当用户正常使用时,这些数据并看不到。
而这些指令有没有在运行?一直在的。无非最终用户看不到而已。
我在所著的上一本书《西门子WINCC从入门到精通》中P137-140页详细讲解了此功能,但看来还是有很多人没学习到。

一个正常运行的程序,从来都是诊断脚本夹杂在正常的功能代码中的,即便到最后发布, 也不会删除。甚至像WINDOWS操作系统, OFFICE软件,以及西门子的STEP7, TIA PORTAL等软件, 也都是。
因为并不会影响正常功能的运行,所以从来也不会有人特别关心它们。
现在回到正题。
在PLC程序中要实现类似的trace功能,该如何做呢?
就是,我们需要在其中一些关键部位加入必要的用于输出诊断的程序,然而这块功能又不参与正常的逻辑控制,即便有数据用的不小心,产生一些数据冲突等,也不影响主机本身的运行功能。
对咯!答案就是用M变量。
在FB中使用M变量。
因为我们的正常的程序功能根本不会使用M变量,甚至,在FB中如果使用了, 还会功能不完整,出错误不能实现真正需要的功能。
所以,如果有幸,见到了我在FB中使用了M变量,那基本上可以断定,是程序诊断用的!使用M变量比起给FB增加静态变量的好处在于,程序的接口没有改变,因而不需要重新编译和重新生成背景数据块。所以相当方便。
比如这样:

我在程序中加入诊断,为了观察这里逻辑的运行情况。然而如果调试成功了,到最后设备交付,我也不会删除它们,因为,早晚有一天有再次诊断需要的时候, 我再在监控表中看一看即可。
另外, 新书 《PLC标准化编程原理方法》 正在紧锣密鼓撰写中,让关心的读者们久等了,非常抱歉。
因为忙于写书,所以没有时间打理公众号,但未来,我会酌情摘录一些书中的段落,提前发布在公众号上,欢迎大家持续关注。