编程思想的图解(深入浅出) 点击: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-28 21:28:32
21楼

 

  让PLC自动运行一次,我们所需要的一组实测数据就出来了:

 

wanggq

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

 

  因为在程序片断中的“条件比较”指令是故意写成“LD> D2 K30 ”的,即故意让Y1在0.0秒时刻启动输出,当D0的内容由 K0 增加到 K1 时,“0# 时段”的当前时值(D2 的内容)就等于 K31, 即: D2 > K30 。所以在0.1秒这一时刻Y1的输出就停止了。

 

  我们把楼上的一组数据转换成如下的时序波形图:

 

wanggq

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

 

  把测试功能片断加上注解,让网友们更易理解程序的功能:

 

  从测试监视图片中,我们可以看到,按照<robotH >网友指定的4个时刻输入脉冲,程序在2.0,4.0,5.1秒时刻根本没有输出!

wanggq

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

 

  如果不故意缺写“比较指令”中的“=”字符,把该指令正确写成“LD>= D2 K30  ”,则测试的结果为:Y1连一个输出都没有!

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2010-10-01 17:16:17
25楼
引用robotH 的回复内容:

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




      回复:

 

       从您提供的这个梯形图来看,您的错误是把测试片断放错了位置!应该考虑PLC计时器的特点。100ms计时器的分辨率是比较低的。从2#(2.0秒)到4#(5.1秒)这段时间是3.1秒,这就非常考验PLC中100ms计时器的分辨能力!

 

     

liqichao951989

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 72回
  • 年度积分:0
  • 历史总积分:332
  • 注册:2010年9月16日
发表于:2010-10-02 14:25:58
26楼

高。。。。。。。。。。。。。

 

wanggq

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

 

  现在要讲一讲三菱FX系列PLC中100ms的计时器的工作原理:

  当程序扫描至计时器“驱动条件”为“ON”时,还要恰逢100ms时钟信号为“ON”期间(它只有50ms的脉宽)计时器中的“计数器”数据内容才会增1。假如不巧,它恰逢100ms时钟信号的“ON”刚刚翻转为“OFF”(这个期间也是50ms的宽度),那么,它还要等几个甚至十几个扫描周期才会再让计时器的“计数器”数据内容增1!

 

 

wanggq

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

 

  <robotH >网友把他的“测试片断”放在“输入脉冲密度判别”功能片断之前就是一个错误!他的所谓“X1脉冲出现在0.0,2.0,4.0,5.1秒时刻”只是他的“期望值时刻”,而“输入脉冲密度判别”功能片断所实测到的数据并不是这个“期望值”!

  PLC指令的运算是要占用一点时间的,测试片断放在最前面,则测试片断中的T11、T12、T13的驱动时刻就要早于“输入脉冲密度判别”功能片断中T0、T1的驱动,这个时差就足以让PLC的运算在时间上产生误差!

 

cqu_rockwell

  • 精华:16帖
  • 求助:0帖
  • 帖子:678帖 | 8694回
  • 年度积分:0
  • 历史总积分:57901
  • 注册:2010年6月30日
发表于:2010-10-04 16:23:57
29楼

学习了。。。。。。。。

wanggq

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

 

  对应于楼上这个试验程序的测试数据如下:

  在这个数据表上我们可以看到测试的最后一个D0的数据是“K10”(即3#脉冲与4#脉冲的间隔之实测值是1.0秒),另外还有一个数据是2#脉冲与3#脉冲的间隔用D1测试的数据是“K19”即1.9秒,(这要再增加一个测试片断才能显示出来)
 
  2#时段为:D1+D0 = 1.9+1.0 = 2.9   (秒)
                                                                                                                                                        
       “密度判别”功能片断根据2#时段的实测值2.9秒内有2#、3#、4#这3个脉冲输入,所以做出让Y1第2次输出。这也是符合题目的目标要求的嘛!与“期望值”发生差错,这错不在“密度判别”功能片断,而是<robotH>的测试方法不得当的结果!

wanggq

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

 

  即便是把“产生指定时刻的脉冲”之功能片段放在最前的位置,也决不可能产生在2.0,4.0秒这两个时刻Y1有输出的现象!因为1#时段内2#脉冲是决不可能触发Y1输出的,而3#脉冲又距首脉冲前沿有4秒时间,很明显的大于3秒。所以PLC毫不费力的就能分辨出来!

 

     只有2#时段的设定时间3.1秒,刚好处于100ms分辨率的“大于3秒”临界点,PLC的指令运算所具有的时差(比如:1个微秒)就可能造成T0或T1少计0.1秒,从而造成D2的数值不大于3秒,使Y1输出也是正常的现象!

                              

wanggq

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

上面的图片宽了一些,右边的信息看不到,我把图片向左移动一部分以便让网友们看全图片的全部信息:

wanggq

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

 

         X1输入脉冲前/后沿时刻表及Y1输出波形前/后沿时刻表数据改用1ms时间单位:  

      如图片下段所示,为了检测到2#时段中的D1实测值,我再给检测片断增加一个“LD  M0     MOVP    D1   D79V1 ”的片段。

 

 

      把2#时段中的D1‘终了值’(K19)与2#时段中的D0‘终了值’(K10)相加(其结果‘K29’寄存于D2)。这个2.9秒与设定值3秒比较,当然不大于3秒啦!所以,Y1这时输出自然是合符‘目标功能’的啦!

 

 

wanggq

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

 

  <robotH>网友的测试片断采用设置分辨率“临界点”去考验PLC计时器的分辨率,不仅仅能够让图1所示的程序片断发生测试误差,对于所有的采用相同分辨率(100ms)计时器的程序片断都不可避免的会发生测试误差!譬如<robotH>网友自己在《求个最简洁的》第32楼的那个片断也一样在“期望值5.1秒时刻”Y1发生误输出。但是,<robotH>网友就没有认为这是“程序有问题”,他在紧接的第33楼说他“在PLC上做了验证,没有问题”:

 

  在“期望值5.1秒时刻”Y1会输出,确实不是“输入脉冲密度判别”之程序片断的“问题”。但是,<robotH>网友的这个片断却确确实实的存在“当输入脉冲密度下降后,Y1继续有输出”的毛病。从第3# 输入脉冲起计算的3秒时间内第4#输入脉冲以后仍然没有出现第5#输入脉冲的情况下Y1没有停止其输出。

 

wanggq

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

 

  下面是把<robotH>的测试片断放在他自己写的“脉冲输入密度判别”功能片断的前面的检验程序:

 

wanggq

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

 

  下面是两次试验分别所测得的数据:  (单位:10ms)

 

    D60起始的10个数据寄存器都没有被测试数据刷新过,足以证明:<robotH>的“密度判别”功能片段是不能识别出“脉冲密度下降”情况的!

wanggq

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

 

  最公平的测试方法是用另一个PLC来产生指定时刻发生的一系列脉冲,以晶体管输出的方式向“脉冲输入密度判别”功能程序的实际“X1输入端口”输入脉冲来测验。

 

      测试时还要注意把X1的输入滤波常数设置成最小。

 

     以后有空闲的时候,我再把以“输入脉冲时序波形图”为依据转化成数据来控制PLC产生设定脉冲串的简洁程序贴出来。(按下面这个时序波形图所示的各个时刻设定出14个脉冲)

penghuida

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 10回
  • 年度积分:0
  • 历史总积分:43
  • 注册:2010年9月18日
发表于:2010-10-16 16:33:46
38楼

高,小弟学习了。。。。。

WZY542293926

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 26回
  • 年度积分:0
  • 历史总积分:134
  • 注册:2009年11月28日
发表于:2010-10-18 11:21:59
39楼

太牛了     、、、、顶下

雨里看花

  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 16回
  • 年度积分:0
  • 历史总积分:116
  • 注册:2010年9月05日
发表于:2010-10-18 21:21:35
40楼
NB                                              XUEXILE

热门招聘
相关主题

官方公众号

智造工程师