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.

145 lines
5.6 KiB
Python

1 year ago
import sys
sys.path.append('../../')
import struct
1 year ago
from enum import Enum
1 year ago
1 year ago
from utils.DBModels.DeviceParModels import *
from protocol.ModBus.DPV1Master import DPV1Master
1 year ago
from model.ProjectModel.ParmManage import Parm
1 year ago
1 year ago
class BlockType(Enum):
1 year ago
class TB(Enum):
1 year ago
flowTB = -1
1 year ago
tempTB = -2
levelTB = -3 # 物位转换块
pressureTB = -4
1 year ago
PB = 0
1 year ago
FB = 2
1 year ago
class BlockManage():
1 year ago
_instance = None
_dpv1Master = None
def __new__(cls, address):
if not cls._instance:
cls._instance = super().__new__(cls)
return cls._instance
1 year ago
def __init__(self, address = None):
1 year ago
self.address = address
1 year ago
if address:
self.initBlocks()
1 year ago
@property
def DPV1Master(self):
1 year ago
if not self._dpv1Master:
1 year ago
self._dpv1Master = DPV1Master('192.168.3.10', 502)
return self._dpv1Master
def initBlocks(self):
if not self.DPV1Master.judgeSlave(self.address):
1 year ago
raise RuntimeError(f"连接从站{self.address}失败.")
1 year ago
self.blockDict = {
BlockType.PB : [],
BlockType.TB : [],
BlockType.FB : [],
}
dirHeadDatas = self.DPV1Master.readParm(address = self.address, slot = 1, index = 0, length = 12)
1 year ago
dirHeadDatas = struct.unpack('>6h', dirHeadDatas)
1 year ago
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)
1 year ago
dirDatas = struct.unpack('>{}h'.format(int(dirLength/2)), dirDatas)
1 year ago
entryTuples = [(dirDatas[i], dirDatas[i+1]) for i in range(0, len(dirDatas), 2)]
for typ in [BlockType.PB, BlockType.TB, BlockType.FB]:
1 year ago
typeIndex = typ.value if type(typ.value) == int else 1
1 year ago
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
1 year ago
# print(blkEntryListIndex, entryTuples)
1 year ago
blkPointerByte = struct.pack('>h', entryTuples[blkEntryListIndex][0])
numBlkParms = entryTuples[blkEntryListIndex][1]
blkSlot = int(blkPointerByte[0])
blkStartIndex = int(blkPointerByte[1])
1 year ago
# print(111, blkStartIndex, )
1 year ago
block = Block(typ, self.DPV1Master)
1 year ago
block.slot = blkSlot
1 year ago
block.startIndex = blkStartIndex
1 year ago
block.numParms = numBlkParms
1 year ago
block.blockIndex = i
block.address = self.address
1 year ago
block.addParms()
1 year ago
if not block.getTBType():
1 year ago
self.blockDict[typ].append(block)
1 year ago
# print(blkSlot, blkIndex)
1 year ago
# print(self.blockDict)
1 year ago
def getBlockValues(self, blockType, blockIndex):
1 year ago
pass
1 year ago
1 year ago
def getBlockNums(self):
return [len(self.blockDict[BlockType.PB]), len(self.blockDict[BlockType.TB]), len(self.blockDict[BlockType.FB])]
1 year ago
1 year ago
@classmethod
def searchSlave(self, callback):
self.DPV1Master.searchSlave(callback)
1 year ago
1 year ago
class Block():
slot = None
startIndex = None
1 year ago
numParms = None
1 year ago
blockIndex = None
address = None
def __init__(self, blockType, DPV1Master):
1 year ago
self.parms = []
self.blockType = blockType
1 year ago
self.DPV1Master = DPV1Master
1 year ago
# self.addParms()
1 year ago
1 year ago
def addParms(self):
1 year ago
getParmsFunc = {
BlockType.PB: PhysicalBlock.getallParame,
BlockType.TB: AIFunctionBlock.getallParame,
BlockType.FB: PressureTranslationBlock.getallParame,
}.get(self.blockType, lambda: [])
1 year ago
1 year ago
parmsData = getParmsFunc()
for parmData in parmsData:
1 year ago
# print(parmData)
# print(self.startIndex, 3214)
parm = Parm(parmData, self.slot, self.startIndex, self)
1 year ago
def getTBType(self):
return
def setTBType(self):
1 year ago
pass
1 year ago
1 year ago
if __name__ == '__main__':
1 year ago
b = BlockManage(address = 55)
c = BlockManage(address = 77)
1 year ago
# b.initBlock()