0523更新

main
ZHANGXUXU\95193 5 months ago
parent ab959dcbab
commit fc81413870

@ -114,7 +114,7 @@ QComboBox#tbcombox::drop-down{
QTabBar::close-button { QTabBar::close-button {
image: url(Static/close.png); image: url(Static/close_black.png);
subcontrol-origin: padding; subcontrol-origin: padding;

@ -72,7 +72,7 @@ class MainTop(QtWidgets.QWidget):
def searchEditTextChanged(self, text): def searchEditTextChanged(self, text):
index = Globals.getValue('SearchWidget') index = Globals.getValue('SearchWidget')
print(index, 'aaaaa') # print(index, 'aaaaa')
if index == 0: if index == 0:
self.MainWindow.rightWidget.widget(index).on_comboBox_currentIndexChanged(1) self.MainWindow.rightWidget.widget(index).on_comboBox_currentIndexChanged(1)
self.MainWindow.rightWidget.widget(index).on_lineEdit_textChanged(text) self.MainWindow.rightWidget.widget(index).on_lineEdit_textChanged(text)

@ -1,6 +1,7 @@
import re import re
import sys import sys
import json import json
from anyio import value
import qtawesome import qtawesome
from PyQt5.QtWidgets import QApplication, QTabWidget, QWidget, QLabel, QPushButton, \ from PyQt5.QtWidgets import QApplication, QTabWidget, QWidget, QLabel, QPushButton, \
@ -64,7 +65,8 @@ class AreaTabWidget(QTabWidget):
for area in areas: for area in areas:
dataType, order = self.tran(area["type"], area["order"]) dataType, order = self.tran(area["type"], area["order"])
channelBytes = area["bytes"] channelBytes = area["bytes"]
settingValue = [dataType, order, channelBytes] valueName = area["valueName"]
settingValue = [dataType, order, channelBytes, valueName]
self.addAreaTab(settingValue=settingValue) self.addAreaTab(settingValue=settingValue)
else: else:
@ -181,6 +183,11 @@ class AreaWidget(QWidget):
self.byteLineEdit.setPlaceholderText('字节长度') self.byteLineEdit.setPlaceholderText('字节长度')
self.byteLineEdit.setObjectName('byteLineEdit') 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 = QPushButton('保存')
self.okBtn.setObjectName('okBtn') self.okBtn.setObjectName('okBtn')
@ -210,8 +217,11 @@ class AreaWidget(QWidget):
self.leftLayout.addWidget(self.orderCombox,4, 1, 2, 1) self.leftLayout.addWidget(self.orderCombox,4, 1, 2, 1)
self.leftLayout.addWidget(self.byteLineLabel,5, 0, 2,1) self.leftLayout.addWidget(self.byteLineLabel,5, 0, 2,1)
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(self.valueNamelabel, 6, 0, 2, 1)
self.leftLayout.addLayout(hLayout, 7, 0, 2, 2) 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) self.leftLayout.setContentsMargins(10, 10, 0, 20)
@ -283,18 +293,22 @@ class AreaWidget(QWidget):
dataType = self.dataTypeCombox.currentText() dataType = self.dataTypeCombox.currentText()
order = self.dataTypeTranslate(self.orderCombox.currentText()) order = self.dataTypeTranslate(self.orderCombox.currentText())
byteLineEdit = self.byteLineEdit.text() byteLineEdit = self.byteLineEdit.text()
valueName = self.valueNameEdit.text()
else: else:
dataTypeIndex = self.settingValue[0] dataTypeIndex = self.settingValue[0]
orderIndex = self.settingValue[1] orderIndex = self.settingValue[1]
byteLineEditIndex = self.settingValue[2] byteLineEditIndex = self.settingValue[2]
valueNameIndex = self.settingValue[3]
self.dataTypeCombox.setCurrentIndex(dataTypeIndex) self.dataTypeCombox.setCurrentIndex(dataTypeIndex)
self.orderCombox.setCurrentIndex(orderIndex) self.orderCombox.setCurrentIndex(orderIndex)
self.byteLineEdit.setText(byteLineEditIndex) self.byteLineEdit.setText(byteLineEditIndex)
self.valueNameEdit.setText(valueNameIndex)
dataType = self.dataTypeCombox.currentText() dataType = self.dataTypeCombox.currentText()
order = self.dataTypeTranslate(self.orderCombox.currentText()) order = self.dataTypeTranslate(self.orderCombox.currentText())
byteLineEdit = self.byteLineEdit.text() byteLineEdit = self.byteLineEdit.text()
valueName = self.valueNameEdit.text()
#判断字节长度的输入是否是数字 #判断字节长度的输入是否是数字
pattern = re.compile(r'^[1-7]$') pattern = re.compile(r'^[1-7]$')
@ -310,6 +324,7 @@ class AreaWidget(QWidget):
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.valueNameEdit.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)
@ -320,6 +335,7 @@ class AreaWidget(QWidget):
self.okBtn.setIcon(qtawesome.icon('fa.save', color='#1fbb6f')) 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.valueNameEdit.setEnabled(True)
self.okBtnValue = True self.okBtnValue = True
return return
@ -333,7 +349,7 @@ class AreaWidget(QWidget):
widget.deleteLater() 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) areaLayout.addWidget(self.rightAreaWidgets)
self.state = False self.state = False
@ -341,15 +357,15 @@ class AreaWidget(QWidget):
areaId = DevicesManange.getAreaID(deviceName) areaId = DevicesManange.getAreaID(deviceName)
if self.settingValue is not None: 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() self.devicesManange.recalculateAddress()
return return
elif areaId is not None and curIndex in areaId: 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)) self.isRead = self.devicesManange.getDevice(deviceName).editArea(index = curIndex, type = dataType, order = order, bytes = int(byteLineEdit))
else: else:
DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName) DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName, valueName)
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() self.devicesManange.recalculateAddress()

@ -167,8 +167,8 @@ class ProfibusWidgets(QWidget):
iconLabel.setPixmap(scaledPixmap) iconLabel.setPixmap(scaledPixmap)
iconLabel.setScaledContents(True) iconLabel.setScaledContents(True)
toolbarLayout.addWidget(iconLabel, 1) # toolbarLayout.addWidget(iconLabel, 1)
toolbarLayout.addWidget(QWidget(), 1) # toolbarLayout.addWidget(QWidget(), 1)
toolbarLayout.addWidget(self.startProtocolBtn, 1) toolbarLayout.addWidget(self.startProtocolBtn, 1)
toolbarLayout.addWidget(self.valueBtn, 1) toolbarLayout.addWidget(self.valueBtn, 1)
toolbarLayout.addWidget(self.switchBtn, 1) toolbarLayout.addWidget(self.switchBtn, 1)

@ -23,7 +23,7 @@ class ForceRadioButton(QRadioButton):
self.number = number self.number = number
class RightAreaWidgets(QWidget): class RightAreaWidgets(QWidget):
def __init__(self, areaWidget, order, byteLineEdit, dataType, deviceName): def __init__(self, areaWidget, order, byteLineEdit, dataType, deviceName, valueName = None):
super().__init__() super().__init__()
self.areaLineEditValue = [] self.areaLineEditValue = []
self.qualityEditValueList = [] self.qualityEditValueList = []
@ -35,6 +35,7 @@ class RightAreaWidgets(QWidget):
self.byteLineEdit = byteLineEdit self.byteLineEdit = byteLineEdit
self.dataType = dataType self.dataType = dataType
self.deviceName = deviceName self.deviceName = deviceName
self.valueName = valueName
if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'): if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'):
self.force = False self.force = False
elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'): elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'):

@ -46,7 +46,7 @@ class RemoteConnectSettingWidget(QWidget):
# 存储两种模式的Widget # 存储两种模式的Widget
self.deviceMasterWidget = DeviceMasterWidget() # 主站模式 self.deviceMasterWidget = DeviceMasterWidget() # 主站模式
self.deviceSlavrWidget = DeviceSlaveWidget() # 从站模式 self.deviceSlaveWidget = DeviceSlaveWidget() # 从站模式
# 初始显示主站模式 # 初始显示主站模式
self.currentWidget = self.deviceMasterWidget self.currentWidget = self.deviceMasterWidget
@ -67,7 +67,7 @@ class RemoteConnectSettingWidget(QWidget):
if mode == "主站模式": if mode == "主站模式":
self.currentWidget = self.deviceMasterWidget self.currentWidget = self.deviceMasterWidget
else: else:
self.currentWidget = self.deviceSlavrWidget self.currentWidget = self.deviceSlaveWidget
# 重新添加Widget保持居中 # 重新添加Widget保持居中
self.contentLayout.insertWidget(1, self.currentWidget) # 插入到两个弹簧中间 self.contentLayout.insertWidget(1, self.currentWidget) # 插入到两个弹簧中间

@ -141,8 +141,8 @@ class DeviceMasterWidget(QMainWindow):
# 在列表中显示设备 # 在列表中显示设备
for server in servers: for server in servers:
item_text = f"{server['hostname']} ({server['ip'][0]}:{server['port']})" itemText = f"{server['hostname']} ({server['ip'][0]})"
self.deviceList.addItem(item_text) self.deviceList.addItem(itemText)
self.connectButton.setEnabled(True) self.connectButton.setEnabled(True)
@ -154,15 +154,7 @@ class DeviceMasterWidget(QMainWindow):
return return
selectedServer = self.servers[selectedIndex] selectedServer = self.servers[selectedIndex]
try: print(selectedServer['ip'][0])
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)}")
def getLocalIp(self): def getLocalIp(self):
for interface in QNetworkInterface.allInterfaces(): for interface in QNetworkInterface.allInterfaces():
@ -198,30 +190,30 @@ class TcpServer(QObject):
logMessage = f"[{currentTime}] {message}" logMessage = f"[{currentTime}] {message}"
self.updateSignal.emit(logMessage) self.updateSignal.emit(logMessage)
def tcpServer(self): # def tcpServer(self):
try: # try:
self.serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # self.serverSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.serverSocket.settimeout(1) # 设置1秒超时 # self.serverSocket.settimeout(1) # 设置1秒超时
self.serverSocket.bind(('0.0.0.0', self.tcpPort)) # self.serverSocket.bind(('0.0.0.0', self.tcpPort))
self.serverSocket.listen(5) # self.serverSocket.listen(5)
self.log(f"TCP服务端已启动监听端口 {self.tcpPort}") # self.log(f"TCP服务端已启动监听端口 {self.tcpPort}")
while self.tcpRunning: # while self.tcpRunning:
try: # try:
clientSock, addr = self.serverSocket.accept() # clientSock, addr = self.serverSocket.accept()
self.log(f"接收到来自 {addr} 的连接") # self.log(f"接收到来自 {addr} 的连接")
clientThread = threading.Thread(target=self.handleClient, args=(clientSock,)) # clientThread = threading.Thread(target=self.handleClient, args=(clientSock,))
clientThread.start() # clientThread.start()
except socket.timeout: # except socket.timeout:
continue # 超时后继续检查运行标志 # continue # 超时后继续检查运行标志
except: # except:
break # break
except Exception as e: # except Exception as e:
self.log(f"TCP服务器错误: {e}") # self.log(f"TCP服务器错误: {e}")
finally: # finally:
if self.serverSocket: # if self.serverSocket:
self.serverSocket.close() # self.serverSocket.close()
self.log("TCP服务端已停止") # self.log("TCP服务端已停止")
def handleClient(self, clientSock): def handleClient(self, clientSock):
try: try:
@ -260,22 +252,22 @@ class TcpServer(QObject):
self.udpSocket.close() self.udpSocket.close()
self.log("UDP发现服务已停止") self.log("UDP发现服务已停止")
def startTcpServer(self): # def startTcpServer(self):
if not self.tcpRunning: # if not self.tcpRunning:
self.tcpRunning = True # self.tcpRunning = True
self.tcpThread = threading.Thread(target=self.tcpServer) # self.tcpThread = threading.Thread(target=self.tcpServer)
self.tcpThread.start() # self.tcpThread.start()
def stopTcpServer(self): # def stopTcpServer(self):
if self.tcpRunning: # if self.tcpRunning:
self.tcpRunning = False # self.tcpRunning = False
# 创建一个临时连接来解除accept阻塞 # # 创建一个临时连接来解除accept阻塞
try: # try:
tempSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # tempSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tempSocket.connect(('127.0.0.1', self.tcpPort)) # tempSocket.connect(('127.0.0.1', self.tcpPort))
tempSocket.close() # tempSocket.close()
except: # except:
pass # pass
def startUdpServer(self): def startUdpServer(self):
if not self.udpRunning: if not self.udpRunning:
@ -310,10 +302,10 @@ class DeviceSlaveWidget(QMainWindow):
mainLayout = QVBoxLayout() mainLayout = QVBoxLayout()
# 控制按钮 # 控制按钮
self.tcpButton = QPushButton("启动 TCP 服务器") # self.tcpButton = QPushButton("启动 TCP 服务器")
self.tcpButton.clicked.connect(self.toggleTcpServer) # self.tcpButton.clicked.connect(self.toggleTcpServer)
self.tcpButton.setObjectName('setButton') # self.tcpButton.setObjectName('setButton')
self.udpButton = QPushButton("启动 UDP 发现服务") self.udpButton = QPushButton("开启远程通讯模式")
self.udpButton.clicked.connect(self.toggleUdpServer) self.udpButton.clicked.connect(self.toggleUdpServer)
self.udpButton.setObjectName('setButton') self.udpButton.setObjectName('setButton')
# 日志显示 # 日志显示
@ -321,7 +313,7 @@ class DeviceSlaveWidget(QMainWindow):
self.logDisplay.setReadOnly(True) self.logDisplay.setReadOnly(True)
# 添加到布局 # 添加到布局
mainLayout.addWidget(self.tcpButton) # mainLayout.addWidget(self.tcpButton)
mainLayout.addWidget(self.udpButton) mainLayout.addWidget(self.udpButton)
mainLayout.addWidget(QLabel("服务器日志:")) mainLayout.addWidget(QLabel("服务器日志:"))
mainLayout.addWidget(self.logDisplay) mainLayout.addWidget(self.logDisplay)
@ -334,18 +326,18 @@ class DeviceSlaveWidget(QMainWindow):
def toggleTcpServer(self): def toggleTcpServer(self):
if self.server.tcpRunning: if self.server.tcpRunning:
self.server.stopTcpServer() self.server.stopTcpServer()
self.tcpButton.setText("启动 TCP 服务器") # self.tcpButton.setText("启动 TCP 服务器")
else: else:
self.server.startTcpServer() self.server.startTcpServer()
self.tcpButton.setText("停止 TCP 服务器") # self.tcpButton.setText("停止 TCP 服务器")
def toggleUdpServer(self): def toggleUdpServer(self):
if self.server.udpRunning: if self.server.udpRunning:
self.server.stopUdpServer() self.server.stopUdpServer()
self.udpButton.setText("启动 UDP 发现服务") self.udpButton.setText("开启远程通讯模式")
else: else:
self.server.startUdpServer() self.server.startUdpServer()
self.udpButton.setText("停止 UDP 发现服务") self.udpButton.setText("关闭远程通讯模式")
def updateLog(self, message): def updateLog(self, message):
self.logDisplay.append(message) self.logDisplay.append(message)

@ -38,12 +38,13 @@ class Device():
self.indexDict = collections.OrderedDict() self.indexDict = collections.OrderedDict()
# 有序字典 键:总区域索引 值: [类型(输入 : 0, 或输出 : 1), 该类型的第几个区域索引] # 有序字典 键:总区域索引 值: [类型(输入 : 0, 或输出 : 1), 该类型的第几个区域索引]
def addArea(self, type, nums, bytes, order = 'ABCD'): def addArea(self, type, nums, bytes, order = 'ABCD', valueName = None):
area = Area() area = Area()
bytes = int(bytes) bytes = int(bytes)
area.type = type area.type = type
area.order = order area.order = order
area.bytes = bytes area.bytes = bytes
area.valueName = valueName
area.length = self.getLength(nums, bytes) area.length = self.getLength(nums, bytes)
area.nums = nums area.nums = nums
area.currentValue = [0] * nums area.currentValue = [0] * nums
@ -373,7 +374,7 @@ class DevicesManange():
# 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, valueName = None):
jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
if jsonCon == []: if jsonCon == []:
jsonCon = ([{ jsonCon = ([{
@ -381,6 +382,7 @@ class DevicesManange():
"type": type, "type": type,
"order": order, "order": order,
"bytes": bytes, "bytes": bytes,
"valueName": valueName,
}]) }])
else: else:
@ -390,12 +392,13 @@ class DevicesManange():
"type": type, "type": type,
"order": order, "order": order,
"bytes": bytes, "bytes": bytes,
"valueName": valueName,
}) })
areaJson = json.dumps(jsonCon) areaJson = json.dumps(jsonCon)
DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute()
@classmethod @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) jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
if jsonCon == []: if jsonCon == []:
return False return False
@ -405,6 +408,7 @@ class DevicesManange():
area["type"] = type area["type"] = type
area["order"] = order area["order"] = order
area["bytes"] = bytes area["bytes"] = bytes
area["valueName"] = valueName
areaJson = json.dumps(jsonCon) areaJson = json.dumps(jsonCon)
DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute()

Loading…
Cancel
Save