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