From b0a73b83b1d046a13da328fdfadc78e59b8ff749 Mon Sep 17 00:00:00 2001 From: "ADMINISTRATOR\\Administrator" <951937200@qq.com> Date: Wed, 5 Jun 2024 12:17:41 +0800 Subject: [PATCH] =?UTF-8?q?0605=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- UI/SearchAddressWidget.py | 41 +++++++---------- model/ProjectModel/BlockManage.py | 76 +++++++++++++++++++++++++++++-- protocol/ModBus/DPV1Master.py | 19 +++++--- utils/DBModels/DeviceParModels.py | 2 +- utils/DBModels/InitParameterDB.py | 2 +- 5 files changed, 103 insertions(+), 37 deletions(-) diff --git a/UI/SearchAddressWidget.py b/UI/SearchAddressWidget.py index 511608a..2028d52 100644 --- a/UI/SearchAddressWidget.py +++ b/UI/SearchAddressWidget.py @@ -8,7 +8,9 @@ from PyQt5.Qt import * from PyQt5.QtWidgets import QHBoxLayout, QVBoxLayout, \ QApplication, QLineEdit, QWidget, QTableWidget, QSplitter,QVBoxLayout,QPushButton, QProgressBar, QTableWidgetItem, QMessageBox -from PyQt5.QtWidgets import QDialog +from PyQt5.QtWidgets import QDialog, QListWidgetItem + +from protocol.ModBus.DPV1Master import DPV1Master class SearchAddressWidget(QWidget): def __init__(self, deviceAddressEdit): @@ -20,22 +22,7 @@ class SearchAddressWidget(QWidget): def initUI(self): self.resize(800, 500) self.setObjectName('deviceDialog') - self.addressTabWidget = QTableWidget() - self.addressTabWidget.setRowCount(10) - self.addressTabWidget.setColumnCount(1) - - self.addressTabWidget.setShowGrid(False) #隐藏网格线 - self.addressTabWidget.horizontalHeader().setVisible(False) # 隐藏水平表头 - self.addressTabWidget.verticalHeader().setVisible(False) # 隐藏垂直表头 - self.header = self.addressTabWidget.horizontalHeader() - self.header.setStretchLastSection(True) #设置最后一列顶格 - self.addressTabWidget.setFocusPolicy(Qt.NoFocus) #取消选中焦点,去掉虚线框 - self.addressTabWidget.setEditTriggers(QTableWidget.NoEditTriggers) - self.addressTabWidget.cellClicked.connect(self.onCellClicked) - self.addressTabWidget.cellDoubleClicked.connect(lambda row, column: self.onCellClicked(row, column, True)) - - self.item = QTableWidgetItem('16') - self.addressTabWidget.setItem(0, 0, self.item) + self.addressListWidget = QListWidget() self.mainlayout = QVBoxLayout() self.progressBar = QProgressBar(self) @@ -51,24 +38,28 @@ class SearchAddressWidget(QWidget): self.bottomLayout.addWidget(self.cancelBtn) self.mainlayout.addWidget(self.progressBar) - self.mainlayout.addWidget(self.addressTabWidget) + self.mainlayout.addWidget(self.addressListWidget) self.mainlayout.addLayout(self.bottomLayout) self.setLayout(self.mainlayout) self.setWindowTitle('从站地址查找') - - self.timer = QTimer() - self.timer.timeout.connect(self.updateProgress) - self.timer.start(500) + + test = DPV1Master('192.168.3.10', 502) + test.searchMaster(self.updateProgress) + # self.timer = QTimer() + # self.timer.timeout.connect(self.updateProgress) + # self.timer.start(500) - def updateProgress(self): + def updateProgress(self, address, isSlave): # 模拟一个任务,逐步更新进度条 - self.progressBar.setValue(int(125 * (100/125))) + self.progressBar.setValue(int(address * (100/125))) + if isSlave: + self.addressListWidget.addItem(QListWidgetItem(str(address))) # QApplication.processEvents() # 确保UI及时更新 # QTimer.singleShot(100, lambda: None) # 暂停一小段时间,模拟任务执行时间 def onCellClicked(self, row, column, double = False): - item = self.addressTabWidget.item(row, column) + item = self.addressListWidget.item(row, column) if item: self.address = item.text() if double: diff --git a/model/ProjectModel/BlockManage.py b/model/ProjectModel/BlockManage.py index 45f1ccc..b8cdc40 100644 --- a/model/ProjectModel/BlockManage.py +++ b/model/ProjectModel/BlockManage.py @@ -1,7 +1,13 @@ +import sys +sys.path.append('../../') + +import struct + from enum import Enum from utils.DBModels.DeviceParModels import * from protocol.ModBus.DPV1Master import DPV1Master + class BlockType(Enum): PB = 0 TB = 1 @@ -11,16 +17,78 @@ class BlockManage(): address = 66 def __init__(self): self.DPV1Master = DPV1Master('192.168.3.10', 502) + self.blockDict = { + BlockType.PB : [], + BlockType.TB : [], + BlockType.FB : [], + } + self.initBlocks() - def readDir(self): - dirHeadBytes = self.DPV1Master.readParm(address = self.address, slot = 1, index = 0, length = 12) + def initBlocks(self): + dirHeadDatas = self.DPV1Master.readParm(address = self.address, slot = 1, index = 0, length = 12) + DirID = dirHeadDatas[0] # 目录id + DirRevNum = dirHeadDatas[1] # 目录版本号 + NumDirObj = dirHeadDatas[2] # 目录对象的个数 (如果整个目录使用多于一个目录对象, + # 则这此元素被连续定义,就如同使用一个较大的对象。 + # 多个目录对象都被连续地列在该目录中。该对象计数整个目录所需的对象。Header对象不计人其) + NumDirEntry = dirHeadDatas[3] # 目录登录项的总数 (应计算复合列表目录登录项和复合目录登录项的总个数;实际块数量为NumDirEntry - 3) + FirstCompListDirEntry = dirHeadDatas[4] # 第1个复合列表目录登录项的目录登录项个数 (该数用来计数目录内的登录项, 而不包含该登 + # 录项的参数地址。第1 个目录登录项是在复合列表目录登录项中的物理块引用。在计数登录 + # 项时,复合列表目录登录项与复合目录登录项之间无间隔) + NumCompListDirEntry = dirHeadDatas[5] # 功能块类型数量 复合列表目录登录项的个数 计数设备内的不同块类型(物理块、转换块和功能块)和对象类型 + #(在本标准范围内仅针对链接对象) + + dirLength = 4 * NumDirEntry + dirDatas = self.DPV1Master.readParm(address = self.address, slot = 1, index = 1, length = dirLength) + entryTuples = [(dirDatas[i], dirDatas[i+1]) for i in range(0, len(dirDatas), 2)] + + for typ in [BlockType.PB, BlockType.TB, BlockType.FB]: + typeIndex = typ.value + blkDirMesByte = struct.pack('>h', entryTuples[typeIndex][0]) + blkIndex = int(blkDirMesByte[0]) # 目录对象编号 + blkoffect = int(blkDirMesByte[1]) # 块从第几个Dir_Entry开始 + numBlk = entryTuples[typeIndex][1] # 块数量 + # print(blkIndex, blkoffect, numBlk) + for i in range(numBlk): + blkEntryListIndex = blkoffect - 1 + i + blkPointerByte = struct.pack('>h', entryTuples[blkEntryListIndex][0]) + numBlkParms = entryTuples[blkEntryListIndex][1] + blkSlot = int(blkPointerByte[0]) + blkStartIndex = int(blkPointerByte[1]) + + block = Block(typ) + block.slot = blkSlot + block.startAddress = blkStartIndex + block.numParms = numBlkParms + self.blockDict[typ].append(block) + # print(blkSlot, blkIndex) + print(self.blockDict) + + + + class Block(): slot = None startIndex = None + numParms = None def __init__(self, blockType): self.parms = [] self.blockType = blockType + self.addParms() - def addParms(self, data): - pass \ No newline at end of file + def addParms(self): + pass + # getParmsFunc = { + # BlockType.PB: PhysicalBlock.getallParame, + # BlockType.TB: AIFunctionBlock.getallParame, + # BlockType.FB: PressureTranslationBlock.getallParame, + # }.get(self.blockType, lambda: []) + + # parms_data = getParmsFunc() + + + +if __name__ == '__main__': + b = BlockManage() + # b.initBlock() \ No newline at end of file diff --git a/protocol/ModBus/DPV1Master.py b/protocol/ModBus/DPV1Master.py index 97e2010..b27d037 100644 --- a/protocol/ModBus/DPV1Master.py +++ b/protocol/ModBus/DPV1Master.py @@ -44,16 +44,19 @@ class DPV1Master(): addressList = [] for address in range(1, 126): hexAddress = address.to_bytes(1, byteorder='little') - searchByteStream = b'\x01' + hexAddress + b'\x01\x01\xF0\x00' + searchByteStream = b'\x01' + hexAddress + b'\x01\x00\xF0\x00' searchDate = struct.unpack('>hhh', searchByteStream) self.writeMultipleRegister(1, 750, searchDate) time.sleep(0.3) - dir = self.readHoldingRegisters(1, 750, 10) - if not self.areAllZeros(dir): - addressList.append(address) + dir = self.readHoldingRegisters(1, 750, 6) + if not self.areAllZeros(dir): + callback(address, True) + else: + callback(address, False) self.writeMultipleRegister(1, 750, self.resetData) time.sleep(0.1) - callback(addressList) + # print(address, dir) + # if callable(callback): t = threading.Thread(target=search) t.start() @@ -68,8 +71,11 @@ class DPV1Master(): time.sleep(0.3) value = self.readHoldingRegisters(1, 750, -(-length // 2)) # -(-length // 2)向上取整 self.writeMultipleRegister(1, 750, self.resetData) + time.sleep(0.1) if callable(callback): callback(value) + return + return value @@ -127,7 +133,8 @@ class DPV1Master(): if __name__ == "__main__": - tcpMaster = DPV1Master('127.0.0.1', 502) + tcpMaster = DPV1Master('192.168.3.10', 502) + tcpMaster.searchMaster() # tcpMaster.readHoldingRegisters(1, 6, 2) # tcpMaster.master.execute(1, cst.WRITE_MULTIPLE_REGISTERS, starting_address=0, output_value=[1,2,3,4,5]) # diff --git a/utils/DBModels/DeviceParModels.py b/utils/DBModels/DeviceParModels.py index b0c7fae..54c2b25 100644 --- a/utils/DBModels/DeviceParModels.py +++ b/utils/DBModels/DeviceParModels.py @@ -3,7 +3,7 @@ import os import datetime from peewee import * import json -import pandas as pd + from utils.DBModels.BaseModel import BaseModel diff --git a/utils/DBModels/InitParameterDB.py b/utils/DBModels/InitParameterDB.py index f584320..a43d65c 100644 --- a/utils/DBModels/InitParameterDB.py +++ b/utils/DBModels/InitParameterDB.py @@ -1,5 +1,5 @@ from utils.DBModels.DeviceParModels import * - +import pandas as pd class InitParameterDB(): def __init__(self) -> None: