0313更新

main
parent 1ee92f89ff
commit 455857c88e

@ -1,10 +1,24 @@
QPushButton#okBtn, QPushButton#delAreaBtn, QPushButton#forceBtn { QPushButton#okBtn, QPushButton#delAreaBtn {
font-size: 22px; font-size: 22px;
border: none;
}
QPushButton#okBtn:hover, QPushButton#delAreaBtn:hover {
font-size: 22px;
font: bold;
border: none;
margin-bottom: -2px
} }
QPushButton#wirteDIDOforceBtn { QPushButton#wirteDIDOforceBtn {
@ -23,25 +37,39 @@ QPushButton#wirteDIDOforceBtn {
QPushButton#forceBtn { QPushButton#forceBtn {
font-size: 25px; font-size: 22px;
padding-left: 10px; padding-left: 5px;
padding-right: 10px; padding-right: 5px;
/* padding-top: 5px; padding-top: 6px;
padding-bottom: 5px;
padding-bottom: 5px; */
} }
QPushButton#deviceAddButton, QPushButton#addareabutton { QPushButton#deviceAddButton{
color: #328ffc; color: #328ffc;
font-size: 20px; font-size: 20px;
padding-bottom: 8px;
}
QPushButton#addareabutton{
color: #328ffc;
font-size: 20px;
padding-top: 7px;
} }
QPushButton#initAddDeviceButton, QPushButton#initAreaAddButton{ QPushButton#initAddDeviceButton, QPushButton#initAreaAddButton{

@ -24,10 +24,7 @@ QTabBar::close-button {
subcontrol-origin: padding; subcontrol-origin: padding;
margin-top: 2px; }
margin-left: 4px;
}
QTabBar::close-button:hover { QTabBar::close-button:hover {
@ -46,7 +43,7 @@ QTabBar::tab{
background: #f0f0f0; background: #f0f0f0;
border: 2px; /* border: 2px;*/
min-width: 200px; min-width: 200px;
@ -55,7 +52,6 @@ QTabBar::tab{
font: 20px; font: 20px;
font-family: ".SFNSDisplay-Regular"; font-family: ".SFNSDisplay-Regular";
} }
@ -68,7 +64,6 @@ QTabBar#areaTabBar::tab{
} }
QTabBar::tab:selected { QTabBar::tab:selected {
background-color: #809ac2; background-color: #809ac2;
@ -82,15 +77,6 @@ QTabBar::tab:selected {
} }
QTabWidget#deviceTabWidget::pane {
border: 1px solid #a8a8a8;
border-radius: 3px;
margin: 2px;
}
QDockWidget{ QDockWidget{
@ -99,6 +85,9 @@ QDockWidget{
font: bold; font: bold;
font-family: ".SFNSDisplay-Regular"; font-family: ".SFNSDisplay-Regular";
border: 1px solid black;
} }
QDockWidget::title{ QDockWidget::title{
@ -113,12 +102,60 @@ QDockWidget::title{
} }
QToolBar QToolButton{
QPushButton#startProtocolBtn, QPushButton#switchBtn{
font-size: 20px; font-size: 20px;
border: none;
background-color: white;
}
QPushButton#startProtocolBtn:hover, QPushButton#switchBtn:hover{
font-size: 20px;
font: bold; font: bold;
border: none;
margin-bottom: -2px;
background-color: white;
}
QPushButton#startProtocolBtn:checked, QPushButton#switchBtn:checked{
font-size: 20px;
border: none;
}
QWidget#MainWindow{
background-color: white;
}
QWidget#deviceWidget{
background-color: white;
border: 1px solid gray;
} }
QTabWidget::tab-bar{
background-color: black;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

@ -2,6 +2,7 @@ import re
from socket import AI_ADDRCONFIG from socket import AI_ADDRCONFIG
import sys import sys
import json import json
import qtawesome
from tkinter import N from tkinter import N
from functools import partial from functools import partial
from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \ from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \
@ -31,7 +32,7 @@ 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)
@ -142,17 +143,18 @@ class AreaWidget(QWidget):
self.mainLayout = QHBoxLayout() self.mainLayout = QHBoxLayout()
self.leftLayout = QGridLayout() self.leftLayout = QGridLayout()
self.rightLayout = QGridLayout() self.rightLayout = QGridLayout()
self.mainLayout.setContentsMargins(0, 0, 0, 0)
LimitData = self.devicesManange.getLimitData(self.areaTabWidget.deviceName) LimitData = self.devicesManange.getLimitData(self.areaTabWidget.deviceName)
self.pvUpperLimit = QLabel('量程上限: {}'.format(LimitData[0])) self.pvUpperLimit = QLabel('量程上限: {}'.format(LimitData[0]))
self.pvUpperLimit.setObjectName('pvUpperLimit') self.pvUpperLimit.setObjectName('pvUpperLimit')
self.pvLowerLimit = QLabel('量程下限: {}'.format(LimitData[1])) self.pvLowerLimit = QLabel('量程下限: {}'.format(LimitData[1]))
self.pvLowerLimit.setObjectName('pvLowerLimit') self.pvLowerLimit.setObjectName('pvLowerLimit')
self.pvUnit = QLabel(' 位: {}'.format(LimitData[2])) self.pvUnit = QLabel('位: {}'.format(LimitData[2]))
self.pvUnit.setObjectName('pvUnit') self.pvUnit.setObjectName('pvUnit')
@ -184,17 +186,23 @@ class AreaWidget(QWidget):
self.okBtn = QPushButton('确定') self.okBtn = QPushButton('确定')
# self.okBtn.setFixedSize(90, 27) # self.okBtn.setFixedSize(90, 27)
self.okBtn.setObjectName('okBtn') self.okBtn.setObjectName('okBtn')
self.okBtn.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2'))
# self.okBtn.setIcon(QIcon('Static/delete.png'))
self.okBtn.clicked.connect(self.addAreaWidget) self.okBtn.clicked.connect(self.addAreaWidget)
self.okBtnValue = True self.okBtnValue = True
self.delAreaBtn = QPushButton('删除') self.delAreaBtn = QPushButton('删除')
self.delAreaBtn.setIcon(QIcon('Static/delete.png'))
self.delAreaBtn.setObjectName('delAreaBtn') self.delAreaBtn.setObjectName('delAreaBtn')
# self.delAreaBtn.setFixedSize(90, 27) # self.delAreaBtn.setFixedSize(90, 27)
self.delAreaBtn.clicked.connect(self.removeAreaTab) self.delAreaBtn.clicked.connect(self.removeAreaTab)
hLayout = QHBoxLayout() hLayout = QHBoxLayout()
hLayout.addWidget(QSplitter())
hLayout.addWidget(self.okBtn) hLayout.addWidget(self.okBtn)
hLayout.addWidget(QSplitter())
hLayout.addWidget(self.delAreaBtn) hLayout.addWidget(self.delAreaBtn)
hLayout.addWidget(QSplitter())
# vlayout = QVBoxLayout() # vlayout = QVBoxLayout()
@ -213,6 +221,7 @@ class AreaWidget(QWidget):
self.leftLayout.addWidget(self.byteLineEdit,5, 1, 2, 1) self.leftLayout.addWidget(self.byteLineEdit,5, 1, 2, 1)
self.leftLayout.addWidget(QSplitter(),6, 0, 2, 2) self.leftLayout.addWidget(QSplitter(),6, 0, 2, 2)
self.leftLayout.addLayout(hLayout, 7, 0, 2, 2) self.leftLayout.addLayout(hLayout, 7, 0, 2, 2)
self.leftLayout.setContentsMargins(10, 10, 0, 20)
# self.leftLayout.addWidget(self.delAreaBtn, 3, 1, 1, 1) # self.leftLayout.addWidget(self.delAreaBtn, 3, 1, 1, 1)
@ -312,24 +321,28 @@ class AreaWidget(QWidget):
pattern = re.compile(r'^[1-7]$') pattern = re.compile(r'^[1-7]$')
match = pattern.match(byteLineEdit) match = pattern.match(byteLineEdit)
if not match: if not match:
QMessageBox.warning(self, '提示', '请输入1 - 8') QMessageBox.warning(self, '提示', '请输入1 - 7')
return return
else: else:
#设置点击确定后无法编辑,点击编辑后才能编辑 #设置点击确定后无法编辑,点击编辑后才能编辑
if self.okBtnValue: if self.okBtnValue:
self.okBtn.setText('编辑') self.okBtn.setText('编辑')
self.okBtn.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2'))
self.dataTypeCombox.setEnabled(False ) self.dataTypeCombox.setEnabled(False )
self.orderCombox.setEnabled(False ) self.orderCombox.setEnabled(False )
self.byteLineEdit.setEnabled(False ) self.byteLineEdit.setEnabled(False )
self.okBtnValue = False self.okBtnValue = False
if dataType in ['DI','DO']: if dataType in ['DI','DO']:
self.okBtn.setEnabled(False) self.okBtn.setEnabled(False)
elif dataType in ['AI','AO']: elif dataType in ['AI','AO']:
self.okBtn.setText('确定') self.okBtn.setText('保存')
self.okBtn.setIcon(qtawesome.icon('fa.save', color='#1fbb6f'))
self.orderCombox.setEnabled(True) self.orderCombox.setEnabled(True)
self.byteLineEdit.setEnabled(True) self.byteLineEdit.setEnabled(True)
self.okBtnValue = True self.okBtnValue = True
return
#修改配置后刷新布局内容 #修改配置后刷新布局内容
# if self.settingValue is None: # if self.settingValue is None:
@ -359,6 +372,7 @@ class AreaWidget(QWidget):
elif areaId is not None and curIndex in areaId: elif areaId is not None and curIndex in areaId:
# print(areaId,curIndex,2222) # print(areaId,curIndex,2222)
DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex) DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex)
# print(deviceName, curIndex, dataType, int(byteLineEdit))
self.isRead = 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:

@ -37,7 +37,7 @@ class DeviceDialog(QDialog):
cancel_button = button_box.button(QDialogButtonBox.Cancel) cancel_button = button_box.button(QDialogButtonBox.Cancel)
cancel_button.setText("取消") # 设置Cancel按钮的文本 cancel_button.setText("取消") # 设置Cancel按钮的文本
button_box.accepted.connect(self.check_input) button_box.accepted.connect(self.checkInput)
button_box.rejected.connect(self.reject) button_box.rejected.connect(self.reject)
layout.addRow(button_box) layout.addRow(button_box)
@ -54,20 +54,20 @@ class DeviceDialog(QDialog):
pvUnit = self.findChild(QLineEdit, "pvUnit").text() pvUnit = self.findChild(QLineEdit, "pvUnit").text()
return deviceName, pvUpperLimit, pvLowerLimit, pvUnit return deviceName, pvUpperLimit, pvLowerLimit, pvUnit
def check_input(self): def checkInput(self):
titleName, pvUpperLimit, pvLowerLimit, pvUnit = self.getParameters() titleName, pvUpperLimit, pvLowerLimit, pvUnit = self.getParameters()
deviceName = titleName + self.dataTypeAndModel deviceName = titleName + self.dataTypeAndModel
if not pvUpperLimit or not pvLowerLimit or not pvUnit or not deviceName: if not pvUpperLimit or not pvLowerLimit or not pvUnit or not deviceName:
QMessageBox.warning(self, '警告', '有值未输入。') QMessageBox.warning(self, '警告', '有值未输入。')
return return
elif DeviceDB.getByName(deviceName): elif DeviceDB.getByName(deviceName):
print(DeviceDB.getByName(deviceName),2343) # print(DeviceDB.getByName(deviceName),2343)
QMessageBox.warning(self, '警告', '设备名重复') QMessageBox.warning(self, '警告', '设备名重复')
return return
elif not re.match(r'^[-+]?\d*\.?\d*$', pvUpperLimit) or not re.match(r'^[-+]?\d*\.?\d*$', pvLowerLimit): elif not re.match(r'^[-+]?\d*\.?\d*$', pvUpperLimit) or not re.match(r'^[-+]?\d*\.?\d*$', pvLowerLimit):
QMessageBox.warning(self, '警告', '请输入数字。') QMessageBox.warning(self, '警告', '请输入数字。')
return return
elif pvUpperLimit < pvLowerLimit: elif float(pvUpperLimit) <= float(pvLowerLimit):
QMessageBox.warning(self, '警告', '量程输入有误。') QMessageBox.warning(self, '警告', '量程输入有误。')
return return
else: else:

@ -13,11 +13,12 @@ from utils.DBModels.DeviceModels import DeviceDB
from model.ProjectModel.DeviceManage import DevicesManange from model.ProjectModel.DeviceManage import DevicesManange
from UI.DeviceDialogWidget import DeviceDialog from UI.DeviceDialogWidget import DeviceDialog
class DeviceWidget(QMainWindow): class DeviceWidget(QTabWidget):
def __init__(self, dockWidget, devicesManange): def __init__(self, dockWidget, devicesManange):
super().__init__() super().__init__()
self.dockWidget = dockWidget self.dockWidget = dockWidget
self.devicesManange = devicesManange self.devicesManange = devicesManange
self.setObjectName('deviceWidget')
self.initUI() self.initUI()
@ -27,42 +28,34 @@ class DeviceWidget(QMainWindow):
self.proType = self.dataTypeAndModel[0:2] self.proType = self.dataTypeAndModel[0:2]
self.masterSlaveModel = self.dataTypeAndModel[2:4] self.masterSlaveModel = self.dataTypeAndModel[2:4]
self.setObjectName('deviceTabWidget')
self.deviceTabWidget = QTabWidget(self)
self.deviceTabWidget.setObjectName('deviceTabWidget')
self.addDeviceButton = QPushButton('添加设备')
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.addDeviceButton = QPushButton('添加设备 ')
self.addDeviceButton.setObjectName('deviceAddButton') self.addDeviceButton.setObjectName('deviceAddButton')
self.addDeviceButton.setIcon(QIcon('Static/add.png')) self.addDeviceButton.setIcon(QIcon('Static/add.png'))
self.addDeviceButton.setFlat(True) self.addDeviceButton.setFlat(True)
self.addDeviceButton.clicked.connect(self.addDeviceWidget) self.addDeviceButton.clicked.connect(self.addDeviceWidget)
self.deviceTabWidget.setCornerWidget(self.addDeviceButton) self.setCornerWidget(self.addDeviceButton)
self.deviceTabWidget.setTabsClosable(True) self.setTabsClosable(True)
self.deviceTabWidget.tabCloseRequested.connect(self.closeTab) self.tabCloseRequested.connect(self.closeTab)
self.state = True self.state = True
self.initWidget() self.initWidget()
# 设置主窗口的中心部分为 QTabWidget
self.setCentralWidget(self.deviceTabWidget)
def closeTab(self, index): def closeTab(self, index):
reply = QMessageBox.question(self, 'Confirmation', '确定删掉此设备吗?', reply = QMessageBox.question(self, 'Confirmation', '确定删掉此设备吗?',
QMessageBox.Yes | QMessageBox.No, QMessageBox.No) QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes: if reply == QMessageBox.Yes:
if index != -1: if index != -1:
deviceName = self.deviceTabWidget.tabText(index) + self.dockWidget.windowTitle() deviceName = self.tabText(index) + self.dockWidget.windowTitle()
print(deviceName,index,222) # print(deviceName,index,222)
self.deviceTabWidget.removeTab(index) self.removeTab(index)
self.devicesManange.delDevice(deviceName = deviceName ) self.devicesManange.delDevice(deviceName = deviceName )
DeviceDB.deleteDevice(deviceName = deviceName) DeviceDB.deleteDevice(deviceName = deviceName)
else: else:
return return
if self.deviceTabWidget.count() == 0: if self.count() == 0:
self.creatInitWidget() self.creatInitWidget()
@ -76,11 +69,11 @@ class DeviceWidget(QMainWindow):
DeviceDB().addDevice(deviceName = self.deviceName, proType = self.proType , masterSlaveModel = self.masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit) DeviceDB().addDevice(deviceName = self.deviceName, proType = self.proType , masterSlaveModel = self.masterSlaveModel, pvUpperLimit=pvUpperLimit, pvLowerLimit=pvLowerLimit, pvUnit=pvUnit)
areaTabWidget = AreaTabWidget(self) areaTabWidget = AreaTabWidget(self)
if init: if init:
self.deviceTabWidget.removeTab(0) self.removeTab(0)
tabIndex = self.deviceTabWidget.count() tabIndex = self.count()
self.deviceTabWidget.tabBar().setHidden(False) self.tabBar().setHidden(False)
self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName)) self.addTab(areaTabWidget,str(self.titleName))
self.deviceTabWidget.setCurrentIndex(tabIndex) self.setCurrentIndex(tabIndex)
self.devicesManange.addDevice(proType=self.proType, masterSlaveModel = self.masterSlaveModel, deviceName = self.deviceName) self.devicesManange.addDevice(proType=self.proType, masterSlaveModel = self.masterSlaveModel, deviceName = self.deviceName)
else: else:
return return
@ -88,8 +81,8 @@ class DeviceWidget(QMainWindow):
self.deviceName = deviceName self.deviceName = deviceName
self.titleName = self.deviceName[:-4] self.titleName = self.deviceName[:-4]
areaTabWidget = AreaTabWidget(self) areaTabWidget = AreaTabWidget(self)
self.deviceTabWidget.tabBar().setHidden(False) self.tabBar().setHidden(False)
self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName)) self.addTab(areaTabWidget,str(self.titleName))
@ -119,12 +112,12 @@ class DeviceWidget(QMainWindow):
addButton.setIcon(icon) addButton.setIcon(icon)
addButton.setIconSize(iconSize) addButton.setIconSize(iconSize)
addButton.clicked.connect(lambda: self.addDeviceWidget(True)) addButton.clicked.connect(lambda: self.addDeviceWidget(True))
layout.addItem(self.horizontalSpacer) layout.addWidget(QWidget())
layout.addWidget(addButton) layout.addWidget(addButton)
layout.addItem(self.horizontalSpacer) layout.addWidget(QWidget())
widget.setLayout(layout) widget.setLayout(layout)
self.deviceTabWidget.addTab(widget,'') self.addTab(widget,'')
self.deviceTabWidget.tabBar().setHidden(True) self.tabBar().setHidden(True)

@ -1,13 +1,33 @@
import os
import sys import sys
import time
from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QToolBar, QAction, QTabWidget, QGridLayout import win32con
from PyQt5.QtCore import Qt, QTimer import win32gui
from PyQt5.QtGui import QIcon import win32process
import subprocess
import qtawesome
from PyQt5.QtWidgets import QApplication, QPushButton, QMainWindow, QDockWidget, QToolBar, QAction, QTabWidget, QGridLayout, QWidget, QHBoxLayout, QStackedWidget\
,QVBoxLayout
from PyQt5.QtCore import Qt, QTimer, QSize
from PyQt5.QtGui import QIcon, QWindow
from utils.DBModels.BaseModel import * from utils.DBModels.BaseModel import *
from model.ClientModel.Client import Client from model.ClientModel.Client import Client
from UI.DeviceWidget import DeviceWidget from UI.DeviceWidget import DeviceWidget
from model.ProjectModel.DeviceManage import DevicesManange from model.ProjectModel.DeviceManage import DevicesManange
def getHwndByPid(pid):
def callback(hwnd, hwnds):
if hwnd is not None and win32gui.IsWindowVisible(hwnd):
_, found_pid = win32process.GetWindowThreadProcessId(hwnd)
if found_pid == pid:
hwnds.append(hwnd)
hwnds = []
win32gui.EnumWindows(callback, hwnds)
return hwnds[0]
class CommonHelper: class CommonHelper:
def __init__(self): def __init__(self):
pass pass
@ -18,33 +38,44 @@ class CommonHelper:
return f.read() return f.read()
class MainWindow(QMainWindow): class MainWindow(QWidget):
def __init__(self): def __init__(self):
super().__init__() super().__init__()
self.setObjectName("MainWindow")
self.devicesManange = DevicesManange() self.devicesManange = DevicesManange()
self.process = None
self.initUI() self.initUI()
def initUI(self): def initUI(self):
self.protocolTimer = QTimer() self.protocolTimer = QTimer()
self.protocolTimer.timeout.connect(self.readValues) self.protocolTimer.timeout.connect(self.readValues)
self.toolbar = QToolBar() # self.toolbarWidget = QWidget()
self.addToolBar(self.toolbar) # self.addToolBar(Qt.LeftToolBarArea, self.toolbar)
toolbarLayout = QHBoxLayout()
self.startProtocolBtn = QAction(self) self.startProtocolBtn = QPushButton()
self.startProtocolBtn.setObjectName("startProtocolBtn") self.startProtocolBtn.setObjectName("startProtocolBtn")
self.startProtocolBtn.setIcon(QIcon('Static/startProtocol.png')) # self.startProtocolBtn.setIcon(QIcon('Static/startProtocol.png'))
self.startProtocolBtn.setIconText('开始通讯') self.startProtocolBtn.setText('开始通讯')
self.startProtocolBtn.setIcon(QIcon('Static/start.png'))
self.startProtocolBtn.setIconSize(QSize(18, 18))
self.startProtocolBtn.setCheckable(True) self.startProtocolBtn.setCheckable(True)
self.startProtocolBtn.triggered.connect(self.startProtocol) self.startProtocolBtn.clicked.connect(self.startProtocol)
self.loadProjectBtn = QAction('导入工程', self) self.switchBtn = QPushButton('通讯组态')
self.loadProjectBtn.setObjectName("loadProjectBtn") self.switchBtn.setObjectName("switchBtn")
self.loadProjectBtn.triggered.connect(self.loadProject) self.switchBtn.setIcon(qtawesome.icon('fa.exchange', color='#1fbb6f'))
self.switchBtn.setIconSize(QSize(20, 20))
self.switchBtn.setCheckable(True)
self.switchBtn.clicked.connect(self.switchWidget)
# self.toolbar.addAction(self.loadProjectBtn) toolbarLayout.addWidget(self.startProtocolBtn, 1)
self.toolbar.addAction(self.startProtocolBtn) toolbarLayout.addWidget(self.switchBtn, 1)
toolbarLayout.addWidget(QWidget(), 20)
toolbarLayout.setSpacing(20)
toolbarLayout.setContentsMargins(0, 0, 0, 0)
dpMasterDockWidget = QDockWidget('DP主站') dpMasterDockWidget = QDockWidget('DP主站')
dpMasterDockWidget.setWidget(DeviceWidget(dpMasterDockWidget, self.devicesManange)) dpMasterDockWidget.setWidget(DeviceWidget(dpMasterDockWidget, self.devicesManange))
@ -62,41 +93,56 @@ class MainWindow(QMainWindow):
paSlaveDockWidget.setWidget(DeviceWidget(paSlaveDockWidget, self.devicesManange)) paSlaveDockWidget.setWidget(DeviceWidget(paSlaveDockWidget, self.devicesManange))
paSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore paSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore
self.addDockWidget(Qt.TopDockWidgetArea, dpMasterDockWidget) # type: ignore
self.addDockWidget(Qt.TopDockWidgetArea, dpSlaveDockWidget) # type: ignore self.upperWidget = QMainWindow()
self.addDockWidget(Qt.BottomDockWidgetArea, paMasterDockWidget) # type: ignore self.upperWidget.addDockWidget(Qt.TopDockWidgetArea, dpMasterDockWidget) # type: ignore
self.addDockWidget(Qt.BottomDockWidgetArea, paSlaveDockWidget) # type: ignore self.upperWidget.addDockWidget(Qt.TopDockWidgetArea, dpSlaveDockWidget) # type: ignore
self.upperWidget.addDockWidget(Qt.BottomDockWidgetArea, paMasterDockWidget) # type: ignore
self.upperWidget.addDockWidget(Qt.BottomDockWidgetArea, paSlaveDockWidget) # type: ignore
self.stackWidget = QStackedWidget()
self.stackWidget.addWidget(self.upperWidget)
self.stackWidget.addWidget(QWidget())
self.mainLayout = QVBoxLayout(self)
self.mainLayout.addLayout(toolbarLayout, 1)
self.mainLayout.addWidget(self.stackWidget, 50)
self.setLayout(self.mainLayout)
# self.setCentralWidget(self.stackWidget)
self.setWindowIcon(QIcon('Static/zhjt.ico')) self.setWindowIcon(QIcon('Static/zhjt.ico'))
self.setWindowTitle("PROFIBUS") self.setWindowTitle("PROFIBUS")
self.resize(800, 600)
# self.resize(800, 600)
# self.showMaximized() # self.showMaximized()
def startProtocol(self): def startProtocol(self):
if self.startProtocolBtn.isCheckable(): if self.startProtocolBtn.isChecked():
self.startProtocolBtn.setText('停止通讯') self.startProtocolBtn.setText('停止通讯')
self.startProtocolBtn.setCheckable(False) self.startProtocolBtn.setIcon(QIcon('Static/pause.png'))
self.startProtocolBtn.setIconSize(QSize(22, 22))
self.protocolTimer.start(500) self.protocolTimer.start(500)
else: else:
self.startProtocolBtn.setText('开始通讯') self.startProtocolBtn.setText('开始通讯')
self.startProtocolBtn.setCheckable(True) self.startProtocolBtn.setIcon(QIcon('Static/start.png'))
self.protocolTimer.stop() self.protocolTimer.stop()
def readValues(self): def readValues(self):
self.devicesManange.readAreas() self.devicesManange.readAreas()
dockWidgets = self.findChildren(QDockWidget) #找到四个dockWidget窗口 dockWidgets = self.findChildren(QDockWidget) #找到四个dockWidget窗口
for dockWidget in dockWidgets: for dockWidget in dockWidgets:
if dockWidget.widget().deviceTabWidget.currentWidget().objectName() == 'initWidget': if dockWidget.widget().currentWidget().objectName() == 'initWidget':
print(dockWidget.widget().deviceTabWidget.currentWidget().objectName()) # print(dockWidget.widget().currentWidget().objectName())
continue continue
areaTabWidget = dockWidget.widget().deviceTabWidget.currentWidget()#判断四个窗口里是否有deviceTabWidget areaTabWidget = dockWidget.widget().currentWidget()#判断四个窗口里是否
if areaTabWidget.currentWidget().objectName() == 'initWidget': if areaTabWidget.currentWidget().objectName() == 'initWidget':
print(2) # print(2)
continue continue
if areaTabWidget.currentWidget().state: if areaTabWidget.currentWidget().state:
print(3) # print(3)
continue continue
# masterAndSlave = dockWidget.windowTitle()[2:5] # masterAndSlave = dockWidget.windowTitle()[2:5]
@ -105,19 +151,65 @@ class MainWindow(QMainWindow):
# dataTypeAndModel = masterAndSlave + dataType # dataTypeAndModel = masterAndSlave + dataType
# if dataTypeAndModel in ['主站AI', '主站DI', '从站AO', '从站DO']: # if dataTypeAndModel in ['主站AI', '主站DI', '从站AO', '从站DO']:
# devicecurIndex = deviceTabWidget.currentIndex() # devicecurIndex =.currentIndex()
# deviceTabText = deviceTabWidget.tabText(devicecurIndex) # deviceTabText =.tabText(devicecurIndex)
# try: # try:
areacurindex = areaTabWidget.currentIndex() areacurindex = areaTabWidget.currentIndex()
# deviceName = deviceTabText + proType # deviceName = deviceTabText + proType
buttonlayoutWidget = areaTabWidget.currentWidget().buttonWidgets#获取buttonlayout buttonlayoutWidget = areaTabWidget.currentWidget().rightAreaWidgets#获取buttonlayout
buttonlayoutWidget.readValues(curIndex = areacurindex) buttonlayoutWidget.readValues(curIndex = areacurindex)
# except Exception as e: # except Exception as e:
# print(e) # print(e)
def loadProject(self): def switchWidget(self):
pass if self.switchBtn.isChecked():
if self.process:
self.stackWidget.setCurrentIndex(1)
QTimer.singleShot(50, lambda:self.stackWidget.setCurrentIndex(2))
else:
self.stackWidget.setCurrentIndex(1)
startupInfo = subprocess.STARTUPINFO()
startupInfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
startupInfo.wShowWindow = 2
self.process = subprocess.Popen("D:\\EnTalk PROFIBUS Manager\\DP.exe",startupinfo=startupInfo)
QTimer.singleShot(500, lambda:self.showLowerWidget(self.process))
self.switchBtn.setText('变量读写')
# self.switchBtn.setIcon(QIcon('Static/varMagH.png'))
else:
# self.stackWidget.setCurrentIndex(1)
self.stackWidget.setCurrentIndex(0)
self.switchBtn.setText('通讯组态')
# self.switchBtn.setIcon(QIcon('Static/newH.png'))
def showLowerWidget(self, process):
pid = process.pid
hwnd = int(getHwndByPid(pid))
style = win32gui.GetWindowLong(hwnd, win32con.GWL_STYLE)
exstyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
wrect = win32gui.GetWindowRect(hwnd)[:2] + win32gui.GetClientRect(hwnd)[2:]
# print('save', hwnd, style, exstyle, wrect)
widget = QWidget.createWindowContainer(QWindow.fromWinId(hwnd))
# print(type(widget))
widget.hwnd = hwnd # 窗口句柄
widget.phwnd = 0 # 父窗口句柄
widget.style = style # 窗口样式
widget.exstyle = exstyle # 窗口额外样式
widget.wrect = wrect # 窗口位置
self.stackWidget.addWidget(widget)
widget.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | Qt.WindowFullScreen)
win32gui.SetParent(hwnd, int(self.winId()))
self.stackWidget.setCurrentIndex(2)
def closeEvent(self, event):
if self.process:
self.process.kill()
if __name__ == '__main__': if __name__ == '__main__':
app = QApplication(sys.argv) app = QApplication(sys.argv)

@ -134,15 +134,17 @@ class RightAreaWidgets(QWidget):
def readValues(self, curIndex): def readValues(self, curIndex):
print(curIndex) # print(curIndex)
if self.areaLabel is None or self.areaLabel == dict(): if self.areaLabel is None or self.areaLabel == dict():
return return
# elif curIndex == -1: # elif curIndex == -1:
# return # return
else: else:
print(self.deviceName, curIndex)
device = self.devicesManange.getDevice(self.deviceName) device = self.devicesManange.getDevice(self.deviceName)
values = device.getAreaValues(curIndex) values = device.getAreaValues(curIndex)
# print(self.deviceName, curIndex, values)
if len(values) > len(self.areaLabel):
return
for index, value in enumerate(values): for index, value in enumerate(values):
self.areaLabel[index].setText(str(value)) self.areaLabel[index].setText(str(value))
# print(self.areaLabel[index],values) # print(self.areaLabel[index],values)
@ -157,7 +159,7 @@ class RightAreaWidgets(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) # print(valueList, curIndex)
if valueList is None: if valueList is None:
return return
else: else:

@ -0,0 +1,112 @@
2024-03-13 17:26:51 - [Debug] (:0, ): "gsd files directory: C:/Users/Administrator/Desktop/profibus/GSD"
2024-03-13 17:26:51 - [Warn ] (:0, ): libpng warning: iCCP: known incorrect sRGB profile
2024-03-13 17:26:51 - [Debug] (:0, ): "bin directory: D:/EnTalk PROFIBUS Manager"
2024-03-13 17:26:51 - [Debug] (:0, ): "GSD directory: D:/EnTalk PROFIBUS Manager/GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/3000plus.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/asco089c.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/AVTR4711(1).gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/DPSlave.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/ET021.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/ET025.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/ET026.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/hen100b7.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/hen200b7.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/hil_ezr.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/KIAG0D0B.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK239-Free.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK239-Master.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK239-Slave.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK410.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK411.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK412.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): error in gsd!
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK430.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK432.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK441.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK442.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK511.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK512.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK610.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK616.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK621.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK622.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK710.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK716.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/LK720.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/M-IO1.4.GSD"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/MCPA0B25.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/MCYB0C46.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/pa139710.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/PA_39720.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/PBMDMM04.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/si01818e.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/si04801e.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/sip58052.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): gsd file path: "D:/EnTalk PROFIBUS Manager/GSD/Xone_DP.gsd"
2024-03-13 17:26:51 - [Debug] (:0, ): "row count: 0"
2024-03-13 17:26:51 - [Debug] (:0, ): "row count: 0"
2024-03-13 17:26:51 - [Debug] (:0, ): application started...
2024-03-13 17:26:51 - [Debug] (:0, ): "row count: 0"
2024-03-13 17:26:51 - [Debug] (:0, ): "row count: 0"
2024-03-13 17:26:51 - [Debug] (:0, ): "row count: 0"
2024-03-13 17:26:51 - [Debug] (:0, ): "row count: 0"
2024-03-13 17:26:51 - [Debug] (:0, ): "row count: 0"
2024-03-13 17:26:52 - [Debug] (:0, ): "row count: 0"
2024-03-13 17:26:52 - [Debug] (:0, ): "row count: 0"
2024-03-13 17:26:52 - [Debug] (:0, ): "row count: 0"
2024-03-13 17:26:52 - [Debug] (:0, ): "row count: 0"

@ -6,7 +6,7 @@ import numpy as np
from protocol.ModBus.ByteOrder import * from protocol.ModBus.ByteOrder import *
from protocol.ModBus.TCPMaster import * from protocol.ModBus.TCPMaster import *
import struct import struct
import time
#从站 "AI" "DI"可强制 #从站 "AI" "DI"可强制
#主站 "AO" "DO"可强制 #主站 "AO" "DO"可强制
class Device(): class Device():
@ -60,7 +60,9 @@ class Device():
self.inputAreas.pop(self.indexDict[index]) self.inputAreas.pop(self.indexDict[index])
elif type in ["AO", "DO"]: elif type in ["AO", "DO"]:
self.outputAreas.pop(self.indexDict[index]) self.outputAreas.pop(self.indexDict[index])
# self.recalculateAddress() self.indexDict.pop(index)
self.areas.pop(index)
self.recalculateAddress()
def recalculateAddress(self): def recalculateAddress(self):
# print(self.inputStartAddress) # print(self.inputStartAddress)
@ -77,6 +79,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()
# print(area.addressList, area.startAddress, area.endAddress, self.deviceName) # print(area.addressList, area.startAddress, area.endAddress, self.deviceName)
endAddress = area.endAddress endAddress = area.endAddress
# print(self.deviceName, area.startAddress, area.endAddress, area.bytes, time.time())
# print(endAddress) # print(endAddress)
# else: # else:
# print(endAddress) # print(endAddress)
@ -89,15 +92,19 @@ class Device():
elif inputOrOutput == 1: elif inputOrOutput == 1:
self.outputEndAddress = endAddress self.outputEndAddress = endAddress
# endAddress = 0 # endAddress = 0
# print(self.deviceName, self.inputEndAddress)
def editArea(self, index, type, order, bytes): def editArea(self, index, type, order, bytes):
if type in ["DI", "AI"]: # if type in ["DI", "AI"]:
self.inputAreas[self.indexDict[index]].order = order # self.inputAreas[self.indexDict[index]].order = order
self.inputAreas[self.indexDict[index]].bytes = bytes # self.inputAreas[self.indexDict[index]].bytes = bytes
elif type in ["AO", "DO"]: # elif type in ["AO", "DO"]:
self.outputAreas[self.indexDict[index]].order = order # self.outputAreas[self.indexDict[index]].order = order
self.outputAreas[self.indexDict[index]].bytes = bytes # self.outputAreas[self.indexDict[index]].bytes = bytes
# print(bytes)
# print(self.areas[index])
self.areas[index].order = order
self.areas[index].bytes = bytes
self.areas[index].length = int(self.areas[index].nums) * int(bytes)
# self.recalculateAddress() # self.recalculateAddress()
@ -312,6 +319,7 @@ class DevicesManange():
bytes = bytesValues[area.startAddress:area.endAddress] bytes = bytesValues[area.startAddress:area.endAddress]
# print(area.startAddress, area.endAddress) # print(area.startAddress, area.endAddress)
if area.type in ['AI', 'AO']: if area.type in ['AI', 'AO']:
# print(area)
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:
@ -325,7 +333,7 @@ class DevicesManange():
else: else:
bytes = bytes[::-1] bytes = bytes[::-1]
area.currentValue = bytesToCoils(bytes) area.currentValue = bytesToCoils(bytes)
print(area.currentValue, device.deviceName, area.startAddress,area.endAddress) # print(area.currentValue, device.deviceName, area.startAddress,area.endAddress)
# print() # print()
@classmethod @classmethod
def addAreas(self, type, order, bytes, deviceName): def addAreas(self, type, order, bytes, deviceName):

@ -0,0 +1,4 @@
modbus_tk==1.1.3
numpy==1.26.4
peewee==3.17.1
PyQt5==5.15.10
Loading…
Cancel
Save