You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
3.9 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import sys
sys.path.append('../../')
import struct
from enum import Enum
from utils.DBModels.DeviceParModels import *
from protocol.ModBus.DPV1Master import DPV1Master
class BlockType(Enum):
PB = 0
TB = 1
FB = 2
class BlockManage():
address = 66
def __init__(self):
self.DPV1Master = DPV1Master('192.168.3.10', 502)
self.blockDict = {
BlockType.PB : [],
BlockType.TB : [],
BlockType.FB : [],
}
self.initBlocks()
def initBlocks(self):
dirHeadDatas = self.DPV1Master.readParm(address = self.address, slot = 1, index = 0, length = 12)
DirID = dirHeadDatas[0] # 目录id
DirRevNum = dirHeadDatas[1] # 目录版本号
NumDirObj = dirHeadDatas[2] # 目录对象的个数 (如果整个目录使用多于一个目录对象,
# 则这此元素被连续定义,就如同使用一个较大的对象。
# 多个目录对象都被连续地列在该目录中。该对象计数整个目录所需的对象。Header对象不计人其)
NumDirEntry = dirHeadDatas[3] # 目录登录项的总数 (应计算复合列表目录登录项和复合目录登录项的总个数实际块数量为NumDirEntry - 3)
FirstCompListDirEntry = dirHeadDatas[4] # 第1个复合列表目录登录项的目录登录项个数 (该数用来计数目录内的登录项, 而不包含该登
# 录项的参数地址。第1 个目录登录项是在复合列表目录登录项中的物理块引用。在计数登录
# 项时,复合列表目录登录项与复合目录登录项之间无间隔)
NumCompListDirEntry = dirHeadDatas[5] # 功能块类型数量 复合列表目录登录项的个数 计数设备内的不同块类型(物理块、转换块和功能块)和对象类型
#(在本标准范围内仅针对链接对象)
dirLength = 4 * NumDirEntry
dirDatas = self.DPV1Master.readParm(address = self.address, slot = 1, index = 1, length = dirLength)
entryTuples = [(dirDatas[i], dirDatas[i+1]) for i in range(0, len(dirDatas), 2)]
for typ in [BlockType.PB, BlockType.TB, BlockType.FB]:
typeIndex = typ.value
blkDirMesByte = struct.pack('>h', entryTuples[typeIndex][0])
blkIndex = int(blkDirMesByte[0]) # 目录对象编号
blkoffect = int(blkDirMesByte[1]) # 块从第几个Dir_Entry开始
numBlk = entryTuples[typeIndex][1] # 块数量
# print(blkIndex, blkoffect, numBlk)
for i in range(numBlk):
blkEntryListIndex = blkoffect - 1 + i
blkPointerByte = struct.pack('>h', entryTuples[blkEntryListIndex][0])
numBlkParms = entryTuples[blkEntryListIndex][1]
blkSlot = int(blkPointerByte[0])
blkStartIndex = int(blkPointerByte[1])
block = Block(typ)
block.slot = blkSlot
block.startAddress = blkStartIndex
block.numParms = numBlkParms
self.blockDict[typ].append(block)
# print(blkSlot, blkIndex)
print(self.blockDict)
class Block():
slot = None
startIndex = None
numParms = None
def __init__(self, blockType):
self.parms = []
self.blockType = blockType
self.addParms()
def addParms(self):
pass
# getParmsFunc = {
# BlockType.PB: PhysicalBlock.getallParame,
# BlockType.TB: AIFunctionBlock.getallParame,
# BlockType.FB: PressureTranslationBlock.getallParame,
# }.get(self.blockType, lambda: [])
# parms_data = getParmsFunc()
if __name__ == '__main__':
b = BlockManage()
# b.initBlock()