From 05ed11191ef748d3258e7032b892b44b9d375452 Mon Sep 17 00:00:00 2001 From: "ADMINISTRATOR\\Administrator" <951937200@qq.com> Date: Mon, 17 Jun 2024 18:14:06 +0800 Subject: [PATCH] =?UTF-8?q?0617=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UI/BlockParameterManageWidget.py | 36 ++++++++++++++++--------------- UI/BlockParameterView.py | 1 + UI/SearchAddressWidget.py | 16 ++++++-------- model/ProjectModel/BlockManage.py | 33 +++++++++++++++++++--------- model/ProjectModel/ParmManage.py | 31 ++++++++++++++------------ protocol/ModBus/DPV1Master.py | 4 +++- utils/DBModels/DeviceParModels.py | 8 +++---- 7 files changed, 74 insertions(+), 55 deletions(-) diff --git a/UI/BlockParameterManageWidget.py b/UI/BlockParameterManageWidget.py index 99531e3..b7d3d0c 100644 --- a/UI/BlockParameterManageWidget.py +++ b/UI/BlockParameterManageWidget.py @@ -7,8 +7,12 @@ from UI.BlockParameterView import ParmView from UI.SearchAddressWidget import SearchAddressWidget from utils.DBModels.DeviceParModels import * +from utils import Globals from UI.LoadingDataWidget import LoadingDataWidget +from model.ProjectModel.BlockManage import BlockManage + + class HideTextDelegate(QStyledItemDelegate): def paint(self, painter, option, index): # 仅在下拉列表中绘制文本,避免在ComboBox显示区域绘制 @@ -155,10 +159,6 @@ class BlockParameterManageWidget(QWidget): def initUI(self): - - - blocklist = [1,2,2] - self.blockLayout = DynamicAddBlock(blocklist) self.mainlayout = QVBoxLayout() self.settingLayout = QHBoxLayout() @@ -201,8 +201,8 @@ class BlockParameterManageWidget(QWidget): self.setLayout(self.mainlayout) def loadBlackData(self): - address =self.deviceAddressEdit.text() - print(address) + address = self.deviceAddressEdit.text() + # print(address) if address: pattern = re.compile(r'^(?:[1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-5])$') match = pattern.match(address) @@ -212,7 +212,10 @@ class BlockParameterManageWidget(QWidget): if self.initUIstat: self.splitter.deleteLater() self.widget.deleteLater() - + self.blockManage = BlockManage(int(address)) + Globals.setValue('blockManage', self.blockManage) + blocklist = self.blockManage.getBlockNums() + self.blockLayout = DynamicAddBlock(blocklist) self.settingLayout.addLayout(self.blockLayout, 7) self.settingLayout.addWidget(QSplitter(), 11) self.mainlayout.addWidget(self.blockLayout.parameStackWidget, 20) @@ -225,16 +228,15 @@ class BlockParameterManageWidget(QWidget): return def refreshData(self): - - self.loadingDataWidget = LoadingDataWidget() - self.loadingDataWidget.loadData() - blockView = self.blockLayout.parameStackWidget.currentWidget() - - model = blockView.model - model.updateColumn(5, '查询中sdadadsda\r\nsdasdsasasad\r\nasdsadsad...') - blockName = blockView.dbModel.__name__ - blcoknumber = blockView.blcoknumber + 1 - print(blockName, blcoknumber) + self.loadingDataWidget = LoadingDataWidget() + self.loadingDataWidget.loadData() + blockView = self.blockLayout.parameStackWidget.currentWidget() + + model = blockView.model + model.updateColumn(5, '查询中sdadadsda\r\nsdasdsasasad\r\nasdsadsad...') + blockName = blockView.dbModel.__name__ + blcoknumber = blockView.blcoknumber + 1 + print(blockName, blcoknumber) diff --git a/UI/BlockParameterView.py b/UI/BlockParameterView.py index 2a2190e..90cb587 100644 --- a/UI/BlockParameterView.py +++ b/UI/BlockParameterView.py @@ -84,6 +84,7 @@ class ParmView(QTableView): # self.datas = PressureTranslationBlock.getallParame() self.datas = self.dbModel.getallParame() for index, data in enumerate(self.datas): + data[5] = '' desc = data[2].replace('\r\n', '').replace('\n', '') lines = [desc[i:i+40] + "\r\n" for i in range(0, len(desc), 40)] # 合并列表为一个字符串,移除最后一个换行符 diff --git a/UI/SearchAddressWidget.py b/UI/SearchAddressWidget.py index 629ec60..a0b2173 100644 --- a/UI/SearchAddressWidget.py +++ b/UI/SearchAddressWidget.py @@ -62,16 +62,15 @@ class SearchAddressWidget(QWidget): self.setLayout(self.mainlayout) self.setWindowTitle('从站地址查找') - self.test = DPV1Master('192.168.3.10', 502) - self.test.searchMaster(self.updateProgress) - self.cancelBtn.clicked.connect(self.cancelSearch) + self.DPV1Master = DPV1Master('192.168.3.10', 502) + self.DPV1Master.searchSlave(self.updateProgress) + self.cancelBtn.clicked.connect(self.close) # self.timer = QTimer() # self.timer.timeout.connect(self.updateProgress) # self.timer.start(500) def updateProgress(self, address, isSlave): # 模拟一个任务,逐步更新进度条 - self.progressBar.setValue(address) if isSlave: self.addressListWidget.addItem(QListWidgetItem(str(address))) @@ -82,10 +81,9 @@ class SearchAddressWidget(QWidget): self.onConfirm() def onConfirm(self): - self.deviceAddressEdit.setText(self.address) self.close() - - def cancelSearch(self): - self.test.closeThread - self.close() \ No newline at end of file + + def closeEvent(self, event): + self.DPV1Master.closeThread() + event.accept() \ No newline at end of file diff --git a/model/ProjectModel/BlockManage.py b/model/ProjectModel/BlockManage.py index 6d4714a..f8da4d5 100644 --- a/model/ProjectModel/BlockManage.py +++ b/model/ProjectModel/BlockManage.py @@ -2,6 +2,7 @@ import sys sys.path.append('../../') import struct +from enum import Enum from utils.DBModels.DeviceParModels import * from protocol.ModBus.DPV1Master import DPV1Master @@ -14,7 +15,7 @@ class BlockType(Enum): levelTB = -3 # 物位转换块 pressureTB = -4 PB = 0 - FB = 1 + FB = 2 class BlockManage(): _instance = None @@ -25,9 +26,10 @@ class BlockManage(): cls._instance = super().__new__(cls) return cls._instance - def __init__(self, address = 66): + def __init__(self, address = None): self.address = address - self.initBlocks() + if address: + self.initBlocks() @property def DPV1Master(self): @@ -44,6 +46,7 @@ class BlockManage(): BlockType.FB : [], } dirHeadDatas = self.DPV1Master.readParm(address = self.address, slot = 1, index = 0, length = 12) + dirHeadDatas = struct.unpack('>6h', dirHeadDatas) DirID = dirHeadDatas[0] # 目录id DirRevNum = dirHeadDatas[1] # 目录版本号 NumDirObj = dirHeadDatas[2] # 目录对象的个数 (如果整个目录使用多于一个目录对象, @@ -58,10 +61,11 @@ class BlockManage(): dirLength = 4 * NumDirEntry dirDatas = self.DPV1Master.readParm(address = self.address, slot = 1, index = 1, length = dirLength) + dirDatas = struct.unpack('>{}h'.format(int(dirLength/2)), dirDatas) 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 + typeIndex = typ.value if type(typ.value) == int else 1 blkDirMesByte = struct.pack('>h', entryTuples[typeIndex][0]) blkIndex = int(blkDirMesByte[0]) # 目录对象编号 blkoffect = int(blkDirMesByte[1]) # 块从第几个Dir_Entry开始 @@ -69,27 +73,33 @@ class BlockManage(): # print(blkIndex, blkoffect, numBlk) for i in range(numBlk): blkEntryListIndex = blkoffect - 1 + i + # print(blkEntryListIndex, entryTuples) blkPointerByte = struct.pack('>h', entryTuples[blkEntryListIndex][0]) numBlkParms = entryTuples[blkEntryListIndex][1] blkSlot = int(blkPointerByte[0]) blkStartIndex = int(blkPointerByte[1]) - + # print(111, blkStartIndex, ) block = Block(typ, self.DPV1Master) block.slot = blkSlot block.startIndex = blkStartIndex block.numParms = numBlkParms block.blockIndex = i block.address = self.address + block.addParms() if not block.getTBType(): - self.blockDict[typ].append(block) + self.blockDict[typ].append(block) # print(blkSlot, blkIndex) # print(self.blockDict) - def getBlockValues(slef, blockType, blockIndex): + def getBlockValues(self, blockType, blockIndex): pass + def getBlockNums(self): + return [len(self.blockDict[BlockType.PB]), len(self.blockDict[BlockType.TB]), len(self.blockDict[BlockType.FB])] - + @classmethod + def searchSlave(self, callback): + self.DPV1Master.searchSlave(callback) class Block(): @@ -101,8 +111,8 @@ class Block(): def __init__(self, blockType, DPV1Master): self.parms = [] self.blockType = blockType - self.addParms() self.DPV1Master = DPV1Master + # self.addParms() def addParms(self): getParmsFunc = { @@ -113,12 +123,15 @@ class Block(): parmsData = getParmsFunc() for parmData in parmsData: - parm = Parm(parmData, self.slot, self.startIndex, self.DPV1Master) + # print(parmData) + # print(self.startIndex, 3214) + parm = Parm(parmData, self.slot, self.startIndex, self) def getTBType(self): return def setTBType(self): + pass diff --git a/model/ProjectModel/ParmManage.py b/model/ProjectModel/ParmManage.py index fe97f84..83fffe5 100644 --- a/model/ProjectModel/ParmManage.py +++ b/model/ProjectModel/ParmManage.py @@ -18,7 +18,10 @@ class Parm(): desc = None rdType = None def __init__(self, parmData:list, slot:int, startIndex:int, block): + # print(startIndex, self.relativeIndex) + # print(parmData) self.relativeIndex, self.paramName, self.desc, self.dataType, rdStr, self.size, *rest = parmData + self.relativeIndex = int(self.relativeIndex) self.rdType = ParmEnum.readonly if rdStr == 'r' else ParmEnum.writeable self.realIndex = startIndex + self.relativeIndex self.slot = slot @@ -46,7 +49,7 @@ class Parm(): return str(struct.unpack('>f', value)) def unpackStr(self, value): - return struct.unpack('{}s'.format{str(len(value))}, value) + return struct.unpack('{}s'.format(str(len(value))), value) def unpack101(self, value): valueByte, statusByte = value[:4], value[4] @@ -56,7 +59,7 @@ class Parm(): return displayStr def unpackDS32(self, value): - reserved = self.unpackU8(value[0:1]) + reserved = self.unpackU8(value[0:1]) blockObject = self.unpackU8(value[1:2]) parentClass = self.unpackU8(value[2:3]) clas = self.unpackU8(value[3:4]) @@ -119,20 +122,20 @@ class Parm(): return struct.pack('>f', value) def pack101(self, value, status): - valueByte = self.packFloat(value) - statusByte = self.packU8(status) - packedData = valueByte + statusByte - return packedData + valueByte = self.packFloat(value) + statusByte = self.packU8(status) + packedData = valueByte + statusByte + return packedData def packDS36(self, EU100, EU0, unitValue, decPoint): - EU100Byte = self.packFloat(EU100) - EU0Byte = self.packFloat(EU0) - unitByte = self.packU16(unitValue) - decPointByte = self.packU8(decPoint) - packedData = EU100Byte + EU0Byte + unitByte + decPointByte - return packedData - - def packDS50(self, simulateStatus, simulateValue, simulateEnabled): + EU100Byte = self.packFloat(EU100) + EU0Byte = self.packFloat(EU0) + unitByte = self.packU16(unitValue) + decPointByte = self.packU8(decPoint) + packedData = EU100Byte + EU0Byte + unitByte + decPointByte + return packedData + + def packDS50(self, simulateStatus, simulateValue, simulateEnabled): simulateStatusByte = self.packU8(simulateStatus) simulateValueByte = self.packFloat(simulateValue) simulateEnabledByte = self.packU8(simulateEnabled) diff --git a/protocol/ModBus/DPV1Master.py b/protocol/ModBus/DPV1Master.py index 695fed2..b7f8f83 100644 --- a/protocol/ModBus/DPV1Master.py +++ b/protocol/ModBus/DPV1Master.py @@ -70,6 +70,7 @@ class DPV1Master(): self.searchSlaveThread.stop() def readParm(self, address, slot, index, length, callback = None): + length = int(length) hexAddress = address.to_bytes(1, byteorder='little') slotByte = slot.to_bytes(1, byteorder='little') indexByte = index.to_bytes(1, byteorder='little') @@ -78,7 +79,8 @@ class DPV1Master(): self.writeMultipleRegister(1, 750, searchDate) time.sleep(0.3) value = self.readHoldingRegisters(1, 750, -(-length // 2)) # -(-length // 2)向上取整 - value = struct.pack('>{}b'.format(-(-length // 2)), value)[:length] + # print(value) + value = struct.pack('>{}h'.format(len(value)), *value)[:length] self.writeMultipleRegister(1, 750, self.resetData) time.sleep(0.1) if callable(callback): diff --git a/utils/DBModels/DeviceParModels.py b/utils/DBModels/DeviceParModels.py index 6b25f44..802e50b 100644 --- a/utils/DBModels/DeviceParModels.py +++ b/utils/DBModels/DeviceParModels.py @@ -28,12 +28,12 @@ class PressureTranslationBlock(BaseModel): # 查询设备是否存在 @classmethod def getallParame(cls): - devices = cls.get_all() - if devices is 'error': + params = cls.get_all() + if params is 'error': return l = [] - for x in devices: - l.append([x.index, x.paramName, x.description, x.dataType, x.accessType]) + for x in params: + l.append([x.index, x.paramName, x.description, x.dataType, x.accessType, x.dataSize]) return l @classmethod