0813更新

main
parent 605c398f55
commit d9995cc51d

@ -49,7 +49,7 @@ class TbCombox(QComboBox):
def initUI(self): def initUI(self):
# 创建ComboBox # 创建ComboBox
self.addItems(["压力转换块", "温度转换块", "物位转换块", "流量转换块"]) self.addItems(["压力转换块", "温度转换块", "物位转换块", "流量转换块", 'WIKA液位计'])
self.setEditable(True) # 设置为可编辑以应用样式表隐藏文本 self.setEditable(True) # 设置为可编辑以应用样式表隐藏文本
self.setObjectName('tbcombox') self.setObjectName('tbcombox')
@ -79,8 +79,8 @@ class DynamicAddBlock(QHBoxLayout):
self.blockViewlist = [] self.blockViewlist = []
self.tbtypeList = TbtypeList #存放转换块的各种类型 self.tbtypeList = TbtypeList #存放转换块的各种类型
# print(self.tbtypeList) # print(self.tbtypeList)
self.tbList = ['PressureTranslationBlock', 'TemperatureTranslationBlock', 'LevelTranslationBlock', 'FlowTranslationBlock'] #存放四个转换块 self.tbList = ['PressureTranslationBlock', 'TemperatureTranslationBlock', 'LevelTranslationBlock', 'FlowTranslationBlock', 'WiKaLevelTranslationBlock'] #存放四个转换块
self.enumList = [TBType.pressureTB, TBType.tempTB, TBType.levelTB, TBType.flowTB] self.enumList = [TBType.pressureTB, TBType.tempTB, TBType.levelTB, TBType.flowTB, TBType.wikaLevelTB]
self.initUI() self.initUI()
def initUI(self): def initUI(self):
@ -88,6 +88,7 @@ class DynamicAddBlock(QHBoxLayout):
tbNumber = self.blocklist[1] tbNumber = self.blocklist[1]
fbNumber = self.blocklist[2] fbNumber = self.blocklist[2]
for i in range(pbNumber): for i in range(pbNumber):
pblockBtn = QPushButton('物理块') pblockBtn = QPushButton('物理块')
@ -113,7 +114,7 @@ class DynamicAddBlock(QHBoxLayout):
fblockBtn.setObjectName("parameBtn") fblockBtn.setObjectName("parameBtn")
fblockBtn.setIcon(qtawesome.icon('fa.th-large', color='#1fbb6f')) fblockBtn.setIcon(qtawesome.icon('fa.th-large', color='#1fbb6f'))
fblockBtn.clicked.connect(lambda _, fbbtn = fblockBtn: self.switchParameterWidget(fbbtn)) fblockBtn.clicked.connect(lambda _, fbbtn = fblockBtn: self.switchParameterWidget(fbbtn))
# self.addWidget(fblockBtn, 3) self.addWidget(fblockBtn, 3)
self.buttonlist.append(fblockBtn) self.buttonlist.append(fblockBtn)
aiFunctionBlockView = ParmView(AIFunctionBlock, i, BlockType.FB) aiFunctionBlockView = ParmView(AIFunctionBlock, i, BlockType.FB)
self.blockViewlist.append(aiFunctionBlockView) self.blockViewlist.append(aiFunctionBlockView)
@ -140,6 +141,13 @@ class DynamicAddBlock(QHBoxLayout):
case TBType.flowTB: case TBType.flowTB:
tbcombox.setCurrentIndex(3) tbcombox.setCurrentIndex(3)
tblockBtn = QPushButton(tbcombox.currentText() + str(i + 1)) tblockBtn = QPushButton(tbcombox.currentText() + str(i + 1))
case None:
tbcombox.setCurrentIndex(4)
tblockBtn = QPushButton(tbcombox.currentText() + str(i + 1))
print(1)
# tbcombox.setCurrentIndex(0) # tbcombox.setCurrentIndex(0)
# tblockBtn = QPushButton('压力转换块' + str(i + 1)) # tblockBtn = QPushButton('压力转换块' + str(i + 1))
@ -160,6 +168,7 @@ class DynamicAddBlock(QHBoxLayout):
tbBlockView = ParmView(globals()[tb], i, enum) tbBlockView = ParmView(globals()[tb], i, enum)
self.blockViewlist.append(tbBlockView) self.blockViewlist.append(tbBlockView)
self.parameterButtonGroup = QButtonGroup() self.parameterButtonGroup = QButtonGroup()
self.parameterButtonGroup.setExclusive(True) self.parameterButtonGroup.setExclusive(True)
for button in self.buttonlist: for button in self.buttonlist:
@ -181,8 +190,8 @@ class DynamicAddBlock(QHBoxLayout):
buttonNumber = button.text()[-1] buttonNumber = button.text()[-1]
button.setText(tbType + str(buttonNumber)) button.setText(tbType + str(buttonNumber))
if button.isChecked(): if button.isChecked():
stackIndex = (int(self.blocklist[0]) + int(self.blocklist[2]) + index) + (int(buttonNumber) - 1) * 4 stackIndex = (int(self.blocklist[0]) + int(self.blocklist[2]) + index) + (int(buttonNumber) - 1) * 5
print(stackIndex)
self.parameStackWidget.setCurrentIndex(stackIndex) self.parameStackWidget.setCurrentIndex(stackIndex)
@ -276,46 +285,62 @@ class BlockParameterManageWidget(QWidget):
self.setLayout(self.mainlayout) self.setLayout(self.mainlayout)
def loadBlackData(self): def loadBlackData(self):
address = self.deviceAddressEdit.text()
# print(address)
if address:
pattern = re.compile(r'^(?:[1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-7])$')
match = pattern.match(address)
else:
reply = QMessageBox.question(self.parent(),
'警告',
"请输入从站地址",
QMessageBox.Yes)
return
if not match:
QMessageBox.warning(self, '提示', '请输入2 - 127。')
return
if self.initUIstat: if self.initUIstat:
address = self.deviceAddressEdit.text() try:
# print(address)
if address: self.blockManage = BlockManage(self._isPa, int(address))
pattern = re.compile(r'^(?:[1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-7])$')
match = pattern.match(address) except Exception as e:
if not match:
QMessageBox.warning(self, '提示', '请输入2 - 127。')
return
if self.initUIstat:
try:
self.blockManage = BlockManage(self._isPa, int(address))
except Exception as e:
reply = QMessageBox.question(self.parent(),
'警告',
f"发生错误: {e}",
QMessageBox.Yes)
return
self.splitter.deleteLater()
self.widget.deleteLater()
self.splitter = QSplitter()
Globals.setValue('blockManage', self.blockManage)
blocklist = self.blockManage.getBlockNums()
self.blockLayout = DynamicAddBlock(blocklist, self.blockManage.TBTypeList)
self.settingLayout.addLayout(self.blockLayout, 7)
self.settingLayout.addWidget(self.splitter, 11)
self.mainlayout.addWidget(self.blockLayout.parameStackWidget, 20)
self.initUIstat = False
else:
reply = QMessageBox.question(self.parent(), reply = QMessageBox.question(self.parent(),
'警告', '警告',
"请输入从站地址", f"发生错误: {e}",
QMessageBox.Yes) QMessageBox.Yes)
return return
self.splitter.deleteLater()
self.widget.deleteLater()
self.splitter = QSplitter()
Globals.setValue('blockManage', self.blockManage)
blocklist = self.blockManage.getBlockNums()
self.blockLayout = DynamicAddBlock(blocklist, self.blockManage.TBTypeList)
self.settingLayout.addLayout(self.blockLayout, 7)
self.settingLayout.addWidget(self.splitter, 11)
self.mainlayout.addWidget(self.blockLayout.parameStackWidget, 20)
self.initUIstat = False
self.recordAddress = address #记录链接成功的站地址
else: else:
reply = QMessageBox.question(self, '确定', '确定更换站地址吗?', reply = QMessageBox.question(self, '确定', '确定更换站地址吗?',
QMessageBox.Yes | QMessageBox.No, QMessageBox.No) QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes: if reply == QMessageBox.Yes:
try:
self.blockManage = BlockManage(self._isPa, int(address))
except Exception as e:
reply = QMessageBox.question(self.parent(),
'警告',
f"发生错误: {e}",
QMessageBox.Yes)
self.deviceAddressEdit.setText(self.recordAddress)
return
self.blockLayout.deleteLater() self.blockLayout.deleteLater()
self.splitter.deleteLater() self.splitter.deleteLater()
self.splitter = QSplitter() self.splitter = QSplitter()
@ -326,6 +351,7 @@ class BlockParameterManageWidget(QWidget):
self.settingLayout.addLayout(self.blockLayout, 7) self.settingLayout.addLayout(self.blockLayout, 7)
self.settingLayout.addWidget(self.splitter, 11) self.settingLayout.addWidget(self.splitter, 11)
self.mainlayout.addWidget(self.blockLayout.parameStackWidget, 20) self.mainlayout.addWidget(self.blockLayout.parameStackWidget, 20)
self.recordAddress = address #记录链接成功的站地址
else: else:
return return

@ -179,6 +179,7 @@ class EditAddressWidget(QDialog):
return return
identNumber = self.GSDData[self.deviceTypeCombox.currentIndex()]['identNumber'] identNumber = self.GSDData[self.deviceTypeCombox.currentIndex()]['identNumber']
print(identNumber)
oldAddress = int(oldAddress) oldAddress = int(oldAddress)
newAddress = int(newAddress) newAddress = int(newAddress)
result = self.DPV1Master.editDevAddress(oldAddress, newAddress, identNumber) result = self.DPV1Master.editDevAddress(oldAddress, newAddress, identNumber)

@ -109,11 +109,18 @@ class MainWindow(QWidget):
self.switchBtn = QPushButton('通讯组态') self.switchBtn = QPushButton('通讯组态')
self.switchBtn.setObjectName("switchBtn") self.switchBtn.setObjectName("switchBtn")
self.switchBtn.setIcon(qtawesome.icon('fa.exchange', color='#1fbb6f')) self.switchBtn.setIcon(qtawesome.icon('msc.circuit-board', color='#1fbb6f'))
self.switchBtn.setIconSize(QSize(25, 25)) self.switchBtn.setIconSize(QSize(25, 25))
self.switchBtn.setCheckable(True) self.switchBtn.setCheckable(True)
self.switchBtn.clicked.connect(self.switchWidget) self.switchBtn.clicked.connect(self.switchWidget)
self.valueBtn = QPushButton('变量读写')
self.valueBtn.setObjectName("switchBtn")
self.valueBtn.setIcon(qtawesome.icon('fa.pencil', color='#1fbb6f'))
self.valueBtn.setIconSize(QSize(25, 25))
self.valueBtn.setCheckable(True)
self.deviceParameterManageBtn = QPushButton('设备参数管理') self.deviceParameterManageBtn = QPushButton('设备参数管理')
self.deviceParameterManageBtn.setObjectName('deviceParameterManageBtn') self.deviceParameterManageBtn.setObjectName('deviceParameterManageBtn')
self.deviceParameterManageBtn.setIcon(qtawesome.icon('fa.gears', color='#1fbb6f')) self.deviceParameterManageBtn.setIcon(qtawesome.icon('fa.gears', color='#1fbb6f'))
@ -160,6 +167,7 @@ class MainWindow(QWidget):
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.switchBtn, 1) toolbarLayout.addWidget(self.switchBtn, 1)
toolbarLayout.addWidget(self.switchTouchBtn, 1) toolbarLayout.addWidget(self.switchTouchBtn, 1)
toolbarLayout.addWidget(self.deviceParameterManageBtn, 1) toolbarLayout.addWidget(self.deviceParameterManageBtn, 1)
@ -203,6 +211,7 @@ class MainWindow(QWidget):
self.stackWidget.addWidget(self.upperWidget) self.stackWidget.addWidget(self.upperWidget)
self.stackWidget.addWidget(QWidget()) self.stackWidget.addWidget(QWidget())
self.stackWidget.addWidget(self.blockParameterManageWidget) self.stackWidget.addWidget(self.blockParameterManageWidget)
self.valueBtn.clicked.connect(lambda : self.stackWidget.setCurrentIndex(0))
self.mainLayout = QVBoxLayout(self) self.mainLayout = QVBoxLayout(self)
self.mainLayout.addLayout(toolbarLayout, 1) self.mainLayout.addLayout(toolbarLayout, 1)
@ -283,30 +292,26 @@ class MainWindow(QWidget):
def searchSlave(self): def searchSlave(self):
address = self.dpv1Master.searchSlave() address = self.dpv1Master.searchSlave()
if address == '读取错误':
self.dpv1Master = DPV1Master('192.168.3.10', 502)
self.addressLabel.setText('在线仪表地址:')
self.addressLabel.setText('在线仪表地址:{}'.format(address)) self.addressLabel.setText('在线仪表地址:{}'.format(address))
def switchWidget(self): def switchWidget(self):
if self.switchBtn.isChecked():
if self.process: if self.process:
self.stackWidget.setCurrentIndex(1) self.stackWidget.setCurrentIndex(1)
QTimer.singleShot(50, lambda:self.stackWidget.setCurrentIndex(3)) QTimer.singleShot(50, lambda:self.stackWidget.setCurrentIndex(3))
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.showMaximized()
# self.switchBtn.setIcon(QIcon(':/static/varMagH.png'))
else: else:
# self.stackWidget.setCurrentIndex(1) self.stackWidget.setCurrentIndex(1)
self.stackWidget.setCurrentIndex(0) startupInfo = subprocess.STARTUPINFO()
self.switchBtn.setText('通讯组态') startupInfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
# self.switchBtn.setIcon(QIcon(':/static/newH.png')) startupInfo.wShowWindow = 2
self.process = subprocess.Popen("D:\\EnTalk PROFIBUS Manager\\DP.exe",startupinfo=startupInfo)
QTimer.singleShot(500, lambda:self.showLowerWidget(self.process))
self.showMaximized()
# self.switchBtn.setIcon(QIcon(':/static/varMagH.png'))
def switchDeviceParManageWidget(self): def switchDeviceParManageWidget(self):

@ -18,6 +18,6 @@ class Client(object):
else: else:
self.deviceDB = SqliteDatabase(dbPath) self.deviceDB = SqliteDatabase(dbPath)
client_proxy.initialize(self.deviceDB) client_proxy.initialize(self.deviceDB)
modelsArr = [DeviceDB, PressureTranslationBlock, PhysicalBlock, AIFunctionBlock, TemperatureTranslationBlock, LevelTranslationBlock, FlowTranslationBlock, UnitTable] modelsArr = [DeviceDB, PressureTranslationBlock, PhysicalBlock, AIFunctionBlock, TemperatureTranslationBlock, LevelTranslationBlock, FlowTranslationBlock, WiKaLevelTranslationBlock, UnitTable]
self.deviceDB.connect() self.deviceDB.connect()
self.deviceDB.create_tables(modelsArr, safe = True) self.deviceDB.create_tables(modelsArr, safe = True)

@ -39,6 +39,7 @@ class TBType(Enum):
tempTB = -2 tempTB = -2
levelTB = -3 # 物位转换块 levelTB = -3 # 物位转换块
pressureTB = -4 pressureTB = -4
wikaLevelTB = -5
class BlockManage(): class BlockManage():
_instance = None _instance = None
@ -73,6 +74,7 @@ class BlockManage():
def initBlocks(self): def initBlocks(self):
# print(self._isPa,5555) # print(self._isPa,5555)
if not self.DPV1Master.judgeSlave(self.address): if not self.DPV1Master.judgeSlave(self.address):
print(self.address)
raise RuntimeError(f"连接从站{self.address}失败.") raise RuntimeError(f"连接从站{self.address}失败.")
self.blockDict = { self.blockDict = {
BlockType.PB : [], BlockType.PB : [],
@ -117,7 +119,7 @@ class BlockManage():
else: else:
data = self.DPV1Master.readParm(address = self.address, slot = 1, index = key, length = 4 * value) data = self.DPV1Master.readParm(address = self.address, slot = 1, index = key, length = 4 * value)
# print(data, int(len(data)/2)) # print(data, int(len(data)/2))
print(data) # print(data)
data = struct.unpack('>{}h'.format(int(len(data)/2)), data) data = struct.unpack('>{}h'.format(int(len(data)/2)), data)
tuples = [(data[i], data[i+1]) for i in range(0, len(data), 2)] tuples = [(data[i], data[i+1]) for i in range(0, len(data), 2)]
entryTuples += tuples entryTuples += tuples
@ -213,6 +215,7 @@ class Block():
TBType.pressureTB: PressureTranslationBlock.getallParame, TBType.pressureTB: PressureTranslationBlock.getallParame,
TBType.tempTB: TemperatureTranslationBlock.getallParame, TBType.tempTB: TemperatureTranslationBlock.getallParame,
TBType.levelTB: LevelTranslationBlock.getallParame, TBType.levelTB: LevelTranslationBlock.getallParame,
TBType.wikaLevelTB: WiKaLevelTranslationBlock.getallParame
}.get(self.blockType, lambda: []) }.get(self.blockType, lambda: [])
parmsData = getParmsFunc() parmsData = getParmsFunc()

@ -65,6 +65,8 @@ class DPV1Master():
# self.searchSlaveThread = SearchSlaveThread(callback = callback, master = self) # self.searchSlaveThread = SearchSlaveThread(callback = callback, master = self)
# self.searchSlaveThread.start() # self.searchSlaveThread.start()
data = self.readHoldingRegisters(1, 850, 64) data = self.readHoldingRegisters(1, 850, 64)
if data == '读取错误':
return data
dataHex = struct.pack('>64h', *data) dataHex = struct.pack('>64h', *data)
indices = [i for i, byte in enumerate(dataHex) if byte == 1] indices = [i for i, byte in enumerate(dataHex) if byte == 1]
return "".join(map(str, indices)) return "".join(map(str, indices))
@ -123,8 +125,11 @@ class DPV1Master():
return result return result
def judgeSlave(self, address): def judgeSlave(self, address):
# print(type(address))
hexAddress = address.to_bytes(1, byteorder='little') hexAddress = address.to_bytes(1, byteorder='little')
searchByteStream = b'\x01' + hexAddress + b'\x01\x00\xF0\x00' searchByteStream = b'\x01' + hexAddress + b'\x01\x01\xF0\x00'
# print(searchByteStream)
searchDate = struct.unpack('>hhh', searchByteStream) searchDate = struct.unpack('>hhh', searchByteStream)
self.writeMultipleRegister(1, 750, searchDate) self.writeMultipleRegister(1, 750, searchDate)
time.sleep(1.1) time.sleep(1.1)
@ -133,6 +138,7 @@ class DPV1Master():
# print(dir) # print(dir)
self.writeMultipleRegister(1, 750, self.resetData) self.writeMultipleRegister(1, 750, self.resetData)
time.sleep(0.1) time.sleep(0.1)
# print(dir)
if not self.areAllZeros(dir) and dir != 'error': if not self.areAllZeros(dir) and dir != 'error':
return True return True
else: else:
@ -143,8 +149,8 @@ class DPV1Master():
newAddressHex = newAddress.to_bytes(1, byteorder='little') newAddressHex = newAddress.to_bytes(1, byteorder='little')
closeProtocolHex = b'\x05\x00' closeProtocolHex = b'\x05\x00'
closeProtocolData = struct.unpack('>h', closeProtocolHex) closeProtocolData = struct.unpack('>h', closeProtocolHex)
self.writeMultipleRegister(1, 750, closeProtocolHex) self.writeMultipleRegister(1, 750, closeProtocolData)
time.sleep(0.4) time.sleep(1)
# print(identNumer) # print(identNumer)
idHighHex = int(identNumer[:2], 16).to_bytes(1, byteorder='little') idHighHex = int(identNumer[:2], 16).to_bytes(1, byteorder='little')
idLowHex = int(identNumer[2:], 16).to_bytes(1, byteorder='little') idLowHex = int(identNumer[2:], 16).to_bytes(1, byteorder='little')
@ -153,6 +159,7 @@ class DPV1Master():
editAddressDate = struct.unpack('>hhhh', editAddressStream) editAddressDate = struct.unpack('>hhhh', editAddressStream)
# print(editAddressDate) # print(editAddressDate)
self.writeMultipleRegister(1, 750, self.resetData) self.writeMultipleRegister(1, 750, self.resetData)
time.sleep(0.2)
self.writeMultipleRegister(1, 750, editAddressDate) self.writeMultipleRegister(1, 750, editAddressDate)
time.sleep(0.4) time.sleep(0.4)
value = self.readHoldingRegisters(1, 750, 2) value = self.readHoldingRegisters(1, 750, 2)
@ -160,6 +167,10 @@ class DPV1Master():
result = '修改错误' result = '修改错误'
else: else:
result = '修改成功' result = '修改成功'
openProtocolHex = b'\x05\x01'
openProtocolData = struct.unpack('>h', openProtocolHex)
self.writeMultipleRegister(1, 750, openProtocolData)
time.sleep(0.2)
self.writeMultipleRegister(1, 750, self.resetData) self.writeMultipleRegister(1, 750, self.resetData)
time.sleep(0.1) time.sleep(0.1)
return result return result

@ -141,6 +141,18 @@ class FlowTranslationBlock(PressureTranslationBlock):
transferType = CharField() transferType = CharField()
description = CharField() description = CharField()
createTime = CharField() createTime = CharField()
class WiKaLevelTranslationBlock(PressureTranslationBlock):
index = CharField()
paramName = CharField()
objectType = CharField()
dataType = CharField()
saveType = CharField()
dataSize = CharField()
accessType = CharField()
transferType = CharField()
description = CharField()
createTime = CharField()
class UnitTable(BaseModel): class UnitTable(BaseModel):

Loading…
Cancel
Save