diff --git a/model/ProjectModel/DeviceManage.py b/model/ProjectModel/DeviceManage.py index df5de30..e9008e6 100644 --- a/model/ProjectModel/DeviceManage.py +++ b/model/ProjectModel/DeviceManage.py @@ -1,7 +1,5 @@ import collections import json - - from utils.DBModels.DeviceModels import DeviceDB from model.ProjectModel.AreaManage import Area import numpy as np @@ -19,9 +17,6 @@ class Device(): protocolType = None masterOrSlave = None deviceName = None - deviceWidget = None - areaTabWidget = [] - def __init__(self): self.inputAreas = [] self.outputAreas = [] @@ -33,20 +28,21 @@ class Device(): bytes = int(bytes) area.type = type area.order = order - area.bytes = bytes # type: ignore - area.length = self.getLength(nums, bytes) # type: ignore + area.bytes = bytes + area.length = self.getLength(nums, bytes) area.nums = nums area.currentValue = [0] * nums if type in ["AI", "DI"]: - area.startAddress = 0 if not self.inputEndAddress else self.inputEndAddress + 1 # type: ignore - area.endAddress = area.startAddress + area.length # type: ignore + 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 # type: ignore - area.endAddress = area.startAddress + area.length # type: ignore + 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() self.indexDict[len(self.indexDict.values())] = len(self.outputAreas) @@ -70,7 +66,7 @@ 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) @@ -113,8 +109,6 @@ class Device(): @classmethod def delAreas(self, deviceName, id): jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) - if not jsonCon or len(jsonCon) < id: - return jsonCon.pop(id) if jsonCon == []: @@ -153,14 +147,11 @@ class DevicesManange(): - def addDevice(self, proType, masterSlaveModel, deviceName, deviceWidget, areaTabWidget): + def addDevice(self, proType, masterSlaveModel, deviceName): device = Device() device.type = proType device.masterOrSlave = masterSlaveModel device.deviceName = deviceName - device.deviceWidget = deviceWidget - device.areaTabWidget.append(areaTabWidget) - if proType == "DP" and masterSlaveModel == "主站": curProDict = self.dpMasterDevices @@ -175,18 +166,13 @@ 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): pass - + def delDevice(self, deviceName): for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]: if deviceName in devicesDict: @@ -203,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() @@ -215,16 +201,7 @@ class DevicesManange(): for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]: if deviceName in devicesDict: return devicesDict[deviceName] - - - def getAllDeviceObj(self): - deviceObjLst = [] - for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]: - for deviceName in devicesDict: - deviceObjLst.append(devicesDict[deviceName]) - return deviceObjLst - def writeAreas(self, deviceName, values): # print(values) bytes = b"" @@ -259,6 +236,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: @@ -268,6 +246,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]))) @@ -291,26 +270,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']: if device.masterOrSlave == '主站' and device.type == 'DP': bytes = bytes @@ -326,6 +312,7 @@ class DevicesManange(): "type": type, "order": order, "bytes": bytes, + }]) else: jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) @@ -382,12 +369,6 @@ class DevicesManange(): pass @classmethod - def getMasterSlaveModel(self, deviceName): - deviceName = deviceName - masterSlaveModel = DeviceDB.getByName(deviceName=deviceName).masterSlaveModel - if masterSlaveModel: - return masterSlaveModel - @classmethod def getAllDevice(self): # 查询所有设备 devices = DeviceDB.get_all() @@ -397,3 +378,4 @@ class DevicesManange(): for x in devices: l.append([x.deviceName, x.proType, x.masterSlaveModel, x.areaJson]) return l +