diff --git a/Static/变量表.xlsx b/Static/变量表.xlsx new file mode 100644 index 0000000..17301f8 Binary files /dev/null and b/Static/变量表.xlsx differ 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