You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

185 lines
7.0 KiB
Python

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import os
import json
from utils import Globals
class GlobalConfigManager:
"""全局配置管理器 - 所有工程使用统一配置"""
CONFIG_FILE = 'Static/global_config.json'
@classmethod
def loadGlobalConfig(cls):
"""加载全局配置文件"""
try:
with open(cls.CONFIG_FILE, 'r', encoding='utf-8') as f:
data = json.load(f)
return data.get('globalConfig', cls.getDefaultConfig())
except Exception as e:
print(f"加载全局配置文件失败: {e}")
return cls.getDefaultConfig()
@classmethod
def getDefaultConfig(cls):
"""获取默认配置(当配置文件不存在时使用)"""
return {
"name": "默认全局配置",
"description": "所有工程统一使用的默认配置",
"variableModules": {
"modbusTcpMaster": True,
"modbusTcpSlave": True,
"modbusRtuMaster": True,
"modbusRtuSlave": True,
"ioModule": True,
"tcRtdModule": True,
"hartReadModule": True,
"hartSimulateModule": True,
"profibusModule": True,
"rpcModule": True
}
}
@classmethod
def saveGlobalConfig(cls, config):
"""保存全局配置文件"""
try:
data = {"globalConfig": config}
with open(cls.CONFIG_FILE, 'w', encoding='utf-8') as f:
json.dump(data, f, indent=2, ensure_ascii=False)
return True
except Exception as e:
print(f"保存全局配置文件失败: {e}")
return False
@classmethod
def getModuleDisplayName(cls, moduleKey):
"""获取模块显示名称"""
displayNames = {
'modbusTcpMaster': 'MODBUSTCP主站',
'modbusTcpSlave': 'MODBUSTCP从站',
'modbusRtuMaster': 'MODBUSRTU主站',
'modbusRtuSlave': 'MODBUSRTU从站',
'ioModule': 'IO模块',
'tcRtdModule': 'TCRTD模块',
'hartReadModule': 'HART读取模块',
'hartSimulateModule': 'HART模拟模块',
'profibusModule': 'PROFIBUS模块',
'rpcModule': '远程通讯模块'
}
return displayNames.get(moduleKey, moduleKey)
@classmethod
def getModuleWidgetClass(cls, moduleKey):
"""获取模块对应的Widget类"""
from UI.VarManages.VarWidget import VarWidgets, TcRtdWidgets, AnalogWidgets, HartSimulateWidgets
from UI.HartWidgets.HartMainWindow import HartMainWindow
from UI.VarManages.VarTable import RpcVarTableView
from UI.ProfibusWidgets.ProfibusWindow import ProfibusWidgets
widgetClasses = {
'modbusTcpMaster': lambda: VarWidgets('ModbusTcpMaster'),
'modbusTcpSlave': lambda: VarWidgets('ModbusTcpSlave'),
'modbusRtuMaster': lambda: VarWidgets('ModbusRtuMaster'),
'modbusRtuSlave': lambda: VarWidgets('ModbusRtuSlave'),
'ioModule': AnalogWidgets,
'tcRtdModule': TcRtdWidgets,
'hartReadModule': HartMainWindow,
'hartSimulateModule': HartSimulateWidgets,
'profibusModule': ProfibusWidgets,
'rpcModule': RpcVarTableView
}
return widgetClasses.get(moduleKey)
@classmethod
def getEnabledModules(cls):
"""获取启用的模块列表"""
config = cls.loadGlobalConfig()
variableModules = config.get('variableModules', {})
return [moduleKey for moduleKey, enabled in variableModules.items() if enabled]
@classmethod
def isModuleEnabled(cls, moduleKey):
"""检查模块是否启用"""
config = cls.loadGlobalConfig()
variableModules = config.get('variableModules', {})
return variableModules.get(moduleKey, False)
@classmethod
def getEnabledModelTables(cls):
"""获取启用模块对应的模型表列表"""
config = cls.loadGlobalConfig()
variableModules = config.get('variableModules', {})
# 模块与模型表的映射关系
moduleToModelMapping = {
'modbusTcpMaster': 'ModbusTcpMasterTable',
'modbusTcpSlave': 'ModbusTcpSlaveTable',
'modbusRtuMaster': 'ModbusRtuMasterTable',
'modbusRtuSlave': 'ModbusRtuSlaveTable',
'tcRtdModule': 'TcRtdTable',
'ioModule': 'AnalogTable',
'hartSimulateModule': 'HartSimulateTable'
# 注意userTable 不在变量管理模块中,始终需要初始化
# hartReadModule 和 profibusModule 可能没有对应的表模型
# rpcModule 可能也没有对应的表模型
}
enabledTables = []
# 添加启用模块对应的表
for moduleKey, enabled in variableModules.items():
if enabled and moduleKey in moduleToModelMapping:
enabledTables.append(moduleToModelMapping[moduleKey])
# 始终添加用户表(非变量管理模块)
enabledTables.append('userTable')
return enabledTables
@classmethod
def getEnabledModelClasses(cls):
"""获取启用模块对应的数据库模型类列表"""
from utils.DBModels.ProtocolModel import (
ModbusTcpMasterVar, ModbusTcpSlaveVar, ModbusRtuMasterVar, ModbusRtuSlaveVar,
HartVar, TcRtdVar, AnalogVar, HartSimulateVar
)
config = cls.loadGlobalConfig()
variableModules = config.get('variableModules', {})
# 模块与数据库模型类的映射关系
moduleToModelClassMapping = {
'modbusTcpMaster': ModbusTcpMasterVar,
'modbusTcpSlave': ModbusTcpSlaveVar,
'modbusRtuMaster': ModbusRtuMasterVar,
'modbusRtuSlave': ModbusRtuSlaveVar,
'hartReadModule': HartVar,
'tcRtdModule': TcRtdVar,
'ioModule': AnalogVar,
'hartSimulateModule': HartSimulateVar
}
enabledModelClasses = []
# 添加启用模块对应的模型类
for moduleKey, enabled in variableModules.items():
if enabled and moduleKey in moduleToModelClassMapping:
enabledModelClasses.append(moduleToModelClassMapping[moduleKey])
return enabledModelClasses
@classmethod
def needsTcpVarManager(cls):
"""检查是否需要初始化TCPVarManager当启用IO或TCRTD模块时"""
config = cls.loadGlobalConfig()
variableModules = config.get('variableModules', {})
# TCPVarManager相关的模块
tcpVarModules = ['ioModule', 'tcRtdModule']
# 检查是否有任何相关模块被启用
for moduleKey in tcpVarModules:
if variableModules.get(moduleKey, False):
return True
return False