首页 上一页 1 2 3 4 5 6 下一页 尾页

编程思想的图解(深入浅出) 点击:4823 | 回复:111



wanggq

    
  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-27 14:25:38
楼主

 

  在《求个最简洁的》题目下,我有一个写给<winter938 >网友参考的程序片断(如图1所示)。其程序的构思虽比较简单,但是也有些人在阅读时不动脑筋而对程序的功能理解出了偏差。现在我用图解的方式来讲解,尽量用初学者都能懂的形式把程序的功能讲清楚。

 

  下面这个图1 就是用于实现(在PLC进入RUN状态已达3秒之后)“在任意不足3秒的时间段内,若X1输入的脉冲前沿达到3个,则输出Y1,从X1的任意一个输入脉冲前沿起,3秒以内达不到有3个输入脉冲前沿出现,则停止Y1。”这一目标功能的程序片断:

                      (图1)

 

  这个片断虽不够是“最简洁的”,但是,它却是能正确实现上述目标功能的程序片断。在程序构思上比较符合一般人的思维顺序,比较容易使人理解。

 




wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-27 14:50:18
1楼

 

  任意相邻的仨脉冲a、b、c 所跨时间段都可以用a、b 俩脉冲间的跨距与b、c 俩脉冲间的跨距之和来表达:

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-27 15:35:34
2楼

 

  设想用一把“两脚规”依次轮番去测量顺序出现的各个输入脉冲的时值,并将其时值寄存于数据寄存器。

  用X1的接点触发“ALTP  M0”使M0产生交替运动,这继电器M0就好比一把“两脚规”,依次轮番测量顺序输入的脉冲之时值。

 

   

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-27 16:41:23
3楼

 

  未经触发前,“M0反”测量PLC最初运行的时间(计满3秒截止计数),并将数据寄存于D1。当第1#脉冲前沿发生时,M0翻个面,用“M0”测量1#脉冲的时值,并传送给寄存器D0。当第2#脉冲前沿发生时,M0再翻个面,又用“M0反”测量2#脉冲时值,并传送给寄存器D1。如此这般依次轮番测量下去。

 

sfountain991

  • 精华:1帖
  • 求助:3帖
  • 帖子:5帖 | 39回
  • 年度积分:0
  • 历史总积分:114
  • 注册:2010年9月27日
发表于:2010-09-27 16:50:02
4楼
学习,三菱的,这个是高速计数的把

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-27 17:12:57
5楼

 

  测量了脉冲的时值,就该把相邻的两个时值进行“ADD”运算了。

 

  这种结构顺序是一种“平铺直叙”式的结构,思维层面较低,待我把这个片断讲解完毕之后,我再说思维层面较高一点的结构供大家参考。

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-27 20:26:51
6楼

  

  把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输出的道理。



  但是,假若把比较指令误写成“LD>  D2  K30 ”,则D2(K30)并不大于“K30”,所以“条件比较”的结果是“OFF”,经“INV”指令的翻转变成“ON”,故执行“SET  Y1 ”指令!这就是写错指令导致0.0秒时刻Y1会误输出的原因。

miy_gongkong

  • 精华:0帖
  • 求助:2帖
  • 帖子:23帖 | 3065回
  • 年度积分:0
  • 历史总积分:12421
  • 注册:2008年9月18日
发表于:2010-09-27 20:43:56
7楼

楼主辛苦了,不过我有点小小的建议,希望你能讲讲经典的实例程序,而不是停留在这一个问题上,

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-27 22:45:24
8楼

 

  当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

  • 精华:1帖
  • 求助:0帖
  • 帖子:12帖 | 2176回
  • 年度积分:6
  • 历史总积分:11194
  • 注册:2001年10月26日
发表于:2010-09-28 07:28:33
9楼
老王的绘图工具真强大。这些都怎么画出来的?

明理

  • 精华:1帖
  • 求助:1帖
  • 帖子:43帖 | 3150回
  • 年度积分:0
  • 历史总积分:20986
  • 注册:2007年6月21日
发表于:2010-09-28 08:53:18
10楼
虽是简单的题目,细细分析起来却也不简单,王公如此详尽的解释,受益匪浅。

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-28 10:49:00
11楼

 

  引用<abysmal >的内容:

 

  “老王的绘图工具真强大。这些都怎么画出来的? ”

 


 


  回复:

 

  我是用Windows操作系统自带的一个《画图》程序,很普及的东西。不管做什么事情,只要认真的去做,就一定能把事情做得很漂亮!

 

  曾经有(日本)小鬼子到我们单位调试他们生产的自动生产线,其中有一个“仁丹胡子”刚来时,他那股傲慢劲儿就甭提了!自认为日本是发达国家,在我们面前表现出:很是歧视“支那人”!

 

  但是,我们中国工人有志气!凭着深厚的技术功底和十分认真的精神,也找出了他们制造的设备上的“毛病”,让他们再神气不起来了!是由我们动脑、动手将他们的“毛病”解决了。他们的工程师也不得不赞叹:“老王的活儿干得真漂亮!”


8210zbb

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:14
  • 注册:2004年6月27日
发表于:2010-09-28 12:12:45
12楼
楼主做事真是认真,赞!!!

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-28 15:05:10
13楼

 

  我上面的讲解已经很清楚了:图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个脉冲前沿。

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-28 15:44:32
14楼

 

  我们再看当“条件比较”指令中的“=”字符被粗心落掉的前提下,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的误输出!

 

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-28 16:35:48
15楼

 

  如果<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

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 688回
  • 年度积分:0
  • 历史总积分:2433
  • 注册:2004年10月14日
发表于:2010-09-28 17:29:01
16楼

Wanggq网友:我是用以下程序加在你的程序之前进行测试的,(相应把X1替换为M10),确实Y1有输出。你也可以试一下。

可能是这个测试方法不科学吧,请你不要再耿耿于怀了。正如7楼网友所说:“希望你能讲讲经典的实例程序,而不是停留在这一个问题上”

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-28 20:21:12
17楼

 

  逻辑推理的东西把您说不服,那我也给您来一个实践的!

 

  下面这个片断的实质就是(图1)所示的例程,其中M4就是替代原图1梯形图中的X1,其中的“条件比较”指令也故意把“=”字符给落掉:

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-28 20:39:07
18楼

 

  为了测试楼上这个片断的功能,我写了下面这个测试片断把输入脉冲前/ 后沿的发生时刻都记录下来、把输入脉冲的个数也记录下来、还把Y1输出波形的前/ 后沿发生时刻也记录下来、以及Y1的输出次数都记录下来。

 

 

  只要有了详实的一系列实验数据,我们就可以根据它们把对应的时序波形图做出来。

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-28 21:02:28
19楼

 

  <robotH >网友提出了具体的4个脉冲前沿发生时刻0.0,2.0,4.0,5.1秒。所以,我还要再写一个自动在这4个指定时刻产生脉冲的片断,以便测试这指定的时刻所产生的脉冲会不会在除了第1个时刻(0.0秒)之外的另外3个时刻发生Y1的输出。

 

  下面这个片断就为了实现这个目的的测试片断:

 

  其中X5是用于启动试验的输入命令。当X5输入测试启动命令,程序便自动在指定的4个时刻(以第1个脉冲前沿发生的时刻为计时起点:0.0秒)把脉宽为200mS的脉冲输入到№17楼的那个片断中去,程序运行之后就会自动记录下我们所希望得到的一系列数据。

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-09-28 21:10:54
20楼

 

  我们把这3个片断拼合起来,方便网友们阅读:

 


热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 3 4 5 6 下一页 尾页