20250409更新

main
ZHANGXUXU\95193 7 months ago
parent a12154ab6e
commit 6734107967

@ -84,7 +84,15 @@ class MainWindow(QMainWindow):
self.projectWidget = ProjectWidgets() self.projectWidget = ProjectWidgets()
self.userWidget = UserWidgets() 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.trendWidget = TrendWidgets()
self.SettingWidget = SettingWidget() self.SettingWidget = SettingWidget()
self.hartWidget = HartWidgets() self.hartWidget = HartWidgets()
@ -95,7 +103,7 @@ class MainWindow(QMainWindow):
self.userWidget.setObjectName('userWidget') self.userWidget.setObjectName('userWidget')
self.projectWidget.setObjectName('projectWidget') self.projectWidget.setObjectName('projectWidget')
self.trendWidget.setObjectName('trendWidget') self.trendWidget.setObjectName('trendWidget')
self.ModBusWidget.setObjectName('varWidget') # self.ModBusWidget.setObjectName('varWidget')
self.analogWidget.setObjectName('analogWidget') self.analogWidget.setObjectName('analogWidget')
self.hartsimulateWidget.setObjectName('hartsimulateWidget') self.hartsimulateWidget.setObjectName('hartsimulateWidget')
@ -103,8 +111,10 @@ class MainWindow(QMainWindow):
self.rightWidget = QStackedWidget() self.rightWidget = QStackedWidget()
self.rightWidget.setObjectName("rightWidget") self.rightWidget.setObjectName("rightWidget")
self.rightWidget.addWidget(self.projectWidget) self.rightWidget.addWidget(self.projectWidget)
for widget, name in zip(modbusWidgetList, modbusNameList):
widget.setObjectName('varWidget')
self.varManageTabWidget.addTab(widget, name)
self.varManageTabWidget.addTab(self.ModBusWidget,'ModBus')
self.varManageTabWidget.addTab(self.analogWidget,'AIAO') self.varManageTabWidget.addTab(self.analogWidget,'AIAO')
self.varManageTabWidget.addTab(self.tcrtdWidget,'TCRTD') self.varManageTabWidget.addTab(self.tcrtdWidget,'TCRTD')
self.varManageTabWidget.addTab(self.hartWidget,'HART读取') self.varManageTabWidget.addTab(self.hartWidget,'HART读取')

@ -221,7 +221,8 @@ class ProjectButtonDelegate(QItemDelegate):
ProjectManage.switchProject(str(self.parent().model.datas[sender.index[0]][1])) 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: for l in modelLists:
Globals.getValue(l).model.initTable() Globals.getValue(l).model.initTable()
Globals.getValue('HistoryWidget').exchangeProject() Globals.getValue('HistoryWidget').exchangeProject()

@ -19,7 +19,6 @@ class HartSimulateModel(VarTableModel):
def initTable(self): def initTable(self):
self.datas = [] self.datas = []
# varDatas = None # varDatas = None
proType = Globals.getValue('currentProType')
# if proType in ['9']: # if proType in ['9']:
varDatas = HartSimulateVarManage.getAllVar() varDatas = HartSimulateVarManage.getAllVar()

@ -1,3 +1,4 @@
from ast import mod
import typing import typing
import sys import sys
@ -35,7 +36,7 @@ class QPushButton(QtWidgets.QPushButton):
class VarTableModel(QAbstractTableModel): class VarTableModel(QAbstractTableModel):
''' 变量表模型类''' ''' 变量表模型类'''
def __init__(self, header, data: list, table = None): def __init__(self, header, data: list, modbusType = None, table = None):
''' '''
header : 表头变量 header : 表头变量
data : 表格内容 data : 表格内容
@ -48,15 +49,13 @@ class VarTableModel(QAbstractTableModel):
self.supportedDragActions() self.supportedDragActions()
self.table = table self.table = table
self.editableList = [] # 表格中可编辑项 self.editableList = [] # 表格中可编辑项
self.modbusType = modbusType
def initTable(self): def initTable(self):
self.datas = [] self.datas = []
self.editableList = [] self.editableList = []
self.table.parent.initIcon() if self.table:
# proType = Globals.getValue('currentProType') self.table.parent.initIcon()
varDatas = ModbusVarManage.getAllVar(self.modbusType)
varDatas = ModbusVarManage.getAllVar()
if not varDatas: if not varDatas:
# self.layoutChanged.emit() # self.layoutChanged.emit()
@ -189,40 +188,24 @@ class VarTableModel(QAbstractTableModel):
def refreshComboBox(self): def refreshComboBox(self):
#功能类型的index是5通讯类型index是10 #功能类型的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)
class ModBusTCPSlaveModel(VarTableModel):
def __init__(self, header, data: list, table = None):
'''
header : 表头变量
data : 表格内容
table : 缺省参数
'''
VarTableModel.__init__(self, header, data, table = table)
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)
@ -324,10 +307,11 @@ class VarButtonDelegate(QItemDelegate):
def indexChange(self): def indexChange(self):
sender = self.sender() sender = self.sender()
modbusType = self.parent().modbusType
index = sender.currentIndex() index = sender.currentIndex()
text = sender.itemText(index) text = sender.itemText(index)
name = self.parent().model.datas[sender.index[0]][3] 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 self.parent().model.datas[sender.index[0]][sender.index[1]] = text
def start_action(self): def start_action(self):
@ -385,50 +369,50 @@ class VarButtonDelegate(QItemDelegate):
def edit_action(self): def edit_action(self):
sender = self.sender() sender = self.sender()
model = self.parent().model model = self.parent().model
modbusType = self.parent().modbusType
fucationCbRow = str('cb' + str(sender.index[0]) + str(5)) fucationCbRow = str('cb' + str(sender.index[0]) + str(5))
fucationIndex = self.parent().model.index(sender.index[0], 5) fucationIndex = self.parent().model.index(sender.index[0], 5)
fucationDelegate = self.parent().itemDelegate(fucationIndex) fucationDelegate = self.parent().itemDelegate(fucationIndex)
fucationCheckbox = getattr(fucationDelegate, fucationCbRow) 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: if sender.isEdit:
sender.setIcon(qtawesome.icon('fa.save', color='#1fbb6f')) sender.setIcon(qtawesome.icon('fa.save', color='#1fbb6f'))
sender.isEdit = False sender.isEdit = False
sender.oldName = model.datas[sender.index[0]][3] sender.oldName = model.datas[sender.index[0]][3]
model.editableList.append(sender.index[0]) model.editableList.append(sender.index[0])
fucationCheckbox.setEnabled(True) fucationCheckbox.setEnabled(True)
modbusTypeCheckbox.setEnabled(True)
else: else:
varMes = model.datas[sender.index[0]] 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) # print(name, des, varType, slaveID, address, min, max, order)
if not name or not varType: if not name or not varType:
reply = QMessageBox.question(self.parent(), reply = QMessageBox.question(self.parent(),
'警告', '警告',
"有字段为空", "有字段为空或输入错误",
QMessageBox.Yes) QMessageBox.Yes)
return 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: 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: else:
QMessageBox.information(self.parent(), '提示', '已有同名变量') QMessageBox.information(self.parent(), '提示', '已有同名变量')
return return
else: 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: if res:
QMessageBox.information(self.parent(), '提示', '已有同名变量') QMessageBox.information(self.parent(), '提示', '已有同名变量')
return return
sender.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2')) sender.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2'))
rowIndex = sender.index[0] rowIndex = sender.index[0]
varMes = ModbusVarManage.getByName(name) varMes = ModbusVarManage.getByName(name, modbusType)
varMes.append('int') varMes.append('int')
varMes.insert(1, '') varMes.insert(1, '')
varMes.insert(2, '') varMes.insert(2, '')
@ -437,7 +421,6 @@ class VarButtonDelegate(QItemDelegate):
sender.isEdit = True sender.isEdit = True
fucationCheckbox.setEnabled(False) fucationCheckbox.setEnabled(False)
modbusTypeCheckbox.setEnabled(False)
model.editableList.remove(sender.index[0]) model.editableList.remove(sender.index[0])
@ -459,29 +442,22 @@ class VarButtonDelegate(QItemDelegate):
class ModbusTypeBox(QItemDelegate): class ModbusTypeBox(QItemDelegate):
def __init__(self, parent=None): def __init__(self, parent=None):
super(ModbusTypeBox, self).__init__(parent) super(ModbusTypeBox, self).__init__(parent)
self.items = items
self.comboxType = comboxType
def paint(self, painter, option, index): 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()] data = self.parent().model.datas[index.row()]
comBox = str('cb' + str(index.row()) + str(index.column())) comBox = str('cb' + str(index.row()) + str(index.column()))
setattr(self, comBox, QComboBox()) setattr(self, comBox, QComboBox())
comboBox = getattr(self, comBox) comboBox = getattr(self, comBox)
comboBox.addItems(self.items) items = ['Coil Status', 'Input Status', 'Input Register', 'Holding Register']
if self.comboxType == 'founctionCombox': comboBox.addItems(items)
if self.parent().model.datas[index.row()][index.column()] in [0, 1]: if self.parent().model.datas[index.row()][index.column()] in [0, 1]:
comboBox.setCurrentIndex(self.parent().model.datas[index.row()][index.column()]) comboBox.setCurrentIndex(self.parent().model.datas[index.row()][index.column()])
elif self.parent().model.datas[index.row()][index.column()] in [3, 4]: elif self.parent().model.datas[index.row()][index.column()] in [3, 4]:
comboBox.setCurrentIndex(self.parent().model.datas[index.row()][index.column()] - 1) comboBox.setCurrentIndex(self.parent().model.datas[index.row()][index.column()] - 1)
else: else:
comboBox.setCurrentIndex(-1) comboBox.setCurrentIndex(0)
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)
comboBox.currentIndexChanged.connect( self.indexChange) comboBox.currentIndexChanged.connect( self.indexChange)
comboBox.setObjectName('ModbusTypeBox') comboBox.setObjectName('ModbusTypeBox')
@ -515,10 +491,7 @@ class ModbusTypeBox(QItemDelegate):
def indexChange(self): def indexChange(self):
sender = self.sender() sender = self.sender()
index = sender.currentIndex() index = sender.currentIndex()
if self.comboxType == 'founctionCombox': if index in [2, 3]:
if index in [2, 3]: index += 1
index += 1 self.parent().model.datas[sender.index[0]][sender.index[1]] = index
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

@ -1,10 +1,7 @@
import time import time
from PyQt5.QtCore import QThread, pyqtSignal from PyQt5.QtCore import QThread, pyqtSignal
from UI.TrendManage.ActualTrendWidget import ActualTrend
from protocol.TCP.RTDTC import RTDTCClient from protocol.TCP.RTDTC import RTDTCClient
from protocol.TCP.Analog import AnalogClient from protocol.TCP.Analog import AnalogClient
from protocol.FF.FFSimulate import FFSimulate
from protocol.Hart.HartSimulate import HartSimulate from protocol.Hart.HartSimulate import HartSimulate
from utils import Globals from utils import Globals

@ -74,19 +74,19 @@ class CheckBoxHeader(QHeaderView):
class VarTableView(QTableView): class VarTableView(QTableView):
def __init__(self, parent=None): def __init__(self, modbusType, parent=None):
super(VarTableView, self).__init__(parent) super(VarTableView, self).__init__(parent)
self.parent = parent self.parent = parent
self.modbusType = modbusType
self.setHeader() self.setHeader()
self.setupUi() self.setupUi()
def setHeader(self): def setHeader(self):
founctionItem = ['Coil Status', 'Input Status', 'Input Register', 'Holding Register'] self.setItemDelegateForColumn(10, VarButtonDelegate(self))
modbusTypeComboxItem = ['MODBUSTCP主站模式', 'MODBUSTCP从站模式', 'MODBUSRTU主站模式', 'MODBUSRTU从站模式'] self.setItemDelegateForColumn(5, ModbusTypeBox(self))
self.setItemDelegateForColumn(11, VarButtonDelegate(self)) self.model = VarTableModel(['ID', '强制值', '当前值', '变量名', '变量描述', '变量类型',
self.setItemDelegateForColumn(5, ModbusTypeBox(founctionItem, 'founctionCombox', self)) '从站地址', '寄存器地址', '工程量下限', '工程量上限', '操作'],
self.setItemDelegateForColumn(10, ModbusTypeBox(modbusTypeComboxItem, 'modbusTypeCombox', self)) [], modbusType = self.modbusType, table = self)
self.model = VarTableModel(['ID', '强制值', '当前值', '变量名', '变量描述', '变量类型', '从站地址', '寄存器地址', '工程量下限', '工程量上限', '通讯类型', '操作'],[], table = self)
def setupUi(self): def setupUi(self):
self.setShowGrid(True) self.setShowGrid(True)

@ -20,8 +20,9 @@ import re
class VarWidgets(QtWidgets.QWidget): class VarWidgets(QtWidgets.QWidget):
_isPopenOpen = False _isPopenOpen = False
def __init__(self, parent=None): def __init__(self, modbusType, parent=None):
super(VarWidgets, self).__init__(parent) super(VarWidgets, self).__init__(parent)
self.modbusType = modbusType
self.setupUI() self.setupUI()
def setupUI(self): def setupUI(self):
@ -62,7 +63,7 @@ class VarWidgets(QtWidgets.QWidget):
self.startProtocolBtn.setIconSize(QSize(22, 22)) self.startProtocolBtn.setIconSize(QSize(22, 22))
self.startProtocolBtn.clicked.connect(self.startProtocol) self.startProtocolBtn.clicked.connect(self.startProtocol)
self.varView = VarTableView(self) self.varView = VarTableView(self.modbusType, self)
self.varView.setObjectName('varView') self.varView.setObjectName('varView')
self.proxy = QtCore.QSortFilterProxyModel(self) self.proxy = QtCore.QSortFilterProxyModel(self)
self.proxy.setSourceModel(self.varView.model) self.proxy.setSourceModel(self.varView.model)
@ -75,7 +76,7 @@ class VarWidgets(QtWidgets.QWidget):
self.timer.timeout.connect(self.proxy.invalidate) self.timer.timeout.connect(self.proxy.invalidate)
self.timer.start(50) # 启动timer 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.initTable()
# [self.varView.model.append_data([1,1,1,1,1,1,1,1,1,1]) for x in range(100)] # [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) # check.sort(reverse=True)
for i in check: for i in check:
varMes = self.varView.model.datas[i] 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\.-]+') pattern = re.compile(r'[^0-9\.-]+')
if not value or re.findall(pattern, str(value)): if not value or re.findall(pattern, str(value)):
reply = QMessageBox.question(self.parent(), reply = QMessageBox.question(self.parent(),

@ -68,6 +68,5 @@ class Register:
else: else:
return False return False
else: else:
print('ccc')
return False return False

@ -22,8 +22,8 @@ from utils import Globals
from utils.DBModels.ClientModels import Project, ClientDB from utils.DBModels.ClientModels import Project, ClientDB
from utils.DBModels.ProjectBaseModel import * from utils.DBModels.ProjectBaseModel import *
from utils.DBModels.ProtocolModel import ModBusVar, TCPSetting, RTUSetting, InfluxMem, HartVar, TcRtdVar, AnalogVar, \ from utils.DBModels.ProtocolModel import ModbusTcpMasterVar, ModbusRtuMasterVar, ModbusRtuSlaveVar,\
FFSimulateVar, HartSimulateVar ModbusTcpSlaveVar, TCPSetting, RTUSetting, InfluxMem, HartVar, TcRtdVar, AnalogVar, HartSimulateVar
from utils.DBModels.UserModels import User from utils.DBModels.UserModels import User
@ -60,14 +60,13 @@ class ProjectManage(object):
project_proxy.initialize(projectDB) project_proxy.initialize(projectDB)
projectDB.connect() projectDB.connect()
projectDB.create_tables([ModBusVar, User, TCPSetting, RTUSetting,\ projectDB.create_tables([ModbusTcpMasterVar, ModbusRtuMasterVar, ModbusRtuSlaveVar, \
HartVar, TcRtdVar, FFSimulateVar, HartSimulateVar,AnalogVar,InfluxMem],safe=True) ModbusTcpSlaveVar, TCPSetting, User, TCPSetting, RTUSetting,HartVar, \
TcRtdVar, HartSimulateVar, AnalogVar, InfluxMem],safe=True)
manageList = [HartVarManage(), AnalogManage(), TcRtdManage(), HartSimulateVarManage()]
HartVarManage().initVar() for l in manageList:
AnalogManage().initVar() l.initVar()
TcRtdManage().initVar()
HartSimulateVarManage().initVar()
UserManage.initUser() UserManage.initUser()
modbusMasterTcpSetting = TCPSetting() modbusMasterTcpSetting = TCPSetting()

@ -2,16 +2,29 @@
import openpyxl import openpyxl
from pytz import NonExistentTimeError 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 from utils import Globals
# ID 从站地址 变量名 变量描述 功能码 寄存器地址 工程量下限 工程量上限 # ID 从站地址 变量名 变量描述 功能码 寄存器地址 工程量下限 工程量上限
class ModbusVarManage(object): class ModbusVarManage(object):
ModBusVarClass = {
'ModbusTcpMaster': ModbusTcpMasterVar,
'ModbusTcpSlave': ModbusRtuMasterVar,
'ModbusRtuMaster': ModbusRtuSlaveVar,
'ModbusRtuSlave': ModbusTcpSlaveVar,
}
def __init__(self): def __init__(self):
super().__init__() super().__init__()
@classmethod
def getVarClass(self, modbusType):
"""根据类型获取对应的变量类"""
return self.ModBusVarClass.get(modbusType)
@classmethod @classmethod
def importModbusVar(self, path): def importModbusVar(self, path):
# 导入modbus变量表 # 导入modbus变量表
@ -25,7 +38,6 @@ class ModbusVarManage(object):
addrIndex = None addrIndex = None
minIndex = None minIndex = None
maxIndex = None maxIndex = None
modbusType = None
for index, cell in enumerate(list(ws.iter_rows())[0]): for index, cell in enumerate(list(ws.iter_rows())[0]):
if cell.value in ['id', 'ID']: if cell.value in ['id', 'ID']:
@ -44,10 +56,8 @@ class ModbusVarManage(object):
minIndex = index minIndex = index
if cell.value == '工程量上限': if cell.value == '工程量上限':
maxIndex = index maxIndex = index
if cell.value == '通讯类型':
modbusType = index
# print(IDIndex, slaveIndex, nameIndex, desIndex, typeIndex, addrIndex, minIndex, maxIndex) # 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('表头错误') # print('表头错误')
return '表头错误' return '表头错误'
errorConList = [] errorConList = []
@ -101,7 +111,7 @@ class ModbusVarManage(object):
@classmethod @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) name = str(varName)
des = str(des) des = str(des)
@ -111,24 +121,25 @@ class ModbusVarManage(object):
min = str(min) min = str(min)
max = str(max) max = str(max)
order = order order = order
modbusType = str(modbusType) if self.getVarClass(modbusType).getByName(name):
if ModBusVar.getByName(name):
return 1 return 1
else: 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 @classmethod
def deleteVar(self, name): def deleteVar(self, name, modbusType):
# 删除变量 # 删除变量
name = str(name) name = str(name)
# print(name) # print(name)
ModBusVar.deleteVar(name = name) self.getVarClass(modbusType).deleteVar(name = name)
@classmethod @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) name = str(name)
Nname = str(Nname) Nname = str(Nname)
@ -138,41 +149,41 @@ class ModbusVarManage(object):
address = str(address) address = str(address)
min = str(min) min = str(min)
max = str(max) max = str(max)
modbusType = str(modbusType)
if Nname == name: 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() 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 ModBusVar.getByName(Nname): elif self.getVarClass(modbusType).getByName(Nname):
print('已有同名变量') print('已有同名变量')
return return
elif not ModBusVar.getByName(name): elif not self.getVarClass(modbusType).getByName(name):
print('不存在的变量') print('不存在的变量')
return return
else: 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 @classmethod
def editOrder(self, name, order): def editOrder(self, name, order, modbusType):
name = str(name) name = str(name)
order = str(order) 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 @classmethod
def getAllVar(self): def getAllVar(self, modbusType):
# 查询所有变量 # 查询所有变量
vars = ModBusVar.get_all()
vars = self.getVarClass(modbusType).get_all()
if vars is 'error': if vars is 'error':
return return
l = [] l = []
for var in vars: 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 return l
@classmethod @classmethod
def getByName(self, name): def getByName(self, name, modbusType):
# 查询指定变量信息 # 查询指定变量信息
var = ModBusVar.getByName(name) var = self.getVarClass(modbusType).getByName(name)
if var: 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: else:
return False return False

@ -1,236 +0,0 @@
from pythonnet import load
# load('coreclr')
import clr # 与其他模块不同此处不直接导入pythonnet 而是导入clrpython与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()

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

@ -72,7 +72,6 @@ class ModBusVar(BaseModel):
slaveID = CharField() slaveID = CharField()
min = CharField() min = CharField()
max = CharField() max = CharField()
modbusType = IntegerField()
order = CharField() order = CharField()
@ -91,7 +90,7 @@ class ModBusVar(BaseModel):
query.execute() 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.varName = varName
self.varType = varType self.varType = varType
self.description = des 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.createTime = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
self.min = min self.min = min
self.max = max self.max = max
self.modbusType = modbusType
self.order = order self.order = order
# print(self.createTime) # print(self.createTime)
self.save() self.save()
class ModbusTcpMasterVar(ModBusVar):
pass
class ModbusTcpSlaveVar(ModBusVar):
pass
class ModbusRtuMasterVar(ModBusVar):
pass
class ModbusRtuSlaveVar(ModBusVar):
pass
class InfluxMem(BaseModel): class InfluxMem(BaseModel):
mem = CharField() mem = CharField()

Loading…
Cancel
Save