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