main
zcwBit 1 year ago
parent 2a6a840864
commit 9dde7437bb

@ -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()

@ -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):

@ -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)

@ -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'):

Loading…
Cancel
Save