三菱plc指令请教 点击:16580 | 回复:165



tiger-auto

    
  • 精华:0帖
  • 求助:1帖
  • 帖子:27帖 | 39回
  • 年度积分:0
  • 历史总积分:0
  • 注册:2003年11月05日
发表于:2005-07-16 19:34:00
楼主
我现用FX1N的三菱PLC做一个案子,其中有连续的8个输入点X10-X17为故障信号,我想得到一个故障发生的总数量,三菱的指令有一个数据ON位数求和,FNC43(SUM),可该指令仅适合FX2N和FX2NC,请问有其他方法可以实现吗?谢谢!


楼主最近还看过



wanggq

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

 

  再说,无论您循环多少次的执行“sftr  M0  M8001  k8  k1 ”这条指令的结果都是:

 

  M0→M8008→M8007→M8006→M8005→M8004→M8003→M8002→M8001

 

  把“ M0 ”放在“源操作数”的位置上,无论指令执行多少次,“源操作数——M0 ”的状态都是不会随着指令的执行而转移的!它只能随着

 

X10的变化而变化。怎么可能如您想象的:随着循环次数的改变而改变M0所代表的报警输入点呢?在每一次循环中,M0所代表的报警点始终都是:X10 !

 

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2009-03-24 15:37:31
42楼

 

  M8008至M8005这4个特殊继电器虽然可以破例在FX1n或FX1s上被用户程序所驱动,但是,它们的状态改变并不能改变数据寄存器D0中的内容,因

 

为在您所展示的程序中,数据寄存器D0内容的“加1”的条件是:M0=“1” 。

 

  D0内容是否“加1”仅与M0有关。 而M0又不受“sftr  M0  M8001  k8  k1 ”这条指令的控制。所以我才说:

 

这条“sftr  m0  m8001  k8  k1 ”指令的执行 结果无论正确与否,其结果根本都不会在该程序中对D0中的数据起到任何的控制作用!

 



胡立桦

  • 精华:1帖
  • 求助:1帖
  • 帖子:29帖 | 247回
  • 年度积分:100
  • 历史总积分:1126
  • 注册:2006年4月13日
发表于:2009-03-24 20:50:12
43楼

有意思 好像 我们的验瓶机里面和这 有点像

wanggq

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

                                                                              

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2009-03-24 23:48:06
45楼

                                       

  片断1中的“位右移”指令的第2个操作数是“目标操作数”,按常规是不能用“特殊用途继电器”来做操作“目标”的。不过,您有打破常规的思想方法也是一种创新的精神!只是要注意:不能和系统的定义相冲突!

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2009-03-24 23:48:43
46楼

                                                                                                 

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2009-03-25 12:24:16
47楼

那就是说,只有第二这个结果是对的。

楼上的也算交足功课了。

经你这么一说一画。旁边捂着嘴看的,都应该明白透了。

不过,这个程序还不值得深入研究了。这只是花拳绣腿,没有实用意义的。简单的示范或者作为教学题材还差不多。因为运行太浪费扫描时间了。前面的8行INC D0虽然不是最短,但却是执行很快的程序。无疑是最实用的。

工控生涯

  • 精华:0帖
  • 求助:0帖
  • 帖子:5帖 | 90回
  • 年度积分:0
  • 历史总积分:268
  • 注册:2008年12月21日
发表于:2009-03-25 12:33:38
48楼
用这几个点的上升沿加一,用这几个点的下降沿减一

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2009-03-25 13:16:42
49楼
引用芳季 的回复内容:

那就是说,只有第二这个结果是对的。

楼上的也算交足功课了。

 


 


   并不是说“只有第二这个结果是对的”。事实上,可以有多种多样的程序其结果是对的!就是您那个把“特殊继电器”用作“位右移”指令的操作“目标对象”,还把特殊继电器状态的移位误当作报警状态的移位的程序是错的。

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2009-03-25 15:00:31
50楼

 

  我于3月22日在№22楼贴出“swading”网友的 8行 INC D0  的程序,并称是当时(3月22日)来讲“迄今为止”最好的方案。并希望有人来参与,写出更好更简练的解决楼主提出的问题的程序。

 

  这不!引起了“芳季”网友的兴趣。贴出一个用“循环语句”和“移位命令”结合的解决方案来让我们大开了眼界!

 

  不过,“芳季”网友的程序有一些错误。所以我在№25楼贴出了我的一个程序,这个程序写得繁了一些,但是,它却是能够正确统计出报警点数来的。它的这个“繁”,事实上是我有意为续下来的讨论打下的伏笔。让网友们挑挑“破绽”好引出更深层次的话题。

 

  接下来我就开始回答“芳季”网友这样的提问:“干吗要占个K9呢?一移过来第一个是1的话已经可以加1了。何必要通过M0启动呢?

还有更短的程序吗?

 

 

  用“循环语句”在程序的每个扫描周期里都要循环重复8次执行“位右移”指令,如果出现报警的点数达到8个的话,还要重复执行8次“INC  D0 ”指令。这样是很费时间的,使程序的扫描周期拖得很长。扫描周期太长就不利于PLC实时的控制设备的运行!所以我们要设法缩短程序的扫描周期。

 

  报警点的信息并不是经常或快速不断在变动的,而是很久才可能有报警信息的变动。所以我们没有必要让程序每一个扫描周期都去循环执行“统计报警点数”的任务。把时间腾出来让PLC去执行它主要的控制任务!

 

  我“干嘛要占个K9呢? ”我占个K9是想在统计出“报警点数”之后再重复利用“K2M1”这个字节的内容,把它与“K2X10”进行比较,当“K2M1”与“K2X10”的内容一致时,就让程序跳过循环的这一段程序去执行主要的控制任务,不必每个周期都去重复统计“报警点数”从而提高PLC对设备控制的“实时性”!当报警信息出现新状态时,通过比较“K2M1”与“K2X10”的信息有不同时,又才去执行“报警点数”的统计任务。

 

学海无涯KZZH

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 129回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2009-03-25 15:43:02
51楼
真了不起       在此学习了

wanggq

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

 

  在№25楼贴出来的程序的基础上稍加改动,得到一个新程序,我希望以这种改动来实现“缩短扫描周期”的愿望:

 

hanyf2008

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 65回
  • 年度积分:0
  • 历史总积分:234
  • 注册:2008年9月12日
发表于:2009-03-25 19:23:59
53楼

看了各位高手的讲解,收获很多,谢谢。我是新手,请多帮助

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2009-03-26 12:25:40
54楼

这天真正让大家开眼界的是

什么是论坛?这个才叫论坛。

比较 跳转 循环 转移

如虎添翼。

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2009-03-26 12:29:18
55楼

这就是

从少到多,从多到少;
从浅到深,从深到浅;
从简到繁,从繁到简;

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2009-03-28 13:41:39
56楼

 

      到这样的培训班学习太花钱!,只要大家是以一个学习和交流的态度在这个论坛上认认真真的交流心得,也是能够学好PLC的!

 

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2009-03-28 13:47:45
57楼

 

  大家可以再动动脑筋,看看还能不能把№52楼的程序写得更好,让程序的每个扫描周期都得到缩短?!

 

 

wanggq

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

 

  贴在№52楼的程序的编写思路是:平常没有报警时,“k2m1”字节的内容是“0000”与“K2X10”字节的内容“0000”是一致的。通过“接点

 

比较”(<>       K2X10         K2M1  )得出:“传送(MOV       k2X10         K2M1    )指令”及“清零( RST      D0 )指令”的执行条件“不成立”。

 

于是,这时程序是不执行这两条指令的。我认为:程序不执行这两条指令,因而这两条指令在这种情形下就不会占用程序的扫描周期时间(不知道我的

 

理解对不对,谨供网友们参考)。再通过第3行的“反相(INV )指令”构成“跳转(CJ     P0 )指令”的执行条件“成立”,使程序直接跳过“循环范

 

围”,避免毫无意义的循环重复8次执行“位右移(SFTR  MO  M0  K9  K1)指令”,因为这时“K2M1”字节内各个“位”均为“0”,

 

完全没有去统计这一字节内有多少个“ON”的“位”的意义!

   

wanggq

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

 

   在设备运行中,倘若设备的某些构件或局部出现问题,送出了报警信号,这时通过“接点比较(<>  K2X10 K2M1 )指令”得出:“传送

 

(MOV k2X10 K2M1 )指令”及“清零( RST D0 )指令”的执行条件“成立”。于是,程序把“K2X10”字节的报警信息传送给“K2M1”字节,接着把

 

存贮报警点数的统计数据的寄存器“D0”的内容“清零”。这第1次的“清零”虽然没有意义,但是,我们也没有必要刻意避免这一次的“ RST  

 

D0 ”因为这条指令执行一次只占“3步”除这第1次之外倘若“K2X10 ”字节的报警信息发生改变(或报警排除,抑或产生新的报警),我们要“刷

 

新报警统计数据”,对“D0 ”执行“RST指令”就是最简的必不可少的措施!程序对“D0 ”执行“RST指令”则意味着这时“跳转(CJ  P0)指

 

令”的执行条件“不成立”。所以,程序进入循环范围,反复执行8次“位右移(SFTR  M0  M0  K9  K1 )指令”及有条件的重复执行

 

“INC D0 ”,进行报警点数的统计过程。这一过程是相当费时间的。循环结束之后数据寄存器“D0”内容就被刷新成现时的报警统计数据了(这个数 

 

据也有可能是:所有“报警”被完全排除的状态数据)。

 


wanggq

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

 

    由于程序采用了“环形移位寄存器”结构,当循环满8次时,“k2M1 ”字节的内容又还原成由“MOV K2X10 K2M1 ”所刷新之后与

 

“K2X10”字节相同的状态。“环形移位寄存器”把这个刷新之后的状态保存在“K2M1”字节内,与“K2X10”字节内容相比较,只要“K2X10”字节内容的

 

状态不发生新的变动,程序就跳转过循环范围,从而腾出时间让PLC去完成对设备的主要的控制任务。直到“K2X10”字节中出现新的报警状态,程序又才

 

去循环统计出新的报警点数的数据(也有可能是报警排除后的信息数据)。 



热门招聘
相关主题

官方公众号

智造工程师