楼主最近还看过
引用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的内存容量相对于我们的控制程序来说是足够的大,我们为了使控制过程有很好的“实时性”,也力争要把程序写得简短一些!
“芳季”的这句<请程序用数据的原始数据的块大小也列出来。因为这也是程序的不可分割部分。应该计算入程序空间。>给我的感觉是:他认为看一个指定功能的程序是不是写得简练,不能单看这个程序所占“步”数的多少(“步”数的多少在一定程度上反映了程序的周期扫描时间的长短),还要看“数据的块大小”(即:数据个数),要把“数据个数”也计算入程序空间(即程序“步”数)中去。这样计算出来的“程序量”才能完整的反映出程序量的大小来。
“芳季”所谓的“应该计算入程序空间”是怎样的一种“计算”呢?该不是说“用减法的计算”吧?!
我猜想“芳季”是想“用加法来计算”!把“数据的块大小”加算到一个指定程序的“步”数中去。如果“数据的块大小”的“数目”较大,则“用加法”来计算入程序空间的结果就是:合计的程序空间变得“较大”了!
为了确认我上述的这个猜想,我于4月26号在《各位大虾请过来探讨……》一文的第100楼贴出一个帖子其内容如下:
请教“芳季”网友:数据块的大小(譬如:1个数据与100个数据的区别)跟调用它的程序空间大小(假设调用这些数据的程序都是相同的“程序步数”譬如:都为26步。)有关联吗?
譬如如有这样一个程序(片断):
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,两个程序的大小(即两个片断各自所占的程序空间)都是一样的!
这样PLC的程序就变成了操作系统。数据块就成为执行的过程或步骤。使用过程中PLC的程序就不在进行修改了,要更改程序的执行结果或者说效果,就只要更换数据块就可以了。
如果令数据H02视为LD指令。令H80视为M0。令HFF视为由D0开始读。我把H02和H80和HFF写到D0和D1D2中。D3D4等等是其他的数据。然后程序就不断地循环读数据,从D0开始。那么程序的执行结果就是LD M0 LD M0 LD M0……
这样的话PLC就变成了用户可做第二次修改的程控器。生产编程者编的就是命令解释程序。而用户编的就是用户程序。我想高级语言就是由这样产生的。
如果单从“程序量”的大小来看,第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楼的程序最好!!
上面的大部份有个致命错误,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位总数”。这样,每一个周期统计出来的数据都是正确的!