加入收藏 在线留言 联系我们
关注微信
手机扫一扫 立刻联系商家
全国服务热线15267534595

2023邵阳市SIEMENS工业自动化PLC授权代理商|西门子变频器授权一级总代理|技术|维修

更新时间
2025-01-19 09:10:00
价格
请来电询价
西门子
S120
变频器
伺服电机
G120XA
一级总代理
联系电话
18126392341
联系手机
15267534595
联系人
梁涛
立即询价

详细介绍

管理堆表头设计

在V中分配的背景DB需要有一些空间来容纳管理变量,我把这些变量放置到了开头,称作管理DB的表头。

这些表头信息是:

pHeapHead 指向自身的堆指针,也是Heap首地址。

HeapStatus 堆状态信息。

DBCap 数据块预置容量

DBLen 数据块实际使用长度

pDBTerminal 数据块终点地址

pDBVector 数据块头指针

IndexSource 索引资源

指定数量的全局数据块索引

表头和DB之间的分隔符"#"

这些变量的作用涉及到许多技术实现细节,以后慢慢添加。

之后是数据块,不过头两个DB块是特殊用途DB的管理块,本质上这两个DB和之后的几个特殊用途DB都是数据块,只不过由管理程序使用,分配用户DB也不会用这几个块空间来分配。

1,数据块的结构

每个数据块的第一个字是DB容量,这个由DB分配程序来读写,用户不用操心。
之后是一个字节的DB标志符"FF",这个是方便调试而设计的,并无多大作用,也是设计遗留下来的东西,唯一的作用是可以帮助分辨DB开始。

这个标识符唯一不存在于接下来的一个DB。

然后才是真正的DB数据。

2,Temp块管理DB的设计

Temp块管理DB管理的其实不只Temp块,还硬塞进来了FIFO队列。 FIFO队列后是14个存放DBTemp的指针向量。DBTemp动态分配,这些指针表在DBTemp初始化时自动生成。由于设计也是逐步推进的,这里采用直接存放4字节的指针,而不是像接下来的用户DB指针表存放的是V编号,也就是指针的低字数据。

3,用户DB指针表(用户DB管理表)的设计

用户DB的定位采用的是遍历定位方式,但考虑许久还是专门设计出一个DB来存放用户DB开始的指针数据,这样DBIndex不是直接定位用户DB,而是首先定位这个表的数据,然后提取数据作为指针来直接定位用户DB。好处是代码量少些,也可能执行起来快速些。

用户DB不是一开始就规划好的,而是动态分配的,位置、尺寸都是动态由子程序自己所需DB尺寸自动生成的。

4,DBTemp块的设计

DBTemp共计14个,每个都具有用户指定的大小,比如50个字节。没有内部特殊结构,和普通DB没有区别。

用户可以使用的普通数据块

共计255个容量,每个的大小不同,由用户子程序决定。

好了,增强背景数据块的基本结构也已经说了,和我有同样需求的朋友相信已经能够知道我要如何做了。这里给出结构的截图方便大家理解:


图片


图片


图片


图片



模块设计

一共有6个模块,分别是DBInit、BaseInit、DBMalloc、Temp单区分配、TempStack、ByteClear。中文变量其实也蛮好的。

1,DBInit

First_Scan_On时调用,主要作用是判断库分配的开始地址是否合适,初始化DB表头信息。
表头信息里面有个状态字节HeapStatus,设置了几个反应运行中是否发生DB错误的判断信息,给调试带来一些便利。

bit0: 1 初始化时超过了V区容量

bit1: 1 库设置的V区全局变量pHeapHead没有位于开头,主要是反应DBInit的参数pHeapAddr和pHeapHead不一致。

bit3: 1 且bit0=bit1=bit2=0,初始化完成。

bit4: 1 已经使用的容量超过了预置容量

bit5: 1 DB定位失败

bit6: 1 用户DB数量超过DBQTY限制。

2,BaseInit

这个也是在Fisrt_Scan_On时调用,主要作用是初始化几个特殊用途数据块:DBTemp管理块(FIFO、DBTemp地址栈表)、用户DB地址表、DBTemp。

3,DBMalloc

这个是公共模块,用于DB分配。如果SBR是首次扫描需要获取可用的V区开始地址作为用户DB地址,并把这个地址存入用户DB地址表中来。如果不是第一次扫描,就直接从用户DB地址表中获取实际用户DB地址并返回该地址。包括一些错误判断和状态信息的给出。

4,Temp单区分配

这个就简单了,就是直接分配14个DBTemp。只不过没有使用浪费全局索引而是使用temp变量,因为分配完后DBTemp地址会存放到DBTemp管理区,就不需要索引来定位DBTemp了。

5,TempStack

TempStack实现DBTemp的FIFO,根据传入功能ii_Function的不同可以选择是入栈还是出栈。
byi_TempNo是DBTemp编号,设计了几个特殊用途的编号:
0#作为普通temp扩展,入口参数byi_TempNo=0.
10#~13#作为通用设备实例的I/O接口参数使用,byi_TempNo=10~13。
其他Temp区作为Temp栈使用,从1#~9#共计9个块,可供总计9层子程序嵌套使用,用户不能指定,由FIFO管理到底使用哪个DBTemp。
主程序外*多可以嵌套到第8层,实际由于需要使用静态DB管理(调用1层子程序),再加上本程序占用一层,如果需要使用Temp扩展(本功能块),只能嵌套到第6层。
如果中断需要使用本功能,则*多只能在中断内使用2层嵌套子程序。

6,ByteClear

用于大尺寸V区清零复位,也可以是任何数据赋值给V区初始化。

MAIN中的固定程序


图片




相关产品

联系方式

  • 电  话:18126392341
  • 联系人:梁涛
  • 手  机:15267534595
  • 微  信:15267534595