0605更新

main
parent dc48ede172
commit b0a73b83b1

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

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

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

@ -3,7 +3,7 @@ import os
import datetime
from peewee import *
import json
import pandas as pd
from utils.DBModels.BaseModel import BaseModel

@ -1,5 +1,5 @@
from utils.DBModels.DeviceParModels import *
import pandas as pd
class InitParameterDB():
def __init__(self) -> None:

Loading…
Cancel
Save