diff --git a/model/ProjectModel/AreaManage.py b/model/ProjectModel/AreaManage.py index c863656..4d06726 100644 --- a/model/ProjectModel/AreaManage.py +++ b/model/ProjectModel/AreaManage.py @@ -19,8 +19,9 @@ class Area(): type = None addressList = [] order = 'ABCD' - nums = None + nums = 0 forceValue = [0] + currentValue = [0] * nums def __init__(self): pass diff --git a/model/ProjectModel/DeviceManage.py b/model/ProjectModel/DeviceManage.py index f8d33ad..6b677a7 100644 --- a/model/ProjectModel/DeviceManage.py +++ b/model/ProjectModel/DeviceManage.py @@ -134,6 +134,8 @@ class DevicesManange(): self.paSlaveDevices = collections.OrderedDict() self.dpSlaveModbus = TcpMaster(host = '192.168.2.10', port = 502) self.paSlaveModbus = TcpMaster(host = '192.168.4.10', port = 502) + self.dpMasterModbus = TcpMaster(host = '192.168.1.10', port = 502) + self.paMasterModbus = TcpMaster(host = '192.168.3.10', port = 502) @@ -182,13 +184,14 @@ class DevicesManange(): for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]: if deviceName in devicesDict: return devicesDict[deviceName] - + def writeAreas(self, deviceName, values): bytes = b"" device = self.getDevice(deviceName) if device.type == "DP" and device.masterOrSlave == "主站": curProDict = self.dpMasterDevices areas = device.outputAreas + modbusM = self.dpMasterModbus elif device.type == "DP" and device.masterOrSlave == "从站": curProDict = self.dpSlaveDevices areas = device.inputAreas @@ -196,6 +199,7 @@ class DevicesManange(): elif device.type == "PA" and device.masterOrSlave == "主站": areas = device.outputAreas curProDict = self.paMasterDevices + modbusM = self.paMasterModbus elif device.type == "PA" and device.masterOrSlave == "从站": areas = device.inputAreas curProDict = self.paSlaveDevices @@ -220,6 +224,38 @@ class DevicesManange(): modbusM.writeMultipleRegister(slaveId = 1, address = 0, outputValue = values) # print(struct.unpack('>f', struct.pack('!HH', *values[:2]))) + def readAreas(self): + for index, curProDict enumerate(devicesDict) in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]: + match index: + case 0: + areaType = 'output' + modbusM = self.paMasterModbus + case 1: + areaType = 'input' + modbusM = self.paSlaverModbus + case 2: + areaType = 'output' + modbusM = self.dpMasterModbus + case 3: + areaType = 'input' + modbusM = self.dpSlaverModbus + lastDevice = list(curProDict.values())[-1] + bytesNums = lastDevice.inputEndAddress if areaType == 'input' else lastDevice.outputEndAddress + intNums = int(bytesNums / 2) if bytesNums % 2 == 0 else int(bytesNums / 2) + 1 + intValues = modbusM.readHoldingRegisters(slaveId = 1, startAddress = 0, intNums) + bytesValues = struct.pack(f"!{'H' * len(intValues)}") + for device in curProDict.values(): + readAreas = device.inputAreas if areaType == 'input' else device.outputAreas + for area in readAreas: + bytes = bytesValues[area.startAddress, area.endAddress + 1] + if area.type in ['AI', 'AO']: + for i in range(0, len(bytes), 4): + byte = byte[i:i+4] + if len(byte) != 4: + return + area.currentValue[i] = struct.unpack('!f', reorderBytes(byte)) + elif area.type in ['DI', 'DO']: + area.currentValue = bytesToCoils(byte) @classmethod def addAreas(self, type, order, bytes, deviceName): if DeviceDB.getByName(deviceName=deviceName).areaJson is None: diff --git a/protocol/ModBus/ByteOrder.py b/protocol/ModBus/ByteOrder.py index a7df5ac..c634766 100644 --- a/protocol/ModBus/ByteOrder.py +++ b/protocol/ModBus/ByteOrder.py @@ -51,6 +51,18 @@ def CDABToFloat(value): valueByte = struct.unpack('