三菱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-04-28 19:25:39
141楼

 

  引用4月23日“芳季”的话:<请程序用调用数据的原始数据的块大小也列出来。因为这也是程序的不可分割部分。应该计算列入程序空间。>

 

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

 

①、我这样理解“芳季”所讲的 “数据的块大小”:

  “数据块”是指连续的若干个数据寄存器构成的区域。“数据的块大小”是指可能被程序调用到的区域中寄存器的个数(即:数据的个数)。我认为“数据块大小(即:数据个数)”与其数据的“数值大小”是不同的两个概念。

 

②、我这样理解“芳季”所讲的“程序空间”:

  “程序空间”是指程序量的大小。

  我们知道:PLC的程序容量是有最大容量限制的。它由PLC实体硬件的内存容量来决定其大小。不同品牌的PLC描述其最大程序容量的术语可能不同。譬如:用三菱的术语来描述,是程序“步”的多少;还有其它品牌,有的用多少“W”即:多少个“字”来描述;有的用多少“I”即:多少条“指令”来描述;还有的是用多少“B”即:多少“字节”来描述。

 

三菱各系列PLC的程序最大容量各不相同。

 

FX0的最大程序容量为:800步; FX1(旧版)为:1K步; FX0s为:800步;FX1s为:2000步;FX1n为:8000步;FX2n为:8000步;FX3U为:64000步。

  可见,一个指定的PLC,其最大能容纳的程序量是有限的。为了希望在有限的内存空间里写出能完成更丰富、更强大的功能的程序来,所以,我们平常要练习怎样把PLC程序写得“简练”一些!还有另一个重要的原因是:PLC每执行一个“程序步”是需要一点时间的,程序量愈大,则程序的周期扫描时间就愈长。这样就很不利于提高PLC的控制“实时性”!所以,即便PLC的内存容量相对于我们的控制程序来说是足够的大,我们为了使控制过程有很好的“实时性”,也力争要把程序写得简短一些!

 

wanggq

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

 

  “芳季”的这句<请程序用数据的原始数据的块大小也列出来。因为这也是程序的不可分割部分。应该计算入程序空间。>给我的感觉是:他认为看一个指定功能的程序是不是写得简练,不能单看这个程序所占“步”数的多少(“步”数的多少在一定程度上反映了程序的周期扫描时间的长短),还要看“数据的块大小”(即:数据个数),要把“数据个数”也计算入程序空间(即程序“步”数)中去。这样计算出来的“程序量”才能完整的反映出程序量的大小来。

  “芳季”所谓的“应该计算入程序空间”是怎样的一种“计算”呢?该不是说“用减法的计算”吧?!

  我猜想“芳季”是想“用加法来计算”!把“数据的块大小”加算到一个指定程序的“步”数中去。如果“数据的块大小”的“数目”较大,则“用加法”来计算入程序空间的结果就是:合计的程序空间变得“较大”了!

  为了确认我上述的这个猜想,我于4月26号在《各位大虾请过来探讨……》一文的第100楼贴出一个帖子其内容如下:

 

  请教“芳季”网友:数据块的大小(譬如:1个数据与100个数据的区别)跟调用它的程序空间大小(假设调用这些数据的程序都是相同的“程序步数”譬如:都为26步。)有关联吗?

 

wanggq

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

 

譬如如有这样一个程序(片断):

 

LD           X0                     

 

OUT        T0         K600               

 

LD           T0                

 

 OUT        Y0              

 

END              

 

和这样的另一个程序(片断):

 

 LD        X0  

                                                                    

OUT      T0     D500                                 

           

LD           T0

          

OUT        Y0


 

END                  ( D500是一个停电保持的数据寄存器,其中的内容是用编程工具直接写进去的“k600 ”)

                             

                                     

  这两个程序片断除了计时器T0的设定值的表达方式不同(上面一个片断中T0设定值是用“立即数”直接指定的;下面一个片断中T0的设定值是用数据寄存器D500间接指定的)之外,所有的内容都是相同的。

 

  根据三菱的编程手册对指令的解释,这两个片断分别所实现的功能及各指令的执行“步”数都完全是一样的!

 

  所以,不管程序中是否用到数据寄存器D500,两个程序的大小(即两个片断各自所占的程序空间)都是一样的!

 

 

wanggq

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

                                  

wanggq

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

 

  把局部放大一些可以看得清楚一些

 

wanggq

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

 

  在FX2n上,不管计时器的设定值是用“立即数”直接指定,还是用数据寄存器间接指定,“OUT    T   (K) ”和“OUT      T    (D) ”的ON状态的执行时间都是43微秒,OFF状态的执行时间都是38微秒。用“步”的概念来表达,两者的指令“步”数都是3(步)。完全没有差别!

 

 

wanggq

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

 

  接下来,我们再比较一下那个按时段分配阀位动作的程序。一个程序是为200个时间段所写的分配程序;另一个是为20个时间段所写的分配程序。其中一个程序要调用400个数据;另一个程序只调用40个数据,两者悬殊10倍!但是,两者的程序大小是一样的,都是(不计END)26步的程序!两者对应的程序扫描周期都是一致的!不会因为哪一个程序所调用的数据个数多一些,而使得“程序扫描周期”拖长!

 

wanggq

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

 

<紧接第3页第150楼的内容>

 

  请大家注意:“程序扫描周期”与控制功能内容中的“全部时段循环分配周期”(也可以称为“任务循环扫描周期”)是完全不同的两个概念!

 

 

芳季

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

我只是想说程序思路渗入到数据块中。便可以令程序更简炼。没有其他什么意思了。

象电脑的内存和硬盘。部分程序常驻内存作用是去调用和指挥其他程序。而在硬盘里的程序才是实际干活的内容。

用户只要更改数据的内容便可以更改整个程序的执行结果。象上面那个程序,只要下载其他数据就可以的到其他的执行效果。(暂不讨论是什么结果)

芳季

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

这样PLC的程序就变成了操作系统。数据块就成为执行的过程或步骤。使用过程中PLC的程序就不在进行修改了,要更改程序的执行结果或者说效果,就只要更换数据块就可以了。

如果令数据H02视为LD指令。令H80视为M0。令HFF视为由D0开始读。我把H02和H80和HFF写到D0和D1D2中。D3D4等等是其他的数据。然后程序就不断地循环读数据,从D0开始。那么程序的执行结果就是LD M0 LD M0 LD M0……

这样的话PLC就变成了用户可做第二次修改的程控器。生产编程者编的就是命令解释程序。而用户编的就是用户程序。我想高级语言就是由这样产生的。

wanggq

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

 

  这个“用非‘SUM指令’来求:‘K2X10’字节的‘ON位总数’”主题的讨论,由于“zhouduoliang”网友的加入,使得“讨论”的水平提高到了一个新的高度。真正使我们大开了眼界!

 

  受“zhouduoliang”网友的启发,我们还可以用更少的程序“步”来实现楼主的题目要求的功能。

 

 

wanggq

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

 

  把“0~255”的这256个“10进制”数据分别与“K2X10”字节的256个不同状态对应起来。再把这256个不同状态中“1”的“个数”事先依次分别写入:以D500起始的256个数据寄存器中。则,只用3条指令就能实现“用非SUM指令来求:‘K2X10’字节中的‘ON位总数’”这一题目要求的功能。

 

程序片断如下:

 

LD             M8000

 

MOV         K2X10             V0

 

MOV        D500V0            D0

 

 

wanggq

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

 

  指令“MOV          K2X10          V0”的作用可以分别把“K2X10”字节的256种内容对应的10进制数据(0~255)传送给变址寄存器V0(实际上,传送给V0的内容仍然是2进制形式的数据,我们只是根据编程语法的定义把它理解为“10进制”数据)然后用变址寄存器V0去修饰第2条传送指令中的“源操作数”。由于我们事先把分别对应于“K2X10”字节中的256个状态时的“1”的“个数”写在了以D500起始的256个数据寄存器里,所以,经第2条传送指令执行之后,D0中的数据就是“K2X10”字节中的“ON位总数”。

 

 

wanggq

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

 

  如果单从“程序量”的大小来看,第156楼的梯形图程序程序(不计END只有11“步”)要比第137楼的梯形图程序(不计END 有18“步”)精简7“步”,运算时间至少要短27.6μS 。

 

  但是,从综合观点来看,迄今为止还是“zhouduoliang”网友在第137楼的程序最好!理由是:在完成相同任务的前提下,第137楼的程序所占用的数据寄存器元件资源比第156楼的程序所占资源少得多!只填写16个数据当然比填写256个数据要轻松得多!如果题目要求在较低档次的PLC平台上实现“目的” 则,低档次PLC可能不满足第156楼的程序所需调用的“保持型数据寄存器”的元件数量。譬如:在FX1s系列PLC中的“保持型数据寄存器”只有128点。如果你想用它的“文件寄存器”来存放“调用数据”,那么,势必会增加程序量(譬如要用到“BMOV 指令”)。所以说还是“zhouduoliang”网友在第137楼的程序最好!!

 

wanggq

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

 

  把两个梯形图程序放在一块儿,方便大家比较:

 

芳季

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

这是典型的查表法计算方式。无形地透露出计算法和查表法的本质区别。

查表法无疑是高速的。计算法也无疑是灵活的。就象中文的打印机本身都带有硬字库一般。而绘图仪则可以绘出任意的线形。

要看使用场所的要求了。

lizhibin520

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 47回
  • 年度积分:0
  • 历史总积分:71
  • 注册:2009年7月22日
发表于:2009-07-26 15:51:11
157楼

上面的大部份有个致命错误,INC指令在每个扫描周期都要进行一次加计数。因该用 INCP  D0

我写了个简单的程序请大家看看:

LDP  X10       ORP  X11      ORP  X12     ORP   X13    ORP  X14   ORP   X15    ORP  X16  ORP  X17

OUT  MO     LDP M0    OUT  C0  K10000

X10到X17并联上升延输出到M0                  M0给C0进行计数就可以了。C0上限随意。 

nike717

  • 精华:0帖
  • 求助:2帖
  • 帖子:8帖 | 359回
  • 年度积分:0
  • 历史总积分:493
  • 注册:2007年12月12日
发表于:2009-07-26 16:43:58
158楼
引用wanggq 的回复内容:

 

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

 





wanggq

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

 

      我的帖子中出现的“迄今为止”一词是有“时间参照”的,请这个引用我的帖子内容的网友把“时间参照”也标注出来!譬如,我贴这个“内容”的时候,“周铎良”网友还没参与这个讨论,他一进来就不同了。他把这个讨论带到了一个新的水平!现在是“周铎良”的程序最好!

wanggq

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

对:lizhibin520 关于

上面的大部份有个致命错误,INC指令在每个扫描周期都要进行一次加计数。因该用 INCP  D0

我写了个简单的程序请大家看看:

LDP  X10       ORP  X11      ORP  X12     ORP   X13    ORP  X14   ORP   X15    ORP  X16  ORP  X17

OUT  MO     LDP M0    OUT  C0  K10000

X10到X17并联上升延输出到M0                  M0给C0进行计数就可以了。C0上限随意。 

 


     回复: 

 

  程序中的“INC ”没有用“脉冲执行型 ‘INCP ’”完全是正确的!并不是您所认为的“致命错误”!因为它们的前面有“ LD    M8000     RST       D0 ” 程序的每个扫描周期都会重新统计X10至X17这8个“位元件”中的“ON位总数”。这样,每一个周期统计出来的数据都是正确的!

 




热门招聘
相关主题

官方公众号

智造工程师