0625更新变量表导入功能

main
ZHANGXUXU\95193 4 months ago
parent c92d4b0d5a
commit 08119a416f

Binary file not shown.

@ -1,12 +1,15 @@
from csv import excel
import sys import sys
import pandas as pd
from PyQt5 import QtWidgets from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt
from PyQt5.Qt import * 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 import POINTER, cast
from ctypes.wintypes import MSG from ctypes.wintypes import MSG
from win32 import win32api, win32gui from win32 import win32api, win32gui
from win32.lib import win32con from win32.lib import win32con
from model.ProjectModel.VarManage import GlobalVarManager
from windoweffect import WindowEffect, MINMAXINFO, NCCALCSIZE_PARAMS from windoweffect import WindowEffect, MINMAXINFO, NCCALCSIZE_PARAMS
from UI.Main.MainLeft import MainLeft from UI.Main.MainLeft import MainLeft
from UI.Main.MainTop import MainTop from UI.Main.MainTop import MainTop
@ -204,8 +207,36 @@ class MainWindow(QMainWindow):
self.exButtonClicked(5) self.exButtonClicked(5)
def loadVar(self): 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): def enum(self,**enums):
return type('Enum', (), enums) return type('Enum', (), enums)

@ -462,3 +462,16 @@ class DevicesManange():
return l return l
except Exception as e: except Exception as e:
return print(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)

@ -1,10 +1,11 @@
from utils import Globals
import openpyxl import openpyxl
from utils.DBModels.ProtocolModel import ModbusTcpMasterVar, ModbusRtuMasterVar, ModbusRtuSlaveVar,\ from utils.DBModels.ProtocolModel import ModbusTcpMasterVar, ModbusRtuMasterVar, ModbusRtuSlaveVar,\
ModbusTcpSlaveVar, HartVar, TcRtdVar, AnalogVar, HartSimulateVar ModbusTcpSlaveVar, HartVar, TcRtdVar, AnalogVar, HartSimulateVar
from PyQt5.Qt import QFileDialog, QMessageBox
# ID 从站地址 变量名 变量描述 功能码 寄存器地址 工程量下限 工程量上限 # ID 从站地址 变量名 变量描述 变量类型 寄存器地址 工程量下限 工程量上限
class ModbusVarManage(object): class ModbusVarManage(object):
@ -24,71 +25,82 @@ class ModbusVarManage(object):
return self.ModBusVarClass.get(modbusType) return self.ModBusVarClass.get(modbusType)
@classmethod @classmethod
def importModbusVar(self, path): def importVarForm(self, varName, varType, des, address, slaveID, min, max, order, modbusType, varModel):
# 导入modbus变量表 varClass = self.getVarClass(modbusType)
wb = openpyxl.load_workbook(path) if varClass.getByName(varName):
ws = wb.active # 如果变量已存在,更新其信息
IDIndex = None varClass.update(varType=varType, description=des, address=address, slaveID=slaveID, min=min, max=max, order=order, varModel=varModel).where(varClass.varName == varName).execute()
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: else:
if errorConList: modbusVarType =self.getVarClass(modbusType)()
return '\r\n'.join(errorConList) modbusVarType.createVar(varName = varName, varType = varType, des = des, address = address,
else: slaveID = slaveID, min = min, max = max, order = order, varModel = varModel)
return '导入成功'
# 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 @classmethod
def exportModbusVar(self, excelPath): def exportModbusVar(self, excelPath):
@ -270,6 +282,15 @@ class HartVarManage(object):
def initVar(self): def initVar(self):
self.createVar(varName='name', des='TC', varModel='本地值') 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): class TcRtdManage(object):
@ -361,6 +382,15 @@ class TcRtdManage(object):
name = str(name) name = str(name)
TcRtdVar.update(varModel = str(varModel)).where(TcRtdVar.varName == name).execute() 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): class AnalogManage(object):
def __init__(self): def __init__(self):
super(AnalogManage, self).__init__() super(AnalogManage, self).__init__()
@ -464,7 +494,15 @@ class AnalogManage(object):
des = '有源/无源4-20mA输入' + str(i) des = '有源/无源4-20mA输入' + str(i)
self.createVar(varName=name, channelNumber=str(i), varType='AI', des=des, min='100', max='200', varModel = '本地值') 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): class HartSimulateVarManage(object):
@ -539,6 +577,16 @@ class HartSimulateVarManage(object):
def initVar(self): def initVar(self):
self.createVar(varName='name', des='TC', varModel='本地值') 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): class GlobalVarManager(object):
# 所有支持的变量模型类列表 # 所有支持的变量模型类列表
allVarClass = [ allVarClass = [
@ -569,4 +617,108 @@ class GlobalVarManager(object):
if str(varName) in existingNames: if str(varName) in existingNames:
return True return True
else: else:
return False 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()
Loading…
Cancel
Save