0308更新

main
parent a27b6db15e
commit 0e55c20ff2

@ -0,0 +1,150 @@
QPushButton#okBtn, QPushButton#delAreaBtn, QPushButton#forceBtn {
font-size: 22px;
}
QPushButton#wirteDIDOforceBtn {
font-size: 16px;
padding-left: 5px;
padding-right: 5px;
padding-top: 5px;
padding-bottom: 5px;
}
QPushButton#forceBtn {
font-size: 26px;
padding-left: 5px;
padding-right: 5px;
padding-top: 5px;
padding-bottom: 5px;
}
QPushButton#deviceAddButton, QPushButton#addareabutton {
color: #328ffc;
font-size: 20px;
}
QPushButton#initAddDeviceButton, QPushButton#initAreaAddButton{
font-size: 45px;
color: #328ffc;
background-color: rgba(255, 255, 255, 0);
}
QPushButton#initAddDeviceButton:hover, QPushButton#initAreaAddButton:hover{
color: #1a86d8;
font: bold;
border-radius: 3px;
margin-bottom: -4px
}
QLabel#WirteDIDOareaMessLabel, QLabel#WirteDIDOareaValueLabel{
font-size: 16px;
}
QLabel#WirteDIDOareaValueLabel{
color: #0160aa;
}
QLabel#areaMessLabel, QLabel#areaValueLabel{
font-size: 28px;
}
QLabel#areaValueLabel{
color: #0160aa;
}
QLabel#readDIDOareaMessLabel, QLabel#readDIDOareaValueLabel{
font-size: 23px;
}
QLabel#dataTypeLabel, QLabel#dataOrderLabel, QLabel#byteLineLabel{
font-size: 24px;
}
QLabel#areaValueLabel{
color: #0160aa;
}
QLineEdit#byteLineEdit, QLineEdit#areaLineEdit {
font-size: 28px;
}
QLineEdit#WirteDIDOareaLineEdit {
font-size: 16px;
}
QLineEdit#areaLineEdit {
font-size: 28px;
}
QComboBox#dataTypeCombox, QComboBox#orderCombox{
font-size: 20px;
}

@ -4,68 +4,16 @@ QMdiSubWindow {
font-size: 18px; font-size: 18px;
font-weight: bold; font-weight: bold;
}
QPushButton#okBtn, QPushButton#delAreaBtn, QPushButton#forceBtn {
font-size: 20px;
}
QPushButton#deviceAddButton, QPushButton#addareabutton {
color: #328ffc;
font-size: 21px;
}
QPushButton#initAddDeviceButton, QPushButton#initAreaAddButton{
font-size: 45px;
color: #328ffc;
background-color: rgba(255, 255, 255, 0);
}
QPushButton#initAddDeviceButton:hover, QPushButton#initAreaAddButton:hover{
color: #1a86d8;
font: bold;
border-radius: 3px;
margin-bottom: -4px
}
QLabel#dataTypeLabel, QLabel#dataOrderLabel, QLabel#byteLineLabel, QLabel#areaMessLabel, QLabel#areaValueLabel{
font-size: 20px;
} }
QLabel#areaValueLabel{
color: #0160aa;
}
QLineEdit#byteLineEdit, QLineEdit#areaLineEdit {
font-size: 20px;
}
QComboBox#dataTypeCombox, QComboBox#orderCombox{ QComboBox#dataTypeCombox, QComboBox#orderCombox{
font-size: 25px; font-size: 20px;
} }
@ -110,11 +58,13 @@ QTabBar::tab{
} }
QTabBar#areaTabBar::tab{ QTabBar#areaTabBar::tab{
min-width: 100px; /* min-width: 100px;*/
font: 20px; font: 20px;
} }
@ -153,9 +103,21 @@ QDockWidget{
QDockWidget::title{ QDockWidget::title{
font-size: 20px;
background-color: #cbdeec; background-color: #cbdeec;
color: white; color: white;
text-align: center; text-align: center;
}
QToolBar QToolButton{
font-size: 20px;
font: bold;
} }

@ -32,14 +32,14 @@ class AreaTabWidget(QTabWidget):
self.setObjectName('areaTabWidget') self.setObjectName('areaTabWidget')
self.setTabPosition(QTabWidget.South) self.setTabPosition(QTabWidget.South)
self.tabBar().setObjectName('areaTabBar') self.tabBar().setObjectName('areaTabBar')
self.addAreaButton = QPushButton("添加区域") self.addAreaButton = QPushButton("添加通道")
self.addAreaButton.setObjectName('addareabutton') self.addAreaButton.setObjectName('addareabutton')
self.addAreaButton.setIcon(QIcon('Static/add.png')) self.addAreaButton.setIcon(QIcon('Static/add.png'))
self.addAreaButton.setFlat(True) self.addAreaButton.setFlat(True)
self.setCornerWidget(self.addAreaButton) self.setCornerWidget(self.addAreaButton)
self.addAreaButton.clicked.connect(self.addAreaTab) self.addAreaButton.clicked.connect(self.addAreaTab)
# self.state = True
self.initWidget() #初始化界面 self.initWidget() #初始化界面
# self.tabCloseRequested.connect(self.closeTab) # self.tabCloseRequested.connect(self.closeTab)
@ -59,15 +59,18 @@ class AreaTabWidget(QTabWidget):
areas = json.loads(devices[3]) areas = json.loads(devices[3])
if areas: if areas:
self.removeTab(0) self.removeTab(0)
# self.state = False
for area in areas: for area in areas:
dataType, order = self.tran(area["type"], area["order"]) dataType, order = self.tran(area["type"], area["order"])
channelBytes = area["bytes"] channelBytes = area["bytes"]
settingValue = [dataType, order, channelBytes] settingValue = [dataType, order, channelBytes]
self.addAreaTab(settingValue=settingValue) self.addAreaTab(settingValue=settingValue)
else: else:
widget = QWidget() widget = QWidget()
widget.setObjectName('initWidget')
layout = QHBoxLayout() layout = QHBoxLayout()
addButton = QPushButton('添加区域') addButton = QPushButton('添加通道')
addButton.setObjectName('initAreaAddButton') addButton.setObjectName('initAreaAddButton')
icon = QIcon('Static/add.png') icon = QIcon('Static/add.png')
iconSize = QSize(50,50) iconSize = QSize(50,50)
@ -126,12 +129,11 @@ class AreaWidget(QWidget):
super().__init__() super().__init__()
self.areaTabWidget = areaTabWidget self.areaTabWidget = areaTabWidget
self.settingValue = settingValue self.settingValue = settingValue
self.state = True
self.devicesManange = self.areaTabWidget.devicesManange self.devicesManange = self.areaTabWidget.devicesManange
self.initUI() self.initUI()
def initUI(self): def initUI(self):
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.mainLayout = QHBoxLayout() self.mainLayout = QHBoxLayout()
self.leftLayout = QGridLayout() self.leftLayout = QGridLayout()
self.rightLayout = QGridLayout() self.rightLayout = QGridLayout()
@ -194,8 +196,8 @@ class AreaWidget(QWidget):
self.mainLayout.addLayout(self.leftLayout, 1) self.mainLayout.addLayout(self.leftLayout, 1)
self.mainLayout.addWidget(line) self.mainLayout.addWidget(line)
self.mainLayout.addLayout(self.rightLayout, 9) self.mainLayout.addLayout(self.rightLayout, 20)
self.mainLayout.setSpacing(20) self.mainLayout.setSpacing(10)
# self.deviceWidgetManage.addArea(mainLayout=mainLayout, leftLayoutWidget=leftLayoutWidgets) # self.deviceWidgetManage.addArea(mainLayout=mainLayout, leftLayoutWidget=leftLayoutWidgets)
@ -219,8 +221,9 @@ class AreaWidget(QWidget):
if self.okBtn.text() == '确定': if self.okBtn.text() == '确定':
if index != -1: if index != -1:
self.areaTabWidget.removeTab(index) self.areaTabWidget.removeTab(index)
if tabCount == 1: # if tabCount == 1:
self.areaTabWidget.initWidget() # self.areaTabWidget.initWidget()
# self.state = True
#正常点击删除按钮的情况 #正常点击删除按钮的情况
else: else:
@ -233,8 +236,10 @@ class AreaWidget(QWidget):
Device.delAreas(deviceName, index) Device.delAreas(deviceName, index)
self.devicesManange.getDevice(deviceName).delArea(index, datatype) self.devicesManange.getDevice(deviceName).delArea(index, datatype)
self.devicesManange.recalculateAddress() self.devicesManange.recalculateAddress()
if tabCount == 1: if tabCount == 1:
self.areaTabWidget.initWidget() self.areaTabWidget.initWidget()
self.state = True
@ -246,6 +251,7 @@ class AreaWidget(QWidget):
areaLayout = self.rightLayout areaLayout = self.rightLayout
deviceName = self.areaTabWidget.deviceName deviceName = self.areaTabWidget.deviceName
#开启软件时判断数据库是否有存在设备信息,并执行相应的操作 #开启软件时判断数据库是否有存在设备信息,并执行相应的操作
if self.settingValue is None: if self.settingValue is None:
dataType = self.dataTypeCombox.currentText() dataType = self.dataTypeCombox.currentText()
@ -296,26 +302,24 @@ class AreaWidget(QWidget):
widget.deleteLater() widget.deleteLater()
#添加按钮布局 #添加按钮布局
buttonWidgets = ButtonWidgets(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName) self.buttonWidgets = ButtonWidgets(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName)
areaLayout.addWidget(buttonWidgets,0,0) areaLayout.addWidget(self.buttonWidgets)
self.state = False
areaId = DevicesManange.getAreaID(deviceName) areaId = DevicesManange.getAreaID(deviceName)
if self.settingValue is not None: if self.settingValue is not None:
self.isRead = self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1)
self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) self.devicesManange.recalculateAddress()
return return
elif areaId is not None and curIndex in areaId: elif areaId is not None and curIndex in areaId:
# print(areaId,curIndex,2222)
DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex) DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex)
self.devicesManange.getDevice(deviceName).editArea(index = curIndex, type = dataType, order = order, bytes = int(byteLineEdit)) self.isRead = self.devicesManange.getDevice(deviceName).editArea(index = curIndex, type = dataType, order = order, bytes = int(byteLineEdit))
# self.readVarTimer.start(500) # self.readVarTimer.start(500)
else: else:
DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName) DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) self.isRead = self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1)
self.devicesManange.recalculateAddress() self.devicesManange.recalculateAddress()
# self.readVarTimer.start(500) # self.readVarTimer.start(500)
@ -330,35 +334,7 @@ class AreaWidget(QWidget):
self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'} self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'}
return self.dataTypeDict[order] return self.dataTypeDict[order]
def wirteValue(self, deviceName, curIndex, valueList):
print(deviceName,curIndex, valueList )
# self.devicesManange.writeAreas(deviceName = deviceName, values = valueList)
def readValue(self,deviceName, curIndex):
print(deviceName, curIndex)
# if curIndex == -1:
# return
# else:
# device = self.devicesManange.getDevice(deviceName)
# values = device.getAreaValues(curIndex)
# i = 0
# for value in values:
# areaLabel[i].setText(str(value))
# i =+ 1
#
# else:
# device = self.mainwindow.devicesManange.getDevice(deviceName)
# values = device.getAreaValues(curIndex)
# areaWidgets = self.widgetList[areaIndex]
# for value, widgets in zip(values, areaWidgets):
# widgets[0].setText(str(value))

@ -42,7 +42,7 @@ class AreaWidget(QWidget):
self.sub_window.setWidget(self.widget) self.sub_window.setWidget(self.widget)
def newArea(self): def newArea(self):
print(1) # print(1)
areaSettingWidget = AreaSettingWidget() areaSettingWidget = AreaSettingWidget()
if areaSettingWidget.exec_() == QDialog.Accepted: if areaSettingWidget.exec_() == QDialog.Accepted:
deviceName, proType, varType = areaSettingWidget.getParameters() deviceName, proType, varType = areaSettingWidget.getParameters()

@ -35,7 +35,6 @@ class ButtonWidgets(QWidget):
def areaLayout(self): def areaLayout(self):
areaLayout = QVBoxLayout() areaLayout = QVBoxLayout()
print(self.dataType)
if self.dataType in ['AI','AO']: if self.dataType in ['AI','AO']:
hLayout = QHBoxLayout() hLayout = QHBoxLayout()
hLayout.addWidget(QSplitter()) hLayout.addWidget(QSplitter())
@ -49,11 +48,11 @@ class ButtonWidgets(QWidget):
areaLayout.addWidget(QSplitter()) areaLayout.addWidget(QSplitter())
for i in range(int(byteLineEdit)): for i in range(int(byteLineEdit)):
hLayout = QHBoxLayout() hLayout = QHBoxLayout()
hLayout.addWidget(QSplitter(), 2) hLayout.addWidget(QSplitter(), 1)
hLayout.addLayout(self.dateLayout(number = (i + 1)), 6) hLayout.addLayout(self.dateLayout(number = (i + 1)), 3)
hLayout.addWidget(QSplitter(), 2) hLayout.addWidget(QSplitter(), 1)
hLayout.addLayout(self.dateLayout(number = (i + 1) + 8), 6) hLayout.addLayout(self.dateLayout(number = (i + 1) + 8), 3)
hLayout.addWidget(QSplitter(), 2) hLayout.addWidget(QSplitter(), 1)
areaLayout.addLayout(hLayout) areaLayout.addLayout(hLayout)
areaLayout.addWidget(QSplitter()) areaLayout.addWidget(QSplitter())
@ -73,21 +72,39 @@ class ButtonWidgets(QWidget):
if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'): if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'):
force = False force = False
self.areaLabel[number] = areaValueLabel self.areaLabel[number - 1] = areaValueLabel
elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'): elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'):
force = False force = False
self.areaLabel[number] = areaValueLabel self.areaLabel[number - 1] = areaValueLabel
if force: if force:
areaLineEdit = QLineEdit('0') areaLineEdit = QLineEdit('0')
areaLineEdit.setObjectName('areaLineEdit') areaLineEdit.setObjectName('areaLineEdit')
areaLineEdit.setFixedSize(80, 33)
forceBtn = forceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit) forceBtn = forceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit)
forceBtn.clicked.connect(self.forceValues) forceBtn.clicked.connect(self.forceValues)
# forceBtn.setFixedSize(50, 27)
forceLayout.addWidget(areaLineEdit) forceLayout.addWidget(areaLineEdit)
forceLayout.addWidget(forceBtn) forceLayout.addWidget(forceBtn)
self.areaLineEditValue.append('0') self.areaLineEditValue.append(0)
if self.deviceName[-2:] + self.dataType in ['从站DI','主站DO']:
areaMessLabel.setObjectName('wirteDIDOareaMessLabel')
areaValueLabel.setObjectName('wirteDIDOareaValueLabel')
areaLineEdit.setObjectName('wirteDIDOareaLineEdit')
areaLineEdit.setFixedSize(30, 27)
forceBtn.setObjectName('wirteDIDOforceBtn')
if self.deviceName[-2:] + self.dataType in ['主站DI','从站DO']:
areaMessLabel.setObjectName('readDIDOareaMessLabel')
areaValueLabel.setObjectName('readDIDOareaValueLabel')
forceLayout.setSpacing(10)
# forceLayout.setSpacing(10)
return forceLayout return forceLayout
def wirteAreaLineEditValue(self,dataTypeAndModel, valueLabel, number, value): def wirteAreaLineEditValue(self,dataTypeAndModel, valueLabel, number, value):
@ -100,7 +117,7 @@ class ButtonWidgets(QWidget):
return return
else: else:
valueLabel.setText(value) valueLabel.setText(value)
self.areaLineEditValue[number -1] = value self.areaLineEditValue[number -1] = float(value)
#判断输入值是否为0和1 #判断输入值是否为0和1
elif dataTypeAndModel in ['主站DO','从站DI']: elif dataTypeAndModel in ['主站DO','从站DI']:
@ -117,17 +134,19 @@ class ButtonWidgets(QWidget):
return self.areaLineEditValue return self.areaLineEditValue
def readValues(self,deviceName, curIndex): def readValues(self, curIndex):
if self.areaLabel is None: print(curIndex)
return if self.areaLabel is None or self.areaLabel == dict():
elif curIndex == -1:
return return
# elif curIndex == -1:
# return
else: else:
device = self.devicesManange.getDevice(deviceName) print(self.deviceName, curIndex)
# print(id(device)) device = self.devicesManange.getDevice(self.deviceName)
values = device.getAreaValues(curIndex) values = device.getAreaValues(curIndex)
for index, value in enumerate(values): for index, value in enumerate(values):
self.areaLabel[index+1].setText(str(value)) self.areaLabel[index].setText(str(value))
# print(self.areaLabel[index],values)
@ -139,10 +158,10 @@ class ButtonWidgets(QWidget):
dataTypeAndModel = self.deviceName[-2:] + self.dataType dataTypeAndModel = self.deviceName[-2:] + self.dataType
curIndex = self.areaWidget.areaTabWidget.currentIndex() curIndex = self.areaWidget.areaTabWidget.currentIndex()
valueList = self.wirteAreaLineEditValue(dataTypeAndModel=dataTypeAndModel, valueLabel=valueLabel,number=number, value=value) valueList = self.wirteAreaLineEditValue(dataTypeAndModel=dataTypeAndModel, valueLabel=valueLabel,number=number, value=value)
print(valueList, curIndex)
if valueList is None: if valueList is None:
return return
else: else:
self.areaWidget.wirteValue(deviceName = self.deviceName, curIndex = curIndex, valueList = valueList) self.devicesManange.writeAreas(deviceName = self.deviceName, areaIndex = curIndex, values = valueList)

@ -1,3 +1,4 @@
import re
from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QDialogButtonBox, QMessageBox from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QDialogButtonBox, QMessageBox
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt

@ -45,8 +45,8 @@ class DeviceWidget(QMainWindow):
self.deviceTabWidget.setCornerWidget(self.addDeviceButton) self.deviceTabWidget.setCornerWidget(self.addDeviceButton)
self.deviceTabWidget.setTabsClosable(True) self.deviceTabWidget.setTabsClosable(True)
self.deviceTabWidget.tabCloseRequested.connect(self.closeTab) self.deviceTabWidget.tabCloseRequested.connect(self.closeTab)
self.state = True
self.initWidget(True) self.initWidget()
# 设置主窗口的中心部分为 QTabWidget # 设置主窗口的中心部分为 QTabWidget
self.setCentralWidget(self.deviceTabWidget) self.setCentralWidget(self.deviceTabWidget)
@ -62,7 +62,7 @@ class DeviceWidget(QMainWindow):
else: else:
return return
if self.deviceTabWidget.count() == 0: if self.deviceTabWidget.count() == 0:
self.initWidget(True) self.creatInitWidget()
@ -70,7 +70,7 @@ class DeviceWidget(QMainWindow):
if deviceName is None: if deviceName is None:
dialog = DeviceDialog() dialog = DeviceDialog()
if dialog.exec_() == QDialog.Accepted: if dialog.exec_() == QDialog.Accepted:
self.titleName = dialog.getParameters() self.titleName, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters()
self.deviceName = self.titleName + self.dockWidget.windowTitle() self.deviceName = self.titleName + self.dockWidget.windowTitle()
DeviceDB().addDevice(deviceName = self.deviceName, proType = self.proType , masterSlaveModel = self.masterSlaveModel) DeviceDB().addDevice(deviceName = self.deviceName, proType = self.proType , masterSlaveModel = self.masterSlaveModel)
areaTabWidget = AreaTabWidget(self) areaTabWidget = AreaTabWidget(self)
@ -93,7 +93,7 @@ class DeviceWidget(QMainWindow):
def initWidget(self,state): def initWidget(self):
alldevices = DevicesManange.getAllDevice() alldevices = DevicesManange.getAllDevice()
titleName = self.dockWidget.windowTitle() titleName = self.dockWidget.windowTitle()
if alldevices: if alldevices:
@ -101,12 +101,16 @@ class DeviceWidget(QMainWindow):
deviceName = devices[0] deviceName = devices[0]
if titleName in deviceName: if titleName in deviceName:
# print(devices,333)
self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0]) self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0])
self.addDeviceWidget(deviceName=deviceName) self.addDeviceWidget(deviceName=deviceName)
self.state = False
if self.state:
self.creatInitWidget()
state = False def creatInitWidget(self):
if state:
widget = QWidget() widget = QWidget()
widget.setObjectName('initWidget')
layout = QHBoxLayout() layout = QHBoxLayout()
addButton = QPushButton('添加设备') addButton = QPushButton('添加设备')
addButton.setObjectName('initAddDeviceButton') addButton.setObjectName('initAddDeviceButton')

@ -1,7 +1,7 @@
import sys import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QToolBar, QAction, QTabWidget, QGridLayout from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QToolBar, QAction, QTabWidget, QGridLayout
from PyQt5.QtCore import Qt from PyQt5.QtCore import Qt, QTimer
from PyQt5.QtGui import QIcon from PyQt5.QtGui import QIcon
from utils.DBModels.BaseModel import * from utils.DBModels.BaseModel import *
from model.ClientModel.Client import Client from model.ClientModel.Client import Client
@ -26,18 +26,22 @@ class MainWindow(QMainWindow):
def initUI(self): def initUI(self):
self.protocolTimer = QTimer()
self.protocolTimer.timeout.connect(self.readValues)
self.toolbar = QToolBar() self.toolbar = QToolBar()
self.addToolBar(self.toolbar) self.addToolBar(self.toolbar)
self.startProtocolBtn = QAction("开始通讯", self) self.startProtocolBtn = QAction("开始通讯", self)
self.startProtocolBtn.setObjectName("startProtocolBtn") self.startProtocolBtn.setObjectName("startProtocolBtn")
self.startProtocolBtn.setCheckable(True)
self.startProtocolBtn.triggered.connect(self.startProtocol) self.startProtocolBtn.triggered.connect(self.startProtocol)
self.loadProjectBtn = QAction('导入工程', self) self.loadProjectBtn = QAction('导入工程', self)
self.loadProjectBtn.setObjectName("loadProjectBtn") self.loadProjectBtn.setObjectName("loadProjectBtn")
self.loadProjectBtn.triggered.connect(self.loadProject) self.loadProjectBtn.triggered.connect(self.loadProject)
self.toolbar.addAction(self.loadProjectBtn) # self.toolbar.addAction(self.loadProjectBtn)
self.toolbar.addAction(self.startProtocolBtn) self.toolbar.addAction(self.startProtocolBtn)
dpMasterDockWidget = QDockWidget('DP主站') dpMasterDockWidget = QDockWidget('DP主站')
@ -63,28 +67,51 @@ class MainWindow(QMainWindow):
self.setWindowIcon(QIcon('Static/zhjt.ico')) self.setWindowIcon(QIcon('Static/zhjt.ico'))
self.setWindowTitle("PROFIBUS") self.setWindowTitle("PROFIBUS")
self.showMaximized() self.resize(800, 600)
# self.showMaximized()
def startProtocol(self): def startProtocol(self):
if self.startProtocolBtn.isCheckable():
self.startProtocolBtn.setText('停止通讯')
self.startProtocolBtn.setCheckable(False)
self.protocolTimer.start(500)
else:
self.startProtocolBtn.setText('开始通讯')
self.startProtocolBtn.setCheckable(True)
self.protocolTimer.stop()
def readValues(self):
self.devicesManange.readAreas()
dockWidgets = self.findChildren(QDockWidget) #找到四个dockWidget窗口 dockWidgets = self.findChildren(QDockWidget) #找到四个dockWidget窗口
for dockWidget in dockWidgets: for dockWidget in dockWidgets:
deviceTabWidgets = dockWidget.findChildren(QTabWidget, 'deviceTabWidget') #判断四个窗口里是否有deviceTabWidget if dockWidget.widget().deviceTabWidget.currentWidget().objectName() == 'initWidget':
print(dockWidget.widget().deviceTabWidget.currentWidget().objectName())
for deviceTabWidget in deviceTabWidgets: continue
areaTabWidgets = deviceTabWidget.findChildren(QTabWidget, 'areaTabWidget')
areaTabWidget = dockWidget.widget().deviceTabWidget.currentWidget()#判断四个窗口里是否有deviceTabWidget
for areaTabWidget in areaTabWidgets: if areaTabWidget.currentWidget().objectName() == 'initWidget':
leftLayout = areaTabWidget.currentWidget().layout().itemAt(0) print(2)
continue
if isinstance(leftLayout,QGridLayout): if areaTabWidget.currentWidget().state:
masterAndSlave = dockWidget.windowTitle()[2:5] print(3)
dataType = leftLayout.itemAtPosition(0,1).widget().currentText() continue
dataTypeAndModel = masterAndSlave + dataType
# masterAndSlave = dockWidget.windowTitle()[2:5]
if dataTypeAndModel in ['主站AI', '主站DI', '从站AO', '从站DO']: # proType = dockWidget.windowTitle()
curIndex = areaTabWidget.currentIndex() # dataType = dataTypeCombox.currentText()
buttonlayoutWidget = areaTabWidget.currentWidget().layout().itemAt(2).itemAtPosition(0,0).widget()#获取buttonlayout # dataTypeAndModel = masterAndSlave + dataType
buttonlayoutWidget.readValues(deviceName = deviceName, curIndex = curIndex)
# if dataTypeAndModel in ['主站AI', '主站DI', '从站AO', '从站DO']:
# devicecurIndex = deviceTabWidget.currentIndex()
# deviceTabText = deviceTabWidget.tabText(devicecurIndex)
# try:
areacurindex = areaTabWidget.currentIndex()
# deviceName = deviceTabText + proType
buttonlayoutWidget = areaTabWidget.currentWidget().buttonWidgets#获取buttonlayout
buttonlayoutWidget.readValues(curIndex = areacurindex)
# except Exception as e:
# print(e)
def loadProject(self): def loadProject(self):

@ -9,8 +9,10 @@ import sys
if __name__ == '__main__': if __name__ == '__main__':
app = QApplication(sys.argv) app = QApplication(sys.argv)
app.setStyle(QStyleFactory.create('windowsvista')) app.setStyle(QStyleFactory.create('windowsvista'))
app.setStyleSheet(CommonHelper.readQss('static/main.qss')) app.setStyleSheet(CommonHelper.readQss('static/main.qss') + CommonHelper.readQss('static/Area.qss'))
Client.initDB() Client.initDB()
window = MainWindow() window = MainWindow()
window.show() window.showMaximized()
# window.show()
sys.exit(app.exec_()) sys.exit(app.exec_())

@ -20,6 +20,7 @@ class Device():
def __init__(self): def __init__(self):
self.inputAreas = [] self.inputAreas = []
self.outputAreas = [] self.outputAreas = []
self.areas = []
self.indexDict = collections.OrderedDict() self.indexDict = collections.OrderedDict()
# 有序字典 键:总区域索引 值: [类型(输入 : 0, 或输出 : 1), 该类型的第几个区域索引] # 有序字典 键:总区域索引 值: [类型(输入 : 0, 或输出 : 1), 该类型的第几个区域索引]
@ -40,6 +41,7 @@ class Device():
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)
self.areas.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
area.endAddress = area.startAddress + area.length area.endAddress = area.startAddress + area.length
@ -47,6 +49,9 @@ class Device():
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)
self.outputAreas.append(area) self.outputAreas.append(area)
self.areas.append(area)
if (self.masterOrSlave == '主站' and type in ['AI', 'DI']) or (self.masterOrSlave == '从站' and type in ['AO', 'DO']):
return True
# print(id(self), self.inputAreas) # print(id(self), self.inputAreas)
# print(self.deviceName, area.addressList, area.startAddress, area.endAddress, self.inputAreas) # print(self.deviceName, area.addressList, area.startAddress, area.endAddress, self.inputAreas)
@ -58,6 +63,7 @@ class Device():
# self.recalculateAddress() # self.recalculateAddress()
def recalculateAddress(self): def recalculateAddress(self):
# print(self.inputStartAddress)
for inputOrOutput, areas in enumerate([self.inputAreas, self.outputAreas]): for inputOrOutput, areas in enumerate([self.inputAreas, self.outputAreas]):
endAddress = 0 endAddress = 0
for index, area in enumerate(areas): for index, area in enumerate(areas):
@ -71,7 +77,13 @@ class Device():
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)
endAddress = area.endAddress endAddress = area.endAddress
else: # print(endAddress)
# else:
# print(endAddress)
if endAddress == 0 and inputOrOutput == 0:
endAddress = self.inputStartAddress
if endAddress == 0 and inputOrOutput == 1:
endAddress = self.outputStartAddress
if inputOrOutput == 0: if inputOrOutput == 0:
self.inputEndAddress = endAddress self.inputEndAddress = endAddress
elif inputOrOutput == 1: elif inputOrOutput == 1:
@ -90,12 +102,14 @@ class Device():
def getAreaValues(self, index): def getAreaValues(self, index):
if self.masterOrSlave == "从站": # if self.masterOrSlave == "从站":
return self.outputAreas[index].currentValue # return self.outputAreas[index].currentValue
else: # else:
# print(self.inputAreas, index) # # print(self.inputAreas, index)
# print(id(self), self.inputAreas) # # print(id(self), self.inputAreas)
return self.inputAreas[index].currentValue # return self.inputAreas[index].currentValue
# print(self.areas[index].currentValue)
return self.areas[index].currentValue
def getLength(self, nums, bytes): def getLength(self, nums, bytes):
length = int(nums) * int(bytes) length = int(nums) * int(bytes)
@ -110,7 +124,6 @@ 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)
print(len(jsonCon))
if len(jsonCon) > id: if len(jsonCon) > id:
jsonCon.pop(id) jsonCon.pop(id)
else: else:
@ -121,7 +134,7 @@ class Device():
DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute()
else: else:
for index, areajsonId in enumerate(jsonCon): for index, areajsonId in enumerate(jsonCon):
areajsonId["id"] = index + 1 areajsonId["id"] = index
areaJson = json.dumps(jsonCon) areaJson = json.dumps(jsonCon)
DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute()
@ -147,7 +160,7 @@ class DevicesManange():
self.paSlaveDevices = collections.OrderedDict() self.paSlaveDevices = collections.OrderedDict()
self.dpSlaveModbus = TcpMaster(host = '192.168.2.10', port = 502) self.dpSlaveModbus = TcpMaster(host = '192.168.2.10', port = 502)
self.paSlaveModbus = TcpMaster(host = '192.168.4.10', port = 502) self.paSlaveModbus = TcpMaster(host = '192.168.4.10', port = 502)
self.dpMasterModbus = TcpMaster(host = '192.168.0.40', port = 502) self.dpMasterModbus = TcpMaster(host = '192.168.1.10', port = 502)
self.paMasterModbus = TcpMaster(host = '192.168.3.10', port = 502) self.paMasterModbus = TcpMaster(host = '192.168.3.10', port = 502)
@ -187,6 +200,8 @@ class DevicesManange():
def recalculateAddress(self): def recalculateAddress(self):
for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]: for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]:
# print(len(devicesDict)) # print(len(devicesDict))
# print(devicesDict)
# print(self.dpMasterDevices)
for index, (deviceName, device) in enumerate(devicesDict.items()): for index, (deviceName, device) in enumerate(devicesDict.items()):
if index == 0: if index == 0:
device.inputStartAddress = 0 device.inputStartAddress = 0
@ -197,8 +212,9 @@ class DevicesManange():
device.inputStartAddress = 0 if inputAddress == 0 else inputAddress device.inputStartAddress = 0 if inputAddress == 0 else inputAddress
device.outputStartAddress = 0 if outputAddress == 0 else outputAddress device.outputStartAddress = 0 if outputAddress == 0 else outputAddress
# print(device.inputStartAddress, device.inputEndAddress, deviceName, '输入') # print(device.inputStartAddress, device.inputEndAddress, deviceName, '输入')
# print(device.outputStartAddress, device.outputEndAddress, deviceName, 'shuchu')
device.recalculateAddress() device.recalculateAddress()
# print(device.outputStartAddress, device.outputEndAddress, deviceName)
# print(device.outputStartAddress, device.outputEndAddress, deviceName, 'shuchu')
# previousDevice = device # previousDevice = device
@ -207,34 +223,35 @@ class DevicesManange():
if deviceName in devicesDict: if deviceName in devicesDict:
return devicesDict[deviceName] return devicesDict[deviceName]
def writeAreas(self, deviceName, values): def writeAreas(self, deviceName, areaIndex, values):
# print(values) # print(values)
bytes = b"" bytes = b""
device = self.getDevice(deviceName) device = self.getDevice(deviceName)
# print(device, deviceName) # print(device, deviceName)
if device.type == "DP" and device.masterOrSlave == "主站": if device.type == "DP" and device.masterOrSlave == "主站":
curProDict = self.dpMasterDevices curProDict = self.dpMasterDevices
areas = device.outputAreas # areas = device.outputAreas
modbusM = self.dpMasterModbus modbusM = self.dpMasterModbus
elif device.type == "DP" and device.masterOrSlave == "从站": elif device.type == "DP" and device.masterOrSlave == "从站":
curProDict = self.dpSlaveDevices curProDict = self.dpSlaveDevices
areas = device.inputAreas # areas = device.inputAreas
modbusM = self.dpSlaveModbus modbusM = self.dpSlaveModbus
elif device.type == "PA" and device.masterOrSlave == "主站": elif device.type == "PA" and device.masterOrSlave == "主站":
areas = device.outputAreas # areas = device.outputAreas
curProDict = self.paMasterDevices curProDict = self.paMasterDevices
modbusM = self.paMasterModbus modbusM = self.paMasterModbus
elif device.type == "PA" and device.masterOrSlave == "从站": elif device.type == "PA" and device.masterOrSlave == "从站":
areas = device.inputAreas # areas = device.inputAreas
curProDict = self.paSlaveDevices curProDict = self.paSlaveDevices
modbusM = self.paSlaveModbus modbusM = self.paSlaveModbus
# print(values) # print(values)
for area, value in zip(areas, values): # for area, value in zip(areas, values):
area.forceValue = value area = device.areas[areaIndex]
area.forceValue = values
if area.type in ['DO', 'DI'] and device.type == 'PA': if area.type in ['DO', 'DI'] and device.type == 'PA':
area.forceValue = value[8:] + value[:8] area.forceValue = values[8:] + values[:8]
elif area.type in ['DO', 'DI'] and device.type == 'DP' and device.masterOrSlave == "主站": elif area.type in ['DO', 'DI'] and device.type == 'DP' and device.masterOrSlave == "主站":
area.forceValue = value[8:] + value[:8] area.forceValue = values[8:] + values[:8]
for device in curProDict.values(): for device in curProDict.values():
forceAreas = device.outputAreas if device.masterOrSlave == "主站" else device.inputAreas forceAreas = device.outputAreas if device.masterOrSlave == "主站" else device.inputAreas
@ -308,7 +325,8 @@ class DevicesManange():
else: else:
bytes = bytes[::-1] bytes = bytes[::-1]
area.currentValue = bytesToCoils(bytes) area.currentValue = bytesToCoils(bytes)
# print(area.currentValue) print(area.currentValue, device.deviceName, area.startAddress,area.endAddress)
# print()
@classmethod @classmethod
def addAreas(self, type, order, bytes, deviceName): def addAreas(self, type, order, bytes, deviceName):
jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)

@ -1,15 +0,0 @@
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)

@ -69,6 +69,7 @@ def floatToBytes(values, length, order):
# hOrder = '<'if order.byte in ['ABCD', 'DCBA'] else '>' # hOrder = '<'if order.byte in ['ABCD', 'DCBA'] else '>'
# 获取values的长度 # 获取values的长度
valuesNums = len(values) valuesNums = len(values)
# print(values,valuesNums,6666)
# 将values转换为字节流 # 将values转换为字节流
valueByte = struct.pack(f"!{'f' * valuesNums}", *values) valueByte = struct.pack(f"!{'f' * valuesNums}", *values)
valueByte = reorderBytes(valueByte, format = order) + struct.pack('B' * (length - valuesNums * 4), *[0] * (length - valuesNums * 4)) valueByte = reorderBytes(valueByte, format = order) + struct.pack('B' * (length - valuesNums * 4), *[0] * (length - valuesNums * 4))

@ -24,7 +24,9 @@ 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()
# 查询设备是否存在 # 查询设备是否存在
@ -48,11 +50,14 @@ class DeviceDB(BaseModel):
# 添加设备 # 添加设备
def addDevice(self, deviceName, proType, masterSlaveModel=masterSlaveModel, areaJson=json.dumps([])): def addDevice(self, deviceName, proType, masterSlaveModel=masterSlaveModel, areaJson=json.dumps([]), pvLowerLimit=pvLowerLimit, pvUpperLimit=pvUpperLimit, pvUnit=pvUnit):
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()

Loading…
Cancel
Save