别光看我的标题,会以为我被这些程序搞的如蒙冤多日,怀有血海深仇似的。都说编程是一件综合考量你对软件、硬件;设备及工艺的认识、理解程度的标尺,但凡网上很多的编程大侠洋洋洒洒地信手能够写出许多经典的、移植性*的程序段子,直让人感动的五体投地。实际上都是他(她)在平时工作中的经验累积及积极、主动的学习态度所堆积起来的思想,和平时勤于观察,善于记录有关。
一些非常经典、非常有意思的程序段子,总是时不时的在我眼前晃,似乎有一些“冤屈”要想通过我的这个口(准确地讲应该是手),找个机会来伸一伸,则乃,我对此认识尚还肤浅,理解浅显,更不能够胜任当代的“老包”之职,回到正题,就说说这些“冤屈”。
例子程序若有雷同,全当抄袭,先表示歉意。
先来说说这个程序,打开【S7-200 SMART PLUS】帮助手册----编程----子程序调用的常问问题2,程序截图:
手册中明确告知,这个子程序调用时和离开时,输出位的一些特性。
如果我拿来做这个程序稍做修改,挪做其它功能又将如何?假设,我把EN管脚的地址用I0.0替换,把IN1管脚用Q0.0的NC逻辑替换会产生怎么样的结果?
编译程序、保存、下载到cpu验证一下:
大家马上都会看出来这个输出是一个随机值,或许为1,又或许为0,具体输出的状态看I0.0离开时PLC的扫描周期所处的位置。
好,我再加一点“料”,不修改子程序的前提下,对管脚再稍作修改,输出的逻辑又将如何呢?
这时输出变的有那么一点规律了,对了,这就是我们经常在深入讨论的、经典的一个话题,就是所谓“单按钮起、停”控制程序了。
如果你担心多次调用这样的子程序又将如何?那你需要自己去试试了。
知道“然”,还要学会应用这个“然”字,知道了它的“不足”,就是利用它的这个“不足”,把“坏事”变为“好事”,一直被大家理解为不合理的程序调用,只要稍加修改也可以为我们所用,这个是我理解的“冤”,我想为它伸一伸。
再来看一个例子,一个循环指令的应用:
相信大家也很快能够看出问题的所在了,原因是这些临时变量、输入接口变量的初始值问题。在调用临时变量、接口变量时,大家都时刻注意着调用这些变量前,都会很自觉地做初始化的操作。但,是否是每一个变量都需要这样做初始化呢?答案当然是否定的。在特定的指令和应用环境中,如、循环指令它本身启动时,INDX管脚的初值一定是自0值开始循环的。而OUT1的管脚由于子程序多次调用,需要做初始值的操作了。不然当该子程序被多次调用时,这个管脚值会被多次修改,造成程序的混乱和错误。
修改完整的子程序:
很显然,我在这个程序中仅仅是做了需要计算结果的初始化,而对于循环指令的数据并没有做任何操作,正常运行程序如下所示:
在准备做多次调用的子程序时,一些变量的初始值不是一概定论的,而是需要根据具体实际的需要,灵活运用,扬长避短,做到心中有数,我想为这个定论伸一伸冤。
好了,其实编程应该是一件快乐的事情,也别老挂着苦大仇深脸,只有心情愉悦了,思路才会天马行空,任由你去驰骋。
本不想采用这个标题,感觉偏离了当时编写短文的本意,但到后修改时,突然闪出这么一个奇怪的念头,感觉还是这样写的标题或许会轻松一些,大家更容易有记忆,不当之处尽请谅解。