diff --git a/UI/Main/Main.py b/UI/Main/Main.py index ffa3aef..bd14721 100644 --- a/UI/Main/Main.py +++ b/UI/Main/Main.py @@ -84,7 +84,15 @@ class MainWindow(QMainWindow): self.projectWidget = ProjectWidgets() self.userWidget = UserWidgets() - self.ModBusWidget = VarWidgets() + + self.ModbusTcpMasterWidget = VarWidgets('ModbusTcpMaster') + self.ModbusTcpSlaveWidget = VarWidgets('ModbusTcpSlave') + self.ModbusRtuMasterWidget = VarWidgets('ModbusRtuMaster') + self.ModbusRtuSlaveWidget = VarWidgets('ModbusRtuSlave') + + modbusWidgetList = [self.ModbusTcpMasterWidget, self.ModbusTcpSlaveWidget, self.ModbusRtuMasterWidget, self.ModbusRtuSlaveWidget] + modbusNameList = ['MODBUSTCP主站', 'MODBUSTCP从站', 'MODBUSRTU主站', 'MODBUSRTU从站',] + self.trendWidget = TrendWidgets() self.SettingWidget = SettingWidget() self.hartWidget = HartWidgets() @@ -95,7 +103,7 @@ class MainWindow(QMainWindow): self.userWidget.setObjectName('userWidget') self.projectWidget.setObjectName('projectWidget') self.trendWidget.setObjectName('trendWidget') - self.ModBusWidget.setObjectName('varWidget') + # self.ModBusWidget.setObjectName('varWidget') self.analogWidget.setObjectName('analogWidget') self.hartsimulateWidget.setObjectName('hartsimulateWidget') @@ -103,8 +111,10 @@ class MainWindow(QMainWindow): self.rightWidget = QStackedWidget() self.rightWidget.setObjectName("rightWidget") self.rightWidget.addWidget(self.projectWidget) - - self.varManageTabWidget.addTab(self.ModBusWidget,'ModBus') + for widget, name in zip(modbusWidgetList, modbusNameList): + widget.setObjectName('varWidget') + self.varManageTabWidget.addTab(widget, name) + self.varManageTabWidget.addTab(self.analogWidget,'AIAO') self.varManageTabWidget.addTab(self.tcrtdWidget,'TCRTD') self.varManageTabWidget.addTab(self.hartWidget,'HART读取') diff --git a/UI/ProjectManages/ProjectModel.py b/UI/ProjectManages/ProjectModel.py index 7e94ee0..c1daebd 100644 --- a/UI/ProjectManages/ProjectModel.py +++ b/UI/ProjectManages/ProjectModel.py @@ -221,7 +221,8 @@ class ProjectButtonDelegate(QItemDelegate): ProjectManage.switchProject(str(self.parent().model.datas[sender.index[0]][1])) #初始化读取数据库数据 - modelLists = ['varTable', 'HartTable', 'TcRtdTable', 'AnalogTable', 'HartSimulateTable', 'userTable'] + modelLists = ['ModbusTcpMasterTable', 'ModbusTcpSlaveTable', 'ModbusRtuMasterTable', \ + 'ModbusRtuSlaveTable', 'HartTable', 'TcRtdTable', 'AnalogTable', 'HartSimulateTable', 'userTable'] for l in modelLists: Globals.getValue(l).model.initTable() Globals.getValue('HistoryWidget').exchangeProject() diff --git a/UI/VarManages/HartSimulateModel.py b/UI/VarManages/HartSimulateModel.py index 44808cd..29dd894 100644 --- a/UI/VarManages/HartSimulateModel.py +++ b/UI/VarManages/HartSimulateModel.py @@ -19,7 +19,6 @@ class HartSimulateModel(VarTableModel): def initTable(self): self.datas = [] # varDatas = None - proType = Globals.getValue('currentProType') # if proType in ['9']: varDatas = HartSimulateVarManage.getAllVar() diff --git a/UI/VarManages/ModbusModel.py b/UI/VarManages/ModbusModel.py index 75a2910..49ee30f 100644 --- a/UI/VarManages/ModbusModel.py +++ b/UI/VarManages/ModbusModel.py @@ -1,3 +1,4 @@ +from ast import mod import typing import sys @@ -35,7 +36,7 @@ class QPushButton(QtWidgets.QPushButton): class VarTableModel(QAbstractTableModel): ''' 变量表模型类''' - def __init__(self, header, data: list, table = None): + def __init__(self, header, data: list, modbusType = None, table = None): ''' header : 表头变量 data : 表格内容 @@ -48,16 +49,14 @@ class VarTableModel(QAbstractTableModel): self.supportedDragActions() self.table = table self.editableList = [] # 表格中可编辑项 - - + self.modbusType = modbusType def initTable(self): self.datas = [] self.editableList = [] - self.table.parent.initIcon() - # proType = Globals.getValue('currentProType') - - varDatas = ModbusVarManage.getAllVar() - + if self.table: + self.table.parent.initIcon() + varDatas = ModbusVarManage.getAllVar(self.modbusType) + if not varDatas: # self.layoutChanged.emit() self.table.proxy.invalidate() @@ -189,43 +188,27 @@ class VarTableModel(QAbstractTableModel): def refreshComboBox(self): #功能类型的index是5,通讯类型index是10 - for num in range(1,3): - for i in range(len(self.datas)): - cbRow = str('cb' + str(i) + str(num*5)) - index = self.index(i, int(num*5)) - delegate = self.table.itemDelegate(index) - delegate.paint(self.table, QStyleOptionViewItem(), index) - try: - comboBox = getattr(delegate, cbRow) - # print(comboBox, i, num, cbRow) - except Exception as e: - continue - if num == 1: - if self.datas[i][5] in [0, 1]: - comboBox.setCurrentIndex(self.datas[i][5]) - elif self.datas[i][5] in [3, 4]: - comboBox.setCurrentIndex(self.datas[i][5] - 1) - else: - comboBox.setCurrentIndex(-1) - if num == 2: - if self.datas[i][10] in [0, 1, 2, 3]: - comboBox.setCurrentIndex(self.datas[i][10]) - else: - comboBox.setCurrentIndex(-1) + + for i in range(len(self.datas)): + cbRow = str('cb' + str(i) + str(5)) + index = self.index(i, int(5)) + delegate = self.table.itemDelegate(index) + delegate.paint(self.table, QStyleOptionViewItem(), index) + try: + comboBox = getattr(delegate, cbRow) + # print(comboBox, i, num, cbRow) + except Exception as e: + continue + + if self.datas[i][5] in [0, 1]: + comboBox.setCurrentIndex(self.datas[i][5]) + elif self.datas[i][5] in [3, 4]: + comboBox.setCurrentIndex(self.datas[i][5] - 1) + else: + comboBox.setCurrentIndex(-1) + -class ModBusTCPSlaveModel(VarTableModel): - def __init__(self, header, data: list, table = None): - ''' - header : 表头变量 - data : 表格内容 - table : 缺省参数 - ''' - VarTableModel.__init__(self, header, data, table = table) - - - - @@ -324,10 +307,11 @@ class VarButtonDelegate(QItemDelegate): def indexChange(self): sender = self.sender() + modbusType = self.parent().modbusType index = sender.currentIndex() text = sender.itemText(index) name = self.parent().model.datas[sender.index[0]][3] - ModbusVarManage.editOrder(name, text) + ModbusVarManage.editOrder(name, text, modbusType) self.parent().model.datas[sender.index[0]][sender.index[1]] = text def start_action(self): @@ -385,50 +369,50 @@ class VarButtonDelegate(QItemDelegate): def edit_action(self): sender = self.sender() model = self.parent().model + modbusType = self.parent().modbusType fucationCbRow = str('cb' + str(sender.index[0]) + str(5)) fucationIndex = self.parent().model.index(sender.index[0], 5) fucationDelegate = self.parent().itemDelegate(fucationIndex) fucationCheckbox = getattr(fucationDelegate, fucationCbRow) - modbusTypeCbRow = str('cb' + str(sender.index[0]) + str(10)) - modbusTypeIndex = self.parent().model.index(sender.index[0], 10) - modbusTypeDelegate = self.parent().itemDelegate(modbusTypeIndex) - modbusTypeCheckbox = getattr(modbusTypeDelegate, modbusTypeCbRow) - if sender.isEdit: sender.setIcon(qtawesome.icon('fa.save', color='#1fbb6f')) sender.isEdit = False sender.oldName = model.datas[sender.index[0]][3] model.editableList.append(sender.index[0]) fucationCheckbox.setEnabled(True) - modbusTypeCheckbox.setEnabled(True) + else: varMes = model.datas[sender.index[0]] - name, des, varType, slaveID, address, min, max, modbusType, order = str(varMes[3]), str(varMes[4]), str(varMes[5]), str(varMes[6]), str(varMes[7]), str(varMes[8]), str(varMes[9]), str(varMes[10]), str(varMes[11]) + name, des, varType, slaveID, address, min, max, order = str(varMes[3]), str(varMes[4]), str(varMes[5]), str(varMes[6]), str(varMes[7]), str(varMes[8]), str(varMes[9]), str(varMes[-1]) # print(name, des, varType, slaveID, address, min, max, order) if not name or not varType: reply = QMessageBox.question(self.parent(), '警告', - "有字段为空", + "有字段为空或输入错误", QMessageBox.Yes) return - if sender.oldName and ModBusVar.getByName(sender.oldName): + if sender.oldName and Globals()[modbusType + 'Var'].getByName(sender.oldName): if sender.oldName == name or [varMes[3] for varMes in model.datas].count(name) < 2: - ModbusVarManage.editVar(name = sender.oldName, Nname = name, des = des, varType = varType, slaveID = slaveID, address = address, min = min, max = max, order = order, modbusType = modbusType) + ModbusVarManage.editVar(name = sender.oldName, Nname = name, des = des, + varType = varType, slaveID = slaveID, address = address, + min = min, max = max, order = order, modbusType = modbusType) else: QMessageBox.information(self.parent(), '提示', '已有同名变量') return else: - res = ModbusVarManage.createVar(varName = name, varType = varType, des = des, address = address, slaveID = slaveID, min = min, max = max, order = order, modbusType = modbusType) + res = ModbusVarManage.createVar(varName = name, varType = varType, des = des, + address = address, slaveID = slaveID, min = min, + max = max, order = order, modbusType = modbusType) if res: QMessageBox.information(self.parent(), '提示', '已有同名变量') return sender.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2')) rowIndex = sender.index[0] - varMes = ModbusVarManage.getByName(name) + varMes = ModbusVarManage.getByName(name, modbusType) varMes.append('int') varMes.insert(1, '') varMes.insert(2, '') @@ -437,7 +421,6 @@ class VarButtonDelegate(QItemDelegate): sender.isEdit = True fucationCheckbox.setEnabled(False) - modbusTypeCheckbox.setEnabled(False) model.editableList.remove(sender.index[0]) @@ -459,29 +442,22 @@ class VarButtonDelegate(QItemDelegate): class ModbusTypeBox(QItemDelegate): def __init__(self, parent=None): super(ModbusTypeBox, self).__init__(parent) - self.items = items - self.comboxType = comboxType - + def paint(self, painter, option, index): - if (index.column() == 5 or index.column() == 10) and index.row() not in self.parent().model.editableList: + if (index.column() == 5) and index.row() not in self.parent().model.editableList: data = self.parent().model.datas[index.row()] comBox = str('cb' + str(index.row()) + str(index.column())) setattr(self, comBox, QComboBox()) comboBox = getattr(self, comBox) - comboBox.addItems(self.items) - if self.comboxType == 'founctionCombox': - if self.parent().model.datas[index.row()][index.column()] in [0, 1]: - comboBox.setCurrentIndex(self.parent().model.datas[index.row()][index.column()]) - elif self.parent().model.datas[index.row()][index.column()] in [3, 4]: - comboBox.setCurrentIndex(self.parent().model.datas[index.row()][index.column()] - 1) - else: - comboBox.setCurrentIndex(-1) - elif self.comboxType == 'modbusTypeCombox': - if self.parent().model.datas[index.row()][index.column()] in [0, 1, 2, 3]: - comboBox.setCurrentIndex(self.parent().model.datas[index.row()][index.column()]) - else: - comboBox.setCurrentIndex(-1) - # self.parent().model.comboboxList.append(comboBox) + items = ['Coil Status', 'Input Status', 'Input Register', 'Holding Register'] + comboBox.addItems(items) + if self.parent().model.datas[index.row()][index.column()] in [0, 1]: + comboBox.setCurrentIndex(self.parent().model.datas[index.row()][index.column()]) + elif self.parent().model.datas[index.row()][index.column()] in [3, 4]: + comboBox.setCurrentIndex(self.parent().model.datas[index.row()][index.column()] - 1) + else: + comboBox.setCurrentIndex(0) + comboBox.currentIndexChanged.connect( self.indexChange) comboBox.setObjectName('ModbusTypeBox') @@ -515,10 +491,7 @@ class ModbusTypeBox(QItemDelegate): def indexChange(self): sender = self.sender() index = sender.currentIndex() - if self.comboxType == 'founctionCombox': - if index in [2, 3]: - index += 1 - self.parent().model.datas[sender.index[0]][sender.index[1]] = index - elif self.comboxType == 'modbusTypeCombox': - self.parent().model.datas[sender.index[0]][sender.index[1]] = index - + if index in [2, 3]: + index += 1 + self.parent().model.datas[sender.index[0]][sender.index[1]] = index + \ No newline at end of file diff --git a/UI/VarManages/Thread.py b/UI/VarManages/Thread.py index e775ee4..2444cee 100644 --- a/UI/VarManages/Thread.py +++ b/UI/VarManages/Thread.py @@ -1,10 +1,7 @@ import time from PyQt5.QtCore import QThread, pyqtSignal - -from UI.TrendManage.ActualTrendWidget import ActualTrend from protocol.TCP.RTDTC import RTDTCClient from protocol.TCP.Analog import AnalogClient -from protocol.FF.FFSimulate import FFSimulate from protocol.Hart.HartSimulate import HartSimulate from utils import Globals diff --git a/UI/VarManages/VarTable.py b/UI/VarManages/VarTable.py index 9755c43..acb26af 100644 --- a/UI/VarManages/VarTable.py +++ b/UI/VarManages/VarTable.py @@ -74,19 +74,19 @@ class CheckBoxHeader(QHeaderView): class VarTableView(QTableView): - def __init__(self, parent=None): + def __init__(self, modbusType, parent=None): super(VarTableView, self).__init__(parent) self.parent = parent + self.modbusType = modbusType self.setHeader() self.setupUi() def setHeader(self): - founctionItem = ['Coil Status', 'Input Status', 'Input Register', 'Holding Register'] - modbusTypeComboxItem = ['MODBUSTCP主站模式', 'MODBUSTCP从站模式', 'MODBUSRTU主站模式', 'MODBUSRTU从站模式'] - self.setItemDelegateForColumn(11, VarButtonDelegate(self)) - self.setItemDelegateForColumn(5, ModbusTypeBox(founctionItem, 'founctionCombox', self)) - self.setItemDelegateForColumn(10, ModbusTypeBox(modbusTypeComboxItem, 'modbusTypeCombox', self)) - self.model = VarTableModel(['ID', '强制值', '当前值', '变量名', '变量描述', '变量类型', '从站地址', '寄存器地址', '工程量下限', '工程量上限', '通讯类型', '操作'],[], table = self) + self.setItemDelegateForColumn(10, VarButtonDelegate(self)) + self.setItemDelegateForColumn(5, ModbusTypeBox(self)) + self.model = VarTableModel(['ID', '强制值', '当前值', '变量名', '变量描述', '变量类型', + '从站地址', '寄存器地址', '工程量下限', '工程量上限', '操作'], + [], modbusType = self.modbusType, table = self) def setupUi(self): self.setShowGrid(True) diff --git a/UI/VarManages/VarWidget.py b/UI/VarManages/VarWidget.py index 3cb87a4..ec39ccb 100644 --- a/UI/VarManages/VarWidget.py +++ b/UI/VarManages/VarWidget.py @@ -20,8 +20,9 @@ import re class VarWidgets(QtWidgets.QWidget): _isPopenOpen = False - def __init__(self, parent=None): + def __init__(self, modbusType, parent=None): super(VarWidgets, self).__init__(parent) + self.modbusType = modbusType self.setupUI() def setupUI(self): @@ -62,7 +63,7 @@ class VarWidgets(QtWidgets.QWidget): self.startProtocolBtn.setIconSize(QSize(22, 22)) self.startProtocolBtn.clicked.connect(self.startProtocol) - self.varView = VarTableView(self) + self.varView = VarTableView(self.modbusType, self) self.varView.setObjectName('varView') self.proxy = QtCore.QSortFilterProxyModel(self) self.proxy.setSourceModel(self.varView.model) @@ -75,7 +76,7 @@ class VarWidgets(QtWidgets.QWidget): self.timer.timeout.connect(self.proxy.invalidate) self.timer.start(50) # 启动timer - Globals.setValue('varTable', self.varView) + Globals.setValue(str(self.modbusType) + 'Table', self.varView) # self.varView.model.initTable() # [self.varView.model.append_data([1,1,1,1,1,1,1,1,1,1]) for x in range(100)] @@ -218,7 +219,7 @@ class VarWidgets(QtWidgets.QWidget): # check.sort(reverse=True) for i in check: varMes = self.varView.model.datas[i] - value, name, des, varType, slaveID, address, min, max, modbusType, order = str(varMes[1]), str(varMes[3]), str(varMes[4]), str(varMes[5]), str(varMes[6]), str(varMes[7]), str(varMes[8]), str(varMes[9]), str(varMes[10]), str(varMes[11]) + value, name, des, varType, slaveID, address, min, max, order = str(varMes[1]), str(varMes[3]), str(varMes[4]), str(varMes[5]), str(varMes[6]), str(varMes[7]), str(varMes[8]), str(varMes[9]), str(varMes[10]), str(varMes[11]) pattern = re.compile(r'[^0-9\.-]+') if not value or re.findall(pattern, str(value)): reply = QMessageBox.question(self.parent(), diff --git a/model/ClientModel/RegisterManage.py b/model/ClientModel/RegisterManage.py index fbacc22..c7b5c4b 100644 --- a/model/ClientModel/RegisterManage.py +++ b/model/ClientModel/RegisterManage.py @@ -68,6 +68,5 @@ class Register: else: return False else: - print('ccc') return False diff --git a/model/ProjectModel/ProjectManage.py b/model/ProjectModel/ProjectManage.py index 3fac901..71c062c 100644 --- a/model/ProjectModel/ProjectManage.py +++ b/model/ProjectModel/ProjectManage.py @@ -22,8 +22,8 @@ from utils import Globals from utils.DBModels.ClientModels import Project, ClientDB from utils.DBModels.ProjectBaseModel import * -from utils.DBModels.ProtocolModel import ModBusVar, TCPSetting, RTUSetting, InfluxMem, HartVar, TcRtdVar, AnalogVar, \ - FFSimulateVar, HartSimulateVar +from utils.DBModels.ProtocolModel import ModbusTcpMasterVar, ModbusRtuMasterVar, ModbusRtuSlaveVar,\ + ModbusTcpSlaveVar, TCPSetting, RTUSetting, InfluxMem, HartVar, TcRtdVar, AnalogVar, HartSimulateVar from utils.DBModels.UserModels import User @@ -60,14 +60,13 @@ class ProjectManage(object): project_proxy.initialize(projectDB) projectDB.connect() - projectDB.create_tables([ModBusVar, User, TCPSetting, RTUSetting,\ - HartVar, TcRtdVar, FFSimulateVar, HartSimulateVar,AnalogVar,InfluxMem],safe=True) + projectDB.create_tables([ModbusTcpMasterVar, ModbusRtuMasterVar, ModbusRtuSlaveVar, \ + ModbusTcpSlaveVar, TCPSetting, User, TCPSetting, RTUSetting,HartVar, \ + TcRtdVar, HartSimulateVar, AnalogVar, InfluxMem],safe=True) - - HartVarManage().initVar() - AnalogManage().initVar() - TcRtdManage().initVar() - HartSimulateVarManage().initVar() + manageList = [HartVarManage(), AnalogManage(), TcRtdManage(), HartSimulateVarManage()] + for l in manageList: + l.initVar() UserManage.initUser() modbusMasterTcpSetting = TCPSetting() diff --git a/model/ProjectModel/VarManage.py b/model/ProjectModel/VarManage.py index 7ef5937..8caf925 100644 --- a/model/ProjectModel/VarManage.py +++ b/model/ProjectModel/VarManage.py @@ -2,15 +2,28 @@ import openpyxl from pytz import NonExistentTimeError -from utils.DBModels.ProtocolModel import ModBusVar, HartVar, TcRtdVar, AnalogVar, FFSimulateVar, HartSimulateVar +from utils.DBModels.ProtocolModel import ModbusTcpMasterVar, ModbusRtuMasterVar, ModbusRtuSlaveVar,\ + ModbusTcpSlaveVar, HartVar, TcRtdVar, AnalogVar, FFSimulateVar, HartSimulateVar from utils import Globals # ID 从站地址 变量名 变量描述 功能码 寄存器地址 工程量下限 工程量上限 class ModbusVarManage(object): + ModBusVarClass = { + 'ModbusTcpMaster': ModbusTcpMasterVar, + 'ModbusTcpSlave': ModbusRtuMasterVar, + 'ModbusRtuMaster': ModbusRtuSlaveVar, + 'ModbusRtuSlave': ModbusTcpSlaveVar, + } def __init__(self): super().__init__() + + + @classmethod + def getVarClass(self, modbusType): + """根据类型获取对应的变量类""" + return self.ModBusVarClass.get(modbusType) @classmethod def importModbusVar(self, path): @@ -25,7 +38,6 @@ class ModbusVarManage(object): addrIndex = None minIndex = None maxIndex = None - modbusType = None for index, cell in enumerate(list(ws.iter_rows())[0]): if cell.value in ['id', 'ID']: @@ -44,10 +56,8 @@ class ModbusVarManage(object): minIndex = index if cell.value == '工程量上限': maxIndex = index - if cell.value == '通讯类型': - modbusType = 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 or modbusType == NonExistentTimeError: + 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 = [] @@ -101,7 +111,7 @@ class ModbusVarManage(object): @classmethod - def createVar(self, varName, varType, des, address, slaveID, min, max, modbusType, order): + def createVar(self, varName, varType, des, address, slaveID, min, max, order, modbusType): # 创建变量 name = str(varName) des = str(des) @@ -111,24 +121,25 @@ class ModbusVarManage(object): min = str(min) max = str(max) order = order - modbusType = str(modbusType) - if ModBusVar.getByName(name): + if self.getVarClass(modbusType).getByName(name): return 1 else: - varModel = ModBusVar() - varModel.createVar(varName = varName, varType = varType, des = des, address = address, slaveID = slaveID, min = min, max = max, modbusType = modbusType, order = order) + + varModel =self.getVarClass(modbusType)() + varModel.createVar(varName = varName, varType = varType, des = des, address = address, slaveID = slaveID, min = min, max = max, order = order) @classmethod - def deleteVar(self, name): + def deleteVar(self, name, modbusType): # 删除变量 name = str(name) # print(name) - ModBusVar.deleteVar(name = name) + self.getVarClass(modbusType).deleteVar(name = name) @classmethod - def editVar(self, name, Nname, des, varType, slaveID, address, min, max, modbusType, order): + def editVar(self, name, Nname, des, varType, slaveID, address, min, max, order, modbusType): + # 修改变量信息 name = str(name) Nname = str(Nname) @@ -138,41 +149,41 @@ class ModbusVarManage(object): address = str(address) min = str(min) max = str(max) - modbusType = str(modbusType) if Nname == name: - ModBusVar.update(varName = Nname, description = des, varType = varType, address = address, slaveID = slaveID, min = min, max = max, modbusType = modbusType, order = order).where(ModBusVar.varName == name).execute() - elif ModBusVar.getByName(Nname): + self.getVarClass(modbusType).update(varName = Nname, description = des, varType = varType, address = address, slaveID = slaveID, min = min, max = max, order = order).where(self.getVarClass(modbusType).varName == name).execute() + elif self.getVarClass(modbusType).getByName(Nname): print('已有同名变量') return - elif not ModBusVar.getByName(name): + elif not self.getVarClass(modbusType).getByName(name): print('不存在的变量') return else: - ModBusVar.update(varName = Nname, description = des, varType = varType, address = address, slaveID = slaveID, min = min, max = max, modbusType = modbusType, order = order).where(ModBusVar.varName == name).execute() + self.getVarClass(modbusType).update(varName = Nname, description = des, varType = varType, address = address, slaveID = slaveID, min = min, max = max, order = order).where(self.getVarClass(modbusType).varName == name).execute() @classmethod - def editOrder(self, name, order): + def editOrder(self, name, order, modbusType): name = str(name) order = str(order) - ModBusVar.update(order = order).where(ModBusVar.varName == name).execute() + self.getVarClass(modbusType).update(order = order).where(self.getVarClass(modbusType).varName == name).execute() @classmethod - def getAllVar(self): + def getAllVar(self, modbusType): # 查询所有变量 - vars = ModBusVar.get_all() + + vars = self.getVarClass(modbusType).get_all() if vars is 'error': return l = [] for var in vars: - l.append([var.id, var.varName, var.description, var.varType, var.slaveID, var.address, var.min, var.max, var.modbusType, var.order]) + l.append([var.id, var.varName, var.description, var.varType, var.slaveID, var.address, var.min, var.max, var.order]) return l @classmethod - def getByName(self, name): + def getByName(self, name, modbusType): # 查询指定变量信息 - var = ModBusVar.getByName(name) + var = self.getVarClass(modbusType).getByName(name) if var: - return [var.id, var.varName, var.description, var.varType, var.slaveID, var.address, var.min, var.max, var.modbusType] + return [var.id, var.varName, var.description, var.varType, var.slaveID, var.address, var.min, var.max] else: return False diff --git a/protocol/FF/FFProtocol.py b/protocol/FF/FFProtocol.py deleted file mode 100644 index 8f6a9dc..0000000 --- a/protocol/FF/FFProtocol.py +++ /dev/null @@ -1,236 +0,0 @@ -from pythonnet import load -# load('coreclr') -import clr # 与其他模块不同此处不直接导入pythonnet 而是导入clr(python与c#交互核心) -dll_path = 'protocol\\FF\\NationalInstruments.Fieldbus' # 为了方便理解这里给到dll所在的绝对路径且包含dll文件本身 -clr.AddReference(dll_path) #加载c#库 -clr.AddReference('System.Collections') -clr.AddReference('System') -from NationalInstruments.FieldBus import Session, FBDate -from NationalInstruments.FieldBus.ParameterHandler import Parameter, ParameterType -from NationalInstruments.FieldBus.ElementHandler import * -from System.Collections.Generic import * -from System import * -# import numpy as np - - -# session = Session() -# session.Open() -# link = session.Links[0] -# link.Open() -# print([x.Tag for x in link.Devices]) -# dev = link.Devices[1] -# VFD = dev.GetVfdByOrdinalNumber(0) -# VFD.Open() -# blocks = VFD.Blocks -# print([x.Tag for x in blocks]) -# block = blocks[1] -# block.Open() -# Params = block.Parameters -# print([x.Type.ToString() + ' ' + x.Name for x in Params]) -# print(byte(10)) -class ParamItem(object): - def __init__(self, param): - self.param = param - self.name = param.Name - self.type = param.Type.ToString() - self.elemDict = {} - match(param.Type): - case ParameterType.ODT_SIMPLEVAR: - self.elements = [param.Element] - case ParameterType.ODT_ARRAY: - self.elements = param.Elements - case ParameterType.ODT_RECORD: - self.elements = param.Elements - - def getElements(self): - for elem in self.elements: - self.elemDict[elem.Name] = [elem.Type.ToString(), elem.ValueString(), elem] - return self.elemDict - - -class FFProtocol(object): - """docstring for FF""" - paramDict = {} - def __init__(self): - pass - - def open(self): - self.session = Session() - self.session.Open() - self.link = self.session.Links[0] - self.link.Open() - - - def getDevices(self): - self.devices = [x for x in self.link.Devices][1:] - for device in self.devices: - device.Open() - VFD = device.GetVfdByOrdinalNumber(0) - VFD.Open() - return [x.Tag for x in self.devices] - - def getBlocks(self, devTag): - device = self.link.GetDeviceByTag(devTag) - VFD = device.GetVfdByOrdinalNumber(0) - blocks = [x for x in VFD.Blocks] - for block in blocks: - block.Open() - return [x.Tag for x in blocks] - - def getParams(self, devTag, blockTag): - device = self.link.GetDeviceByTag(devTag) - VFD = device.GetVfdByOrdinalNumber(0) - block = VFD.GetBlockByTag(blockTag) - Params = block.Parameters - paramList = [] - for param in Params: - paramList.append(ParamItem(param = param)) - if devTag not in self.paramDict: - self.paramDict[devTag] = {blockTag : paramList} - else: - self.paramDict[devTag][blockTag] = paramList - # print(self.paramDict) - return paramList - - def refreshParams(self, reParams = None): - if reParams: - for param in reParams: - param.Read() - # print(reParams) - # for device, blockDict in self.paramDict.items(): - # for block, paramList in blockDict.items(): - # else: - # param.param.Read() - # for elem in param.elements: - # return elem.get_Value() - - def writeValue(self, param, elem, value): - param.Read() - match(elem.Type): - case ElementType.FF_BOOLEAN: - if value in [True, False]: - elem.Value = value - elif value in ['True', 'true']: - elem.Value = True - elif value in ['False', 'false']: - elem.Value = False - case ElementType.FF_INTEGER8 | ElementType.FF_INTEGER16: - value = int(value) - elem.Value = Int16(value) - case ElementType.FF_INTEGER32 | ElementType.FF_UNSIGNED16: - value = int(value) - elem.Value = Int32(value) - case ElementType.FF_UNSIGNED8: - value = int(value) - elem.Value = Byte(value) - case ElementType.FF_UNSIGNED32: - value = int(value) - elem.Value = Int64(value) - case ElementType.FF_FLOAT: - value = float(value) - elem.Value = Single(value) - case ElementType.FF_VISIBLE_STRING: - value = str(value) - elem.Value = value - case ElementType.FF_OCTET_STRING: - value = str(value) - if len(value) % 2 != 0: - return - startIndex = 0 - # byteArray = [x for x in range(int(len(value) / 2))] - byteArray = Array.CreateInstance(Byte, int(len(value) / 2)) - for i in range(int(len(value) / 2)): - varStr = value[startIndex:startIndex + 2] - startIndex += 2 - byteArray[i] = Byte(int(varStr)) - elem.Value = byteArray - case ElementType.FF_DATE: - value = str(value) - valueList = [int(x) for x in value.split(':')] - elem.Value.Year = Byte(valueList[0]) - elem.Value.Month = Byte(valueList[1]) - elem.Value.DayOfMonth =Byte(valueList[2]) - elem.Value.Hour = Byte(valueList[3]) - elem.Value.Minute = Byte(valueList[4]) - elem.Value.Millisecond = int(valueList[5]) - case ElementType.FF_TIMEOFDAY | ElementType.FF_TIME_DIFF: - value = str(value) - valueList = [int(x) for x in value.split(':')] - elem.Value.Day = int(valueList[0]) - elem.Value.Millisecond = Int64(valueList[1]) - case ElementType.FF_BIT_STRING: - value = str(value) - for s in value: - if s not in ['0', '1']: - return - if len(value) % 8 != 0: - return - j = -1 - byteArray = Array.CreateInstance(Byte, int(len(value) / 8)) - for i in range(len(value)): - if i % 8 == 0: - j += 1 - if value[i] == '1': - # print(type(byteArray[j])) - byteArray[j] += 1<<(7-(i % 8)) - byteArray[j] = Byte(byteArray[j]) - elem.Value = byteArray - case ElementType.FF_TIME_VALUE: - value = str(value) - valueList = [int(x) for x in value.split(':')] - elem.Value.Lower = Int64(valueList[0]) - elem.Value.Upper = Int64(valueList[1]) - - param.Write() - - - - def close(self): - for device in self.devices: - device.Close() - self.link.Close() - self.session.Close() - - -if __name__ == '__main__': - a = FFProtocol() - a.open() - devs = a.getDevices() - blocks = a.getBlocks(devs[0]) - - par = a.getParams(devs[0], blocks[0])[7] - - ele1 = par.getElements()['VALUE_1'][2] - ele2 = par.getElements()['VALUE_2'][2] - ele3 = par.getElements()['VALUE_3'][2] - ele4 = par.getElements()['VALUE_4'][2] - ele5 = par.getElements()['VALUE_5'][2] - ele6 = par.getElements()['VALUE_6'][2] - ele7 = par.getElements()['VALUE_7'][2] - ele8 = par.getElements()['VALUE_8'][2] - ele9 = par.getElements()['VALUE_9'][2] - ele10 = par.getElements()['VALUE_10'][2] - ele11 = par.getElements()['VALUE_11'][2] - ele12 = par.getElements()['VALUE_12'][2] - ele13 = par.getElements()['VALUE_13'][2] - ele14 = par.getElements()['VALUE_14'][2] - ele15 = par.getElements()['VALUE_15'][2] - - a.writeValue(par.param, ele1, True) - a.writeValue(par.param, ele2, 1) - a.writeValue(par.param, ele3, 2) - a.writeValue(par.param, ele4, 3) - a.writeValue(par.param, ele5, 4) - a.writeValue(par.param, ele6, 5) - a.writeValue(par.param, ele7, 6) - a.writeValue(par.param, ele8, 1.1) - a.writeValue(par.param, ele9, 'test') - a.writeValue(par.param, ele10, '9999494949494949494949494949494949494949494949494949494949494949') - a.writeValue(par.param, ele11, '23:02:18:14:49:50') - a.writeValue(par.param, ele12, '18:59') - a.writeValue(par.param, ele13, '25:60') - a.writeValue(par.param, ele14, '1111000000001111') - a.writeValue(par.param, ele15, '55:55') - - - a.close() \ No newline at end of file diff --git a/protocol/FF/FFSimulate.py b/protocol/FF/FFSimulate.py deleted file mode 100644 index a41b2ab..0000000 --- a/protocol/FF/FFSimulate.py +++ /dev/null @@ -1,63 +0,0 @@ -import sys -sys.path.append('../') -sys.path.append('../../') -sys.path.append('../../../') -from protocol.ModBus.rtuslave_example import RTUSlave - -import modbus_tk.defines as cst - -class FFSimulate(object): - def __init__(self): - self.rtuSlave = RTUSlave(port = 'COM12', baudrate = 9600, bytesize = 8, parity = 'N', stopbits = 1, xonxoff = 0) - self.AIAddr = [x for x in range(4100, 4107) if x % 2 == 0] - self.AOAddr = [x for x in range(4200, 4207) if x % 2 == 0] - self.DIAddr = [x for x in range(4300, 4304)] - self.DOAddr = [x for x in range(4400, 4404)] - self.writeList = self.AIAddr + self.DIAddr - self.readList = self.writeList + self.AOAddr + self.DOAddr - - def start(self): - self.rtuSlave.start() - try: - self.addSlave() - except: - pass - - def stop(self): - self.rtuSlave.server.stop() - - def addSlave(self): - self.rtuSlave.server.add_slave(1) - slave = self.rtuSlave.server.get_slave(1) - slave.add_block('4', cst.HOLDING_REGISTERS, 4000, 5000) - - def readValue(self): - valueList = [] - for index, address in enumerate(self.readList): - if index < 4 or 7 < index < 12: - order = 'ABCD' - else: - order = 'int' - value = self.rtuSlave.readValue(1, '4', address, order = order) - valueList.append(value) - return valueList - - def writeValue(self, index, value): - index = int(index) - if index < 4: - value = float(value) - order = 'ABCD' - else: - value = int(value) - order = 'int' - self.rtuSlave.setValue(1, '4', self.writeList[index], value, order = order) - - -if __name__ == '__main__': - a = FFSimulate() - a.start() - # a.addSlave() - a.writeValue(1, 16.5) - a.writeValue(7, 1) - print(a.readValue()) - print(a.writeList) \ No newline at end of file diff --git a/protocol/FF/NationalInstruments.Fieldbus.dll b/protocol/FF/NationalInstruments.Fieldbus.dll deleted file mode 100644 index 3c58a35..0000000 Binary files a/protocol/FF/NationalInstruments.Fieldbus.dll and /dev/null differ diff --git a/protocol/FF/__init__.py b/protocol/FF/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/utils/DBModels/ProtocolModel.py b/utils/DBModels/ProtocolModel.py index 001e85e..a59f885 100644 --- a/utils/DBModels/ProtocolModel.py +++ b/utils/DBModels/ProtocolModel.py @@ -72,7 +72,6 @@ class ModBusVar(BaseModel): slaveID = CharField() min = CharField() max = CharField() - modbusType = IntegerField() order = CharField() @@ -91,7 +90,7 @@ class ModBusVar(BaseModel): query.execute() # 创建变量 - def createVar(self, varName, varType, des, address, slaveID, min, max, modbusType, order): + def createVar(self, varName, varType, des, address, slaveID, min, max, order): self.varName = varName self.varType = varType self.description = des @@ -100,11 +99,21 @@ class ModBusVar(BaseModel): self.createTime = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S') self.min = min self.max = max - self.modbusType = modbusType self.order = order # print(self.createTime) self.save() +class ModbusTcpMasterVar(ModBusVar): + pass + +class ModbusTcpSlaveVar(ModBusVar): + pass + +class ModbusRtuMasterVar(ModBusVar): + pass + +class ModbusRtuSlaveVar(ModBusVar): + pass class InfluxMem(BaseModel): mem = CharField()