From 08119a416f57e9169881e862a16c4956963b737f Mon Sep 17 00:00:00 2001 From: "ZHANGXUXU\\95193" <951937200@qq.com> Date: Wed, 25 Jun 2025 18:40:25 +0800 Subject: [PATCH 1/2] =?UTF-8?q?0625=E6=9B=B4=E6=96=B0=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E8=A1=A8=E5=AF=BC=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Static/变量表.xlsx | Bin 0 -> 30818 bytes UI/Main/Main.py | 35 +++- model/ProjectModel/DeviceManage.py | 13 ++ model/ProjectModel/VarManage.py | 288 ++++++++++++++++++++++------- 4 files changed, 266 insertions(+), 70 deletions(-) create mode 100644 Static/变量表.xlsx diff --git a/Static/变量表.xlsx b/Static/变量表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..17301f854a0d56be7b2970f7d6e741604891d1ad GIT binary patch literal 30818 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 literal 0 HcmV?d00001 diff --git a/UI/Main/Main.py b/UI/Main/Main.py index f01a4e9..9ad6a70 100644 --- a/UI/Main/Main.py +++ b/UI/Main/Main.py @@ -1,12 +1,15 @@ +from csv import excel import sys +import pandas as pd from PyQt5 import QtWidgets from PyQt5.QtCore import Qt from PyQt5.Qt import * -from PyQt5.QtWidgets import QApplication, QMainWindow, QStackedWidget, QMessageBox, QStackedWidget, QWidget, QTabWidget +from PyQt5.QtWidgets import QApplication, QMainWindow, QStackedWidget, QMessageBox, QStackedWidget, QWidget, QTabWidget, QFileDialog from ctypes import POINTER, cast from ctypes.wintypes import MSG from win32 import win32api, win32gui from win32.lib import win32con +from model.ProjectModel.VarManage import GlobalVarManager from windoweffect import WindowEffect, MINMAXINFO, NCCALCSIZE_PARAMS from UI.Main.MainLeft import MainLeft from UI.Main.MainTop import MainTop @@ -204,8 +207,36 @@ class MainWindow(QMainWindow): self.exButtonClicked(5) def loadVar(self): - pass + file_path, _ = QFileDialog.getOpenFileName(self, '选择Excel文件', '', 'Excel Files (*.xlsx *.xls)') + if not file_path: + return + + excelData = pd.read_excel(file_path, sheet_name=None) + allVarNames = [] + for sheet_name, data in excelData.items(): + if '变量名' in data.columns: + # 确保所有变量名转换为字符串 + allVarNames.extend(data['变量名'].astype(str).tolist()) + + if len(allVarNames) != len(set(allVarNames)): + # 确保重复名称列表中的元素都是字符串 + repeated_names = [str(name) for name in set(allVarNames) if allVarNames.count(name) > 1] + QMessageBox.warning(self, '警告', f'发现重复的变量名: {", ".join(repeated_names)}') + return + for sheet_name, data in excelData.items(): + if '变量名' in data.columns: + GlobalVarManager.importVar(sheet_name, data) + + + # Uncomment the following lines if you want to update or insert variables into the database + # db_manager = DBManager() # Assuming you have a DBManager class to handle database operations + # for _, row in data.iterrows(): + # variable_name = row['变量名'] + # value = row.iloc[1] if len(row) > 1 else None + + # db_manager.update_or_insert_variable(variable_name, value) + def enum(self,**enums): return type('Enum', (), enums) diff --git a/model/ProjectModel/DeviceManage.py b/model/ProjectModel/DeviceManage.py index 27449fe..c155132 100644 --- a/model/ProjectModel/DeviceManage.py +++ b/model/ProjectModel/DeviceManage.py @@ -462,3 +462,16 @@ class DevicesManange(): return l except Exception as e: return print(e) + + @classmethod + def update_or_insert_variable(self, variable_name, value): + # 这里假设有一个数据库模型类DeviceVariable用于操作变量数据 + from utils.DBModels.DeviceModels import DeviceVariable + variable = DeviceVariable.get_by_name(variable_name) + if variable: + # 如果变量存在,则更新其值 + variable.value = value + variable.save() + else: + # 如果变量不存在,则创建新记录 + DeviceVariable.create(name=variable_name, value=value) diff --git a/model/ProjectModel/VarManage.py b/model/ProjectModel/VarManage.py index a740dd3..e3b5fd0 100644 --- a/model/ProjectModel/VarManage.py +++ b/model/ProjectModel/VarManage.py @@ -1,10 +1,11 @@ +from utils import Globals import openpyxl from utils.DBModels.ProtocolModel import ModbusTcpMasterVar, ModbusRtuMasterVar, ModbusRtuSlaveVar,\ ModbusTcpSlaveVar, HartVar, TcRtdVar, AnalogVar, HartSimulateVar - -# ID 从站地址 变量名 变量描述 功能码 寄存器地址 工程量下限 工程量上限 +from PyQt5.Qt import QFileDialog, QMessageBox +# ID 从站地址 变量名 变量描述 变量类型 寄存器地址 工程量下限 工程量上限 class ModbusVarManage(object): @@ -24,71 +25,82 @@ class ModbusVarManage(object): return self.ModBusVarClass.get(modbusType) @classmethod - def importModbusVar(self, path): - # 导入modbus变量表 - wb = openpyxl.load_workbook(path) - ws = wb.active - IDIndex = None - slaveIndex = None - nameIndex = None - desIndex = None - typeIndex = None - addrIndex = None - minIndex = None - maxIndex = None - - for index, cell in enumerate(list(ws.iter_rows())[0]): - if cell.value in ['id', 'ID']: - IDIndex = index - if cell.value == '从站地址': - slaveIndex = index - if cell.value == '变量名': - nameIndex = index - if cell.value == '变量描述': - desIndex = index - if cell.value == '变量类型': - typeIndex = index - if cell.value == '寄存器地址': - addrIndex = index - if cell.value == '工程量下限': - minIndex = index - if cell.value == '工程量上限': - maxIndex = index - # print(IDIndex, slaveIndex, nameIndex, desIndex, typeIndex, addrIndex, minIndex, maxIndex) - if IDIndex == None or slaveIndex == None or nameIndex == None or desIndex == None or typeIndex == None or addrIndex == None or minIndex == None or maxIndex == None: - # print('表头错误') - return '表头错误' - errorConList = [] - for index, row in enumerate(list(ws.iter_rows())[1:]): - try: - l = [str(x.value) for x in row] - varName = l[nameIndex] - varType = l[typeIndex] - des = '' if l[desIndex] == 'None' else l[desIndex] - address = l[addrIndex] - slaveID = l[slaveIndex] - min = '' if l[minIndex] == 'None' else l[minIndex] - max = '' if l[maxIndex] == 'None' else l[maxIndex] - if {varName, varType, address, slaveID} & {'None'}: - errorConList.append('第{}行导入失败,有关键字段为空'.format(str(index + 1))) - continue - - if varType not in ['0', '1', '3', '4']: - errorConList.append('第{}行导入失败,变量类型有误'.format(str(index + 1))) - continue - if ModBusVar.getByName(varName): - ModBusVar.update(varType = varType, description = des, address = address, slaveID = slaveID, min = min, max = max, order = 'int').where(ModBusVar.varName == varName).execute() - else: - ModBusVarModel = ModBusVar() - ModBusVarModel.createVar(varName = varName, varType = varType, des = des, address = address, slaveID = slaveID, min = min, max = max, order = 'int') - except Exception as e: - errorConList.append('第{}行导入失败,{}'.format(str(index + 1), str(e))) - continue + def importVarForm(self, varName, varType, des, address, slaveID, min, max, order, modbusType, varModel): + varClass = self.getVarClass(modbusType) + if varClass.getByName(varName): + # 如果变量已存在,更新其信息 + varClass.update(varType=varType, description=des, address=address, slaveID=slaveID, min=min, max=max, order=order, varModel=varModel).where(varClass.varName == varName).execute() else: - if errorConList: - return '\r\n'.join(errorConList) - else: - return '导入成功' + modbusVarType =self.getVarClass(modbusType)() + modbusVarType.createVar(varName = varName, varType = varType, des = des, address = address, + slaveID = slaveID, min = min, max = max, order = order, varModel = varModel) + + + # def importModbusVar(self, path): + # # 导入modbus变量表 + # wb = openpyxl.load_workbook(path) + # ws = wb.active + # IDIndex = None + # slaveIndex = None + # nameIndex = None + # desIndex = None + # typeIndex = None + # addrIndex = None + # minIndex = None + # maxIndex = None + + # for index, cell in enumerate(list(ws.iter_rows())[0]): + # if cell.value in ['id', 'ID']: + # IDIndex = index + # if cell.value == '从站地址': + # slaveIndex = index + # if cell.value == '变量名': + # nameIndex = index + # if cell.value == '变量描述': + # desIndex = index + # if cell.value == '变量类型': + # typeIndex = index + # if cell.value == '寄存器地址': + # addrIndex = index + # if cell.value == '工程量下限': + # minIndex = index + # if cell.value == '工程量上限': + # maxIndex = index + # # print(IDIndex, slaveIndex, nameIndex, desIndex, typeIndex, addrIndex, minIndex, maxIndex) + # if IDIndex == None or slaveIndex == None or nameIndex == None or desIndex == None or typeIndex == None or addrIndex == None or minIndex == None or maxIndex == None: + # # print('表头错误') + # return '表头错误' + # errorConList = [] + # for index, row in enumerate(list(ws.iter_rows())[1:]): + # try: + # l = [str(x.value) for x in row] + # varName = l[nameIndex] + # varType = l[typeIndex] + # des = '' if l[desIndex] == 'None' else l[desIndex] + # address = l[addrIndex] + # slaveID = l[slaveIndex] + # min = '' if l[minIndex] == 'None' else l[minIndex] + # max = '' if l[maxIndex] == 'None' else l[maxIndex] + # if {varName, varType, address, slaveID} & {'None'}: + # errorConList.append('第{}行导入失败,有关键字段为空'.format(str(index + 1))) + # continue + + # if varType not in ['0', '1', '3', '4']: + # errorConList.append('第{}行导入失败,变量类型有误'.format(str(index + 1))) + # continue + # if ModBusVar.getByName(varName): + # ModBusVar.update(varType = varType, description = des, address = address, slaveID = slaveID, min = min, max = max, order = 'int').where(ModBusVar.varName == varName).execute() + # else: + # ModBusVarModel = ModBusVar() + # ModBusVarModel.createVar(varName = varName, varType = varType, des = des, address = address, slaveID = slaveID, min = min, max = max, order = 'int') + # except Exception as e: + # errorConList.append('第{}行导入失败,{}'.format(str(index + 1), str(e))) + # continue + # else: + # if errorConList: + # return '\r\n'.join(errorConList) + # else: + # return '导入成功' @classmethod def exportModbusVar(self, excelPath): @@ -270,6 +282,15 @@ class HartVarManage(object): def initVar(self): self.createVar(varName='name', des='TC', varModel='本地值') + + @classmethod + def importVarForm(self, varName, des, varModel): + if HartVar.getByName(varName): + # 如果变量已存在,更新其信息 + HartVar.update(description = des, varModel = varModel).where(HartVar.varName == varName).execute() + else: + hartVarType = HartVar() + hartVarType.createVar(varName = varName, des = des, varModel = varModel) class TcRtdManage(object): @@ -361,6 +382,15 @@ class TcRtdManage(object): name = str(name) TcRtdVar.update(varModel = str(varModel)).where(TcRtdVar.varName == name).execute() + @classmethod + def importVarForm(self, varName, channelNumber, varType, des, min, max, compensationVar, varModel): + if TcRtdVar.getByName(varName): + # 如果变量已存在,更新其信息 + TcRtdVar.update(channelNumber = channelNumber, description=des, varType=varType, min=min, max=max, compensationVar = compensationVar).where(TcRtdVar.varName == varName).execute() + else: + tcRtdVarType = TcRtdVar() + tcRtdVarType.createVar(varName = varName, channelNumber=channelNumber, des = des, varType = varType, min = min, max = max, compensationVar = compensationVar, varModel = varModel) + class AnalogManage(object): def __init__(self): super(AnalogManage, self).__init__() @@ -464,7 +494,15 @@ class AnalogManage(object): des = '有源/无源4-20mA输入' + str(i) self.createVar(varName=name, channelNumber=str(i), varType='AI', des=des, min='100', max='200', varModel = '本地值') - + @classmethod + def importVarForm(self, varName, channelNumber, varType, des, min, max, varModel): + if AnalogVar.getByName(varName): + # 如果变量已存在,更新其信息 + AnalogVar.update(channelNumber =channelNumber, description=des, varType=varType, min=min, max=max).where(AnalogVar.varName == varName).execute() + else: + analogVarType = AnalogVar() + analogVarType.createVar(varName = varName, channelNumber = channelNumber, des = des, varType = varType, min = min, max = max, varModel = varModel) + class HartSimulateVarManage(object): @@ -539,6 +577,16 @@ class HartSimulateVarManage(object): def initVar(self): self.createVar(varName='name', des='TC', varModel='本地值') + @classmethod + def importVarForm(self, varName, des, varModel): + if AnalogVar.getByName(varName): + # 如果变量已存在,更新其信息 + HartSimulateVar.update(description = des, varModel = varModel).where(HartSimulateVar.varName == varName).execute() + else: + hartSimulateVarType = HartSimulateVar() + hartSimulateVarType.createVar(varName = varName, des = des,varModel = varModel) + + class GlobalVarManager(object): # 所有支持的变量模型类列表 allVarClass = [ @@ -569,4 +617,108 @@ class GlobalVarManager(object): if str(varName) in existingNames: return True else: - return False \ No newline at end of file + return False + + @classmethod + def importVar(cls,sheetName, data): + """导入变量""" + match sheetName: + case 'ModbusTCP主站': + for index, row in data.iterrows(): + ModbusVarManage.importVarForm( + varName=row['变量名'], + varType=row['变量类型'], + des=row['变量描述'], + address=row['寄存器地址'], + slaveID=row['从站地址'], + min=row['工程量下限'], + max=row['工程量上限'], + order=row['字节顺序'], + modbusType='ModbusTcpMaster', + varModel=row['值类型'] + ) + case 'ModbusTCP从站': + for index, row in data.iterrows(): + ModbusVarManage.importVarForm( + varName=row['变量名'], + varType=row['变量类型'], + des=row['变量描述'], + address=row['寄存器地址'], + slaveID=row['从站地址'], + min=row['工程量下限'], + max=row['工程量上限'], + order=row['字节顺序'], + modbusType='ModbusTcpSlave', + varModel=row['值类型'] + ) + case 'ModbusRTU主站': + for index, row in data.iterrows(): + ModbusVarManage.importVarForm( + varName=row['变量名'], + varType=row['变量类型'], + des=row['变量描述'], + address=row['寄存器地址'], + slaveID=row['从站地址'], + min=row['工程量下限'], + max=row['工程量上限'], + order=row['字节顺序'], + modbusType='ModbusTcpSlave', + varModel=row['值类型'] + ) + case 'ModbusRTU从站': + for index, row in data.iterrows(): + ModbusVarManage.importVarForm( + varName=row['变量名'], + varType=row['变量类型'], + des=row['变量描述'], + address=row['寄存器地址'], + slaveID=row['从站地址'], + min=row['工程量下限'], + max=row['工程量上限'], + order=row['字节顺序'], + modbusType='ModbusTcpSlave', + varModel=row['值类型'] + ) + case 'IO': + for index, row in data.iterrows(): + AnalogManage.importVarForm( + varName=row['变量名'], + channelNumber=row['通道序号'], + varType=row['变量类型'], + des=row['变量描述'], + min=row['工程量下限'], + max=row['工程量上限'], + varModel=row['值类型'] + ) + + case 'TCRTD': + for index, row in data.iterrows(): + TcRtdManage.importVarForm( + varName=row['变量名'], + channelNumber=row['通道序号'], + varType=row['变量类型'], + des=row['变量描述'], + min=row['工程量下限'], + max=row['工程量上限'], + compensationVar=row['补偿值'], + varModel=row['值类型'] + ) + case 'Hart模拟': + for index, row in data.iterrows(): + HartSimulateVarManage.importVarForm( + varName=row['变量名'], + des=row['变量描述'], + varModel=row['值类型'] + ) + case 'Hart读取': + for index, row in data.iterrows(): + HartVarManage.importVarForm( + varName=row['变量名'], + des=row['变量描述'], + varModel=row['值类型'] + ) + + modelLists = ['ModbusTcpMasterTable', 'ModbusTcpSlaveTable', 'ModbusRtuMasterTable', \ + 'ModbusRtuSlaveTable', 'HartTable', 'TcRtdTable', 'AnalogTable', 'HartSimulateTable', 'userTable'] + for l in modelLists: + Globals.getValue(l).model.initTable() \ No newline at end of file From b69058a4bf741b2429d40829675e3a9666299ee9 Mon Sep 17 00:00:00 2001 From: "ZHANGXUXU\\95193" <951937200@qq.com> Date: Wed, 25 Jun 2025 18:42:21 +0800 Subject: [PATCH 2/2] 0625 --- model/ProjectModel/DeviceManage.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/model/ProjectModel/DeviceManage.py b/model/ProjectModel/DeviceManage.py index c155132..8670bdf 100644 --- a/model/ProjectModel/DeviceManage.py +++ b/model/ProjectModel/DeviceManage.py @@ -463,15 +463,3 @@ class DevicesManange(): except Exception as e: return print(e) - @classmethod - def update_or_insert_variable(self, variable_name, value): - # 这里假设有一个数据库模型类DeviceVariable用于操作变量数据 - from utils.DBModels.DeviceModels import DeviceVariable - variable = DeviceVariable.get_by_name(variable_name) - if variable: - # 如果变量存在,则更新其值 - variable.value = value - variable.save() - else: - # 如果变量不存在,则创建新记录 - DeviceVariable.create(name=variable_name, value=value)