各位大虾请过来探讨一下具有挑战性的PLC题目 点击:3790 | 回复:131



zhouduoliang

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:4帖 | 156回
  • 年度积分:0
  • 历史总积分:1219
  • 注册:2007年2月14日
发表于:2009-04-13 20:43:05
楼主

某项目要求完成15个电磁阀的以下功能:电磁阀分别由y0,y1,...,y16控制,按规定的时间片段来控制,如表所示:

例如:第0时段,#1,#5电磁阀开,其他的关闭,工作时间1分钟;1分钟后切换到第1时段,第#2电磁阀开,其他的关,工作时间3分钟,3分钟后到切换到第2时段;按如此顺序从0~19时段反复循环。请写出能实现上述要求的PLC程序。

 

 




聚沙成塔

  • 精华:0帖
  • 求助:1帖
  • 帖子:85帖 | 654回
  • 年度积分:0
  • 历史总积分:1083
  • 注册:2006年4月15日
发表于:2009-04-26 14:59:38
101楼

用步进编看起来明了,但复杂些,37楼和48楼的程序就很简单,用间接寻址也是最省的变成方法。

wanggq

  • 精华:2帖
  • 求助:0帖
  • 帖子:24帖 | 5342回
  • 年度积分:0
  • 历史总积分:10407
  • 注册:2004年8月21日
发表于:2009-04-26 15:30:09
102楼
引用刘存刚 的回复内容:

 

    在GX Developer中编好程序后,怎样编写数据块和写入plc?请你不要见笑,我只是想学习学习!

 

 


 

 

  回复刘存钢的问题:

 

  在《寄存器视图》界面上选择数据块起始的寄存器编号、数据格式(2进制、或16进制、或10进制)、数据长度(16位、或32位)等,选择完毕再按确定或回车,就会弹出“所选寄存器表格”。依次在表格中填入数据即可。

 

  数据填好之后保存一下,就点击“PLC→寄存器数据传送→写出”,数据就开始向PLC的数据寄存器传送了!

 

 


wanggq

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

 

  再借用《手把手教您写“让PLC唱歌”的程序》一文中的图片来帮助讲解:

 

老菜鸟

  • 精华:22帖
  • 求助:0帖
  • 帖子:301帖 | 8609回
  • 年度积分:0
  • 历史总积分:24924
  • 注册:2003年6月15日
发表于:2009-04-26 15:48:39
104楼
采用时段来写程序就可以了,前面的网友已经贴出了程序。

深水渔

  • 精华:0帖
  • 求助:1帖
  • 帖子:32帖 | 1660回
  • 年度积分:0
  • 历史总积分:1915
  • 注册:2007年12月17日
发表于:2009-04-26 15:52:02
105楼
采用时段来写程序这样好理解.....我的程序已经贴出了 

芳季

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

因为数据的内容可以转化为程序的内容。例如数据D0=K100。那么可以在程序中用初始化写MOV K100 D0。所以假如你编一个属于二次开发的程序,程序是不断的根据数据块的内容去执行相应指令的话。那么你的程序可能只有几百B。但是通过调用数K的数据是可以完成非常可观的工作的。

我说说一个比较接近,但是有不是很贴切的事实。

变频器的简易PLC控制。当用户写参数段号;频率;经历时间;段号;频率;经历时间;……只要经历时间不写“0”就认为程序一直没有结束。经历时间写9999就认为是从头开始循环。那你说。他的程序可有多短啊?所控制的动作可以多复杂啊?

芳季

  • [版主]
  • 精华:5帖
  • 求助:5帖
  • 帖子:86帖 | 5336回
  • 年度积分:0
  • 历史总积分:20165
  • 注册:2003年1月31日
发表于:2009-04-26 22:18:55
107楼
类似这样的数据我通常用文件寄存器。好比读写硬盘数据一样。文件寄存器大概理解为非工作区。可以少占用工作内存。1S的文件区概念是比较明显的。其余型号的都可以作为工作内存。

wanggq

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

 

 

 

  引用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的内存容量相对于我们的控制程序来说是足够的大,我们为了使控制过程有很好的“实时性”,也力争要把程序写得简短一些!

 

 

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

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

  如果是“用减法的计算”,则:把“数据的块大小”“计算入程序空间”才会得出这个奇怪的结论:合计的程序量“只有几百B”!  

 

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

 

  可是,事实上却是:前一页第81楼的那个更为简练的只有26 步(未计END)的调用程序,不论是调用30个数据(15×2),还是调用40个数据(20×2),它的程序量就都是26步!而且其扫描周期时间也不会有什么不同!

  

wanggq

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

 

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

 

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,两个程序的大小(即两个片断各自所占的程序空间)都是一样的!

 

                          

 

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

 

wanggq

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

 

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

 

                                    

新力量

  • 精华:0帖
  • 求助:1帖
  • 帖子:22帖 | 154回
  • 年度积分:0
  • 历史总积分:194
  • 注册:2008年11月04日
发表于:2009-04-27 14:53:45
111楼

楼上人真强..我望洋兴叹..

wanggq

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

 

  为了回复“刘存刚”的问题,今天到朋友那里拷了一个“GX Developer ”软件,进行了初步的认识。

 

  再次回复“刘存刚”的问题:“在GX Developer中编好程序后,怎样编写数据块和写入plc?”

 

  用图片的形式来说明:

 

                                  

杯末停

  • 精华:0帖
  • 求助:0帖
  • 帖子:7帖 | 364回
  • 年度积分:0
  • 历史总积分:833
  • 注册:2006年9月01日
发表于:2009-04-27 16:03:59
113楼
38楼 的写的不错 xuexi

lijiaj

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 44回
  • 年度积分:0
  • 历史总积分:49
  • 注册:2005年11月03日
发表于:2009-04-27 16:56:26
114楼

有难度的,学习中~~~~~~~~

人工置顶

南云

  • 精华:0帖
  • 求助:1帖
  • 帖子:12帖 | 309回
  • 年度积分:0
  • 历史总积分:387
  • 注册:2005年11月17日
发表于:2009-04-27 21:39:01
115楼
38楼的说的很详细,就应该这样,因为很多人的情况不一,有的一目了然,有的需要详细,支持38楼的认真态度。

南云

  • 精华:0帖
  • 求助:1帖
  • 帖子:12帖 | 309回
  • 年度积分:0
  • 历史总积分:387
  • 注册:2005年11月17日
发表于:2009-04-27 21:41:13
116楼

纠正一下,应该是48楼。

 

刘存刚

  • 精华:0帖
  • 求助:1帖
  • 帖子:13帖 | 110回
  • 年度积分:0
  • 历史总积分:337
  • 注册:2008年8月06日
发表于:2009-04-28 01:38:46
117楼

谢谢 wanggq 谢谢你这么热心的 帮助!

wanggq

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

 

     闲暇的时候就上一上网和网友们相互学习和探讨嘛,不需谢的!

 

 

刘存刚

  • 精华:0帖
  • 求助:1帖
  • 帖子:13帖 | 110回
  • 年度积分:0
  • 历史总积分:337
  • 注册:2008年8月06日
发表于:2009-04-28 11:15:36
119楼
 wanggq老师你好,由于没有真实的plc,我用仿真做了,但传送不了,为什么程序上MOV D519V0  D0从D519开始,而寄存器上从D520开始,是不是plc刚一上电时,T0常开动作V0加1到V1,D519V0变成D520V1,把D520中数据传输给D0,当T0下一次动作时成D521V2,依次类推是不是?

wanggq

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

 

  最好相互称呼“网友”!  

 

  回复“刘存刚”在楼上的问题:

 

        PLC刚上电,或者刚从STOP转入RUN,M8002(最初运行脉冲)在第一个周期的开头把V0清零。(在FX2n的操作手册中记载:变址寄存器V、Z是

 

保持型数据寄存器。但我最近发现:事实上它们的“保持”并不是“停电保持”。所以,如果没有“LD    M8002 ”这条指令,刚上电时V 中的内容也 

 

是“0”,但是,如果要求PLC每次从STOP转入RUN的时候,程序都要从“0时段”开始运行。则这条“LD M8002 ”指令就不能少了!)而且在这 

 

最初的一个周期开始的时候,D0中的内容也是“0”。所以,当程序最初扫描至“步”号为“9”的这条指令“LDI     T0 ”时,计时器T0的驱动条件成

 

立,最初扫描至“OUT     T0     D0 ”指令时,计时器T0的触点动作。接下来程序扫描至“步”号为“13 ”的“LD   T0 ”这条指令时,这个触点

 

为:ON,为接下来的3条功能指令的执行建立起条件,这“INC     V0 ”放置在其它两条传送指令的前面,当然是先执行了!INC指令给V0加1之后再 

 

用作两条传送指令的操作数变址修饰,所以在这第一个周期里“D519V0”所表达的操作数就是“D520 ”啦!同理,这第一个周期里“D539V0 ”所 

 

表达的操作数就是“D540 ”。

 

 


热门招聘
相关主题

官方公众号

智造工程师