0617更新

main
parent 8be2487217
commit 05ed11191e

@ -7,8 +7,12 @@ from UI.BlockParameterView import ParmView
from UI.SearchAddressWidget import SearchAddressWidget
from utils.DBModels.DeviceParModels import *
from utils import Globals
from UI.LoadingDataWidget import LoadingDataWidget
from model.ProjectModel.BlockManage import BlockManage
class HideTextDelegate(QStyledItemDelegate):
def paint(self, painter, option, index):
# 仅在下拉列表中绘制文本避免在ComboBox显示区域绘制
@ -155,10 +159,6 @@ class BlockParameterManageWidget(QWidget):
def initUI(self):
blocklist = [1,2,2]
self.blockLayout = DynamicAddBlock(blocklist)
self.mainlayout = QVBoxLayout()
self.settingLayout = QHBoxLayout()
@ -201,8 +201,8 @@ class BlockParameterManageWidget(QWidget):
self.setLayout(self.mainlayout)
def loadBlackData(self):
address =self.deviceAddressEdit.text()
print(address)
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-5])$')
match = pattern.match(address)
@ -212,7 +212,10 @@ class BlockParameterManageWidget(QWidget):
if self.initUIstat:
self.splitter.deleteLater()
self.widget.deleteLater()
self.blockManage = BlockManage(int(address))
Globals.setValue('blockManage', self.blockManage)
blocklist = self.blockManage.getBlockNums()
self.blockLayout = DynamicAddBlock(blocklist)
self.settingLayout.addLayout(self.blockLayout, 7)
self.settingLayout.addWidget(QSplitter(), 11)
self.mainlayout.addWidget(self.blockLayout.parameStackWidget, 20)
@ -225,16 +228,15 @@ class BlockParameterManageWidget(QWidget):
return
def refreshData(self):
self.loadingDataWidget = LoadingDataWidget()
self.loadingDataWidget.loadData()
blockView = self.blockLayout.parameStackWidget.currentWidget()
model = blockView.model
model.updateColumn(5, '查询中sdadadsda\r\nsdasdsasasad\r\nasdsadsad...')
blockName = blockView.dbModel.__name__
blcoknumber = blockView.blcoknumber + 1
print(blockName, blcoknumber)
self.loadingDataWidget = LoadingDataWidget()
self.loadingDataWidget.loadData()
blockView = self.blockLayout.parameStackWidget.currentWidget()
model = blockView.model
model.updateColumn(5, '查询中sdadadsda\r\nsdasdsasasad\r\nasdsadsad...')
blockName = blockView.dbModel.__name__
blcoknumber = blockView.blcoknumber + 1
print(blockName, blcoknumber)

@ -84,6 +84,7 @@ class ParmView(QTableView):
# self.datas = PressureTranslationBlock.getallParame()
self.datas = self.dbModel.getallParame()
for index, data in enumerate(self.datas):
data[5] = ''
desc = data[2].replace('\r\n', '').replace('\n', '')
lines = [desc[i:i+40] + "\r\n" for i in range(0, len(desc), 40)]
# 合并列表为一个字符串,移除最后一个换行符

@ -62,16 +62,15 @@ class SearchAddressWidget(QWidget):
self.setLayout(self.mainlayout)
self.setWindowTitle('从站地址查找')
self.test = DPV1Master('192.168.3.10', 502)
self.test.searchMaster(self.updateProgress)
self.cancelBtn.clicked.connect(self.cancelSearch)
self.DPV1Master = DPV1Master('192.168.3.10', 502)
self.DPV1Master.searchSlave(self.updateProgress)
self.cancelBtn.clicked.connect(self.close)
# self.timer = QTimer()
# self.timer.timeout.connect(self.updateProgress)
# self.timer.start(500)
def updateProgress(self, address, isSlave):
# 模拟一个任务,逐步更新进度条
self.progressBar.setValue(address)
if isSlave:
self.addressListWidget.addItem(QListWidgetItem(str(address)))
@ -82,10 +81,9 @@ class SearchAddressWidget(QWidget):
self.onConfirm()
def onConfirm(self):
self.deviceAddressEdit.setText(self.address)
self.close()
def cancelSearch(self):
self.test.closeThread
self.close()
def closeEvent(self, event):
self.DPV1Master.closeThread()
event.accept()

@ -2,6 +2,7 @@ import sys
sys.path.append('../../')
import struct
from enum import Enum
from utils.DBModels.DeviceParModels import *
from protocol.ModBus.DPV1Master import DPV1Master
@ -14,7 +15,7 @@ class BlockType(Enum):
levelTB = -3 # 物位转换块
pressureTB = -4
PB = 0
FB = 1
FB = 2
class BlockManage():
_instance = None
@ -25,9 +26,10 @@ class BlockManage():
cls._instance = super().__new__(cls)
return cls._instance
def __init__(self, address = 66):
def __init__(self, address = None):
self.address = address
self.initBlocks()
if address:
self.initBlocks()
@property
def DPV1Master(self):
@ -44,6 +46,7 @@ class BlockManage():
BlockType.FB : [],
}
dirHeadDatas = self.DPV1Master.readParm(address = self.address, slot = 1, index = 0, length = 12)
dirHeadDatas = struct.unpack('>6h', dirHeadDatas)
DirID = dirHeadDatas[0] # 目录id
DirRevNum = dirHeadDatas[1] # 目录版本号
NumDirObj = dirHeadDatas[2] # 目录对象的个数 (如果整个目录使用多于一个目录对象,
@ -58,10 +61,11 @@ class BlockManage():
dirLength = 4 * NumDirEntry
dirDatas = self.DPV1Master.readParm(address = self.address, slot = 1, index = 1, length = dirLength)
dirDatas = struct.unpack('>{}h'.format(int(dirLength/2)), dirDatas)
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
typeIndex = typ.value if type(typ.value) == int else 1
blkDirMesByte = struct.pack('>h', entryTuples[typeIndex][0])
blkIndex = int(blkDirMesByte[0]) # 目录对象编号
blkoffect = int(blkDirMesByte[1]) # 块从第几个Dir_Entry开始
@ -69,27 +73,33 @@ class BlockManage():
# print(blkIndex, blkoffect, numBlk)
for i in range(numBlk):
blkEntryListIndex = blkoffect - 1 + i
# print(blkEntryListIndex, entryTuples)
blkPointerByte = struct.pack('>h', entryTuples[blkEntryListIndex][0])
numBlkParms = entryTuples[blkEntryListIndex][1]
blkSlot = int(blkPointerByte[0])
blkStartIndex = int(blkPointerByte[1])
# print(111, blkStartIndex, )
block = Block(typ, self.DPV1Master)
block.slot = blkSlot
block.startIndex = blkStartIndex
block.numParms = numBlkParms
block.blockIndex = i
block.address = self.address
block.addParms()
if not block.getTBType():
self.blockDict[typ].append(block)
self.blockDict[typ].append(block)
# print(blkSlot, blkIndex)
# print(self.blockDict)
def getBlockValues(slef, blockType, blockIndex):
def getBlockValues(self, blockType, blockIndex):
pass
def getBlockNums(self):
return [len(self.blockDict[BlockType.PB]), len(self.blockDict[BlockType.TB]), len(self.blockDict[BlockType.FB])]
@classmethod
def searchSlave(self, callback):
self.DPV1Master.searchSlave(callback)
class Block():
@ -101,8 +111,8 @@ class Block():
def __init__(self, blockType, DPV1Master):
self.parms = []
self.blockType = blockType
self.addParms()
self.DPV1Master = DPV1Master
# self.addParms()
def addParms(self):
getParmsFunc = {
@ -113,12 +123,15 @@ class Block():
parmsData = getParmsFunc()
for parmData in parmsData:
parm = Parm(parmData, self.slot, self.startIndex, self.DPV1Master)
# print(parmData)
# print(self.startIndex, 3214)
parm = Parm(parmData, self.slot, self.startIndex, self)
def getTBType(self):
return
def setTBType(self):
pass

@ -18,7 +18,10 @@ class Parm():
desc = None
rdType = None
def __init__(self, parmData:list, slot:int, startIndex:int, block):
# print(startIndex, self.relativeIndex)
# print(parmData)
self.relativeIndex, self.paramName, self.desc, self.dataType, rdStr, self.size, *rest = parmData
self.relativeIndex = int(self.relativeIndex)
self.rdType = ParmEnum.readonly if rdStr == 'r' else ParmEnum.writeable
self.realIndex = startIndex + self.relativeIndex
self.slot = slot
@ -46,7 +49,7 @@ class Parm():
return str(struct.unpack('>f', value))
def unpackStr(self, value):
return struct.unpack('{}s'.format{str(len(value))}, value)
return struct.unpack('{}s'.format(str(len(value))), value)
def unpack101(self, value):
valueByte, statusByte = value[:4], value[4]
@ -56,7 +59,7 @@ class Parm():
return displayStr
def unpackDS32(self, value):
reserved = self.unpackU8(value[0:1])
reserved = self.unpackU8(value[0:1])
blockObject = self.unpackU8(value[1:2])
parentClass = self.unpackU8(value[2:3])
clas = self.unpackU8(value[3:4])
@ -119,20 +122,20 @@ class Parm():
return struct.pack('>f', value)
def pack101(self, value, status):
valueByte = self.packFloat(value)
statusByte = self.packU8(status)
packedData = valueByte + statusByte
return packedData
valueByte = self.packFloat(value)
statusByte = self.packU8(status)
packedData = valueByte + statusByte
return packedData
def packDS36(self, EU100, EU0, unitValue, decPoint):
EU100Byte = self.packFloat(EU100)
EU0Byte = self.packFloat(EU0)
unitByte = self.packU16(unitValue)
decPointByte = self.packU8(decPoint)
packedData = EU100Byte + EU0Byte + unitByte + decPointByte
return packedData
def packDS50(self, simulateStatus, simulateValue, simulateEnabled):
EU100Byte = self.packFloat(EU100)
EU0Byte = self.packFloat(EU0)
unitByte = self.packU16(unitValue)
decPointByte = self.packU8(decPoint)
packedData = EU100Byte + EU0Byte + unitByte + decPointByte
return packedData
def packDS50(self, simulateStatus, simulateValue, simulateEnabled):
simulateStatusByte = self.packU8(simulateStatus)
simulateValueByte = self.packFloat(simulateValue)
simulateEnabledByte = self.packU8(simulateEnabled)

@ -70,6 +70,7 @@ class DPV1Master():
self.searchSlaveThread.stop()
def readParm(self, address, slot, index, length, callback = None):
length = int(length)
hexAddress = address.to_bytes(1, byteorder='little')
slotByte = slot.to_bytes(1, byteorder='little')
indexByte = index.to_bytes(1, byteorder='little')
@ -78,7 +79,8 @@ class DPV1Master():
self.writeMultipleRegister(1, 750, searchDate)
time.sleep(0.3)
value = self.readHoldingRegisters(1, 750, -(-length // 2)) # -(-length // 2)向上取整
value = struct.pack('>{}b'.format(-(-length // 2)), value)[:length]
# print(value)
value = struct.pack('>{}h'.format(len(value)), *value)[:length]
self.writeMultipleRegister(1, 750, self.resetData)
time.sleep(0.1)
if callable(callback):

@ -28,12 +28,12 @@ class PressureTranslationBlock(BaseModel):
# 查询设备是否存在
@classmethod
def getallParame(cls):
devices = cls.get_all()
if devices is 'error':
params = cls.get_all()
if params is 'error':
return
l = []
for x in devices:
l.append([x.index, x.paramName, x.description, x.dataType, x.accessType])
for x in params:
l.append([x.index, x.paramName, x.description, x.dataType, x.accessType, x.dataSize])
return l
@classmethod

Loading…
Cancel
Save