diff --git a/Static/Area.qss b/Static/Area.qss index e32560e..d4ee466 100644 --- a/Static/Area.qss +++ b/Static/Area.qss @@ -1,10 +1,24 @@ -QPushButton#okBtn, QPushButton#delAreaBtn, QPushButton#forceBtn { +QPushButton#okBtn, QPushButton#delAreaBtn { font-size: 22px; + border: none; + +} + +QPushButton#okBtn:hover, QPushButton#delAreaBtn:hover { + + font-size: 22px; + + font: bold; + + border: none; + + margin-bottom: -2px + } QPushButton#wirteDIDOforceBtn { @@ -23,25 +37,39 @@ QPushButton#wirteDIDOforceBtn { 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; font-size: 20px; + padding-bottom: 8px; + + } + + +QPushButton#addareabutton{ + + color: #328ffc; + + font-size: 20px; + + padding-top: 7px; + } QPushButton#initAddDeviceButton, QPushButton#initAreaAddButton{ diff --git a/Static/Main.qss b/Static/Main.qss index 206281d..9dcca0b 100644 --- a/Static/Main.qss +++ b/Static/Main.qss @@ -24,10 +24,7 @@ QTabBar::close-button { subcontrol-origin: padding; - margin-top: 2px; - - margin-left: 4px; - } +} QTabBar::close-button:hover { @@ -46,7 +43,7 @@ QTabBar::tab{ background: #f0f0f0; - border: 2px; + /* border: 2px;*/ min-width: 200px; @@ -55,7 +52,6 @@ QTabBar::tab{ font: 20px; font-family: ".SFNSDisplay-Regular"; - } @@ -68,7 +64,6 @@ QTabBar#areaTabBar::tab{ } - QTabBar::tab:selected { background-color: #809ac2; @@ -82,15 +77,6 @@ QTabBar::tab:selected { } -QTabWidget#deviceTabWidget::pane { - - border: 1px solid #a8a8a8; - - border-radius: 3px; - - margin: 2px; - - } QDockWidget{ @@ -99,6 +85,9 @@ QDockWidget{ font: bold; font-family: ".SFNSDisplay-Regular"; + + border: 1px solid black; + } QDockWidget::title{ @@ -113,12 +102,60 @@ QDockWidget::title{ + } -QToolBar QToolButton{ + +QPushButton#startProtocolBtn, QPushButton#switchBtn{ font-size: 20px; + + border: none; + + background-color: white; + +} + +QPushButton#startProtocolBtn:hover, QPushButton#switchBtn:hover{ + + font-size: 20px; + 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; + +} \ No newline at end of file diff --git a/Static/delete.png b/Static/delete.png new file mode 100644 index 0000000..dc513f4 Binary files /dev/null and b/Static/delete.png differ diff --git a/Static/newH.png b/Static/newH.png new file mode 100644 index 0000000..4b21487 Binary files /dev/null and b/Static/newH.png differ diff --git a/Static/pause.png b/Static/pause.png new file mode 100644 index 0000000..f3a32b9 Binary files /dev/null and b/Static/pause.png differ diff --git a/Static/start.png b/Static/start.png new file mode 100644 index 0000000..27aad33 Binary files /dev/null and b/Static/start.png differ diff --git a/Static/varMagH.png b/Static/varMagH.png new file mode 100644 index 0000000..1d94c1e Binary files /dev/null and b/Static/varMagH.png differ diff --git a/UI/AreaTabWidget.py b/UI/AreaTabWidget.py index ae62441..ea0bdcc 100644 --- a/UI/AreaTabWidget.py +++ b/UI/AreaTabWidget.py @@ -2,6 +2,7 @@ import re from socket import AI_ADDRCONFIG import sys import json +import qtawesome from tkinter import N from functools import partial from PyQt5.QtWidgets import QApplication, QMainWindow, QTabWidget, QWidget, QVBoxLayout, QLabel, QPushButton, QLayout, \ @@ -31,7 +32,7 @@ class AreaTabWidget(QTabWidget): self.setObjectName('areaTabWidget') self.setTabPosition(QTabWidget.South) self.tabBar().setObjectName('areaTabBar') - self.addAreaButton = QPushButton("添加通道") + self.addAreaButton = QPushButton("添加通道 ") self.addAreaButton.setObjectName('addareabutton') self.addAreaButton.setIcon(QIcon('Static/add.png')) self.addAreaButton.setFlat(True) @@ -142,17 +143,18 @@ class AreaWidget(QWidget): self.mainLayout = QHBoxLayout() self.leftLayout = QGridLayout() self.rightLayout = QGridLayout() + self.mainLayout.setContentsMargins(0, 0, 0, 0) LimitData = self.devicesManange.getLimitData(self.areaTabWidget.deviceName) - self.pvUpperLimit = QLabel('量程上限: {}'.format(LimitData[0])) + self.pvUpperLimit = QLabel('量程上限: {}'.format(LimitData[0])) self.pvUpperLimit.setObjectName('pvUpperLimit') - self.pvLowerLimit = QLabel('量程下限: {}'.format(LimitData[1])) + self.pvLowerLimit = QLabel('量程下限: {}'.format(LimitData[1])) self.pvLowerLimit.setObjectName('pvLowerLimit') - self.pvUnit = QLabel('单 位: {}'.format(LimitData[2])) + self.pvUnit = QLabel('单 位: {}'.format(LimitData[2])) self.pvUnit.setObjectName('pvUnit') @@ -184,17 +186,23 @@ class AreaWidget(QWidget): self.okBtn = QPushButton('确定') # self.okBtn.setFixedSize(90, 27) 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.okBtnValue = True self.delAreaBtn = QPushButton('删除') + self.delAreaBtn.setIcon(QIcon('Static/delete.png')) self.delAreaBtn.setObjectName('delAreaBtn') # self.delAreaBtn.setFixedSize(90, 27) self.delAreaBtn.clicked.connect(self.removeAreaTab) hLayout = QHBoxLayout() + hLayout.addWidget(QSplitter()) hLayout.addWidget(self.okBtn) + hLayout.addWidget(QSplitter()) hLayout.addWidget(self.delAreaBtn) + hLayout.addWidget(QSplitter()) # vlayout = QVBoxLayout() @@ -213,6 +221,7 @@ class AreaWidget(QWidget): self.leftLayout.addWidget(self.byteLineEdit,5, 1, 2, 1) self.leftLayout.addWidget(QSplitter(),6, 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) @@ -312,24 +321,28 @@ class AreaWidget(QWidget): pattern = re.compile(r'^[1-7]$') match = pattern.match(byteLineEdit) if not match: - QMessageBox.warning(self, '提示', '请输入1 - 8。') + QMessageBox.warning(self, '提示', '请输入1 - 7。') return else: #设置点击确定后无法编辑,点击编辑后才能编辑 if self.okBtnValue: self.okBtn.setText('编辑') + self.okBtn.setIcon(qtawesome.icon('fa.pencil', color='#4c8cf2')) self.dataTypeCombox.setEnabled(False ) self.orderCombox.setEnabled(False ) self.byteLineEdit.setEnabled(False ) self.okBtnValue = False if dataType in ['DI','DO']: self.okBtn.setEnabled(False) + 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.byteLineEdit.setEnabled(True) self.okBtnValue = True + return #修改配置后刷新布局内容 # if self.settingValue is None: @@ -359,6 +372,7 @@ class AreaWidget(QWidget): elif areaId is not None and curIndex in areaId: # print(areaId,curIndex,2222) 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.readVarTimer.start(500) else: diff --git a/UI/DeviceDialogWidget.py b/UI/DeviceDialogWidget.py index 837f85a..299cb11 100644 --- a/UI/DeviceDialogWidget.py +++ b/UI/DeviceDialogWidget.py @@ -37,7 +37,7 @@ class DeviceDialog(QDialog): cancel_button = button_box.button(QDialogButtonBox.Cancel) cancel_button.setText("取消") # 设置Cancel按钮的文本 - button_box.accepted.connect(self.check_input) + button_box.accepted.connect(self.checkInput) button_box.rejected.connect(self.reject) layout.addRow(button_box) @@ -54,20 +54,20 @@ class DeviceDialog(QDialog): pvUnit = self.findChild(QLineEdit, "pvUnit").text() return deviceName, pvUpperLimit, pvLowerLimit, pvUnit - def check_input(self): + def checkInput(self): titleName, pvUpperLimit, pvLowerLimit, pvUnit = self.getParameters() deviceName = titleName + self.dataTypeAndModel if not pvUpperLimit or not pvLowerLimit or not pvUnit or not deviceName: QMessageBox.warning(self, '警告', '有值未输入。') return elif DeviceDB.getByName(deviceName): - print(DeviceDB.getByName(deviceName),2343) + # print(DeviceDB.getByName(deviceName),2343) QMessageBox.warning(self, '警告', '设备名重复') return elif not re.match(r'^[-+]?\d*\.?\d*$', pvUpperLimit) or not re.match(r'^[-+]?\d*\.?\d*$', pvLowerLimit): QMessageBox.warning(self, '警告', '请输入数字。') return - elif pvUpperLimit < pvLowerLimit: + elif float(pvUpperLimit) <= float(pvLowerLimit): QMessageBox.warning(self, '警告', '量程输入有误。') return else: diff --git a/UI/DeviceWidget.py b/UI/DeviceWidget.py index 846fdb6..dd174d7 100644 --- a/UI/DeviceWidget.py +++ b/UI/DeviceWidget.py @@ -13,11 +13,12 @@ from utils.DBModels.DeviceModels import DeviceDB from model.ProjectModel.DeviceManage import DevicesManange from UI.DeviceDialogWidget import DeviceDialog -class DeviceWidget(QMainWindow): +class DeviceWidget(QTabWidget): def __init__(self, dockWidget, devicesManange): super().__init__() self.dockWidget = dockWidget self.devicesManange = devicesManange + self.setObjectName('deviceWidget') self.initUI() @@ -27,42 +28,34 @@ class DeviceWidget(QMainWindow): self.proType = self.dataTypeAndModel[0:2] self.masterSlaveModel = self.dataTypeAndModel[2:4] - - self.deviceTabWidget = QTabWidget(self) - self.deviceTabWidget.setObjectName('deviceTabWidget') + self.setObjectName('deviceTabWidget') - - self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) - self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) - - self.addDeviceButton = QPushButton('添加设备 ') + self.addDeviceButton = QPushButton('添加设备') self.addDeviceButton.setObjectName('deviceAddButton') self.addDeviceButton.setIcon(QIcon('Static/add.png')) self.addDeviceButton.setFlat(True) self.addDeviceButton.clicked.connect(self.addDeviceWidget) - self.deviceTabWidget.setCornerWidget(self.addDeviceButton) - self.deviceTabWidget.setTabsClosable(True) - self.deviceTabWidget.tabCloseRequested.connect(self.closeTab) + self.setCornerWidget(self.addDeviceButton) + self.setTabsClosable(True) + self.tabCloseRequested.connect(self.closeTab) self.state = True self.initWidget() - # 设置主窗口的中心部分为 QTabWidget - self.setCentralWidget(self.deviceTabWidget) def closeTab(self, index): reply = QMessageBox.question(self, 'Confirmation', '确定删掉此设备吗?', QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: if index != -1: - deviceName = self.deviceTabWidget.tabText(index) + self.dockWidget.windowTitle() - print(deviceName,index,222) - self.deviceTabWidget.removeTab(index) + deviceName = self.tabText(index) + self.dockWidget.windowTitle() + # print(deviceName,index,222) + self.removeTab(index) self.devicesManange.delDevice(deviceName = deviceName ) DeviceDB.deleteDevice(deviceName = deviceName) else: return - if self.deviceTabWidget.count() == 0: + if self.count() == 0: 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) areaTabWidget = AreaTabWidget(self) if init: - self.deviceTabWidget.removeTab(0) - tabIndex = self.deviceTabWidget.count() - self.deviceTabWidget.tabBar().setHidden(False) - self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName)) - self.deviceTabWidget.setCurrentIndex(tabIndex) + self.removeTab(0) + tabIndex = self.count() + self.tabBar().setHidden(False) + self.addTab(areaTabWidget,str(self.titleName)) + self.setCurrentIndex(tabIndex) self.devicesManange.addDevice(proType=self.proType, masterSlaveModel = self.masterSlaveModel, deviceName = self.deviceName) else: return @@ -88,8 +81,8 @@ class DeviceWidget(QMainWindow): self.deviceName = deviceName self.titleName = self.deviceName[:-4] areaTabWidget = AreaTabWidget(self) - self.deviceTabWidget.tabBar().setHidden(False) - self.deviceTabWidget.addTab(areaTabWidget,str(self.titleName)) + self.tabBar().setHidden(False) + self.addTab(areaTabWidget,str(self.titleName)) @@ -119,12 +112,12 @@ class DeviceWidget(QMainWindow): addButton.setIcon(icon) addButton.setIconSize(iconSize) addButton.clicked.connect(lambda: self.addDeviceWidget(True)) - layout.addItem(self.horizontalSpacer) + layout.addWidget(QWidget()) layout.addWidget(addButton) - layout.addItem(self.horizontalSpacer) + layout.addWidget(QWidget()) widget.setLayout(layout) - self.deviceTabWidget.addTab(widget,'') - self.deviceTabWidget.tabBar().setHidden(True) + self.addTab(widget,'') + self.tabBar().setHidden(True) diff --git a/UI/MainWindow.py b/UI/MainWindow.py index a85f3cb..9022a39 100644 --- a/UI/MainWindow.py +++ b/UI/MainWindow.py @@ -1,13 +1,33 @@ +import os import sys - -from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QToolBar, QAction, QTabWidget, QGridLayout -from PyQt5.QtCore import Qt, QTimer -from PyQt5.QtGui import QIcon +import time +import win32con +import win32gui +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 model.ClientModel.Client import Client from UI.DeviceWidget import DeviceWidget 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: def __init__(self): pass @@ -18,33 +38,44 @@ class CommonHelper: return f.read() -class MainWindow(QMainWindow): +class MainWindow(QWidget): def __init__(self): super().__init__() + self.setObjectName("MainWindow") self.devicesManange = DevicesManange() + self.process = None self.initUI() def initUI(self): - self.protocolTimer = QTimer() self.protocolTimer.timeout.connect(self.readValues) - self.toolbar = QToolBar() - self.addToolBar(self.toolbar) + # self.toolbarWidget = QWidget() + # self.addToolBar(Qt.LeftToolBarArea, self.toolbar) + + toolbarLayout = QHBoxLayout() - self.startProtocolBtn = QAction(self) + self.startProtocolBtn = QPushButton() self.startProtocolBtn.setObjectName("startProtocolBtn") - self.startProtocolBtn.setIcon(QIcon('Static/startProtocol.png')) - self.startProtocolBtn.setIconText('开始通讯') + # self.startProtocolBtn.setIcon(QIcon('Static/startProtocol.png')) + self.startProtocolBtn.setText('开始通讯') + self.startProtocolBtn.setIcon(QIcon('Static/start.png')) + self.startProtocolBtn.setIconSize(QSize(18, 18)) self.startProtocolBtn.setCheckable(True) - self.startProtocolBtn.triggered.connect(self.startProtocol) + self.startProtocolBtn.clicked.connect(self.startProtocol) - self.loadProjectBtn = QAction('导入工程', self) - self.loadProjectBtn.setObjectName("loadProjectBtn") - self.loadProjectBtn.triggered.connect(self.loadProject) + self.switchBtn = QPushButton('通讯组态') + self.switchBtn.setObjectName("switchBtn") + 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) - self.toolbar.addAction(self.startProtocolBtn) + toolbarLayout.addWidget(self.startProtocolBtn, 1) + toolbarLayout.addWidget(self.switchBtn, 1) + toolbarLayout.addWidget(QWidget(), 20) + toolbarLayout.setSpacing(20) + toolbarLayout.setContentsMargins(0, 0, 0, 0) dpMasterDockWidget = QDockWidget('DP主站') dpMasterDockWidget.setWidget(DeviceWidget(dpMasterDockWidget, self.devicesManange)) @@ -62,41 +93,56 @@ class MainWindow(QMainWindow): paSlaveDockWidget.setWidget(DeviceWidget(paSlaveDockWidget, self.devicesManange)) paSlaveDockWidget.setFeatures(QDockWidget.DockWidgetMovable | QDockWidget.DockWidgetFloatable) # type: ignore - self.addDockWidget(Qt.TopDockWidgetArea, dpMasterDockWidget) # type: ignore - self.addDockWidget(Qt.TopDockWidgetArea, dpSlaveDockWidget) # type: ignore - self.addDockWidget(Qt.BottomDockWidgetArea, paMasterDockWidget) # type: ignore - self.addDockWidget(Qt.BottomDockWidgetArea, paSlaveDockWidget) # type: ignore + + self.upperWidget = QMainWindow() + self.upperWidget.addDockWidget(Qt.TopDockWidgetArea, dpMasterDockWidget) # 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.setWindowTitle("PROFIBUS") - self.resize(800, 600) + + # self.resize(800, 600) # self.showMaximized() def startProtocol(self): - if self.startProtocolBtn.isCheckable(): + if self.startProtocolBtn.isChecked(): self.startProtocolBtn.setText('停止通讯') - self.startProtocolBtn.setCheckable(False) + self.startProtocolBtn.setIcon(QIcon('Static/pause.png')) + self.startProtocolBtn.setIconSize(QSize(22, 22)) self.protocolTimer.start(500) else: self.startProtocolBtn.setText('开始通讯') - self.startProtocolBtn.setCheckable(True) + self.startProtocolBtn.setIcon(QIcon('Static/start.png')) self.protocolTimer.stop() def readValues(self): self.devicesManange.readAreas() dockWidgets = self.findChildren(QDockWidget) #找到四个dockWidget窗口 for dockWidget in dockWidgets: - if dockWidget.widget().deviceTabWidget.currentWidget().objectName() == 'initWidget': - print(dockWidget.widget().deviceTabWidget.currentWidget().objectName()) + if dockWidget.widget().currentWidget().objectName() == 'initWidget': + # print(dockWidget.widget().currentWidget().objectName()) continue - areaTabWidget = dockWidget.widget().deviceTabWidget.currentWidget()#判断四个窗口里是否有deviceTabWidget + areaTabWidget = dockWidget.widget().currentWidget()#判断四个窗口里是否 if areaTabWidget.currentWidget().objectName() == 'initWidget': - print(2) + # print(2) continue if areaTabWidget.currentWidget().state: - print(3) + # print(3) continue # masterAndSlave = dockWidget.windowTitle()[2:5] @@ -105,19 +151,65 @@ class MainWindow(QMainWindow): # dataTypeAndModel = masterAndSlave + dataType # if dataTypeAndModel in ['主站AI', '主站DI', '从站AO', '从站DO']: - # devicecurIndex = deviceTabWidget.currentIndex() - # deviceTabText = deviceTabWidget.tabText(devicecurIndex) + # devicecurIndex =.currentIndex() + # deviceTabText =.tabText(devicecurIndex) # try: areacurindex = areaTabWidget.currentIndex() # deviceName = deviceTabText + proType - buttonlayoutWidget = areaTabWidget.currentWidget().buttonWidgets#获取buttonlayout + buttonlayoutWidget = areaTabWidget.currentWidget().rightAreaWidgets#获取buttonlayout buttonlayoutWidget.readValues(curIndex = areacurindex) # except Exception as e: # print(e) - def loadProject(self): - pass + def switchWidget(self): + 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__': app = QApplication(sys.argv) diff --git a/UI/RightAreaWidget.py b/UI/RightAreaWidget.py index 8f06712..37973a6 100644 --- a/UI/RightAreaWidget.py +++ b/UI/RightAreaWidget.py @@ -134,15 +134,17 @@ class RightAreaWidgets(QWidget): def readValues(self, curIndex): - print(curIndex) + # print(curIndex) if self.areaLabel is None or self.areaLabel == dict(): return # elif curIndex == -1: # return else: - print(self.deviceName, curIndex) device = self.devicesManange.getDevice(self.deviceName) values = device.getAreaValues(curIndex) + # print(self.deviceName, curIndex, values) + if len(values) > len(self.areaLabel): + return for index, value in enumerate(values): self.areaLabel[index].setText(str(value)) # print(self.areaLabel[index],values) @@ -157,7 +159,7 @@ class RightAreaWidgets(QWidget): dataTypeAndModel = self.deviceName[-2:] + self.dataType curIndex = self.areaWidget.areaTabWidget.currentIndex() valueList = self.wirteAreaLineEditValue(dataTypeAndModel=dataTypeAndModel, valueLabel=valueLabel,number=number, value=value) - print(valueList, curIndex) + # print(valueList, curIndex) if valueList is None: return else: diff --git a/log/log.txt b/log/log.txt new file mode 100644 index 0000000..73456c2 --- /dev/null +++ b/log/log.txt @@ -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" + diff --git a/model/ProjectModel/DeviceManage.py b/model/ProjectModel/DeviceManage.py index 454a2a4..0c7a323 100644 --- a/model/ProjectModel/DeviceManage.py +++ b/model/ProjectModel/DeviceManage.py @@ -6,7 +6,7 @@ import numpy as np from protocol.ModBus.ByteOrder import * from protocol.ModBus.TCPMaster import * import struct - +import time #从站 "AI" "DI"可强制 #主站 "AO" "DO"可强制 class Device(): @@ -60,7 +60,9 @@ class Device(): self.inputAreas.pop(self.indexDict[index]) elif type in ["AO", "DO"]: self.outputAreas.pop(self.indexDict[index]) - # self.recalculateAddress() + self.indexDict.pop(index) + self.areas.pop(index) + self.recalculateAddress() def recalculateAddress(self): # print(self.inputStartAddress) @@ -77,6 +79,7 @@ class Device(): area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() # print(area.addressList, area.startAddress, area.endAddress, self.deviceName) endAddress = area.endAddress + # print(self.deviceName, area.startAddress, area.endAddress, area.bytes, time.time()) # print(endAddress) # else: # print(endAddress) @@ -89,15 +92,19 @@ class Device(): elif inputOrOutput == 1: self.outputEndAddress = endAddress # endAddress = 0 - # print(self.deviceName, self.inputEndAddress) def editArea(self, index, type, order, bytes): - if type in ["DI", "AI"]: - self.inputAreas[self.indexDict[index]].order = order - self.inputAreas[self.indexDict[index]].bytes = bytes - elif type in ["AO", "DO"]: - self.outputAreas[self.indexDict[index]].order = order - self.outputAreas[self.indexDict[index]].bytes = bytes + # if type in ["DI", "AI"]: + # self.inputAreas[self.indexDict[index]].order = order + # self.inputAreas[self.indexDict[index]].bytes = bytes + # elif type in ["AO", "DO"]: + # self.outputAreas[self.indexDict[index]].order = order + # 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() @@ -312,6 +319,7 @@ class DevicesManange(): bytes = bytesValues[area.startAddress:area.endAddress] # print(area.startAddress, area.endAddress) if area.type in ['AI', 'AO']: + # print(area) for i in range(0, len(bytes), 4): byte = bytes[i:i+4] if len(byte) != 4: @@ -325,7 +333,7 @@ class DevicesManange(): else: bytes = bytes[::-1] area.currentValue = bytesToCoils(bytes) - print(area.currentValue, device.deviceName, area.startAddress,area.endAddress) + # print(area.currentValue, device.deviceName, area.startAddress,area.endAddress) # print() @classmethod def addAreas(self, type, order, bytes, deviceName): diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..a57157f --- /dev/null +++ b/requirements.txt @@ -0,0 +1,4 @@ +modbus_tk==1.1.3 +numpy==1.26.4 +peewee==3.17.1 +PyQt5==5.15.10