From 5a18962b205d8b8164c03dcc4c89b926b0165540 Mon Sep 17 00:00:00 2001 From: zcwBit Date: Tue, 23 Jan 2024 15:30:10 +0800 Subject: [PATCH] =?UTF-8?q?0123=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + model/ProjectModel/DeviceManage.py | 30 ++++++++++++++++++++---------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 085c4fe..876e814 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ *.pyc *.db +*.cpython-310.pyc \ No newline at end of file diff --git a/model/ProjectModel/DeviceManage.py b/model/ProjectModel/DeviceManage.py index 16de3a3..ec346d3 100644 --- a/model/ProjectModel/DeviceManage.py +++ b/model/ProjectModel/DeviceManage.py @@ -33,14 +33,15 @@ class Device(): area.nums = nums area.currentValue = [0] * nums if type in ["AI", "DI"]: - area.startAddress = 0 if not self.inputEndAddress else self.inputEndAddress + 1 + area.startAddress = 0 if not self.inputEndAddress else self.inputEndAddress area.endAddress = area.startAddress + area.length + # print(area.startAddress, area.endAddress) self.inputEndAddress = area.endAddress area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() self.indexDict[len(self.indexDict.values())] = len(self.inputAreas) self.inputAreas.append(area) elif type in ["DO" , "AO"]: - area.startAddress = 0 if not self.outputEndAddress else self.outputEndAddress + 1 + area.startAddress = 0 if not self.outputEndAddress else self.outputEndAddress area.endAddress = area.startAddress + area.length self.outputEndAddress = area.endAddress area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() @@ -65,10 +66,10 @@ class Device(): elif index == 0 and inputOrOutput == 1: area.startAddress = self.outputStartAddress else: - area.startAddress = areas[index - 1].endAddress + 1 + area.startAddress = areas[index - 1].endAddress area.endAddress = area.startAddress + area.length area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() - print(area.addressList, area.startAddress, area.endAddress, self.deviceName) + # print(area.addressList, area.startAddress, area.endAddress, self.deviceName) endAddress = area.endAddress else: if inputOrOutput == 0: @@ -165,8 +166,8 @@ class DevicesManange(): device.inputStartAddress = 0 device.outputStartAddress = 0 else: - device.inputStartAddress = list(curProDict.values())[-1].inputEndAddress + 1 - device.outputStartAddress = list(curProDict.values())[-1].outputEndAddress + 1 + device.inputStartAddress = list(curProDict.values())[-1].inputEndAddress + device.outputStartAddress = list(curProDict.values())[-1].outputEndAddress curProDict[deviceName] = device def initDevices(self): @@ -188,8 +189,8 @@ class DevicesManange(): else: inputAddress = list(devicesDict.values())[index - 1].inputEndAddress outputAddress = list(devicesDict.values())[index - 1].outputEndAddress - device.inputStartAddress = 0 if inputAddress == 0 else inputAddress + 1 - device.outputStartAddress = 0 if outputAddress == 0 else outputAddress + 1 + device.inputStartAddress = 0 if inputAddress == 0 else inputAddress + device.outputStartAddress = 0 if outputAddress == 0 else outputAddress # print(device.inputStartAddress, device.inputEndAddress, deviceName, '输入') # print(device.outputStartAddress, device.outputEndAddress, deviceName, 'shuchu') device.recalculateAddress() @@ -233,6 +234,7 @@ class DevicesManange(): for area in forceAreas: # print(area.forceValue) if area.type in ["AI", "AO"]: + # print(area.forceValue) byte = floatToBytes(area.forceValue, area.bytes, order = area.order) elif area.type in ["DI", "DO"]: # if device.type == "PA" and device.masterOrSlave == "从站" and len(area.forceValue) == 16: @@ -242,6 +244,7 @@ class DevicesManange(): if len(bytes) % 2 != 0: bytes += struct.pack('B', 0) # print(bytes) + # print(bytes) values = struct.unpack('!' + 'H' * int(len(bytes) / 2), bytes) modbusM.writeMultipleRegister(slaveId = 1, address = 0, outputValue = values) # print(struct.unpack('>f', struct.pack('!HH', *values[:2]))) @@ -265,26 +268,33 @@ class DevicesManange(): continue inputEndAddress = max([x.inputEndAddress for x in list(curProDict.values())]) outputEndAddress = max([x.outputEndAddress for x in list(curProDict.values())]) + inputAreaNums = sum([len(x.inputAreas) for x in list(curProDict.values())]) - 1 + outputAreaNums = sum([len(x.outputAreas) for x in list(curProDict.values())]) - 1 bytesNums = inputEndAddress if areaType == 'input' else outputEndAddress intNums = int(bytesNums / 2) if bytesNums % 2 == 0 else int(bytesNums / 2) + 1 if bytesNums == 0: continue intValues = modbusM.readHoldingRegisters(slaveId = 1, startAddress = 0, varNums = intNums) bytesValues = struct.pack(f"!{'H' * len(intValues)}", *intValues) + # print(bytesValues, intNums, bytesNums) + # print(bytes) for device in curProDict.values(): readAreas = device.inputAreas if areaType == 'input' else device.outputAreas for area in readAreas: + # print(area.startAddress, area.endAddress) if area.startAddress == 0: bytes = bytesValues[area.startAddress:area.endAddress] else: - bytes = bytesValues[area.startAddress - 1:area.endAddress] - + bytes = bytesValues[area.startAddress:area.endAddress] + # print(area.startAddress, area.endAddress) if area.type in ['AI', 'AO']: for i in range(0, len(bytes), 4): byte = bytes[i:i+4] if len(byte) != 4: continue + # print(round(struct.unpack('!f', reorderBytes(byte, area.order))[0], 4)) area.currentValue[i] = round(struct.unpack('!f', reorderBytes(byte, area.order))[0], 4) + # print(round(struct.unpack('!f', reorderBytes(byte, area.order))[0], 4)) elif area.type in ['DI', 'DO']: bytes = bytes[::-1] area.currentValue = bytesToCoils(bytes)