在《求个最简洁的》题目下,我有一个写给<winter938 >网友参考的程序片断(如图1所示)。其程序的构思虽比较简单,但是也有些人在阅读时不动脑筋而对程序的功能理解出了偏差。现在我用图解的方式来讲解,尽量用初学者都能懂的形式把程序的功能讲清楚。
下面这个图1 就是用于实现(在PLC进入RUN状态已达3秒之后)“在任意不足3秒的时间段内,若X1输入的脉冲前沿达到3个,则输出Y1,从X1的任意一个输入脉冲前沿起,3秒以内达不到有3个输入脉冲前沿出现,则停止Y1。”这一目标功能的程序片断:
(图1)
这个片断虽不够是“最简洁的”,但是,它却是能正确实现上述目标功能的程序片断。在程序构思上比较符合一般人的思维顺序,比较容易使人理解。
把D0、D1的数据之“和”求出传送给D2后,接着就把它跟目标设定的“标准”进行比较,根据比较的结果来决定对Y1执行怎样的操作:
在X1还未输入任何脉冲之前,M0=“0”状态,以这个M0为驱动条件的“OUT T0 K30 ”及“MOV T0 D0 ”都未运算,所以T0及D0的当前值都为零;而“M0反”=“1”状态。这时T1的驱动条件为ON,当PLC进入RUN 3 秒之后,D1的当前值就已经达到“K30”了。
当X1的第1# 脉冲前沿发生时刻,D2中的数值为“0# 时段”中对应该时刻的“D1+ D0 = K30 ”(即:D2当前值不小于 K30),如果例程中的“条件比较”指令正确的写成“LD>= D2 K30 ”,则这个“条件比较”接点为“ON”状态。于是执行“RST Y1 ”指令。这时Y1还未输出,所以1#脉冲还不能表现出什么“作为”;而“条件比较”结果“ON”被“INV”指令翻转为“OFF”,故“SET Y1 ”指令是不被执行的!这就是第1#脉冲不会使 Y1输出的道理。
当X1的第2# 脉冲前沿发生时刻“0#时段”终了,这前一刻D2的内容当然是“大于K30”了!因为第1#脉冲前沿发生时刻就已经不小于K30了嘛!这第2#脉冲前沿发生时刻让M0又翻了一个面,T0清零,又轮换成D1来测量2#脉冲的时值,这一时刻D1的当前值为零,如果这个时刻运算“ADD指令”,且遇D0的内容小于K30的话,则第2#脉冲就会触发Y1输出!但是,我的这个程序片断中“ADD指令”的驱动条件是“除M0翻转时刻”之外的时间才为“ON”。所以,当第2#脉冲前沿发生的这个周期中“ADD指令”是不被执行的。这就是第2#输入脉冲决不可能触发Y1输出的原理。
当X1的第3#脉冲前沿发生时刻,“1#时段”终了,只要“1#时段”终了值小于3秒,则“条件比较”的结果为“OFF”,经“INV”反转后变成“ON”,于是执行“SET Y1 ”。这就是第3#输入脉冲在3秒以内出现才会触发Y1输出的原理。
引用<abysmal >的内容:
“老王的绘图工具真强大。这些都怎么画出来的? ”
回复:
我是用Windows操作系统自带的一个《画图》程序,很普及的东西。不管做什么事情,只要认真的去做,就一定能把事情做得很漂亮!
曾经有(日本)小鬼子到我们单位调试他们生产的自动生产线,其中有一个“仁丹胡子”刚来时,他那股傲慢劲儿就甭提了!自认为日本是发达国家,在我们面前表现出:很是歧视“支那人”!
但是,我们中国工人有志气!凭着深厚的技术功底和十分认真的精神,也找出了他们制造的设备上的“毛病”,让他们再神气不起来了!是由我们动脑、动手将他们的“毛病”解决了。他们的工程师也不得不赞叹:“老王的活儿干得真漂亮!”
我上面的讲解已经很清楚了:图1所示的程序片断在第2#脉冲前沿发生时刻是决不会有Y1输出的!可是<robotH >网友却在《求个最简洁的》第153楼说他试过了,发现该片断有问题:当X1脉冲出现在0.0,2.0,4.0,5.1秒,Y1会输出。(注:是在PLC运行3秒后测试的)。
<robotH >网友给我们打马虎眼,他举出的数据既不详,也不实!不能够说清情况。“当X1脉冲出现在0.0,2.0,4.0,5.1秒”是说“X1输入的1#、2#、3#、4#脉冲前沿分别对应于0.0,2.0,4.0,5.1秒这4个时刻出现”吗?如果是,那么,这“2.0,4.0,5.1秒,Y1会输出”是决不可能的!
我们先说当“条件比较”指令在正确写成“LD>= D2 K30 ”的前提下,X1 的1#、2#、3#、4#输入脉冲前沿分别对应0.0,2.0,4.0,5.1秒这4个时刻出现时的情况(用下面的时序波形图来说明):
图片中特意安排了一个“3秒滑尺”(长度为300像素)网友们可以把这个图片复制或另存为新图片,然后选中“3秒滑尺”用鼠标拖拽它从左至右的沿时间轴移动,看看这个滑尺是否能覆盖3个脉冲前沿。
我们再看当“条件比较”指令中的“=”字符被粗心落掉的前提下,X1 的1#、2#、3#、4#输入脉冲前沿分别对应0.0,2.0,4.0,5.1秒这4个时刻出现时的情况(用下面的时序波形图来说明):
当X1 的1#输入脉冲前沿发生时刻,M0翻了个面,由M0去测量1#脉冲的时值,经D0的当前值增到“K1”(代表100mS)时,D1(K30)+D0(K1)=D2(K31)这才停止Y1的输出。之后,X1 的第2#、3#、4#脉冲前沿的疏密程度都达不够“标准”!所以,“当X1脉冲出现在2.0,4.0,5.1秒”这3个时刻也决不可能有Y1的误输出!
如果<robotH >网友说的“当X1脉冲出现在0.0,2.0,4.0,5.1秒,Y1会输出”是说“X1输入的1串脉冲,其中有4个脉冲的前沿分别对应于0.0,2.0,4.0,5.1秒这4个时刻出现,Y1会输出”。那么,这2.0秒时刻出现的那个脉冲就必定是第3#脉冲!这4.0秒时刻出现的那个脉冲就必定是第5#脉冲!而5.1秒时刻出现的那个脉冲或者是第6#、也或者是6#之后的某一个脉冲。且,在5.1秒时刻所对应Y1的状态早已是“1”了,根本没有Y1的“上升沿”之说!因为在4.0秒时刻Y1输出后到5.1秒时刻才经历了1.1秒的时间,且第4#脉冲前沿也不可能距4.0秒时刻有1.9秒之差!所以,在5.1 秒时刻前Y1的输出决不会停止,也就不可能给出现在5.1秒时刻的那个脉冲提供“启动Y1”的机会!
第3#脉冲出现在2.0秒时刻,触发Y1的输出,这本来就是符合“在3秒时间之内,X1有3个输入脉冲前沿,则输出Y1”的要求嘛!<robotH >网友怎么会认为是“有问题”呢?!第5#脉冲出现在4.0秒时刻,触发Y1输出,也符合“在3秒时间之内,X1有3个输入脉冲前沿,则输出Y1”。因为从2.0秒时刻到4.0秒时刻,这段时间长度为2秒,其间X1输入了3#、4#、5#这3个脉冲,当然符合目标功能所设定的脉冲密度啦!所以,第5#脉冲出现在4.0秒时刻,触发Y1输出也不能说成是“程序有问题”!
<robotH >网友提出了具体的4个脉冲前沿发生时刻0.0,2.0,4.0,5.1秒。所以,我还要再写一个自动在这4个指定时刻产生脉冲的片断,以便测试这指定的时刻所产生的脉冲会不会在除了第1个时刻(0.0秒)之外的另外3个时刻发生Y1的输出。
下面这个片断就为了实现这个目的的测试片断:
其中X5是用于启动试验的输入命令。当X5输入测试启动命令,程序便自动在指定的4个时刻(以第1个脉冲前沿发生的时刻为计时起点:0.0秒)把脉宽为200mS的脉冲输入到№17楼的那个片断中去,程序运行之后就会自动记录下我们所希望得到的一系列数据。