You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			176 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			176 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
| import collections
 | |
| import json
 | |
| from utils.DBModels.DeviceModels import DeviceDB
 | |
| 
 | |
| 
 | |
| class Device():
 | |
|     areas = []
 | |
|     startAddress = None
 | |
|     endAddress = None
 | |
|     protocolType = None
 | |
|     masterOrSlave = None
 | |
|     def __init__(self):
 | |
|         pass
 | |
| 
 | |
|     def addAreas(self, type, nums, bytes, deviceName):
 | |
|         if DeviceDB.getByName(deviceName=deviceName).areaJson is None:
 | |
|             jsonCon = ([{
 | |
|                 "id": 1,
 | |
|                 "type": type,
 | |
|                 "nums": nums,
 | |
|                 "bytes": bytes,
 | |
|             }])
 | |
|         else:
 | |
|             jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
 | |
|             id = jsonCon[-1]["id"] + 1
 | |
|             jsonCon.append({
 | |
|                 "id": id,
 | |
|                 "type": type,
 | |
|                 "nums": nums,
 | |
|                 "bytes": bytes,
 | |
|             })
 | |
|         areaJson = json.dumps(jsonCon)
 | |
|         DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute()
 | |
| 
 | |
| 
 | |
|     def getValueLength(self):
 | |
|         pass
 | |
| 
 | |
| 
 | |
|     def writeAreas(self):
 | |
|         pass
 | |
| 
 | |
|     def delAreas(self, deviceName, ids):
 | |
| 
 | |
|         jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
 | |
|         for id in ids:
 | |
|             jsonCon.pop(id - 1)
 | |
| 
 | |
|         if jsonCon == []:
 | |
|             areaJson = None
 | |
|             DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute()
 | |
|         else:
 | |
|             for index, areajsonId in enumerate(jsonCon):
 | |
|                 areajsonId["id"] = index + 1
 | |
|             areaJson = json.dumps(jsonCon)
 | |
|          
 | |
|             DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute()
 | |
| 
 | |
| 
 | |
|     def getAreaID(self, deviceNames):
 | |
|         deviceName = deviceNames
 | |
|         jsonConsStr = DeviceDB.getByName(deviceName=deviceName).areaJson
 | |
|         if jsonConsStr is None:
 | |
|             return
 | |
|         else:
 | |
|             jsonCons = json.loads(jsonConsStr)
 | |
|             id = []
 | |
|             for jsonCon in jsonCons:
 | |
|                 id.append(jsonCon["id"])
 | |
|             return id
 | |
| 
 | |
|     def getAreaJson(self, deviceNames):
 | |
|         deviceName = deviceNames
 | |
|         jsonConsStr = DeviceDB.getByName(deviceName=deviceName).areaJson
 | |
|         if jsonConsStr is None:
 | |
|             return
 | |
|         else:
 | |
|             jsonCons = json.loads(jsonConsStr)
 | |
|             return jsonCons
 | |
| 
 | |
| class DevicesManange():
 | |
|     def __init__(self):
 | |
|         self.masterDevices = collections.OrderedDict()
 | |
|         self.slaveDevices = collections.OrderedDict() # 有序字典 (OrderedDict)
 | |
|         self.initDevices()
 | |
| 
 | |
|     def initDevices(self):
 | |
|         devices = DeviceDB.get_all()
 | |
| 
 | |
|         if devices is 'error':
 | |
|             return
 | |
|         for x in devices:
 | |
|             masterSlaveModel = x.masterSlaveModel
 | |
|             if masterSlaveModel == '主站':
 | |
|                 devices = x.deviceName
 | |
|                 masterByteLong = 0
 | |
|                 if x.areaJson is not None:
 | |
|                     for y in json.loads(x.areaJson):
 | |
|                         numbers = y['nums']
 | |
|                         bytes = int(y['bytes'])
 | |
|                         if bytes % 2 == 0:
 | |
|                             byte = bytes // 2
 | |
|                         else:
 | |
|                             byte = (bytes + 1) // 2
 | |
|                         masterByteLong += int(numbers) * int(byte)
 | |
|                 self.masterDevices[devices] = masterByteLong
 | |
|             elif masterSlaveModel == '从站':
 | |
|                 devices = x.deviceName
 | |
|                 salveByteLong = 0
 | |
|                 if x.areaJson is not None:
 | |
|                     for y in json.loads(x.areaJson):
 | |
|                         numbers = y['nums']
 | |
|                         bytes = int(y['bytes'])
 | |
|                         if bytes % 2 == 0:
 | |
|                             byte = bytes // 2
 | |
|                         else:
 | |
|                             byte = (bytes + 1) // 2
 | |
|                         salveByteLong += int(numbers) * (byte)
 | |
|                 self.slaveDevices[devices] = salveByteLong
 | |
|    
 | |
| 
 | |
|     def addDevice(self, deviceName,channelNums, channelBytes):
 | |
|         channelBytes = int(channelBytes)
 | |
|         if channelBytes % 2 == 0:
 | |
|             channelBytes = channelBytes // 2
 | |
|         else:
 | |
|             channelBytes = (channelBytes + 1) // 2
 | |
|         if deviceName in self.masterDevices:
 | |
|             self.masterDevices[deviceName] = self.masterDevices[deviceName] + int(channelNums) * int(channelBytes)
 | |
|         elif deviceName in self.slaveDevices:
 | |
|             self.slaveDevices[deviceName] = self.slaveDevices[deviceName] + int(channelNums) * int(channelBytes)
 | |
|         elif '主站' in deviceName:
 | |
|             self.masterDevices[deviceName] = int(channelNums) * int(channelBytes)
 | |
|         elif '从站' in deviceName:
 | |
|             self.slaveDevices[deviceName] = int(channelNums) * int(channelBytes)
 | |
| 
 | |
|         return self.masterDevices, self.slaveDevices  #分别返回PA和DP每个设备的字节的总长度
 | |
| 
 | |
|     @classmethod
 | |
|     def getChannelLength(self, deviceName):
 | |
|         number = 0
 | |
|         if DeviceDB.getByName(deviceName=deviceName).areaJson is None:
 | |
|             return number
 | |
|         else:
 | |
|             numbers = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
 | |
|             for i in numbers:
 | |
|                 number += int(i['nums'])
 | |
|             return number
 | |
| 
 | |
|     def editDevies(self):
 | |
|         pass
 | |
| 
 | |
|     def getByteLengthStart(self):
 | |
|         masterAddress = 0
 | |
|         slaveAddress = 0
 | |
|         masterAddressList = {}
 | |
|         slaveAddressList = {}
 | |
|         for key in self.masterDevices:
 | |
|             masterAddressList[key] = int(masterAddress)
 | |
|             masterAddress = int(self.masterDevices[key]) + masterAddress
 | |
|     
 | |
|         for key in self.slaveDevices:
 | |
|             slaveAddressList[key] = int(slaveAddress)
 | |
|             slaveAddress = int(self.slaveDevices[key]) + slaveAddress
 | |
|         print(masterAddressList, '主站', slaveAddressList, '从站')
 | |
|         return masterAddressList, slaveAddressList #返回PA和DP每个字节长度的起始值
 | |
| 
 | |
|     def getAllDevice(self):
 | |
|         # 查询所有设备
 | |
|         devices = DeviceDB.get_all()
 | |
|         if devices is 'error':
 | |
|             return
 | |
|         l = []
 | |
|         for x in devices:
 | |
|             l.append([x.deviceName, x.proType, x.masterSlaveModel, x.areaJson])
 | |
|         return l |