回复:问一问自己做子程序自动分配背景数据的人。

holdkcsxyz

西门子1847工业学习平台

  • 帖子

    1560
  • 精华

    24
  • 被关注

    161

论坛等级:至圣

注册时间:2015-06-03

钻石 钻石 如何晋级?

发布于 2025-08-31 19:24:13

42楼

展开查看
以下是引用Zane在2025-08-31 12:05:37的发言 >39楼


单凭这个,也过不了芳大侠的关呀

最简单的自动分配内存初版.zip

是的V2.x子程序没有自身的Static变量,否则不需要一个最初空白的不可相互干扰的IN_OUT类型的VD71xx外部全局容器。


1"#只运行一次"是先赋值再使用的,其实就是V7009.0,之所以不用全局变量是因为如果这个子程序做成库,库里是不允许用VB7000/VD7001/VD7005/V7009.0这些全局变量的,分配函数是固定的永恒不变的,它的即将分配的新地址存放在VD7005;下次给别的子程序将要分配的首地址存在VD7001,第一次运行是V7009.0,待分配的字节长度存在VB7000.


2子程序的第一个网络检测到外部唯一的一个输入输出容器是空的,则调用分配函数,找出分配区域的的首字节地址以及分配的字节数量,分配首字节地址的最开始是&VB0,这个新区域的首字节地址是要存下来的,存在哪儿呢,子程序内部又没有可以当指针用的全局静态变量来存储这个新分配的首地址,只能返存到外部输入输出的那个空容器里面去,让它牢牢的记住这个新分配的首地址,以便下次进入这个子程序再用.


3如果子程序内部有自己独有的可当指针用的静态变量,这个唯一的输入输出容器都可以取消.


4这个唯一的最初空白的输入输出容器,不仅可以是VD7100/7104/7108......也可以是子程序的#LD变量,比如LD8,子程序A内部调用子程序B,子程序A的LD8里面存放B的一个合法入口地址或LD8===0的空白接口容器,A的#LD8===作为#B的入口容器的函数指针就行了,如果LD8是合法的地址则B不调用分配函数,如果A内部的LD8===0则A调用B时,B首先分配一片新内存,然后运行自己逻辑,再把这个首地址返存在A的LD8里面,此时A内部的LD8肯定要在A的末尾返存到属于A自己的全局变量的某个VDxx里面去(0<=xx<=6996).


5每个新子程序的内部第一个网络都是和子程序"启动停止保持"第一个网络检测到容器空就自动分配一片新内存是一样的.






评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有8933条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。