From 9dde7437bb3b98727a3a441f7090d935ff87d880 Mon Sep 17 00:00:00 2001 From: zcwBit Date: Fri, 2 Aug 2024 13:57:57 +0800 Subject: [PATCH] 0802 --- UI/BlockParameterManageWidget.py | 27 +--------- UI/EditAddressWidget.py | 85 +++++++++++++++++++++++++------- model/ConfigModel/GSDManage.py | 47 ++++++++++++++++++ protocol/ModBus/DPV1Master.py | 7 ++- 4 files changed, 120 insertions(+), 46 deletions(-) create mode 100644 model/ConfigModel/GSDManage.py diff --git a/UI/BlockParameterManageWidget.py b/UI/BlockParameterManageWidget.py index abb7533..bb26b13 100644 --- a/UI/BlockParameterManageWidget.py +++ b/UI/BlockParameterManageWidget.py @@ -16,6 +16,7 @@ from UI.EditAddressWidget import EditAddressWidget from model.ProjectModel.BlockManage import BlockManage, BlockType, TBType + class ShowImage(QWidget): def __init__(self, image_path): super().__init__() @@ -353,32 +354,8 @@ class BlockParameterManageWidget(QWidget): def editAddress(self): - - if self.initUIstat: - reply = QMessageBox.question(self.parent(), - '警告', - "请先连接设备", - QMessageBox.Yes) - return - - oldAddress = int(self.blockManage.address) - - self.editAddressWidget = EditAddressWidget(oldAddress) - if self.editAddressWidget.exec_() == QDialog.Accepted: + self.editAddressWidget = EditAddressWidget() - newAddress = int(self.editAddressWidget.editAddressEdit.text()) - - result =self.blockManage.DPV1Master.editDevAddress(oldAddress, newAddress) - - reply = QMessageBox.question(self.parent(), - '提示', - result, - QMessageBox.Yes) - return - - - - def searchAddress(self): self.searchAddressWidget = SearchAddressWidget(self.deviceAddressEdit) self.searchAddressWidget.show() diff --git a/UI/EditAddressWidget.py b/UI/EditAddressWidget.py index 0d722c2..4e73f50 100644 --- a/UI/EditAddressWidget.py +++ b/UI/EditAddressWidget.py @@ -22,28 +22,34 @@ from windoweffect.window_effect import WindowEffect from windoweffect.c_structures import MINMAXINFO, NCCALCSIZE_PARAMS from utils.DBModels.DeviceModels import DeviceDB +from model.ConfigModel.GSDManage import GsdParser +from protocol.ModBus.DPV1Master import DPV1Master class EditAddressWidget(QDialog): BORDER_WIDTH = 5 #设圆角 - def __init__(self, address): + def __init__(self): super().__init__() - self.address = address self.initUI() def initUI(self): self.resize(306, 350) self.setObjectName('deviceDialog') - self.editAddressEdit = QLineEdit() - self.editAddressEdit.setPlaceholderText("请输入站地址") - self.editAddressEdit.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) - self.editAddressEdit.setObjectName('deviceMesEdit') + self.newAddressEdit = QLineEdit() + self.newAddressEdit.setPlaceholderText("请输入目标站地址") + self.newAddressEdit.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) + self.newAddressEdit.setObjectName('deviceMesEdit') - self.oldAddressLabel = QLabel(' 当前站地址: ' + str(self.address)) - self.oldAddressLabel.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) - self.oldAddressLabel.setObjectName('oldAddressLabel') + self.oldAddressEdit = QLineEdit() + self.oldAddressEdit.setPlaceholderText("请输入原站地址") + self.oldAddressEdit.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) + self.oldAddressEdit.setObjectName('deviceMesEdit') + + # self.oldAddressLabel = QLabel(' 请输入原站地址: ' + str(self.address)) + # self.oldAddressLabel.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) + # self.oldAddressLabel.setObjectName('oldAddressLabel') # self.pvLowerEdit = QLineEdit() # self.pvLowerEdit.setPlaceholderText("量程下限") @@ -63,6 +69,11 @@ class EditAddressWidget(QDialog): enterShortcut = QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Return), self) enterShortcut.activated.connect(self.confirmButton.click) + self.deviceTypeCombox = QComboBox() + self.deviceTypeCombox.setObjectName('deviceTypeCombox') + # self.deviceTypeCombox.addItems(['1', '2']) + self.addCheckItem() + self.deviceTypeCombox.currentIndexChanged.connect(lambda index: self.changeDeviceType(index = index)) self.exitButton = QPushButton('取消') self.exitButton.clicked.connect(self.close) @@ -78,8 +89,9 @@ class EditAddressWidget(QDialog): self.conVerLayout = QVBoxLayout() self.conVerLayout.addWidget(QSplitter(), 1) - self.conVerLayout.addWidget(self.oldAddressLabel, 2) - self.conVerLayout.addWidget(self.editAddressEdit, 2) + self.conVerLayout.addWidget(self.oldAddressEdit, 2) + self.conVerLayout.addWidget(self.newAddressEdit, 2) + self.conVerLayout.addWidget(self.deviceTypeCombox, 2) # self.conVerLayout.addWidget(self.pvLowerEdit, 1) # self.conVerLayout.addWidget(self.pvUnitEdit, 1) @@ -95,6 +107,7 @@ class EditAddressWidget(QDialog): self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.setLayout(self.verticalLayout) + # 设置模态窗口 self.setWindowFlags(self.windowFlags() | Qt.Window) @@ -125,22 +138,56 @@ class EditAddressWidget(QDialog): self.setWindowOpacity(0.995) # 设置窗口透明度 self.setWindowFlag(Qt.FramelessWindowHint) + self.DPV1Master = DPV1Master('192.168.3.10', 502) + self.exec_() + # def changeDeviceType(self, index): + # print(index) + def addCheckItem(self): + self.GSDData = GsdParser.parseGsdFiles('C:\\Users\\zcw\\Desktop\\海南profibus\\现场仪表GSD') + # deviceTypeCombox + for GSDDict in self.GSDData: + self.deviceTypeCombox.addItem(GSDDict['modelName']) + def checkInput(self): - - newaddress = self.editAddressEdit.text() - - if not newaddress: + + oldAddress = self.oldAddressEdit.text() + newAddress = self.newAddressEdit.text() + if newAddress and oldAddress: + pattern = re.compile(r'^(?:[1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-6])$') + oldmatch = pattern.match(oldAddress) + newmatch = pattern.match(newAddress) + if not oldmatch: + QMessageBox.warning(self, '提示', '请输入2 - 126。') + return + if not newmatch: + QMessageBox.warning(self, '提示', '请输入2 - 126。') + return + if oldAddress == newAddress: reply = QMessageBox.question(self.parent(), - '警告', - "请先连接设备", - QMessageBox.Yes) + '警告', + "站地址重复", + QMessageBox.Yes) return else: - self.accept() # 所有输入都是数字且不为空时接受对话框 + reply = QMessageBox.question(self.parent(), + '警告', + "请输入从站地址", + QMessageBox.Yes) + return + identNumber = self.GSDData[self.deviceTypeCombox.currentIndex()]['identNumber'] + oldAddress = int(oldAddress) + newAddress = int(newAddress) + result = self.DPV1Master.editDevAddress(oldAddress, newAddress, identNumber) + reply = QMessageBox.question(self.parent(), + '提示', + result, + QMessageBox.Yes) + self.accept() + def enum(self,**enums): diff --git a/model/ConfigModel/GSDManage.py b/model/ConfigModel/GSDManage.py new file mode 100644 index 0000000..4d609c2 --- /dev/null +++ b/model/ConfigModel/GSDManage.py @@ -0,0 +1,47 @@ +import os +import re + + +class GsdParser: + @classmethod + def parseGsdFiles(cls, folderPath): + gsdData = [] + for filename in os.listdir(folderPath): + if filename.lower().endswith('.gsd'): + filePath = os.path.join(folderPath, filename) + identNumber, modelName = cls.parseGsdFile(filePath) + if identNumber and modelName: + gsdData.append({ + 'filename': filename, + 'identNumber': identNumber, + 'modelName': modelName + }) + return gsdData + + @classmethod + def parseGsdFile(cls, filePath): + identNumber = None + modelName = None + with open(filePath, 'r', encoding='utf-8', errors='ignore') as file: + content = file.read().replace(' ', '') + identNumberMatch = re.search(r'Ident_Number=(\w+)', content) + modelNameMatch = re.search(r'Model_Name="(.+?)"', content) + + if identNumberMatch: + identNumber = identNumberMatch.group(1)[2:] + if modelNameMatch: + modelName = modelNameMatch.group(1) + + return identNumber, modelName + + +# 示例用法 +if __name__ == '__main__': + folderPath = './' # 替换为实际的文件夹路径 + parsedData = GsdParser.parseGsdFiles(folderPath) + + for gsdInfo in parsedData: + print(f"File: {gsdInfo['filename']}") + print(f"Ident_Number: {gsdInfo['identNumber']}") + print(f"Model_Name: {gsdInfo['modelName']}") + print("-" * 40) \ No newline at end of file diff --git a/protocol/ModBus/DPV1Master.py b/protocol/ModBus/DPV1Master.py index 5ec1f28..85f4393 100644 --- a/protocol/ModBus/DPV1Master.py +++ b/protocol/ModBus/DPV1Master.py @@ -134,10 +134,12 @@ class DPV1Master(): else: return False - def editDevAddress(self, oldAddress, newAddress): + def editDevAddress(self, oldAddress, newAddress, identNumer): oldAddressHex = oldAddress.to_bytes(length=1, byteorder='little') newAddressHex = newAddress.to_bytes(1, byteorder='little') - editAddressStream = b'\x03' + oldAddressHex + b'\x00'+ newAddressHex + idHighHex = identNumer[:2].to_bytes(1, byteorder='little') + idLowHex = identNumer[2:].to_bytes(1, byteorder='little') + editAddressStream = b'\x03' + oldAddressHex + b'\x00'+ newAddressHex + b'\x00' + idHighHex + b'\x00' + idLowHex editAddressDate = struct.unpack('>hh', editAddressStream) self.writeMultipleRegister(1, 750, self.resetData) self.writeMultipleRegister(1, 750, editAddressDate) @@ -150,6 +152,7 @@ class DPV1Master(): self.writeMultipleRegister(1, 750, self.resetData) time.sleep(0.1) return result + # def readInputRegisters(self, slaveId, startAddress, varNums, order = 'ABCD'):