diff --git a/model/ProjectModel/BlockManage.py b/model/ProjectModel/BlockManage.py index b8cdc40..d2e834c 100644 --- a/model/ProjectModel/BlockManage.py +++ b/model/ProjectModel/BlockManage.py @@ -14,17 +14,34 @@ class BlockType(Enum): FB = 2 class BlockManage(): - address = 66 - def __init__(self): + _instance = None + _dpv1Master = None + + def __new__(cls, address): + if not cls._instance: + cls._instance = super().__new__(cls) + return cls._instance + + def __init__(self, address = 66): self.DPV1Master = DPV1Master('192.168.3.10', 502) + self.address = address + print(self.address, self) + self.initBlocks() + + @property + def DPV1Master(self): + if not _dpv1Master: + self._dpv1Master = DPV1Master('192.168.3.10', 502) + return self._dpv1Master + + def initBlocks(self): + if not self.DPV1Master.judgeSlave(self.address): + return self.blockDict = { BlockType.PB : [], BlockType.TB : [], BlockType.FB : [], } - self.initBlocks() - - def initBlocks(self): dirHeadDatas = self.DPV1Master.readParm(address = self.address, slot = 1, index = 0, length = 12) DirID = dirHeadDatas[0] # 目录id DirRevNum = dirHeadDatas[1] # 目录版本号 @@ -78,17 +95,18 @@ class Block(): self.addParms() def addParms(self): - pass - # getParmsFunc = { - # BlockType.PB: PhysicalBlock.getallParame, - # BlockType.TB: AIFunctionBlock.getallParame, - # BlockType.FB: PressureTranslationBlock.getallParame, - # }.get(self.blockType, lambda: []) + # pass + getParmsFunc = { + BlockType.PB: PhysicalBlock.getallParame, + BlockType.TB: AIFunctionBlock.getallParame, + BlockType.FB: PressureTranslationBlock.getallParame, + }.get(self.blockType, lambda: []) - # parms_data = getParmsFunc() + parms_data = getParmsFunc() if __name__ == '__main__': - b = BlockManage() + b = BlockManage(address = 55) + c = BlockManage(address = 77) # b.initBlock() \ No newline at end of file diff --git a/protocol/ModBus/DPV1Master.py b/protocol/ModBus/DPV1Master.py index 8fa88d7..d79cbbc 100644 --- a/protocol/ModBus/DPV1Master.py +++ b/protocol/ModBus/DPV1Master.py @@ -7,6 +7,25 @@ import struct import threading import time # from protocol.ModBus.ByteOrder import * +import threading + +class SearchSlaveThread(threading.Thread): + def __init__(self, callback, master): + super().__init__() + self.stopEvent = threading.Event() + self.callback = callback + self.master = master + + def run(self): + for address in range(1, 126): + if not self.stopEvent.is_set(): + self.callback(address, self.master.judgeSlave(address)) + + + def stop(self): + self.stopEvent.set() + + class DPV1Master(): @@ -43,31 +62,12 @@ class DPV1Master(): return all(x == 0 for x in tup) - def searchMaster(self, callback = None): - def search(): - for address in range(1, 126): - hexAddress = address.to_bytes(1, byteorder='little') - 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, 6) - if not self.areAllZeros(dir) and dir != 'error': - callback(address, True) - else: - callback(address, False) - self.writeMultipleRegister(1, 750, self.resetData) - time.sleep(0.1) - # print(address, dir) - # if callable(callback): - if not self.master: - callback(125, False) - return - self.searchMasterThread = threading.Thread(target=search) - self.searchMasterThread.start() + def searchSlave(self, callback = None): + self.searchSlaveThread = SearchSlaveThread(callback = callback, master = self) + self.searchSlaveThread.start() def closeThread(self): - self.searchMasterThread.join() + self.searchSlaveThread.stop() def readParm(self, address, slot, index, length, callback = None): hexAddress = address.to_bytes(1, byteorder='little') @@ -85,6 +85,19 @@ class DPV1Master(): return return value + def judgeSlave(self, address): + hexAddress = address.to_bytes(1, byteorder='little') + 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, 6) + self.writeMultipleRegister(1, 750, self.resetData) + time.sleep(0.1) + if not self.areAllZeros(dir) and dir != 'error': + return True + else: + return False # def readInputRegisters(self, slaveId, startAddress, varNums, order = 'ABCD'):