当前位置:
台达高手请进,有关子程序调用
回复 | 人气 | 打印
sunsanr 个人主页 给TA发消息 加TA为好友 发表于:2006-05-18 16:05:00 楼主
各位大侠,最近小弟调试程序,遇到了一个问题,还请指教
程序抽出来如下:
   ld m2
   call p1
   fend
p1
   ld m000
   ddrvi k90000 d3000 y0 y1
   sret
   end
程序一旦开始执行,我取消调用条件m2,伺服电机也不停止。
当我不使用子程序时,取消调用条件m2,伺服电机停止。
请高手指点一下,因为根据具体情况,我必须使用子程,特急,非常感谢!!
分享到: 关注收藏 邀请回答 回复 举报
要你命3000 个人主页 给TA发消息 加TA为好友 发表于:2006-05-18 16:10:00 1楼
  应该不会停,不该写Y0,Y1的输出频率,它不就一直输出了吗?
  回复 引用 举报
sunsanr 个人主页 给TA发消息 加TA为好友 发表于:2006-05-18 16:20:00 2楼
  不是阿,估计是我的调用方法不对。
当不使用子程序时   
   ld m2
   ddrvi k90000 d3000 y0 y1
取消调用条件m2,伺服电机停止
  回复 引用 举报
要你命3000 个人主页 给TA发消息 加TA为好友 发表于:2006-05-18 17:38:00 3楼
  不调用,就不会执行,PLC就不会去判断运行条件了。
  回复 引用 举报
sunsanr 个人主页 给TA发消息 加TA为好友 发表于:2006-05-18 18:48:00 4楼
  不调用,就不会执行.
但是,一旦调用,取消条件也不停止了,直到走完给定脉冲数。
当不使用子程序时 ,取消调用条件m2,伺服电机停止。
  回复 引用 举报
piziy 个人主页 给TA发消息 加TA为好友 发表于:2006-05-18 21:01:00 5楼
  当你使用CALL后,在取消CALL导通的条件,P1的程序段处于保持状态
就这么简单...
  回复 引用 举报
lesing 个人主页 给TA发消息 加TA为好友 发表于:2006-05-18 22:13:00 6楼
  当使用CALL子程序调用指令时,一旦调用子程序之后,即使CALL指令的条件接点为OFF,子程序的程序会停止执行,并保持原来的状态。但是DDRVI指令比较特殊,即使子程序停止调用了,DDRVI指令仍然会执行,直到将脉冲发送完毕为止。
  回复 引用 举报
lesing 个人主页 给TA发消息 加TA为好友 发表于:2006-05-18 22:28:00 7楼
 
你如果将DDRVI指令放在子程序中,那么就没有办法中断DDRVI指令发送脉冲。因为DDRVI指令停止脉冲输出的唯一条件是:M2由ON到OFF的时候。而当你将M0由ON到OFF时,子程序P1已经停止调用,此时即使你再将M2由ON到OFF,DDRVI指令也不会停止发送脉冲,而是执行完相对定位指令才结束。因为此时子程序P1已经停止执行,所以PLC就不会知道M2由ON到OFF了.唯一的办法是将DDRVI指令放在主程序中,你如果想通过一个条件去控制PLC停止脉冲输出,那么你可以去控制标志位M1334、M1335(DVP-EH晶体管 机种)
  回复 引用 举报
lesing 个人主页 给TA发消息 加TA为好友 发表于:2006-05-18 22:32:00 8楼
 
不好意思,刚才贴图时,忘记P1指针了!只好重复一遍! 你如果将DDRVI指令放在子程序中,那么就没有办法中断DDRVI指令发送脉冲。因为DDRVI指令停止脉冲输出的唯一条件是:M2由ON到OFF的时候。而当你将M0由ON到OFF时,子程序P1已经停止调用,此时即使你再将M2由ON到OFF,DDRVI指令也不会停止发送脉冲,而是执行完相对定位指令才结束。因为此时子程序P1已经停止执行,所以PLC就不会知道M2由ON到OFF了.唯一的办法是将DDRVI指令放在主程序中,你如果想通过一个条件去控制PLC停止脉冲输出,那么你可以去控制标志位M1334、M1335(DVP-EH晶体管 机种)
  回复 引用 举报
sunsanr 个人主页 给TA发消息 加TA为好友 发表于:2006-05-19 11:08:00 9楼
  谢谢,明白这个了。
还有一个问题:把ddrvi指令放在子程中,执行完毕后取消调用条件,当执行条件再次成立时,ddrvi不执行了,为什么呢?是标志位的问题么?
  回复 引用 举报
lesing 个人主页 给TA发消息 加TA为好友 发表于:2006-05-19 11:21:00 10楼
  你说的当执行条件再次成立是指的图中的M0由OFF变为ON吧?
DDRVI指令是相对定位指令,当DDRVI指令的条件接点M2由OFF变为ON时,DDRVI指令才会执行。而当你的M2一直为ON状态时,即使M0由OFF变为ON,只不过是重新调用了一次子程序,而DDRVI的条件接点并没有由OFF变为ON,所以DDRVI指令在M0由OFF变为ON时不会继续执行第二遍。
  回复 引用 举报
lesing 个人主页 给TA发消息 加TA为好友 发表于:2006-05-19 11:29:00 11楼
  台达的脉冲输出指令DRVI、DRVA、PLSY等如果放在子程序中,当主程序调用子程序后,即使CALL指令的条件接点(比如上图中的M0)突然由ON变为OFF,DRVI、DRVA、PLSY指令仍然继续执行,直达脉冲输出完毕为止
但是如果将定时器、计数器指令放在子程序中,当主程序调用子程序之后,CALL指令的(比如上图中的M0)突然由ON变为OFF,定时器和计数器就会停止计时/计数,并保持原来的计时值/计数值。
  回复 引用 举报
sunsanr 个人主页 给TA发消息 加TA为好友 发表于:2006-05-19 11:33:00 12楼
  谢谢
我指把m0也换成m2之后,这样执行也是不行,为什么呢?
  回复 引用 举报
sunsanr 个人主页 给TA发消息 加TA为好友 发表于:2006-05-19 11:46:00 13楼
 
我在子程中,加了一步延时,这样就可以重复执行了。 但是还是不明白为什么?还请指点
  回复 引用 举报
lesing 个人主页 给TA发消息 加TA为好友 发表于:2006-05-19 11:50:00 14楼
 
你问的这个问题就涉及到程序的时序问题了,从头开始说吧! [1]当M2第一次由OFF变为ON时,程序扫描到第一行时,M2=ON,调用子程序P1,由于子程序中M2=ON,因此执行DDRVI指令,PLC开始发送脉冲给伺服驱动器,[2]在DDRVI指令执行过程中,M2由ON变为OFF,程序扫描第一行时,M2=OFF,不再执行P1子程序,所以DDRVI的条件接点虽然ON变为OFF,但PLC并不会检测到这一状态的变化,因为子程序已经不被执行了。[3]当DDRVI指令已经执行完毕,再将M2由OFF变为ON时,当扫描到第一行时,M2=ON,调用子程序P1,而此时子程序中M2=ON,而PLC并没有检测到M2由OFF变为ON,所以,DDRVI指令仍然不会被执行。
  回复 引用 举报
lesing 个人主页 给TA发消息 加TA为好友 发表于:2006-05-19 11:54:00 15楼
  你发的图片现在还看不到,马上下班了,下午再聊!
  回复 引用 举报
lesing 个人主页 给TA发消息 加TA为好友 发表于:2006-05-19 11:57:00 16楼
  没看你的延时程序,能不能把延时程序一起贴上?
  回复 引用 举报
sunsanr 个人主页 给TA发消息 加TA为好友 发表于:2006-05-19 12:17:00 17楼
  谢谢了,是不是发高速脉冲的指令都是如此呢?
  回复 引用 举报
lesing 个人主页 给TA发消息 加TA为好友 发表于:2006-05-19 13:43:00 18楼
  TO:sunzhenhua
对,如你所说,高速脉冲输出指令都如此!不过我还是没有看到你所说的延时程序。
  回复 引用 举报
sunsanr 个人主页 给TA发消息 加TA为好友 发表于:2006-05-19 16:00:00 19楼
  上面所的程序中的,mo,实现延时一个扫描周期,这样,
伺服可以重复执行了
  回复 引用 举报
lesing 个人主页 给TA发消息 加TA为好友 发表于:2006-08-19 16:42:00 20楼
     
  回复 引用 举报
工控豆豆 个人主页 给TA发消息 加TA为好友 发表于:2006-09-27 08:22:00 21楼
  我也用子程序做过一个程序,如果外围操作麻烦的话可以把程序分成若干个部分,那样方便以后看起来方便,但是调试和编程时有一定的麻烦.子程序一但被调用再停止调用时有比如M区Y区等会保持原来的状态.这些都应该注意.不过用子程序编程以后检查程序时挺方便.个人看法,呵呵.我也是从前年才开始学台达PLC的,想和各位老师交个朋友.谢谢~~~
  回复 引用 举报
SUNFAW 个人主页 给TA发消息 加TA为好友 发表于:2006-10-03 11:17:00 22楼
  大家好 初学者
  回复 引用 举报
SUNFAW 个人主页 给TA发消息 加TA为好友 发表于:2006-10-03 11:18:00 23楼
  大家好 初学者
  回复 引用 举报
一元 个人主页 给TA发消息 加TA为好友 发表于:2007-01-15 21:10:00 24楼
  谢谢了
  回复 引用 举报
shenxinwang 个人主页 给TA发消息 加TA为好友 发表于:2009-11-05 10:40:42 25楼
 

不错!有收获,值得借鉴

  回复 引用 举报
kissstar 个人主页 给TA发消息 加TA为好友 发表于:2015-05-04 12:08:49 26楼
 

这是子程序的特点,断开时调用时,内部的状态会保持。如果想终止内部逻辑需要自己编写程序。

  回复 引用 举报
ruguodeshi 个人主页 给TA发消息 加TA为好友 发表于:2015-05-04 13:45:42 27楼
 

一起学习了,大家一起分享啊

  回复 引用 举报
kingszj 个人主页 给TA发消息 加TA为好友 发表于:2015-05-20 08:38:34 28楼
 

一起学习了,大家一起分享啊

  回复 引用 举报
俩渔樵 个人主页 给TA发消息 加TA为好友 发表于:2015-07-10 22:13:33 29楼
 

我过去做定位指令时也遇到过类似的问题,程序一旦长了可读性很差。现在用ISP软件写程序由于是模块化的,很容易阅读,更重要的是可设定全局变量和局部变量,这样读和写程序或调试都非常方便。

  回复 引用 举报
guangling11 个人主页 给TA发消息 加TA为好友 发表于:2015-09-17 14:44:24 30楼
 

风格的点点滴滴点点滴滴的点点滴滴滴滴

  回复 引用 举报
guangling11 个人主页 给TA发消息 加TA为好友 发表于:2015-10-19 09:17:11 31楼
 

jfhgjghjgh

  回复 引用 举报
yme 个人主页 给TA发消息 加TA为好友 发表于:2017-01-28 21:27:03 32楼
 

学习了,希望高手学习v学习


  回复 引用 举报
brillian0315 个人主页 给TA发消息 加TA为好友 发表于:2017-06-22 15:12:26 33楼
 

一起学习了,大家一起分享啊

  回复 引用 举报
凡尘一过客 个人主页 给TA发消息 加TA为好友 发表于:2017-07-14 12:00:07 34楼
 

一起学习了,大家一起分享啊

啊都是大神我学习了

  回复 引用 举报
Smile-lyc 个人主页 给TA发消息 加TA为好友 发表于:2017-07-14 12:59:45 35楼
 


引用 brillian0315 的回复内容: 一起学习了,大家一起分享啊


  回复 引用 举报
xiaoshen1989 个人主页 给TA发消息 加TA为好友 发表于:2017-09-01 11:03:14 36楼
 

一起学习了,大家一起分享啊


  回复 引用 举报
小颠工 个人主页 给TA发消息 加TA为好友 发表于:2017-09-20 14:02:03 37楼
 

初学者一起了学

  回复 引用 举报
shaoxing86 个人主页 给TA发消息 加TA为好友 发表于:2017-09-30 20:30:56 38楼
 

很精彩学习了

  回复 引用 举报
maomaxu1985 个人主页 给TA发消息 加TA为好友 发表于:2017-12-22 18:20:13 39楼
 

不调用,就不会执行,PLC就不会去判断运行条件了

  回复 引用 举报
云在 个人主页 给TA发消息 加TA为好友 发表于:2018-11-10 10:27:51 40楼
 

请教!!!

我放入FEND指令的时候,点确定显示无效的指令???不知为什么?

  回复 引用 举报
20181201155625 个人主页 给TA发消息 加TA为好友 发表于:2018-12-02 15:12:20 41楼
 

谢谢分享!终于找到解决问题的


  回复 引用 举报

周点击排行
周回复排行
最新求助