技术论坛

子程序我想能自主分配内存。

作者 主题
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
主题:子程序我想能自主分配内存。


只看楼主 楼主 2010-05-16 00:08:46
一个子程序带参数调用。在调用的同时要定义必要的输入输出参数。另外子程序中间过程的值可以用L区的空间临时使用。但是如果不够用的话就要用到V内存,就是定义库内存。
现在问题是同一个子程序我要多次调用,还有工作对象不是唯一的,可是库内存不能多次分配。这种子程序一般是控制相同性质而不同参数的对象。我尽量做到在主程序中用SM0.0调用。例如要控制几个电机进行星三角启动,各自的启动时间不同,启动过程中的计时互相不影响。
我现在有个想法。子程序在程序中出现的次数,由程序自动登记。然后根据登记的编号让子程序自主去寻找合适的空闲内存块区。
想问一下,要做这样的子程序调度,有什么意见。
可以随便发言吧。
 
以下网友喜欢您的帖子:

  
重要声明:

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

帖子链接:https://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=689429&b_id=3&s_id=0&num=9

侠客

经验值: 814
发帖数: 671
精华帖: 1
回复:子程序我想能自主分配内存。


只看楼主 1楼 2010-05-16 10:36:14
在库内存之外的变量存储器位每个工作对象分配一块空间保存数据不完了吗。。非得占用库内存么。。工作对象调用子程序的同时,将库内存数值MOVE到预先为其分配好的V区。。当别的工作对象调用的时候,再将库内存清空再使用。。
工控猪!
以下网友喜欢您的帖子:

  
侠客

经验值: 814
发帖数: 671
精华帖: 1
回复:子程序我想能自主分配内存。


只看楼主 2楼 2010-05-16 10:40:29
你要用SM0.0调用就没办法实现区分各个工作对象。。不同的工作对象编号可以作为子程序的一个参数。。当工作对象改变时。。先使里面的定时器复位。。这样要注意的是,同一个扫描周期中,最多只能有一个工作对象调用此子程序

子程序中尽量少使用定时器、计数器吧。。
工控猪!
以下网友喜欢您的帖子:

  
至圣

经验值: 19840
发帖数: 8834
精华帖: 39
回复:子程序我想能自主分配内存。


只看楼主 3楼 2010-05-16 15:04:36
增加一个输入参数,指向各自的V区,子程序中通过指针访问
 
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:子程序我想能自主分配内存。


只看楼主 楼主 4楼 2010-05-16 20:40:30
我就是想连这个参数都不想输入。例如我刚才说的星三角启动。我只想调用子程序时
点击此处查看附件
像上面的例子那样。只有必须的输入输出参数,启动时间设定值不相同。并没有运行过程的参数,当前启动时间。子程序中也不使用TON等,这样启动当前值的记忆就只通过子程序内部自动寻找空闲地址去储存。
我的程序每增加一个电机,程序自动分配给每一个不同的子程序不同的内存。
常规做法:

点击此处查看附件
子程序中有个中间量【当前时间】。我就是不想手工分配这个变量。要他自动内部分配。其中具体过程,看怎么实现了。
 
以下网友喜欢您的帖子:

  
至圣

经验值: 19840
发帖数: 8834
精华帖: 39
回复:子程序我想能自主分配内存。


只看楼主 5楼 2010-05-17 09:00:09
不可能的。
L区自动分配,但不能保存数据
其他区域都需要手动分配,你的程序又不可能得到交叉参考的结果,不知道那部分内存有被使用,哪些没被使用
 
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:子程序我想能自主分配内存。


只看楼主 楼主 6楼 2010-05-17 23:18:21
我暂时的一个想法是:
主程序第一周期开头初始化一次。然后执行正常的程序,调用应有的某一个子程序。然后END指令之前再执行初始化的配套的另一个初始化子程序。这样两个初始过程。我就可以知道。主程序中用SM0.0调用过多少次某一个子程序。
然后第二个扫描周期。按被调用的次数安排每次子程序使用的V区。
第三个扫描周期开始已经可以正常运作了。
当这个架构可以实施的话,那么我的所有子程序包括其他任意功能的子程序都在首次扫描登记资料,统一分配V内存。那么这些子程序的运行将相当稳定相当固化,并且不必写符号表。不必担心内存是否会重复定义。
 
以下网友喜欢您的帖子:

  
版主

经验值: 25995
发帖数: 11809
精华帖: 43
回复:子程序我想能自主分配内存。


只看楼主 7楼 2010-05-17 23:57:20
合理的做法,应该是分配内存和指令调用的位置有关,这样,程序一旦写完,所有调用指令的位置即固定,“自动”分配来的内存也“固定”了。如果是以调用的次序/次数来分配内存,这个不是很好,因为子程序有可能是条件调用,每条调用指令不一定每周期调用到,如果出现不调用的指令,则分配的内存就会乱套。
可惜,调用指令的位置相关信息,用户程序是无法获取的。就象ED/EU指令,系统是有内部编号的,但我们的程序没办法得到这个编号。
 
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:子程序我想能自主分配内存。


只看楼主 楼主 8楼 2010-05-18 07:11:24
Y:
我意识到有条件调用的问题。所以我这样的子程序一定要用SM0.0调用的原因就是这个。宁可子程序不使用的时候用RET指令再离开。就像EEPROM保存的那个库程序一样,多处使用到RET指令离开子程序。
 
以下网友喜欢您的帖子:

  
至圣

经验值: 67543
发帖数: 14782
精华帖: 100
回复:子程序我想能自主分配内存。


只看楼主 楼主 9楼 2010-05-18 21:30:54
第一个初始程序清零一个VB,然后退出。
我的每次调用的子程序,前提是用SM0.0调用,里面用SM0.1把VB增一。然后退出子程序。
第二个初始程序,由于在END之前。VB应该加的都已经加过了。程序根据VB的值可以计算出子程序被分配的内存的首址。在首址写下程序身份标识。
第二个周期。
两个初始程序都不再执行了。子程序除了SM0.1这个网络外,下一个网络根据身份标识的值和根据本子程序已知的内存用量(例如4个VB,是自己确实知道的)用间接寻址,从vb8000开始分配4个内存,然后把VB减1。然后下一次被调用有分配下一个4个内存,VB又减1。再调用,再分配,再减1。直到减到0为止置位一个位。表明分配已完成。以后执行可以用这个位跳过分配的程序。这样间接寻址的目标就固定下来了。
我的思路说完了。
 
以下网友喜欢您的帖子:

  
  • 上一页
  • 1
  • 下一页
收起
子程序我想能自主分配内存。
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。