三菱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,请问有其他方法可以实现吗?谢谢!


楼主最近还看过



HONGCHANZI

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 7回
  • 年度积分:0
  • 历史总积分:16
  • 注册:2008年7月29日
发表于:2009-03-18 08:33:53
21楼

请教各位高手,高速计数器,写入M8236.RST_C236.C236能写入,但不能运行,我想不懂,请指教,多谢QQ919012646.

wanggq

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

 

    第19 楼的“swading”的方案是迄今为止最好的方案!我把它用梯形图表达出来供网友们参考,并希望能有更简练的写法出现!

 

芳季

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

让大家开开眼界吧。用相同的程序可以处理最多256个报警数。

ld m8000

mov k2x10 k2m0

for  k8

ld m0

inc d0

ld m8000

sfrb  m0 m8001 k8 k1

next

芳季

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

程序思路应该清晰吧。但是我没有上机试过。

HDIHHT@TOM.COM

wanggq

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

 

    谢谢"芳季"网友!思路够清晰!

 

  但是,我觉得应该这样写:

 

  LD        M8000

       MOV      K2X10         K2M1

       RST       D0

       FOR       K8

       LD          M8000

       SFTR     M8001         M0         K9        K1

       LD          M0

       INC         D0

       NEXT

 

 

wanggq

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

 

   我也没上机试过,下午去上工的时候试一试!

xiaolou

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 296回
  • 年度积分:0
  • 历史总积分:677
  • 注册:2007年6月22日
发表于:2009-03-23 16:10:09
27楼
引用saitc701 的回复内容:使每个输入X产生一个脉冲输出,然后由每个脉冲输出来驱动计数器C,再把每个计数器里的当强值相加,得到你所要的故障数!



芳季

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

RST D0是我漏了。但是其他的区别我觉得你的教烦。

干吗要占个K9呢?一移过来第一个是1的话已经可以加1了。何必要通过M0启动呢?

还有更短的程序吗?

老实说啊。我的程序运行时间是很长的啊。

wanggq

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

 

  回复“芳季”网友:

 

   谢谢“芳季”的提示!我的程序确实是繁了一些!再改一下,如此这般:

 

wanggq

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

                             

电笔

  • 精华:0帖
  • 求助:0帖
  • 帖子:10帖 | 645回
  • 年度积分:0
  • 历史总积分:785
  • 注册:2005年4月02日
发表于:2009-03-23 22:37:40
31楼
真的开眼了,学习......

wanggq

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

 

  如果在电脑上输入一个“非法指令”,编程软件会提示你“指令设置错误”:

 

wanggq

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

 

  我猜是“芳季”网友不小心打错了字符:把“sfrd”的字符“ d ”打错成“ b ”了!“sfrd指令”叫做“移位读出”,但这个指令的“操作对象”是字元件而不是位元件。所以把“b ”改成“d ”之后,软件就会提示你操作数的“设置错误”:

 

 

 

wanggq

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

                            

 

 

wanggq

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

 

  改成“位右移”指令后,输是能输进程序里了,但是它还是存在错误:把指令的“源操作数”与“目标操作数”的位置弄颠倒了!所以这个程序仍然是不行的!

wanggq

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

 

  这里的“位右移”指令应该改成:

 

wanggq

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

 

  “芳季”网友展示的程序有两个错误:1、缺少对数据寄存器D0清零的语句;2、使用了非法的移位命令。

 

  缺少清零语句,造成累积数据错误;使用非法“移位命令”造成程序无法输入。即使把“芳季”网友的“sfrb”指令改成“sftr”,程序也还是有错误的!

 

  譬如说,若X10=0时,对应的M0也等于0 ,这时即使X11、X12、……X17中有一些点有报警信号,“芳季”网友的程序也不能累计出报警点数量

 

来;若X10点有报警输入时,不管其它点有无输报警输入,只要在X10=“1”的持续时间内,该程序都会对D0的内容持续的“加1”(每个程序周期内要执行

 

8次“加1”)造成错误的累计结果!

 

  而在FX1n或FX1s上,当X10持续为“ON”的前提下,这条“sftr  m0  m8001  k8  k1 ”指令只能有4次正确的执行结果!且,这条命令的执行

 

结果无论正确与否,其结果根本都不会在该程序中对D0中的数据起到任何的控制作用!

 

 

芳季

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

哇!我很高兴上面的同志这么仔细。

我上面的程序是爆肚写出来的,或许有跟SIEMENS的混淆了。指令的真正写法也没有弄清,这的确是我的错。

说回来,这个思路我确实在程序上是用过的。

引用

<譬如说,若X10=0时,对应的M0也等于0 ,这时即使X11、X12、……X17中有一些点有报警信号,“芳季”网友的程序也不能累计出报警点数量
来;若X10点有报警输入时,不管其它点有无输报警输入,只要在X10=“1”的持续时间内,该程序都会对D0的内容持续的“加1”(每个程序周期内要执行
>

怎么会呢?循环的过程中M0已经不再是循环次数(n-1)的值了。

第一次执行M0是X10

第二次执行M0是X11

……

每当遇到M0为1的时候就加1了。

wanggq

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

 

  我就喜欢认真仔细的和网友们交流心得!只有这样才能相互促进和提高!我不喜欢那些在这个技术论坛上掷“烂砖”砸人的所谓的“知识分子”比如“iton”、“通讯网”、“雅各宾”、“haha_gao”、“sangkunpeng”这一干人等。掷“烂砖”砸人只能说明他们没有水平,他们的知识顶多只有“半桶水”!

 

  对于“芳季”网友我很欣赏!因为“芳季”网友的多数跟帖是比较认真的。

wanggq

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

 

  回复“芳季”网友的疑惑:

     

 “怎么会呢?循环的过程中M0已经不再是循环次数(n-1)的值了。 第一次执行M0是X10  第二次执行M0是X11   ……  ”

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

  在“芳季”展示的程序中,M0的状态始终是跟X10的状态一致的。它由“MOV     k2X10       k2M0 ”这条传送指令来决定。X10所对应的就是辅助继电器M0。

 

  “芳季”本想用一条“位右移”指令把由“k2m0”所定义的一个“8位的移位寄存器”(m7、m6、m5、m4、m3、m2、m1、m0)中各位的状态顺

 

次向右逐位传递。但是,“芳季”网友把这条指令定义的“源操作数”与“目标操作数”弄颠倒了。(“指令字”后面紧接的第一个“操作数”叫“源

 

操作数s ”,依次第二个“操作数”叫“目标操作数D ”)所以,当这条“位右移”指令执行时,其结果并不是所希望的:

 

 

M8001→m7→m6→m5→m4→m3→m2→m1→m0  ,

 

       而是原本所不希望的:

 

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

 

  我们知道:在FX1n和FX1s中,特殊继电器M8001至M8004是被系统定义了的,在用户程序中只能运用它们的状态,而不能对它们进行驱动;对于

 

M8005至M8008这4个特殊继电器,系统虽然没有对其定义,但是操作手册上要求我们一般不要在用户程序中驱动它们。当然,我们也不一定要格守这样

 

的成规!只要您能在不影响程序的正常运行的前提下,也可以对它们进行驱动操作!

 

  当X10=“1”时,M0也等于“1”,循环的第1次执行“sftr      M0      M8001      k8       k1 ”这条指令的结果是:把M0的“1”状态传送到

 

M8008使它的状态变为“1”,原M8008的状态“0”传送到M8007 ,原M8007的状态“0”传送到M8006……

 

  当M8003的状态(程序运行中,其状态为“1”)传送到M8002时就出问题了:因为M8002被系统定义为“初始化脉冲”(程序进入Run第1个周期过

 

去之后就该是“0”状态),所以M8003的“1”状态是不可能被传送到M8002的!

 

  在X10持续为“1”状态的前提下,“sftr    m0     m8001     k8      k1 ”这条指令最多能将4个“1”传送给M8008至M8005 ! 这就是我说

 

“在FX1n或FX1s上,当X10持续为“ON”的前提下,这条“sftr  m0  m8001  k8  k1 ”指令只能有4次正确的执行结果!”的理由。

 


热门招聘
相关主题

官方公众号

智造工程师