From 529508f5f289e12381671d1c2386cb9e05cbdcef Mon Sep 17 00:00:00 2001 From: "ZHANGXUXU\\95193" <951937200@qq.com> Date: Thu, 14 Aug 2025 16:11:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E5=8F=98=E9=87=8F=E5=AF=BC=E5=85=A5?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9=E4=B8=BA=E6=AF=8F=E6=AC=A1?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E5=89=8D=E5=88=A0=E9=99=A4=E5=AF=B9=E5=BA=94?= =?UTF-8?q?=E8=A1=A8=E7=9A=84=E6=95=B0=E6=8D=AE=E5=BA=93=E5=90=8E=E5=86=8D?= =?UTF-8?q?=E5=8F=AA=E5=AF=BC=E5=85=A5=E8=A1=A8=E4=B8=AD=E7=9A=84=E5=8F=98?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UI/VarManages/TCRTDModel.py | 39 ++++++++-- model/ProjectModel/VarManage.py | 130 +++++++++++++++++++++++++------- 2 files changed, 135 insertions(+), 34 deletions(-) diff --git a/UI/VarManages/TCRTDModel.py b/UI/VarManages/TCRTDModel.py index cc981b6..74a626f 100644 --- a/UI/VarManages/TCRTDModel.py +++ b/UI/VarManages/TCRTDModel.py @@ -54,6 +54,9 @@ class TcRtdModel(VarTableModel): self.checkList = ['Unchecked'] * len(self.datas) # self.layoutChanged.emit() self.table.proxy.invalidate() + + self.table.reset()#强制重绘 + # 初始化后立即刷新缓存 self.refreshValueCache() @@ -341,14 +344,38 @@ class TcRtdTypeDelegate(TcRtdButtonDelegate): painter.fillRect(paint_rect, index.data(Qt.BackgroundRole)) if not self.parent().indexWidget(index): comboBox = QComboBox(self.parent()) - if index.row() < 8: - item = ['R', 'S', 'B', 'J', 'T','E', 'K', 'N', 'C', 'A'] + + # 根据实际的变量类型来设置下拉框选项,而不是根据行号 + currentValue = self.parent().model.datas[index.row()][index.column()] + + # 定义所有可能的类型 + tcTypes = ['R', 'S', 'B', 'J', 'T','E', 'K', 'N', 'C', 'A'] + rtdTypes = ['PT100'] + print(currentValue,2321312) + + + # 如果当前值是热电偶类型 + if currentValue in tcTypes: + item = tcTypes comboBox.addItems(item) - i = item.index(self.parent().model.datas[index.row()][index.column()]) - comboBox.setCurrentIndex(i) - else: - item = ['PT100'] + try: + i = item.index(currentValue) + comboBox.setCurrentIndex(i) + except ValueError: + + comboBox.setCurrentIndex(0) + # 如果当前值是热电阻类型 + elif currentValue in rtdTypes: + item = rtdTypes comboBox.addItems(item) + comboBox.setCurrentIndex(0) + # 如果当前值不在任何已知类型中,显示所有可用选项 + else: + # 显示所有可用的类型选项,让用户自由选择 + all_types = tcTypes + rtdTypes + comboBox.addItems(all_types) + # 不设置当前索引,让用户看到空值状态 + comboBox.setCurrentText('') comboBox.currentIndexChanged.connect(self.indexChange) comboBox.setObjectName('TcRtdTypeBox') comboBox.setEditable(True) diff --git a/model/ProjectModel/VarManage.py b/model/ProjectModel/VarManage.py index c5e6461..c5b57cc 100644 --- a/model/ProjectModel/VarManage.py +++ b/model/ProjectModel/VarManage.py @@ -451,33 +451,38 @@ class TcRtdManage(object): varTypeList = ['R', 'S', 'B', 'J', 'T', 'E', 'K', 'N', 'C', 'A'] pattern = re.compile(r'[^0-9\.-]+') # or re.findall(pattern, varName) - if not varName or not varType or not varModel or not min or not max or not channelNumber : + if not varName or not varType or not varModel or not channelNumber : errorInfo = '表TCRTD第{}行导入失败,有关键字段为空'.format(str(index + 1)) return errorInfo if re.findall(pattern, str(channelNumber)) or re.findall(pattern, str(min)) or re.findall(pattern, str(max)): errorInfo = '表TCRTD第{}行导入失败,{}'.format(str(index + 1), '通道号、工程量下限、工程量上限只能为数字') return errorInfo - if varType not in varTypeList or varType != 'PT100': - errorInfo = '表TCRTD第{}行导入失败,{}'.format(str(index + 1), str(index + 1), '变量类型错误') + # 检查变量类型是否有效:热电偶类型必须在varTypeList中,或者必须是PT100 + if varType not in varTypeList and varType != 'PT100': + errorInfo = '表TCRTD第{}行导入失败,变量类型错误:{}'.format(str(index + 1), varType) + return errorInfo if varModel not in ['本地值', '远程值', '模拟值']: errorInfo = '表TCRTD第{}行导入失败,{}'.format(str(index + 1), str(index + 1), '变量模型有误') return errorInfo + if not varNumberManage.validateChannelNumber(varType, channelNumber): + errorInfo = '表TCRTD第{}行导入失败,{}'.format(str(index + 1), '通道号超出范围') + return errorInfo - if TcRtdVar.getByChannelNumber(channelNumber): - # 如果通道号已存在,更新其信息 - if varType in varTypeList: - #导入热电偶 - TcRtdVar.update(varName = varName, channelNumber = channelNumber, description=des, varType=varType, - min=min, max=max, compensationVar = compensationVar, unit = unit, - initialValue=initialValue).where((TcRtdVar.channelNumber == channelNumber) & (TcRtdVar.varType != 'PT100')).execute() - else: - #导入热电阻 - TcRtdVar.update(varName = varName, channelNumber = channelNumber, description=des, varType=varType, - min=min, max=max, compensationVar = compensationVar, unit = unit, - initialValue=initialValue).where((TcRtdVar.channelNumber == channelNumber) & (TcRtdVar.varType == 'PT100')).execute() - else: - tcRtdVarType = TcRtdVar() - tcRtdVarType.createVar(varName = varName, channelNumber=channelNumber, des = des, varType = varType, min = min, max = max, compensationVar = compensationVar, varModel = varModel, unit = unit,nitialValue=initialValue) + # if TcRtdVar.getByChannelNumber(channelNumber): + # # 如果通道号已存在,更新其信息 + # if varType in varTypeList: + # #导入热电偶 + # TcRtdVar.update(varName = varName, channelNumber = channelNumber, description=des, varType=varType, + # min=min, max=max, compensationVar = compensationVar, unit = unit, + # initialValue=initialValue).where((TcRtdVar.channelNumber == channelNumber) & (TcRtdVar.varType != 'PT100')).execute() + # else: + # #导入热电阻 + # TcRtdVar.update(varName = varName, channelNumber = channelNumber, description=des, varType=varType, + # min=min, max=max, compensationVar = compensationVar, unit = unit, + # initialValue=initialValue).where((TcRtdVar.channelNumber == channelNumber) & (TcRtdVar.varType == 'PT100')).execute() + # else: + tcRtdVarType = TcRtdVar() + tcRtdVarType.createVar(varName = varName, channelNumber=channelNumber, des = des, varType = varType, min = min, max = max, compensationVar = compensationVar, varModel = varModel, unit = unit, initialValue=initialValue) # 操作后刷新缓存 refreshCache() @@ -610,13 +615,15 @@ class AnalogManage(object): if varModel not in ['本地值', '远程值', '模拟值']: errorInfo = '表IO第{}行导入失败,{}'.format(str(index + 1), '变量模型有误') return errorInfo - - if AnalogVar.getByChannelNumber(channelNumber): - # 如果通道号已存在,更新其信息 - AnalogVar.update(varName = varName, description=des, varType=varType, min=min, max=max, unit = unit, initialValue=initialValue).where((AnalogVar.channelNumber == channelNumber) & (AnalogVar.varType == varType)).execute() - else: - analogVarType = AnalogVar() - analogVarType.createVar(varName = varName, channelNumber = channelNumber, des = des, varType = varType, min = min, max = max, varModel = varModel,unit = unit, initialValue=initialValue) + if not varNumberManage.validateChannelNumber(varType, channelNumber): + errorInfo = '表IO第{}行导入失败,{}'.format(str(index + 1), '通道号超出范围') + return errorInfo + # if AnalogVar.getByChannelNumber(channelNumber): + # # 如果通道号已存在,更新其信息 + # AnalogVar.update(varName = varName, description=des, varType=varType, min=min, max=max, unit = unit, initialValue=initialValue).where((AnalogVar.channelNumber == channelNumber) & (AnalogVar.varType == varType)).execute() + + analogVarType = AnalogVar() + analogVarType.createVar(varName = varName, channelNumber = channelNumber, des = des, varType = varType, min = min, max = max, varModel = varModel,unit = unit, initialValue=initialValue) # 操作后刷新缓存 refreshCache() @@ -791,13 +798,26 @@ class GlobalVarManager(object): case 'IO' | 'TCRTD': requiredFields = ['变量名', '通道序号', '变量类型'] if sheetName == 'IO' else \ ['变量名', '通道序号', '变量类型', '补偿值'] - importFunc = AnalogManage.importVarForm if sheetName == 'IO' else TcRtdManage.importVarForm + # 先清空现有数据,再导入新数据 + if sheetName == 'IO': + try: + deleted_count = AnalogVar.delete().execute() + print(f"已清空 {deleted_count} 条IO变量数据") + except Exception as e: + print(f"清空IO数据失败: {str(e)}") + else: # TCRTD + try: + deleted_count = TcRtdVar.delete().execute() + print(f"已清空 {deleted_count} 条TCRTD变量数据") + except Exception as e: + print(f"清空TCRTD数据失败: {str(e)}") + + importFunc = AnalogManage.importVarForm if sheetName == 'IO' else TcRtdManage.importVarForm for index, row in data.iterrows(): if any(pd.isna(row[field]) for field in requiredFields): errorConList.append(f'第{index+1}行关键字段为空') continue - try: if sheetName == 'IO': errInfo = importFunc( @@ -832,6 +852,9 @@ class GlobalVarManager(object): errorConList.append(errInfo) except Exception as e: errorConList.append(f'第{index+1}行导入失败: {str(e)}') + + + case 'Hart模拟' | 'Hart读取': requiredFields = ['变量名'] @@ -860,5 +883,56 @@ class GlobalVarManager(object): - +class varNumberManage(object): + def __init__(self): + super(varNumberManage, self).__init__() + + @classmethod + def validateChannelNumber(cls, varType, channelNumber): + """ + 验证通道号是否在正确的范围内 + + Args: + varType (str): 变量类型 + channelNumber (int): 通道号 + + Returns: + bool: 通道号在范围内返回True,否则返回False + """ + # 确保channelNumber是整数 + try: + channelNumber = int(channelNumber) + except (ValueError, TypeError): + return False + + # 定义各类型的通道号范围 + channelRanges = { + 'AO': (1, 16), + 'DO': (1, 16), + 'AI': (1, 8), + 'DI': (1, 16), + 'PT100': (1, 8), + # 热电偶类型 + 'R': (1, 8), + 'S': (1, 8), + 'B': (1, 8), + 'J': (1, 8), + 'T': (1, 8), + 'E': (1, 8), + 'K': (1, 8), + 'N': (1, 8), + 'C': (1, 8), + 'A': (1, 8) + } + + # 检查变量类型是否在支持的类型中 + if varType not in channelRanges: + return False + + # 获取该类型的通道号范围 + minChannel, maxChannel = channelRanges[varType] + + # 验证通道号是否在范围内 + return minChannel <= channelNumber <= maxChannel +