0205更新

main
zcwBit 2 years ago
parent 5a18962b20
commit 9df90d56a6

@ -1,9 +1,109 @@
QMdiSubWindow { QMdiSubWindow {
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
}
QPushButton#deviceAddButton, QPushButton#addareabutton {
color: #328ffc;
font-size: 17px;
}
QTabBar::close-button {
image: url(Static/close.png);
subcontrol-origin: padding;
margin-top: 2px;
margin-left: 4px;
}
QTabBar::close-button:hover {
background-color: #cccccc;
}
QTabBar::tab:hover {
background-color: #809ac2;
}
QTabBar::tab{
background: #cbdeec;
border: 2px;
min-width: 200px;
min-height: 30px;
font: 17px;
font-family: ".SFNSDisplay-Regular";
}
QTabBar#areaTabBar::tab{
min-width: 100px;
}
QTabBar::tab:selected {
background-color: #f0f0f0;
font: bold;
border-radius: 3px;
margin-bottom: -4px
} }
QTabWidget#deviceTabWidget::pane {
border: 1px solid #a8a8a8;
border-radius: 3px;
margin: 2px;
}
QDockWidget{
font: 18px;
font: bold;
font-family: ".SFNSDisplay-Regular";
}
QDockWidget::title{
background-color: #cbdeec;
color: white;
text-align: center;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 242 B

@ -0,0 +1,29 @@
class AreaWidgetManage:
def __init__(self):
# self.label = [] #主站AI DI与从站AODO,没有确定按钮
# self.lineEdit = [] #存放主站AODO与从站AIDI有确定按钮
self.areaAllWidgets = []
def addWidgets(self,areaWidgets):
#主站AI DI没有确定按钮 从站AIDI有确定按钮
#主站AODO有确定按钮 从站AODO没有确定按钮
self.areaAllWidgets.append(areaWidgets)
def getAllWidgets(self):
l = []
for areaWidgets in self.areaAllWidgets:
for areawidget in areaWidgets:
l.append(areawidget)
return l
def delareaWidget(self, index):
self.areaAllWidgets.pop(index)

@ -1,226 +1,430 @@
import re
from socket import AI_ADDRCONFIG
import sys import sys
import json import json
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, \ from tkinter import N
QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox from functools import partial
from PyQt5 import QtCore from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \
QHBoxLayout, QComboBox, QLineEdit, QSpacerItem, QSizePolicy, QGridLayout, QMessageBox, QSplitter, QFrame
from PyQt5.QtCore import QLine
from PyQt5.QtGui import QIcon
from numpy import add, byte, delete
from model.ProjectModel.AreaManage import Area
from model.ProjectModel.DeviceWidgetManage import DeviceWidgetManage
from UI.AreaMansge import AreaWidgetManage
from model.ProjectModel.DeviceManage import Device, DevicesManange
class forceButton(QPushButton):
def __init__(self, valueEdit):
super().__init__()
self.valueEdit = valueEdit
self.setText('强制')
class ButtonLayout(QWidget):
def __init__(self):
super().__init__()
# self.index = index
self.addLayout()
l = []
def addLayout(self):
self.setLayout(self.areaLayout())
def areaLayout(self):
areaLayout = QVBoxLayout()
for i in range(8):
hLayout = QHBoxLayout()
hLayout.addLayout(self.dateLayout())
hLayout.addWidget(QSplitter())
hLayout.addLayout(self.dateLayout())
areaLayout.addLayout(hLayout)
return areaLayout
def dateLayout(self, force = True):
forceLayout = QHBoxLayout()
areaMessLabel = QLabel('DO' + str(1) + ": " + '字节长度: ' + '22' + ' 当前值: ' )
areaValueLabel = QLabel('0')
forceLayout.addWidget(areaMessLabel)
forceLayout.addWidget(areaValueLabel)
if force:
areaLineEdit = QLineEdit('0')
forceBtn = forceButton(areaLineEdit)
forceBtn.clicked.connect(self.forceValues)
forceLayout.addWidget(areaLineEdit)
forceLayout.addWidget(forceBtn)
return forceLayout
def forceValues(self):
sender = self.sender()
print(sender.valueEdit.text())
from model.ProjectModel.DeviceManage import DevicesManange, Device
class AreaTabWidget(QMainWindow): class AreaTabWidget(QTabWidget):
def __init__(self, mainwindow): def __init__(self, deviceWidget):
super().__init__() super().__init__()
self.deviceWidget = deviceWidget
self.initUI() self.initUI()
self.mainwindow = mainwindow
def initUI(self): def initUI(self):
self.areaWidgetmanage = AreaWidgetManage()
self.deviceName = self.deviceWidget.deviceName
# 创建一个 QTabWidget # 创建一个 QTabWidget
self.widgetList = []
self.areaTabWidget = QTabWidget(self)
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
# 设置主窗口的中心部分为 QTabWidget
self.setCentralWidget(self.areaTabWidget)
def initAreaTab(self, dataType, order, channelBytes): self.setTabPosition(QTabWidget.South)
widgetList = self.addAreaTab() self.tabBar().setObjectName('areaTabBar')
widgetList[0].setCurrentIndex(dataType) self.addAreaButton = QPushButton("添加区域")
widgetList[1].setCurrentIndex(order) self.addAreaButton.setObjectName('addareabutton')
widgetList[2].setText(channelBytes) self.addAreaButton.setIcon(QIcon('Static/add.png'))
self.addAreaButton.setFlat(True)
self.addAreaWidget(widgetList, loacl = False, init = True) self.setCornerWidget(self.addAreaButton)
self.addAreaButton.clicked.connect(self.addAreaTab)
self.initWidget() #初始化界面
def addAreaTab(self): # self.tabCloseRequested.connect(self.closeTab)
areaTabWidget = QWidget()
tabIndex = self.areaTabWidget.count() # self.setTabPosition(QTabWidget.West)
# 将标签页添加到 QTabWidget 中
self.areaTabWidget.addTab(areaTabWidget, str(tabIndex))
self.areaTabWidget.setCurrentIndex(int(tabIndex))
self.setCentralWidget(self.areaTabWidget)
widgetList = []
mainLayout = QVBoxLayout()
topLayout = QHBoxLayout()
areaLayout = QGridLayout()
dataTypeCombox = QComboBox() # self.setTabsClosable(True)
dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO'])
dataTypeCombox.setObjectName('dataTypeCombox')
orderCombox = QComboBox() # 设置主窗口的中心部分为 QTabWidget
orderCombox.addItems(['不转换', '字节转换', '字转换', '字内转换'])
byteLineEdit = QLineEdit()
byteLineEdit.setPlaceholderText('字节长度')
byteLineEdit.setObjectName('byteLineEdit')
okBtn = QPushButton('确定') def initWidget(self):
delAreaBtn = QPushButton('删除') alldevices = DevicesManange.getAllDevice()
if alldevices:
for devices in alldevices:
if self.deviceName in devices:
areas = json.loads(devices[3])
if areas:
self.removeTab(0)
for area in areas:
dataType, order = self.tran(area["type"], area["order"])
channelBytes = area["bytes"]
settingValue = [dataType, order, channelBytes]
self.addAreaTab(settingValue=settingValue)
else:
widget = QWidget()
layout = QHBoxLayout()
addButton = QPushButton('添加区域')
addButton.clicked.connect(lambda: self.addAreaTab(True))
layout.addWidget(QSplitter())
layout.addWidget(addButton)
layout.addWidget(QSplitter())
widget.setLayout(layout)
self.addTab(widget,'')
self.tabBar().setHidden(True)
topLayout.addWidget(dataTypeCombox, 1)
topLayout.addWidget(orderCombox, 1)
# topLayout.addWidget(byteLabel)
topLayout.addWidget(byteLineEdit, 2)
topLayout.addWidget(okBtn, 1)
topLayout.addItem(self.horizontalSpacer)
topLayout.addItem(self.horizontalSpacer)
topLayout.addItem(self.horizontalSpacer)
topLayout.addItem(self.horizontalSpacer)
topLayout.addWidget(delAreaBtn, 1)
widget = QWidget()
areaLayout.addWidget(widget)
mainLayout.addLayout(topLayout, 1)
mainLayout.addLayout(areaLayout, 9)
okBtn.clicked.connect(lambda checked, btn=okBtn: self.addAreaWidget(widgetList))
delAreaBtn.clicked.connect(self.removeAreaTab) def addAreaTab(self, init = False, settingValue = None):
if settingValue is None:
if init:
self.removeTab(0)
tabIndex = self.count()
areaWidget = AreaWidget(self, areaWidgetManage = self.areaWidgetmanage)
self.addTab(areaWidget, '通道' + str(tabIndex + 1))
self.setCurrentIndex(tabIndex)
self.tabBar().setHidden(False)
else:
tabIndex = self.count()
areaWidget = AreaWidget(self, settingValue, areaWidgetManage = self.areaWidgetmanage)
self.addTab(areaWidget, '通道' + str(tabIndex + 1))
self.tabBar().setHidden(False)
def tran(self, dataType, order):
if dataType == 'AI':
dataType = 0
if dataType == 'AO':
dataType = 1
if dataType == 'DI':
dataType = 2
if dataType == 'DO':
dataType = 3
if order == 'ABCD':
order = 0
if order == 'DCBA':
order = 1
if order == 'CDAB':
order = 2
if order == 'BADC':
order = 3
return dataType, order
class AreaWidget(QWidget):
def __init__(self, areaTabWidget, settingValue = None, areaWidgetManage = None):
super().__init__()
self.areaTabWidget = areaTabWidget
self.settingValue = settingValue
self.areaWidgetManage = areaWidgetManage
self.initUI()
widgetList.extend([dataTypeCombox, orderCombox, byteLineEdit, areaLayout]) def initUI(self):
areaTabWidget.setLayout(mainLayout) self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
return widgetList self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.mainLayout = QHBoxLayout()
self.leftLayout = QGridLayout()
self.rightLayout = QGridLayout()
self.dataTypeLabel = QLabel('数据类型:')
# self.dataTypeLabel.setFixedSize(90, 27)
self.dataTypeCombox = QComboBox()
self.dataTypeCombox.addItems(['AI', 'AO', 'DI', 'DO'])
self.dataTypeCombox.setObjectName('dataTypeCombox')
# self.dataTypeCombox.setFixedSize(90, 27)
self.dataOrderLabel = QLabel('数据格式:')
# self.dataOrderLabel.setFixedSize(90, 27)
self.orderCombox = QComboBox()
self.orderCombox.addItems(['不转换', '字节转换', '字转换', '字内转换'])
# self.orderCombox.setFixedSize(90, 27)
self.byteLineLabel = QLabel('字节长度:')
# self.byteLineLabel.setFixedSize(90, 27)
self.byteLineEdit = QLineEdit()
self.byteLineEdit.setPlaceholderText('字节长度')
self.byteLineEdit.setObjectName('byteLineEdit')
# self.byteLineEdit.setFixedSize(90, 27)
self.okBtn = QPushButton('确定')
# self.okBtn.setFixedSize(90, 27)
self.okBtn.clicked.connect(self.addAreaWidget)
self.obBtnValue = True
self.delAreaBtn = QPushButton('删除')
# self.delAreaBtn.setFixedSize(90, 27)
self.delAreaBtn.clicked.connect(self.removeAreaTab)
self.leftLayout.addWidget(self.dataTypeLabel, 0, 0, 1, 1)
self.leftLayout.addWidget(self.dataTypeCombox, 0, 1, 1, 1)
self.leftLayout.addWidget(self.dataOrderLabel,1, 0, 1, 1 )
self.leftLayout.addWidget(self.orderCombox,1, 1, 1, 1 )
self.leftLayout.addWidget(self.byteLineLabel,2, 0, 1, 1 )
self.leftLayout.addWidget(self.byteLineEdit,2, 1, 1, 1 )
self.leftLayout.addWidget(self.okBtn, 3, 0, 1, 1)
self.leftLayout.addWidget(self.delAreaBtn, 3, 1, 1, 1)
self.rightWidget = ButtonLayout()
# self.rightLayout.addWidget(self.rightWidget)
line = QFrame()
line.setFrameShape(QFrame.VLine)
line.setLineWidth(2)
self.mainLayout.addLayout(self.leftLayout, 1)
self.mainLayout.addWidget(line)
self.mainLayout.addWidget(self.rightWidget, 9)
self.mainLayout.setSpacing(20)
# self.deviceWidgetManage.addArea(mainLayout=mainLayout, leftLayoutWidget=leftLayoutWidgets)
self.setLayout(self.mainLayout)
if self.settingValue is not None:
self.addAreaWidget()
self.settingValue = None
def removeAreaTab(self): def removeAreaTab(self):
# 获取 QTabWidget 并从中删除标签页 # 获取 QTabWidget 并从中删除标签页
deviceName = self.areaTabWidget.parent().parent().parent().parent().parent().windowTitle() deviceName = self.areaTabWidget.deviceName
index = self.areaTabWidget.currentIndex() index = self.areaTabWidget.currentIndex()
tabCount = self.areaTabWidget.count()
alldevices = DevicesManange.getAllDevice()
for device in alldevices: # alldevices = DevicesManange.getAllDevice()
if deviceName in device: # for device in alldevices:
areas = device[3] # if deviceName in device:
if areas is not None: # areas = device[3]
areas = json.loads(areas) # if areas is not None:
area = areas[index] # areas = json.loads(areas)
type = area["type"] # if index >= len(areas):
# print(area, type,'ssss') # self.areaTabWidget.removeTab(index)
# return
if index != -1: if index != -1:
self.areaTabWidget.removeTab(index) self.areaTabWidget.removeTab(index)
del self.widgetList[index]
Device.delAreas(deviceName, index) Device.delAreas(deviceName, index)
self.mainwindow.devicesManange.getDevice(deviceName).delArea(index, type)
self.mainwindow.devicesManange.recalculateAddress()
# self.mainwindow.devicesManange.getDevice(deviceName).delArea(index, type)
# self.mainwindow.devicesManange.recalculateAddress()
if tabCount == 1:
self.areaTabWidget.initWidget()
def addAreaWidget(self, widgetList, loacl = True, init = False):
self.mainwindow.readVarTimer.stop()
dataType = widgetList[0].currentText()
# print(widgetList)
order = self.dataTypeTranslate(widgetList[1].currentText())
byteLineEdit = widgetList[2].text()
areaLayout = widgetList[3]
deviceName = self.areaTabWidget.parent().parent().parent().parent().parent().windowTitle()
widgetLists = []
while areaLayout.count():
item = areaLayout.takeAt(0)
widget = item.widget()
if widget:
widget.setParent(None)
if len(byteLineEdit) == 0: def addAreaWidget(self):
QMessageBox.warning(self, '警告', '请输入字节长度。') curIndex = self.areaTabWidget.currentIndex()
return #获取左侧配置布局的参数
else: areaWidgets = []
widgetList[0].setEnabled(False) areaLayout = self.rightLayout
if dataType in ['AI', 'AO']: deviceName = self.areaTabWidget.deviceName
areaLabel = QLabel(dataType + str(1) + ": " + '字节长度: ' + byteLineEdit + ' 当前值: ' ) #开启软件时判断数据库是否有存在设备信息,并执行相应的操作
areaLabel2 =QLabel('0') if self.settingValue is None:
dataType = self.dataTypeCombox.currentText()
if '主站' in deviceName and dataType == 'AI' or ('从站' in deviceName and dataType == 'AO'): order = self.dataTypeTranslate(self.orderCombox.currentText())
areaLayout.addWidget(areaLabel, 0, 0) byteLineEdit = self.byteLineEdit.text()
areaLayout.addWidget(areaLabel2, 0, 1)
areaLayout.addItem(self.horizontalSpacer, 0, 4)
widgetLists.append([areaLabel2, areaLayout, areaLabel])
elif '主站' in deviceName and dataType == 'AO' or ('从站' in deviceName and dataType == 'AI'):
areaLineEdit = QLineEdit('0')
editbtn = QPushButton('强制')
areaLayout.addWidget(areaLabel, 0, 0)
areaLayout.addWidget(areaLabel2, 0, 1 )
areaLayout.addWidget(areaLineEdit, 0, 2 )
areaLayout.addWidget(editbtn, 0, 3)
areaLayout.addItem(self.horizontalSpacer, 0, 4)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.wirteValue(btn))
widgetLists.append([areaLabel2, areaLineEdit, editbtn, areaLayout, areaLabel])
self.widgetList.append(widgetLists)
else:
channelNumber = int(byteLineEdit) * 8
if '主站' in deviceName and dataType == 'DI' or (
'从站' in deviceName and dataType == 'DO'):
for i in range(int(channelNumber)):
if i % 2 == 0:
areaLabel = QLabel(dataType + str(1) + ": " + '字节长度: ' + byteLineEdit + ' 当前值: ')
areaLabel2 = QLabel('0')
areaLayout.addWidget(areaLabel, i // 2, i % 2)
areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 1)
widgetLists.append([areaLabel2, areaLayout, areaLabel])
else: else:
areaLabel = QLabel(dataType + str(1) + ": " + '字节长度: ' + byteLineEdit + ' 当前值: ') dataTypeIndex = self.settingValue[0]
areaLabel2 = QLabel('0') orderIndex = self.settingValue[1]
areaLayout.addWidget(areaLabel, i // 2, i % 2 + 2) byteLineEditIndex = self.settingValue[2]
areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 3) self.dataTypeCombox.setCurrentIndex(dataTypeIndex)
widgetLists.append([areaLabel2, areaLayout, areaLabel]) self.orderCombox.setCurrentIndex(orderIndex)
self.widgetList.append(widgetLists) self.byteLineEdit.setText(byteLineEditIndex)
if '主站' in deviceName and dataType == 'DO' or ( dataType = self.dataTypeCombox.currentText()
'从站' in deviceName and dataType == 'DI'): order = self.dataTypeTranslate(self.orderCombox.currentText())
for i in range(int(channelNumber)): byteLineEdit = self.byteLineEdit.text()
if i % 2 == 0:
areaLabel = QLabel(dataType + str(1) + ": " + '字节长度: ' + byteLineEdit + ' 当前值: ') #判断字节长度的输入是否是数字
areaLabel2 = QLabel('0') pattern = re.compile(r'^\d+$')
areaLineEdit = QLineEdit('0') match = pattern.match(byteLineEdit)
editbtn = QPushButton('强制') if not match:
QMessageBox.warning(self, '提示', '请输入数字。')
areaLayout.addWidget(areaLabel, i // 2, i % 2) return
areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 1)
areaLayout.addWidget(areaLineEdit, i // 2, i % 2 + 2)
areaLayout.addWidget(editbtn, i // 2, i % 2 + 3)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.wirteValue(btn))
widgetLists.append([areaLabel2, areaLineEdit, editbtn, areaLabel])
else: else:
areaLabel = QLabel(dataType + str(1) + ": " + '字节长度: ' + byteLineEdit + ' 当前值: ') #设置点击确定后无法编辑,点击编辑后才能编辑
areaLabel2 = QLabel('0') if self.obBtnValue:
areaLineEdit = QLineEdit('0') self.okBtn.setText('编辑')
editbtn = QPushButton('强制') self.dataTypeCombox.setEnabled(False )
self.orderCombox.setEnabled(False )
self.byteLineEdit.setEnabled(False )
self.obBtnValue = False
areaLayout.addWidget(areaLabel, i // 2, i % 2 + 4) else:
areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 5) self.okBtn.setText('确定')
areaLayout.addWidget(areaLineEdit, i // 2, i % 2 + 6) self.dataTypeCombox.setEnabled(True )
areaLayout.addWidget(editbtn, i // 2, i % 2 + 7) self.orderCombox.setEnabled(True )
editbtn.clicked.connect(lambda checked, btn=editbtn: self.wirteValue(btn)) self.byteLineEdit.setEnabled(True )
self.obBtnValue = True
return
widgetLists.append([areaLabel2, areaLineEdit, editbtn, areaLabel]) #删除布局内容
self.widgetList.append(widgetLists) if self.settingValue is None:
areaLayout.addItem(self.verticalSpacer, int(byteLineEdit) * 8 ,0) self.areaWidgetManage.delareaWidget(curIndex)
while areaLayout.count():
index = self.areaTabWidget.currentIndex() + 1 items = areaLayout.takeAt(0)
areaId = DevicesManange.getAreaID(deviceName) if isinstance(items, QSpacerItem):
if areaId is not None and index in areaId: areaLayout.removeItem(items)
if loacl: if isinstance(items, QHBoxLayout):
while items.count():
item = items.takeAt(0)
del self.widgetList[index - 1] widget = item.widget()
if init: print(widget)
# print(222) if widget:
# self.mainwindow.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), nums = 1) widget.setParent(None)
widget.deleteLater()
items.deleteLater()
# #添加布局
# if dataType in ['AI', 'AO']:
# if '主站' in deviceName and dataType == 'AI' or ('从站' in deviceName and dataType == 'AO'):
# buttonLayout = ButtonLayout(index = 1, dataType = dataType, byteLineEdit = byteLineEdit, devicetype = '主站AI')
# areaLayout.addLayout(buttonLayout, 0, 0)
# areaLayout.addItem(self.horizontalSpacer, 0, 1)
# areaLayout.addItem(self.verticalSpacer, 1, 0)
# areaWidgets.append([buttonLayout.areaLabe2])
# elif '主站' in deviceName and dataType == 'AO' or ('从站' in deviceName and dataType == 'AI'):
# buttonLayout = ButtonLayout(index = 0, dataType = dataType, byteLineEdit = byteLineEdit, devicetype = '主站AO' )
# areaLayout.addLayout(buttonLayout, 0, 0)
# areaLayout.addItem(self.horizontalSpacer, 0, 4)
# areaLayout.addItem(self.verticalSpacer, 1, 0)
# areaLineEdit = buttonLayout.areaLineEdit
# buttonLayout.editbtn.clicked.connect(lambda: self.wirteValue(areaLineEdit, dataType='主站AO'))
# areaWidgets.append([buttonLayout.areaLabe2, areaLineEdit,buttonLayout.editbtn])
# self.areaWidgetManage.addWidgets(areaWidgets)
# else:
# channelNumber = int(byteLineEdit) * 8
# if '主站' in deviceName and dataType == 'DI' or (
# '从站' in deviceName and dataType == 'DO'):
# for i in range(int(channelNumber)):
# buttonLayout = ButtonLayout(index = i + 1, dataType = dataType, byteLineEdit = byteLineEdit, devicetype = '主站DI' ) # type: ignore
# if i % 2 == 0:
# areaLayout.addLayout(buttonLayout, i // 2, i % 2)
# else:
# areaLayout.addLayout(buttonLayout, i // 2, i % 2 + 1 )
# areaWidgets.append([buttonLayout.areaLabe2])
# areaLayout.addItem(self.verticalSpacer, int(channelNumber) // 2 + 1, 0)
# self.areaWidgetManage.addWidgets(areaWidgets)
# if '主站' in deviceName and dataType == 'DO' or (
# '从站' in deviceName and dataType == 'DI'):
# for i in range(int(channelNumber)):
# buttonLayout = ButtonLayout(index = i + 1, dataType = dataType, byteLineEdit = byteLineEdit, devicetype = '主站DO' ) # type: ignore
# if i % 2 == 0:
# areaLayout.addLayout(buttonLayout, i // 2, i % 2)
# areaLineEdit = buttonLayout.areaLineEdit
# buttonLayout.editbtn.clicked.connect(partial(self.wirteValue, areaLineEdit, '主站DO'))
# else:
# areaLayout.addLayout(buttonLayout, i // 2, i % 2 + 1 )
# areaLineEdit = buttonLayout.areaLineEdit
# buttonLayout.editbtn.clicked.connect(partial(self.wirteValue, areaLineEdit, '主站DO'))
# areaWidgets.append([buttonLayout.areaLabe2, areaLineEdit,buttonLayout.editbtn])
# areaLayout.addItem(self.verticalSpacer, int(channelNumber) // 2 + 1, 0)
# self.areaWidgetManage.addWidgets(areaWidgets)
# index = curIndex + 1
# areaId = DevicesManange.getAreaID(deviceName)
# if self.settingValue is not None:
# return
# elif areaId is not None and index in areaId:
# DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, index)
# else:
# DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
# if areaId is not None and index in areaId:
# # if loacl:
# # del self.widgetList[index - 1]
# if init:
# return
# DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, index)
# self.mainwindow.devicesManange.getDevice(deviceName).editArea(index = index - 1, type = dataType, order = order, bytes = int(byteLineEdit))
# self.mainwindow.devicesManange.recalculateAddress() # self.mainwindow.devicesManange.recalculateAddress()
return # self.mainwindow.readVarTimer.start(500)
DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, index) # else:
self.mainwindow.devicesManange.getDevice(deviceName).editArea(index = index - 1, type = dataType, order = order, bytes = int(byteLineEdit)) # DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
self.mainwindow.devicesManange.recalculateAddress() # self.mainwindow.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1)
self.mainwindow.readVarTimer.start(500) # self.mainwindow.devicesManange.recalculateAddress()
else: # self.mainwindow.readVarTimer.start(500)
DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
self.mainwindow.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1)
self.mainwindow.devicesManange.recalculateAddress()
self.mainwindow.readVarTimer.start(500)
@ -230,31 +434,65 @@ class AreaTabWidget(QMainWindow):
self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'} self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'}
return self.dataTypeDict[order] return self.dataTypeDict[order]
def wirteValue(self, editBtn): def wirteValue(self, editbtn, dataType = None):
deviceName = self.areaTabWidget.parent().parent().parent().parent().parent().windowTitle() #判断输入值是否为数字
# index = self.areaTabWidget.currentIndex() if dataType == '主站AO':
editbtnText = editbtn.text()
print(editbtn, editbtnText)
pattern = re.compile(r'^\d+(\.\d+)?$')
match = pattern.match(editbtnText)
if not match:
QMessageBox.warning(self, '提示', '请输入数字。')
return
#判断输入值是否为0和1
elif dataType == '主站DO':
editbtnText = editbtn.text()
print(editbtn, editbtnText, 'sssss')
pattern = re.compile(r'^[01]+$')
match = pattern.match(editbtnText)
if not match:
QMessageBox.warning(self, '提示', '请输入0或1。')
return
areaWidgets = self.areaWidgetManage.getAllWidgets()
valueList = [] valueList = []
didoValueList = [] didoValueList = []
if len(self.widgetList) > 0: if areaWidgets:
for widgetLists in self.widgetList: for areaWidget in areaWidgets:
for widgetList in widgetLists: if editbtn in areaWidget:
if editBtn in widgetList: areaWidget[0].setText(areaWidget[1].text())
widgetList[0].setText(widgetList[1].text()) if isinstance(areaWidget[1], QLineEdit):
didoValueList.append(float(areaWidget[1].text()))
print(didoValueList)
if isinstance(widgetList[1], QLineEdit):
dataType = widgetList[-1].text()[0:2]
# if dataType in ['DI', "DO"]:
didoValueList.append(float(widgetList[1].text()))
if didoValueList: if didoValueList:
valueList.append(didoValueList) valueList.append(didoValueList)
didoValueList = [] didoValueList = []
# print(valueList)
self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList) # self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList)
# valueList = []
# didoValueList = []
# if len(self.widgetList) > 0:
# for widgetLists in self.widgetList:
# for widgetList in widgetLists:
# if editBtn in widgetList:
# widgetList[0].setText(widgetList[1].text())
# if isinstance(widgetList[1], QLineEdit):
# dataType = widgetList[-1].text()[0:2]
# # if dataType in ['DI', "DO"]:
# didoValueList.append(float(widgetList[1].text()))
# if didoValueList:
# valueList.append(didoValueList)
# didoValueList = []
# self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList)
def readValue(self): def readValue(self):
deviceName = self.areaTabWidget.parent().parent().parent().parent().parent().windowTitle() deviceName = self.mainwindow.devicesManange.getDeviceName(self)
curIndex = -1 curIndex = -1
areaIndex = self.areaTabWidget.currentIndex() areaIndex = self.areaTabWidget.currentIndex()
if len(self.widgetList) > 0: if len(self.widgetList) > 0:

@ -0,0 +1,45 @@
from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QDialogButtonBox, QMessageBox
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt
class DeviceDialog(QDialog):
def __init__(self, parent=None):
super().__init__(parent)
self.initUI()
def initUI(self):
layout = QFormLayout()
deviceName = QLineEdit()
deviceName.setObjectName('deviceName')
layout.addRow("设备名:", deviceName)
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
ok_button = button_box.button(QDialogButtonBox.Ok)
ok_button.setText("确定") # 设置Ok按钮的文本
cancel_button = button_box.button(QDialogButtonBox.Cancel)
cancel_button.setText("取消") # 设置Cancel按钮的文本
button_box.accepted.connect(self.check_input)
button_box.rejected.connect(self.reject)
layout.addRow(button_box)
self.setWindowIcon(QIcon('Static/zhjt.ico'))
self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) # 去掉标题栏的问号
self.setLayout(layout)
self.setWindowTitle("设备信息")
def getParameters(self):
deviceName = self.findChild(QLineEdit, "deviceName").text()
return deviceName
def check_input(self):
deviceName = self.getParameters()
if not deviceName:
QMessageBox.warning(self, '警告', '请输入设备名')
else:
self.accept() # 所有输入都是数字且不为空时接受对话框

@ -1,74 +1,158 @@
from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QComboBox, QDialogButtonBox, QMessageBox import json
from PyQt5.QtGui import QPixmap, QIcon
from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QMainWindow, QDialog, QTabWidget, QPushButton, QSpacerItem, QSizePolicy,QMessageBox, QHBoxLayout, QWidget
import sys from PyQt5.QtGui import QIcon
import re
class DeviceDialog(QDialog): from UI.DeviceDialogWidget import DeviceDialog
def __init__(self, parent=None):
super().__init__(parent) from model.ProjectModel.DeviceManage import DevicesManange
from utils.DBModels.BaseModel import *
from UI.AreaTabWidget import AreaTabWidget
from utils.DBModels.DeviceModels import DeviceDB
from model.ProjectModel.DeviceManage import DevicesManange
from UI.DeviceDialogWidget import DeviceDialog
from model.ProjectModel.DeviceWidgetManage import DeviceWidgetManage
class DeviceWidget(QMainWindow):
def __init__(self, dockWidget):
super().__init__()
self.dockWidget = dockWidget
self.forceValues = []
self.initUI() self.initUI()
def initUI(self): def initUI(self):
layout = QFormLayout() #获取DP、PA协议和主从模式
proType = QComboBox()
proType.addItems(['DP', 'PA']) self.proType = self.dockWidget.windowTitle()[0:2]
proType.setObjectName('ProtocolType') self.masterSlaveModel = self.dockWidget.windowTitle()[2:4]
masterSlaveModel = QComboBox()
masterSlaveModel.addItems(['主站', '从站']) # self.deviceWidgetManage = DeviceWidgetManage()
masterSlaveModel.setObjectName('masterSlaveModel') self.deviceTabWidget = QTabWidget(self)
self.deviceTabWidget.setObjectName('deviceTabWidget')
deviceName = QLineEdit()
deviceName.setObjectName('deviceName')
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
pvUpperLimit = QLineEdit() self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
pvUpperLimit.setObjectName('pvUpperLimit')
self.addDeviceButton = QPushButton('添加设备 ')
pvLowerLimit = QLineEdit() self.addDeviceButton.setObjectName('deviceAddButton')
pvLowerLimit.setObjectName('pvLowerLimit') self.addDeviceButton.setIcon(QIcon('Static/add.png'))
self.addDeviceButton.setFlat(True)
pvUnit = QLineEdit() self.addDeviceButton.clicked.connect(self.addDeviceWidget)
pvUnit.setObjectName('pvUnit')
self.deviceTabWidget.setCornerWidget(self.addDeviceButton)
layout.addRow('协议类型', proType) self.deviceTabWidget.setTabsClosable(True)
layout.addRow('主从模式', masterSlaveModel) self.deviceTabWidget.tabCloseRequested.connect(self.closeTab)
layout.addRow("设备名:", deviceName)
layout.addRow("量程上限:", pvUpperLimit) self.initWidget()
layout.addRow("量程下限:", pvLowerLimit)
layout.addRow("单位:", pvUnit) # 设置主窗口的中心部分为 QTabWidget
self.setCentralWidget(self.deviceTabWidget)
button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) def closeTab(self, index):
ok_button = button_box.button(QDialogButtonBox.Ok) reply = QMessageBox.question(self, 'Confirmation', '确定删掉此设备吗?',
ok_button.setText("确定") # 设置Ok按钮的文本 QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
cancel_button = button_box.button(QDialogButtonBox.Cancel) if reply == QMessageBox.Yes:
cancel_button.setText("取消") # 设置Cancel按钮的文本 if index != -1:
self.deviceTabWidget.removeTab(index)
button_box.accepted.connect(self.check_input) DeviceDB.deleteDevice(deviceName = self.deviceName)
button_box.rejected.connect(self.reject) else:
return
layout.addRow(button_box) if self.deviceTabWidget.count() == 0:
self.setWindowIcon(QIcon('Static/zhjt.ico')) self.initWidget()
self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint) # 去掉标题栏的问号
self.setLayout(layout)
self.setWindowTitle("设备信息")
def addDeviceWidget(self,init = False,deviceName = None):
def getParameters(self): if deviceName is None:
proType = self.findChild(QComboBox, "ProtocolType").currentText() dialog = DeviceDialog()
masterSlaveModel = self.findChild(QComboBox, "masterSlaveModel").currentText() if dialog.exec_() == QDialog.Accepted:
deviceName = self.findChild(QLineEdit, "deviceName").text() self.titleName = dialog.getParameters()
pvUpperLimit = self.findChild(QLineEdit, "pvUpperLimit").text() self.deviceName = self.titleName + self.dockWidget.windowTitle()
pvLowerLimit = self.findChild(QLineEdit, "pvLowerLimit").text() DeviceDB().addDevice(deviceName = self.deviceName, proType = self.proType , masterSlaveModel = self.masterSlaveModel)
pvUnit = self.findChild(QLineEdit, "pvUnit").text() areaTabWidget = AreaTabWidget(self)
return deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit if init:
self.deviceTabWidget.removeTab(0)
def check_input(self): tabIndex = self.deviceTabWidget.count()
deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = self.getParameters() self.deviceTabWidget.tabBar().setHidden(False)
self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName))
if not pvUpperLimit or not pvLowerLimit or not pvUnit or not deviceName: self.deviceTabWidget.setCurrentIndex(tabIndex)
QMessageBox.warning(self, '警告', '有值未输入。') # self.deviceWidgetManage.addDevice(deviceName = self.deviceName, areaTabWidget=areaTabWidget, dockWidget=self.dockWidget)
elif not re.match(r'^[-+]?\d*\.?\d*$', pvUpperLimit) or not re.match(r'^[-+]?\d*\.?\d*$', pvLowerLimit): else:
QMessageBox.warning(self, '警告', '请输入数字。') return
elif pvUpperLimit < pvLowerLimit:
QMessageBox.warning(self, '警告', '量程输入有误。')
else: else:
self.accept() # 所有输入都是数字且不为空时接受对话框 self.deviceTabWidget.removeTab(0)
self.deviceName = deviceName
self.titleName = self.deviceName[:-4]
areaTabWidget = AreaTabWidget(self)
self.deviceTabWidget.tabBar().setHidden(False)
self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName))
def initWidget(self):
widget = QWidget()
layout = QHBoxLayout()
addButton = QPushButton('添加设备')
addButton.clicked.connect(lambda: self.addDeviceWidget(True))
layout.addItem(self.horizontalSpacer)
layout.addWidget(addButton)
layout.addItem(self.horizontalSpacer)
widget.setLayout(layout)
self.deviceTabWidget.addTab(widget,'')
self.deviceTabWidget.tabBar().setHidden(True)
alldevices = DevicesManange.getAllDevice()
titleName = self.dockWidget.windowTitle()
if alldevices:
for devices in alldevices:
# self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0])
deviceName = devices[0]
if titleName in deviceName:
self.addDeviceWidget(deviceName=deviceName)
def initAreaWidget(self, mdiarea):
alldevices = DevicesManange.getAllDevice()
for devices in alldevices:
areas = devices[3]
deviceWidget = self.deviceWidget(devices[0], mdiarea) #新建deviceWidget
areaTabWidget = deviceWidget.widget().widget().centralWidget() # type: ignore
self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0], deviceWidget = deviceWidget, areaTabWidget = areaTabWidget) # type: ignore
if areas is not None:
areas = json.loads(areas)
for area in areas:
dataType, order = self.tran(area["type"], area["order"])
channelBytes = area["bytes"]
dev = self.devicesManange.getDevice(deviceName = devices[0])
dev.addArea(type = area["type"], order = area["order"], bytes = int(channelBytes), nums = 1) #添加area
areaTabWidget.initAreaTab(dataType, order, channelBytes)
self.devicesManange.recalculateAddress()
def createDeciveWidget(self, mdiarea):
dialog = DeviceDialog()
if dialog.exec_() == QDialog.Accepted:
deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters()
windowTitle = deviceName + ' ' + proType + masterSlaveModel + ' ' + pvLowerLimit + '-' + pvUpperLimit + pvUnit
DeviceDB().addDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit)
deviceWidget = self.deviceWidget(windowTitle, mdiarea)
areaTabWidget = deviceWidget.widget().widget().centralWidget()
self.devicesManange.addDevice(proType = proType, masterSlaveModel = masterSlaveModel, deviceName = windowTitle, deviceWidget = deviceName, areaTabWidget = areaTabWidget)
self.devicesManange.recalculateAddress()
else:
return

@ -0,0 +1,6 @@
111111111111111111111111
111111111111111111111111

@ -1,23 +1,11 @@
import sys import sys
import json
import collections from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QToolBar, QAction
import time from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QMainWindow, QToolBar, QMdiArea, QAction, QInputDialog, QDialog, QFormLayout, QLineEdit, \
QMdiSubWindow, QDialogButtonBox, QWidget, QComboBox, QTabBar, QTabWidget, QGridLayout, QLabel, QPushButton, QSpacerItem, QSizePolicy, QHBoxLayout, QTableWidget, QScrollArea
from PyQt5 import QtCore
from PyQt5.QtGui import QPixmap, QIcon
from UI.DeviceWidget import DeviceDialog
from UI.AreaSettingWidget import AreaSettingWidget
from UI.DelAreaWidget import DelAreaWidget
from model.ProjectModel.DeviceManage import DevicesManange, Device
from protocol.ModBus.ModBusThread import MyThread
from utils.DBModels.BaseModel import * from utils.DBModels.BaseModel import *
from UI.AreaTabWidget import AreaTabWidget
from utils.DBModels.DeviceModels import DeviceDB
from model.ClientModel.Client import Client from model.ClientModel.Client import Client
from model.ProjectModel.DeviceManage import DevicesManange from UI.DeviceWidget import DeviceWidget
class CommonHelper: class CommonHelper:
def __init__(self): def __init__(self):
@ -32,23 +20,14 @@ class CommonHelper:
class MainWindow(QMainWindow): class MainWindow(QMainWindow):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.devicesManange = DevicesManange()
self.subWindows = [] #存储设备widget
self.initUI() self.initUI()
self.initAreaWidget()
self.states = True
def initUI(self): def initUI(self):
self.toolbar = QToolBar()
self.toolbar = QToolBar()
self.addToolBar(self.toolbar) self.addToolBar(self.toolbar)
# self.setWindowState(self.windowState() | QtCore.Qt.WindowMaximized)
self.addDiviceBtn = QAction("添加设备", self)
self.addDiviceBtn.setObjectName("addDiviceBtn")
self.addDiviceBtn.triggered.connect(self.createDeciveWidget)
self.startProtocolBtn = QAction("开始读取", self) self.startProtocolBtn = QAction("开始通讯", self)
self.startProtocolBtn.setObjectName("startProtocolBtn") self.startProtocolBtn.setObjectName("startProtocolBtn")
self.startProtocolBtn.triggered.connect(self.startProtocol) self.startProtocolBtn.triggered.connect(self.startProtocol)
@ -56,147 +35,40 @@ class MainWindow(QMainWindow):
self.loadProjectBtn.setObjectName("loadProjectBtn") self.loadProjectBtn.setObjectName("loadProjectBtn")
self.loadProjectBtn.triggered.connect(self.loadProject) self.loadProjectBtn.triggered.connect(self.loadProject)
self.toolbar.addAction(self.addDiviceBtn)
self.toolbar.addAction(self.loadProjectBtn) self.toolbar.addAction(self.loadProjectBtn)
self.toolbar.addAction(self.startProtocolBtn) self.toolbar.addAction(self.startProtocolBtn)
self.mdi_area = QMdiArea() dpMasterDockWidget = QDockWidget('DP主站')
dpMasterDockWidget.setWidget(DeviceWidget(dpMasterDockWidget))
self.setCentralWidget(self.mdi_area) dpMasterDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
self.setWindowIcon(QIcon('Static/zhjt.ico'))
self.setWindowTitle("PROFIBUS")
self.setGeometry(1000, 500, 800, 600)
self.readVarTimer = QtCore.QTimer()
self.readVarTimer.timeout.connect(self.readValues)
dpSlaveDockWidget = QDockWidget('DP从站')
dpSlaveDockWidget.setWidget(DeviceWidget(dpSlaveDockWidget))
dpSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
def deviceWidget(self, windowTitle): paMasterDockWidget = QDockWidget('PA主站')
subWindow = AreaQMdiSubWindow(self)# 创建一个子窗口 paMasterDockWidget.setWidget(DeviceWidget(paMasterDockWidget))
subWindow.setObjectName('subWindow') paMasterDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
areaTabWidget = AreaTabWidget(self)
#新建mainWindows放入subwindows paSlaveDockWidget = QDockWidget('PA从站')
areaMainWindow = QMainWindow() paSlaveDockWidget.setWidget(DeviceWidget(paSlaveDockWidget))
areaMainWindow.setCentralWidget(areaTabWidget) paSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
#mainwindows添加工具栏 self.addDockWidget(Qt.TopDockWidgetArea, dpMasterDockWidget) # type: ignore
toolbar = QToolBar() self.addDockWidget(Qt.TopDockWidgetArea, dpSlaveDockWidget) # type: ignore
areaMainWindow.addToolBar(toolbar) self.addDockWidget(Qt.BottomDockWidgetArea, paMasterDockWidget) # type: ignore
addAreaBtn = QAction("添加通道", areaMainWindow) self.addDockWidget(Qt.BottomDockWidgetArea, paSlaveDockWidget) # type: ignore
addAreaBtn.setObjectName("addDiviceBtn")
addAreaBtn.triggered.connect(areaTabWidget.addAreaTab)
toolbar.addAction(addAreaBtn)
#为mainwindow添加右滑动条 self.setWindowIcon(QIcon('Static/zhjt.ico'))
scroll_widget = QScrollArea() self.setWindowTitle("PROFIBUS")
scroll_widget.setWidgetResizable(True) self.showMaximized()
scroll_widget.setWidget(areaMainWindow)
#设置subwindow
subWindow.setWindowTitle(windowTitle)
subWindow.setGeometry(0, 0, 600, 500)
subWindow.setWidget(scroll_widget)
subWindow.setWindowIcon(QIcon('Static/zhjt.ico'))
self.mdi_area.addSubWindow(subWindow) # 将子窗口添加到MDI区域
subWindow.show()
self.subWindows.append(subWindow) def startProtocol(self):
return subWindow pass
def loadProject(self): def loadProject(self):
pass pass
def initAreaWidget(self):
alldevices = DevicesManange.getAllDevice()
for devices in alldevices:
areas = devices[3]
self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0])
areaTabWidget = self.deviceWidget(devices[0]).widget().widget().centralWidget()
if areas is not None:
areas = json.loads(areas)
for area in areas:
dataType, order = self.tran(area["type"], area["order"])
channelBytes = area["bytes"]
dev = self.devicesManange.getDevice(deviceName = devices[0])
dev.addArea(type = area["type"], order = area["order"], bytes = int(channelBytes), nums = 1)
areaTabWidget.initAreaTab(dataType, order, channelBytes)
self.devicesManange.recalculateAddress()
def createDeciveWidget(self):
dialog = DeviceDialog()
if dialog.exec_() == QDialog.Accepted:
deviceName, proType, masterSlaveModel, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters()
windowTitle = deviceName + ' ' + proType + masterSlaveModel + ' ' + pvLowerLimit + '-' + pvUpperLimit + pvUnit
DeviceDB().addDevice(deviceName = windowTitle, proType = proType, masterSlaveModel = masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit)
self.devicesManange.addDevice(proType = proType, masterSlaveModel = masterSlaveModel, deviceName = windowTitle)
self.devicesManange.recalculateAddress()
else:
return
self.deviceWidget(windowTitle)
def startProtocol(self):
if self.states == True:
self.readVarTimer.start(500)
self.states = False
self.startProtocolBtn.setText('停止读取')
else:
self.readVarTimer.stop()
self.states = True
self.startProtocolBtn.setText('开始读取')
def readValues(self):
# try:
self.devicesManange.readAreas()
# except Exception as e:
# print(e)
for subWindow in self.subWindows:
areaTabWidget = subWindow.widget().widget().centralWidget()
areaTabWidget.readValue()
def tran(self, dataType, order):
if dataType == 'AI':
dataType = 0
if dataType == 'AO':
dataType = 1
if dataType == 'DI':
dataType = 2
if dataType == 'DO':
dataType = 3
if order == 'ABCD':
order = 0
if order == 'DCBA':
order = 1
if order == 'CDAB':
order = 2
if order == 'BADC':
order = 3
return dataType, order
class AreaQMdiSubWindow(QMdiSubWindow):
def __init__(self, parentWindow):
super().__init__()
self.parentWindow = parentWindow
def closeEvent(self, event):
self.parentWindow.subWindows.remove(self)
self.parentWindow.devicesManange.delDevice(deviceName = self.windowTitle())
DeviceDB.deleteDevice(deviceName = self.windowTitle())
if __name__ == '__main__': if __name__ == '__main__':
app = QApplication(sys.argv) app = QApplication(sys.argv)
Client.initDB() Client.initDB()

@ -8,7 +8,7 @@ import sys
if __name__ == '__main__': if __name__ == '__main__':
app = QApplication(sys.argv) app = QApplication(sys.argv)
app.setStyle(QStyleFactory.create('Fusion')) app.setStyle(QStyleFactory.create('windowsvista'))
app.setStyleSheet(CommonHelper.readQss('static/main.qss')) app.setStyleSheet(CommonHelper.readQss('static/main.qss'))
Client.initDB() Client.initDB()
window = MainWindow() window = MainWindow()

@ -1,5 +1,7 @@
import collections import collections
import json import json
from utils.DBModels.DeviceModels import DeviceDB from utils.DBModels.DeviceModels import DeviceDB
from model.ProjectModel.AreaManage import Area from model.ProjectModel.AreaManage import Area
import numpy as np import numpy as np
@ -17,6 +19,9 @@ class Device():
protocolType = None protocolType = None
masterOrSlave = None masterOrSlave = None
deviceName = None deviceName = None
deviceWidget = None
areaTabWidget = []
def __init__(self): def __init__(self):
self.inputAreas = [] self.inputAreas = []
self.outputAreas = [] self.outputAreas = []
@ -28,21 +33,20 @@ class Device():
bytes = int(bytes) bytes = int(bytes)
area.type = type area.type = type
area.order = order area.order = order
area.bytes = bytes area.bytes = bytes # type: ignore
area.length = self.getLength(nums, bytes) area.length = self.getLength(nums, bytes) # type: ignore
area.nums = nums area.nums = nums
area.currentValue = [0] * nums area.currentValue = [0] * nums
if type in ["AI", "DI"]: if type in ["AI", "DI"]:
area.startAddress = 0 if not self.inputEndAddress else self.inputEndAddress area.startAddress = 0 if not self.inputEndAddress else self.inputEndAddress + 1 # type: ignore
area.endAddress = area.startAddress + area.length area.endAddress = area.startAddress + area.length # type: ignore
# print(area.startAddress, area.endAddress)
self.inputEndAddress = area.endAddress self.inputEndAddress = area.endAddress
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist()
self.indexDict[len(self.indexDict.values())] = len(self.inputAreas) self.indexDict[len(self.indexDict.values())] = len(self.inputAreas)
self.inputAreas.append(area) self.inputAreas.append(area)
elif type in ["DO" , "AO"]: elif type in ["DO" , "AO"]:
area.startAddress = 0 if not self.outputEndAddress else self.outputEndAddress area.startAddress = 0 if not self.outputEndAddress else self.outputEndAddress + 1 # type: ignore
area.endAddress = area.startAddress + area.length area.endAddress = area.startAddress + area.length # type: ignore
self.outputEndAddress = area.endAddress self.outputEndAddress = area.endAddress
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist()
self.indexDict[len(self.indexDict.values())] = len(self.outputAreas) self.indexDict[len(self.indexDict.values())] = len(self.outputAreas)
@ -66,7 +70,7 @@ class Device():
elif index == 0 and inputOrOutput == 1: elif index == 0 and inputOrOutput == 1:
area.startAddress = self.outputStartAddress area.startAddress = self.outputStartAddress
else: else:
area.startAddress = areas[index - 1].endAddress area.startAddress = areas[index - 1].endAddress + 1
area.endAddress = area.startAddress + area.length area.endAddress = area.startAddress + area.length
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist()
# print(area.addressList, area.startAddress, area.endAddress, self.deviceName) # print(area.addressList, area.startAddress, area.endAddress, self.deviceName)
@ -109,6 +113,8 @@ class Device():
@classmethod @classmethod
def delAreas(self, deviceName, id): def delAreas(self, deviceName, id):
jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
if not jsonCon or len(jsonCon) < id:
return
jsonCon.pop(id) jsonCon.pop(id)
if jsonCon == []: if jsonCon == []:
@ -147,11 +153,14 @@ class DevicesManange():
def addDevice(self, proType, masterSlaveModel, deviceName): def addDevice(self, proType, masterSlaveModel, deviceName, deviceWidget, areaTabWidget):
device = Device() device = Device()
device.type = proType device.type = proType
device.masterOrSlave = masterSlaveModel device.masterOrSlave = masterSlaveModel
device.deviceName = deviceName device.deviceName = deviceName
device.deviceWidget = deviceWidget
device.areaTabWidget.append(areaTabWidget)
if proType == "DP" and masterSlaveModel == "主站": if proType == "DP" and masterSlaveModel == "主站":
curProDict = self.dpMasterDevices curProDict = self.dpMasterDevices
@ -166,10 +175,15 @@ class DevicesManange():
device.inputStartAddress = 0 device.inputStartAddress = 0
device.outputStartAddress = 0 device.outputStartAddress = 0
else: else:
device.inputStartAddress = list(curProDict.values())[-1].inputEndAddress device.inputStartAddress = list(curProDict.values())[-1].inputEndAddress + 1
device.outputStartAddress = list(curProDict.values())[-1].outputEndAddress device.outputStartAddress = list(curProDict.values())[-1].outputEndAddress + 1
curProDict[deviceName] = device curProDict[deviceName] = device
def initDevices(self): def initDevices(self):
pass pass
@ -189,8 +203,8 @@ class DevicesManange():
else: else:
inputAddress = list(devicesDict.values())[index - 1].inputEndAddress inputAddress = list(devicesDict.values())[index - 1].inputEndAddress
outputAddress = list(devicesDict.values())[index - 1].outputEndAddress outputAddress = list(devicesDict.values())[index - 1].outputEndAddress
device.inputStartAddress = 0 if inputAddress == 0 else inputAddress device.inputStartAddress = 0 if inputAddress == 0 else inputAddress + 1
device.outputStartAddress = 0 if outputAddress == 0 else outputAddress device.outputStartAddress = 0 if outputAddress == 0 else outputAddress + 1
# print(device.inputStartAddress, device.inputEndAddress, deviceName, '输入') # print(device.inputStartAddress, device.inputEndAddress, deviceName, '输入')
# print(device.outputStartAddress, device.outputEndAddress, deviceName, 'shuchu') # print(device.outputStartAddress, device.outputEndAddress, deviceName, 'shuchu')
device.recalculateAddress() device.recalculateAddress()
@ -202,6 +216,15 @@ class DevicesManange():
if deviceName in devicesDict: if deviceName in devicesDict:
return devicesDict[deviceName] return devicesDict[deviceName]
def getAllDeviceObj(self):
deviceObjLst = []
for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]:
for deviceName in devicesDict:
deviceObjLst.append(devicesDict[deviceName])
return deviceObjLst
def writeAreas(self, deviceName, values): def writeAreas(self, deviceName, values):
# print(values) # print(values)
bytes = b"" bytes = b""
@ -234,7 +257,6 @@ class DevicesManange():
for area in forceAreas: for area in forceAreas:
# print(area.forceValue) # print(area.forceValue)
if area.type in ["AI", "AO"]: if area.type in ["AI", "AO"]:
# print(area.forceValue)
byte = floatToBytes(area.forceValue, area.bytes, order = area.order) byte = floatToBytes(area.forceValue, area.bytes, order = area.order)
elif area.type in ["DI", "DO"]: elif area.type in ["DI", "DO"]:
# if device.type == "PA" and device.masterOrSlave == "从站" and len(area.forceValue) == 16: # if device.type == "PA" and device.masterOrSlave == "从站" and len(area.forceValue) == 16:
@ -244,7 +266,6 @@ class DevicesManange():
if len(bytes) % 2 != 0: if len(bytes) % 2 != 0:
bytes += struct.pack('B', 0) bytes += struct.pack('B', 0)
# print(bytes) # print(bytes)
# print(bytes)
values = struct.unpack('!' + 'H' * int(len(bytes) / 2), bytes) values = struct.unpack('!' + 'H' * int(len(bytes) / 2), bytes)
modbusM.writeMultipleRegister(slaveId = 1, address = 0, outputValue = values) modbusM.writeMultipleRegister(slaveId = 1, address = 0, outputValue = values)
# print(struct.unpack('>f', struct.pack('!HH', *values[:2]))) # print(struct.unpack('>f', struct.pack('!HH', *values[:2])))
@ -268,33 +289,26 @@ class DevicesManange():
continue continue
inputEndAddress = max([x.inputEndAddress for x in list(curProDict.values())]) inputEndAddress = max([x.inputEndAddress for x in list(curProDict.values())])
outputEndAddress = max([x.outputEndAddress for x in list(curProDict.values())]) outputEndAddress = max([x.outputEndAddress for x in list(curProDict.values())])
inputAreaNums = sum([len(x.inputAreas) for x in list(curProDict.values())]) - 1
outputAreaNums = sum([len(x.outputAreas) for x in list(curProDict.values())]) - 1
bytesNums = inputEndAddress if areaType == 'input' else outputEndAddress bytesNums = inputEndAddress if areaType == 'input' else outputEndAddress
intNums = int(bytesNums / 2) if bytesNums % 2 == 0 else int(bytesNums / 2) + 1 intNums = int(bytesNums / 2) if bytesNums % 2 == 0 else int(bytesNums / 2) + 1
if bytesNums == 0: if bytesNums == 0:
continue continue
intValues = modbusM.readHoldingRegisters(slaveId = 1, startAddress = 0, varNums = intNums) intValues = modbusM.readHoldingRegisters(slaveId = 1, startAddress = 0, varNums = intNums)
bytesValues = struct.pack(f"!{'H' * len(intValues)}", *intValues) bytesValues = struct.pack(f"!{'H' * len(intValues)}", *intValues)
# print(bytesValues, intNums, bytesNums)
# print(bytes)
for device in curProDict.values(): for device in curProDict.values():
readAreas = device.inputAreas if areaType == 'input' else device.outputAreas readAreas = device.inputAreas if areaType == 'input' else device.outputAreas
for area in readAreas: for area in readAreas:
# print(area.startAddress, area.endAddress)
if area.startAddress == 0: if area.startAddress == 0:
bytes = bytesValues[area.startAddress:area.endAddress] bytes = bytesValues[area.startAddress:area.endAddress]
else: else:
bytes = bytesValues[area.startAddress:area.endAddress] bytes = bytesValues[area.startAddress - 1:area.endAddress]
# print(area.startAddress, area.endAddress)
if area.type in ['AI', 'AO']: if area.type in ['AI', 'AO']:
for i in range(0, len(bytes), 4): for i in range(0, len(bytes), 4):
byte = bytes[i:i+4] byte = bytes[i:i+4]
if len(byte) != 4: if len(byte) != 4:
continue continue
# print(round(struct.unpack('!f', reorderBytes(byte, area.order))[0], 4))
area.currentValue[i] = round(struct.unpack('!f', reorderBytes(byte, area.order))[0], 4) area.currentValue[i] = round(struct.unpack('!f', reorderBytes(byte, area.order))[0], 4)
# print(round(struct.unpack('!f', reorderBytes(byte, area.order))[0], 4))
elif area.type in ['DI', 'DO']: elif area.type in ['DI', 'DO']:
bytes = bytes[::-1] bytes = bytes[::-1]
area.currentValue = bytesToCoils(bytes) area.currentValue = bytesToCoils(bytes)
@ -307,7 +321,6 @@ class DevicesManange():
"type": type, "type": type,
"order": order, "order": order,
"bytes": bytes, "bytes": bytes,
}]) }])
else: else:
jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
@ -364,6 +377,12 @@ class DevicesManange():
pass pass
@classmethod @classmethod
def getMasterSlaveModel(self, deviceName):
deviceName = deviceName
masterSlaveModel = DeviceDB.getByName(deviceName=deviceName).masterSlaveModel
if masterSlaveModel:
return masterSlaveModel
@classmethod
def getAllDevice(self): def getAllDevice(self):
# 查询所有设备 # 查询所有设备
devices = DeviceDB.get_all() devices = DeviceDB.get_all()
@ -373,4 +392,3 @@ class DevicesManange():
for x in devices: for x in devices:
l.append([x.deviceName, x.proType, x.masterSlaveModel, x.areaJson]) l.append([x.deviceName, x.proType, x.masterSlaveModel, x.areaJson])
return l return l

@ -0,0 +1,37 @@
class Area():
mainLayout = None
leftLayoutWidget = []
rightLayoutWidget = []
class Device():
deviceName = None
areaTabWidget = None
dockWidget = None
class DeviceWidgetManage():
def addDevice(self,deviceName, areaTabWidget, dockWidget):
Device.deviceName = deviceName
Device.areaTabWidget = areaTabWidget
Device.dockWidget = dockWidget
def getDeviceName(self):
return Device.deviceName
def addArea(self, mainLayout=None, leftLayoutWidget=None, rightLayoutWidget=None):
if mainLayout is not None:
Area.mainLayout = mainLayout
if leftLayoutWidget is not None:
Area.leftLayoutWidget = leftLayoutWidget
if rightLayoutWidget is not None:
Area.rightLayoutWidget = rightLayoutWidget
def getAreaTabWidget(self):
return Device.areaTabWidget

@ -0,0 +1,15 @@
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
for i in range(0, len(nums)):
for j in range(1, len(nums)):
if nums[i] + nums[j] == target:
print([i,j])
solution = Solution()
solution.twoSum([2,7,11,15], 9)

@ -24,9 +24,7 @@ class DeviceDB(BaseModel):
proType = CharField() proType = CharField()
masterSlaveModel = CharField() masterSlaveModel = CharField()
areaJson = JSONField() areaJson = JSONField()
pvUpperLimit = CharField()
pvLowerLimit = CharField()
pvUnit = CharField()
createTime = CharField() createTime = CharField()
# 查询设备是否存在 # 查询设备是否存在
@ -50,29 +48,17 @@ class DeviceDB(BaseModel):
# 添加设备 # 添加设备
def addDevice(self, deviceName, proType, masterSlaveModel=masterSlaveModel, areaJson=None, pvLowerLimit=pvLowerLimit, pvUpperLimit=pvUpperLimit, pvUnit=pvUnit): def addDevice(self, deviceName, proType, masterSlaveModel=masterSlaveModel, areaJson=json.dumps([])):
self.deviceName = deviceName self.deviceName = deviceName
self.proType = proType self.proType = proType
self.masterSlaveModel = masterSlaveModel self.masterSlaveModel = masterSlaveModel
self.areaJson = areaJson self.areaJson = areaJson
self.pvUpperLimit = pvUpperLimit
self.pvLowerLimit = pvLowerLimit
self.pvUnit = pvUnit
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')
# print(self.createTime) # print(self.createTime)
self.save() self.save()
def initDevice(self, deviceName, proType, masterSlaveModel, areaJson, pvLowerLimit, pvUpperLimit, pvUnit):
self.deviceName = deviceName
self.proType = proType
self.masterSlaveModel = masterSlaveModel
self.areaJson = areaJson
self.pvUpperLimit = pvUpperLimit
self.pvLowerLimit = pvLowerLimit
self.pvUnit = pvUnit
self.createTime = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S')
self.save()

Loading…
Cancel
Save