0523更新

main
ZHANGXUXU\95193 5 months ago
parent ab959dcbab
commit fc81413870

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

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

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

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

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

@ -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) # 插入到两个弹簧中间

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

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

Loading…
Cancel
Save