diff --git a/Static/Profibus.qss b/Static/Profibus.qss index 18d5a54..5ea1d0b 100644 --- a/Static/Profibus.qss +++ b/Static/Profibus.qss @@ -114,7 +114,7 @@ QComboBox#tbcombox::drop-down{ QTabBar::close-button { - image: url(Static/close.png); + image: url(Static/close_black.png); subcontrol-origin: padding; diff --git a/UI/Main/MainTop.py b/UI/Main/MainTop.py index ac421af..59774d4 100644 --- a/UI/Main/MainTop.py +++ b/UI/Main/MainTop.py @@ -72,7 +72,7 @@ class MainTop(QtWidgets.QWidget): def searchEditTextChanged(self, text): index = Globals.getValue('SearchWidget') - print(index, 'aaaaa') + # print(index, 'aaaaa') if index == 0: self.MainWindow.rightWidget.widget(index).on_comboBox_currentIndexChanged(1) self.MainWindow.rightWidget.widget(index).on_lineEdit_textChanged(text) diff --git a/UI/ProfibusWidgets/AreaTabWidget.py b/UI/ProfibusWidgets/AreaTabWidget.py index 1027112..258dac4 100644 --- a/UI/ProfibusWidgets/AreaTabWidget.py +++ b/UI/ProfibusWidgets/AreaTabWidget.py @@ -1,6 +1,7 @@ import re import sys import json +from anyio import value import qtawesome from PyQt5.QtWidgets import QApplication, QTabWidget, QWidget, QLabel, QPushButton, \ @@ -64,7 +65,8 @@ class AreaTabWidget(QTabWidget): for area in areas: dataType, order = self.tran(area["type"], area["order"]) channelBytes = area["bytes"] - settingValue = [dataType, order, channelBytes] + valueName = area["valueName"] + settingValue = [dataType, order, channelBytes, valueName] self.addAreaTab(settingValue=settingValue) else: @@ -180,7 +182,12 @@ class AreaWidget(QWidget): self.byteLineEdit = SoftKeyBoardEdit() self.byteLineEdit.setPlaceholderText('字节长度') self.byteLineEdit.setObjectName('byteLineEdit') - + + self.valueNamelabel = QLabel('变量名:') + self.valueNamelabel.setObjectName('byteLineLabel') + self.valueNameEdit = SoftKeyBoardEdit() + self.valueNameEdit.setPlaceholderText('变量名') + self.valueNameEdit.setObjectName('byteLineEdit') self.okBtn = QPushButton('保存') self.okBtn.setObjectName('okBtn') @@ -210,8 +217,11 @@ class AreaWidget(QWidget): self.leftLayout.addWidget(self.orderCombox,4, 1, 2, 1) self.leftLayout.addWidget(self.byteLineLabel,5, 0, 2,1) 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.addWidget(self.valueNamelabel, 6, 0, 2, 1) + self.leftLayout.addWidget(self.valueNameEdit, 6, 1, 2, 1) + + self.leftLayout.addWidget(QSplitter(),7, 0, 2, 2) + self.leftLayout.addLayout(hLayout, 8, 0, 2, 2) self.leftLayout.setContentsMargins(10, 10, 0, 20) @@ -283,18 +293,22 @@ class AreaWidget(QWidget): dataType = self.dataTypeCombox.currentText() order = self.dataTypeTranslate(self.orderCombox.currentText()) byteLineEdit = self.byteLineEdit.text() + valueName = self.valueNameEdit.text() else: dataTypeIndex = self.settingValue[0] orderIndex = self.settingValue[1] byteLineEditIndex = self.settingValue[2] + valueNameIndex = self.settingValue[3] self.dataTypeCombox.setCurrentIndex(dataTypeIndex) self.orderCombox.setCurrentIndex(orderIndex) self.byteLineEdit.setText(byteLineEditIndex) + self.valueNameEdit.setText(valueNameIndex) dataType = self.dataTypeCombox.currentText() order = self.dataTypeTranslate(self.orderCombox.currentText()) byteLineEdit = self.byteLineEdit.text() + valueName = self.valueNameEdit.text() #判断字节长度的输入是否是数字 pattern = re.compile(r'^[1-7]$') @@ -310,6 +324,7 @@ class AreaWidget(QWidget): self.dataTypeCombox.setEnabled(False ) self.orderCombox.setEnabled(False ) self.byteLineEdit.setEnabled(False ) + self.valueNameEdit.setEnabled(False ) self.okBtnValue = False if dataType in ['DI','DO']: self.okBtn.setEnabled(False) @@ -320,6 +335,7 @@ class AreaWidget(QWidget): self.okBtn.setIcon(qtawesome.icon('fa.save', color='#1fbb6f')) self.orderCombox.setEnabled(True) self.byteLineEdit.setEnabled(True) + self.valueNameEdit.setEnabled(True) self.okBtnValue = True return @@ -333,7 +349,7 @@ class AreaWidget(QWidget): widget.deleteLater() #添加按钮布局 - self.rightAreaWidgets = RightAreaWidgets(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName) + self.rightAreaWidgets = RightAreaWidgets(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName, valueName = valueName) areaLayout.addWidget(self.rightAreaWidgets) self.state = False @@ -341,15 +357,15 @@ class AreaWidget(QWidget): areaId = DevicesManange.getAreaID(deviceName) if self.settingValue is not None: - self.isRead = self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) + self.isRead = self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, valueName = valueName, nums = 1) self.devicesManange.recalculateAddress() return elif areaId is not None and curIndex in areaId: - DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex) + DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, valueName, curIndex) self.isRead = self.devicesManange.getDevice(deviceName).editArea(index = curIndex, type = dataType, order = order, bytes = int(byteLineEdit)) else: - DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName) - self.isRead = self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) + DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName, valueName) + self.isRead = self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, valueName = valueName, nums = 1) self.devicesManange.recalculateAddress() diff --git a/UI/ProfibusWidgets/ProfibusWindow.py b/UI/ProfibusWidgets/ProfibusWindow.py index 3e81278..9ac09a7 100644 --- a/UI/ProfibusWidgets/ProfibusWindow.py +++ b/UI/ProfibusWidgets/ProfibusWindow.py @@ -167,8 +167,8 @@ class ProfibusWidgets(QWidget): iconLabel.setPixmap(scaledPixmap) iconLabel.setScaledContents(True) - toolbarLayout.addWidget(iconLabel, 1) - toolbarLayout.addWidget(QWidget(), 1) + # toolbarLayout.addWidget(iconLabel, 1) + # toolbarLayout.addWidget(QWidget(), 1) toolbarLayout.addWidget(self.startProtocolBtn, 1) toolbarLayout.addWidget(self.valueBtn, 1) toolbarLayout.addWidget(self.switchBtn, 1) diff --git a/UI/ProfibusWidgets/RightAreaWidget.py b/UI/ProfibusWidgets/RightAreaWidget.py index bbd8b36..8bd2ca6 100644 --- a/UI/ProfibusWidgets/RightAreaWidget.py +++ b/UI/ProfibusWidgets/RightAreaWidget.py @@ -23,7 +23,7 @@ class ForceRadioButton(QRadioButton): self.number = number class RightAreaWidgets(QWidget): - def __init__(self, areaWidget, order, byteLineEdit, dataType, deviceName): + def __init__(self, areaWidget, order, byteLineEdit, dataType, deviceName, valueName = None): super().__init__() self.areaLineEditValue = [] self.qualityEditValueList = [] @@ -35,6 +35,7 @@ class RightAreaWidgets(QWidget): self.byteLineEdit = byteLineEdit self.dataType = dataType self.deviceName = deviceName + self.valueName = valueName if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'): self.force = False elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'): diff --git a/UI/Setting/RemoteConnectSetting.py b/UI/Setting/RemoteConnectSetting.py index 4c9cd2c..ef4f750 100644 --- a/UI/Setting/RemoteConnectSetting.py +++ b/UI/Setting/RemoteConnectSetting.py @@ -46,7 +46,7 @@ class RemoteConnectSettingWidget(QWidget): # 存储两种模式的Widget self.deviceMasterWidget = DeviceMasterWidget() # 主站模式 - self.deviceSlavrWidget = DeviceSlaveWidget() # 从站模式 + self.deviceSlaveWidget = DeviceSlaveWidget() # 从站模式 # 初始显示主站模式 self.currentWidget = self.deviceMasterWidget @@ -67,7 +67,7 @@ class RemoteConnectSettingWidget(QWidget): if mode == "主站模式": self.currentWidget = self.deviceMasterWidget else: - self.currentWidget = self.deviceSlavrWidget + self.currentWidget = self.deviceSlaveWidget # 重新添加Widget(保持居中) self.contentLayout.insertWidget(1, self.currentWidget) # 插入到两个弹簧中间 diff --git a/UI/Setting/SearchDeviceWidget.py b/UI/Setting/SearchDeviceWidget.py index 254fde4..65b36ac 100644 --- a/UI/Setting/SearchDeviceWidget.py +++ b/UI/Setting/SearchDeviceWidget.py @@ -141,8 +141,8 @@ class DeviceMasterWidget(QMainWindow): # 在列表中显示设备 for server in servers: - item_text = f"{server['hostname']} ({server['ip'][0]}:{server['port']})" - self.deviceList.addItem(item_text) + itemText = f"{server['hostname']} ({server['ip'][0]})" + self.deviceList.addItem(itemText) self.connectButton.setEnabled(True) @@ -154,16 +154,8 @@ class DeviceMasterWidget(QMainWindow): return selectedServer = self.servers[selectedIndex] - try: - success = self.tcpClient.connectToServer(selectedServer['ip'][0], selectedServer['port']) - if success: - QMessageBox.information(self, '连接成功', - f"已连接到 {selectedServer['hostname']}") - else: - QMessageBox.critical(self, '连接失败', "连接失败") - except Exception as e: - QMessageBox.critical(self, '连接失败', f"连接失败: {str(e)}") - + print(selectedServer['ip'][0]) + def getLocalIp(self): for interface in QNetworkInterface.allInterfaces(): if interface.flags() & QNetworkInterface.IsUp: @@ -198,30 +190,30 @@ class TcpServer(QObject): logMessage = f"[{currentTime}] {message}" self.updateSignal.emit(logMessage) - def tcpServer(self): - try: - self.serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - self.serverSocket.settimeout(1) # 设置1秒超时 - self.serverSocket.bind(('0.0.0.0', self.tcpPort)) - self.serverSocket.listen(5) - self.log(f"TCP服务端已启动,监听端口 {self.tcpPort}") + # def tcpServer(self): + # try: + # self.serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # self.serverSocket.settimeout(1) # 设置1秒超时 + # self.serverSocket.bind(('0.0.0.0', self.tcpPort)) + # self.serverSocket.listen(5) + # self.log(f"TCP服务端已启动,监听端口 {self.tcpPort}") - while self.tcpRunning: - try: - clientSock, addr = self.serverSocket.accept() - self.log(f"接收到来自 {addr} 的连接") - clientThread = threading.Thread(target=self.handleClient, args=(clientSock,)) - clientThread.start() - except socket.timeout: - continue # 超时后继续检查运行标志 - except: - break - except Exception as e: - self.log(f"TCP服务器错误: {e}") - finally: - if self.serverSocket: - self.serverSocket.close() - self.log("TCP服务端已停止") + # while self.tcpRunning: + # try: + # clientSock, addr = self.serverSocket.accept() + # self.log(f"接收到来自 {addr} 的连接") + # clientThread = threading.Thread(target=self.handleClient, args=(clientSock,)) + # clientThread.start() + # except socket.timeout: + # continue # 超时后继续检查运行标志 + # except: + # break + # except Exception as e: + # self.log(f"TCP服务器错误: {e}") + # finally: + # if self.serverSocket: + # self.serverSocket.close() + # self.log("TCP服务端已停止") def handleClient(self, clientSock): try: @@ -260,22 +252,22 @@ class TcpServer(QObject): self.udpSocket.close() self.log("UDP发现服务已停止") - def startTcpServer(self): - if not self.tcpRunning: - self.tcpRunning = True - self.tcpThread = threading.Thread(target=self.tcpServer) - self.tcpThread.start() + # def startTcpServer(self): + # if not self.tcpRunning: + # self.tcpRunning = True + # self.tcpThread = threading.Thread(target=self.tcpServer) + # self.tcpThread.start() - def stopTcpServer(self): - if self.tcpRunning: - self.tcpRunning = False - # 创建一个临时连接来解除accept阻塞 - try: - tempSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - tempSocket.connect(('127.0.0.1', self.tcpPort)) - tempSocket.close() - except: - pass + # def stopTcpServer(self): + # if self.tcpRunning: + # self.tcpRunning = False + # # 创建一个临时连接来解除accept阻塞 + # try: + # tempSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # tempSocket.connect(('127.0.0.1', self.tcpPort)) + # tempSocket.close() + # except: + # pass def startUdpServer(self): if not self.udpRunning: @@ -310,10 +302,10 @@ class DeviceSlaveWidget(QMainWindow): mainLayout = QVBoxLayout() # 控制按钮 - self.tcpButton = QPushButton("启动 TCP 服务器") - self.tcpButton.clicked.connect(self.toggleTcpServer) - self.tcpButton.setObjectName('setButton') - self.udpButton = QPushButton("启动 UDP 发现服务") + # self.tcpButton = QPushButton("启动 TCP 服务器") + # self.tcpButton.clicked.connect(self.toggleTcpServer) + # self.tcpButton.setObjectName('setButton') + self.udpButton = QPushButton("开启远程通讯模式") self.udpButton.clicked.connect(self.toggleUdpServer) self.udpButton.setObjectName('setButton') # 日志显示 @@ -321,7 +313,7 @@ class DeviceSlaveWidget(QMainWindow): self.logDisplay.setReadOnly(True) # 添加到布局 - mainLayout.addWidget(self.tcpButton) + # mainLayout.addWidget(self.tcpButton) mainLayout.addWidget(self.udpButton) mainLayout.addWidget(QLabel("服务器日志:")) mainLayout.addWidget(self.logDisplay) @@ -334,18 +326,18 @@ class DeviceSlaveWidget(QMainWindow): def toggleTcpServer(self): if self.server.tcpRunning: self.server.stopTcpServer() - self.tcpButton.setText("启动 TCP 服务器") + # self.tcpButton.setText("启动 TCP 服务器") else: self.server.startTcpServer() - self.tcpButton.setText("停止 TCP 服务器") + # self.tcpButton.setText("停止 TCP 服务器") def toggleUdpServer(self): if self.server.udpRunning: self.server.stopUdpServer() - self.udpButton.setText("启动 UDP 发现服务") + self.udpButton.setText("开启远程通讯模式") else: self.server.startUdpServer() - self.udpButton.setText("停止 UDP 发现服务") + self.udpButton.setText("关闭远程通讯模式") def updateLog(self, message): self.logDisplay.append(message) diff --git a/model/ProjectModel/DeviceManage.py b/model/ProjectModel/DeviceManage.py index ebec59f..27449fe 100644 --- a/model/ProjectModel/DeviceManage.py +++ b/model/ProjectModel/DeviceManage.py @@ -38,12 +38,13 @@ class Device(): self.indexDict = collections.OrderedDict() # 有序字典 键:总区域索引 值: [类型(输入 : 0, 或输出 : 1), 该类型的第几个区域索引] - def addArea(self, type, nums, bytes, order = 'ABCD'): + def addArea(self, type, nums, bytes, order = 'ABCD', valueName = None): area = Area() bytes = int(bytes) area.type = type area.order = order area.bytes = bytes + area.valueName = valueName area.length = self.getLength(nums, bytes) area.nums = nums area.currentValue = [0] * nums @@ -373,7 +374,7 @@ class DevicesManange(): # print(area.currentValue, device.deviceName, area.startAddress,area.endAddress) # print() @classmethod - def addAreas(self, type, order, bytes, deviceName): + def addAreas(self, type, order, bytes, deviceName, valueName = None): jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) if jsonCon == []: jsonCon = ([{ @@ -381,6 +382,7 @@ class DevicesManange(): "type": type, "order": order, "bytes": bytes, + "valueName": valueName, }]) else: @@ -390,12 +392,13 @@ class DevicesManange(): "type": type, "order": order, "bytes": bytes, + "valueName": valueName, }) areaJson = json.dumps(jsonCon) DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() @classmethod - def updataAreas(self, type, order, bytes, deviceName, index): + def updataAreas(self, type, order, bytes, deviceName, valueName, index): jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) if jsonCon == []: return False @@ -405,6 +408,7 @@ class DevicesManange(): area["type"] = type area["order"] = order area["bytes"] = bytes + area["valueName"] = valueName areaJson = json.dumps(jsonCon) DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute()