0313更新

main
parent 1ee92f89ff
commit 455857c88e

@ -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{
color: #328ffc;
font-size: 20px;
padding-bottom: 8px;
}
QPushButton#deviceAddButton, QPushButton#addareabutton {
QPushButton#addareabutton{
color: #328ffc;
font-size: 20px;
padding-top: 7px;
}
QPushButton#initAddDeviceButton, QPushButton#initAreaAddButton{

@ -24,9 +24,6 @@ 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;
@ -56,7 +53,6 @@ QTabBar::tab{
font-family: ".SFNSDisplay-Regular";
}
QTabBar#areaTabBar::tab{
@ -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;
}

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
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, \
@ -142,6 +143,7 @@ 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)
@ -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,12 +321,13 @@ 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 )
@ -325,11 +335,14 @@ class AreaWidget(QWidget):
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:

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

@ -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,13 +28,7 @@ class DeviceWidget(QMainWindow):
self.proType = self.dataTypeAndModel[0:2]
self.masterSlaveModel = self.dataTypeAndModel[2:4]
self.deviceTabWidget = QTabWidget(self)
self.deviceTabWidget.setObjectName('deviceTabWidget')
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
self.setObjectName('deviceTabWidget')
self.addDeviceButton = QPushButton('添加设备')
self.addDeviceButton.setObjectName('deviceAddButton')
@ -41,28 +36,26 @@ class DeviceWidget(QMainWindow):
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)

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

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

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

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