main
zcwBit 2 years ago
parent a8367e57b6
commit 7090bbbcf9

@ -1,7 +1,5 @@
import collections import collections
import json import json
from utils.DBModels.DeviceModels import DeviceDB from utils.DBModels.DeviceModels import DeviceDB
from model.ProjectModel.AreaManage import Area from model.ProjectModel.AreaManage import Area
import numpy as np import numpy as np
@ -19,9 +17,6 @@ class Device():
protocolType = None protocolType = None
masterOrSlave = None masterOrSlave = None
deviceName = None deviceName = None
deviceWidget = None
areaTabWidget = []
def __init__(self): def __init__(self):
self.inputAreas = [] self.inputAreas = []
self.outputAreas = [] self.outputAreas = []
@ -33,20 +28,21 @@ class Device():
bytes = int(bytes) bytes = int(bytes)
area.type = type area.type = type
area.order = order area.order = order
area.bytes = bytes # type: ignore area.bytes = bytes
area.length = self.getLength(nums, bytes) # type: ignore area.length = self.getLength(nums, bytes)
area.nums = nums area.nums = nums
area.currentValue = [0] * nums area.currentValue = [0] * nums
if type in ["AI", "DI"]: if type in ["AI", "DI"]:
area.startAddress = 0 if not self.inputEndAddress else self.inputEndAddress + 1 # type: ignore area.startAddress = 0 if not self.inputEndAddress else self.inputEndAddress
area.endAddress = area.startAddress + area.length # type: ignore area.endAddress = area.startAddress + area.length
# print(area.startAddress, area.endAddress)
self.inputEndAddress = area.endAddress self.inputEndAddress = area.endAddress
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist()
self.indexDict[len(self.indexDict.values())] = len(self.inputAreas) self.indexDict[len(self.indexDict.values())] = len(self.inputAreas)
self.inputAreas.append(area) self.inputAreas.append(area)
elif type in ["DO" , "AO"]: elif type in ["DO" , "AO"]:
area.startAddress = 0 if not self.outputEndAddress else self.outputEndAddress + 1 # type: ignore area.startAddress = 0 if not self.outputEndAddress else self.outputEndAddress
area.endAddress = area.startAddress + area.length # type: ignore area.endAddress = area.startAddress + area.length
self.outputEndAddress = area.endAddress self.outputEndAddress = area.endAddress
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist()
self.indexDict[len(self.indexDict.values())] = len(self.outputAreas) self.indexDict[len(self.indexDict.values())] = len(self.outputAreas)
@ -70,7 +66,7 @@ class Device():
elif index == 0 and inputOrOutput == 1: elif index == 0 and inputOrOutput == 1:
area.startAddress = self.outputStartAddress area.startAddress = self.outputStartAddress
else: else:
area.startAddress = areas[index - 1].endAddress + 1 area.startAddress = areas[index - 1].endAddress
area.endAddress = area.startAddress + area.length area.endAddress = area.startAddress + area.length
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() 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)
@ -113,8 +109,6 @@ class Device():
@classmethod @classmethod
def delAreas(self, deviceName, id): def delAreas(self, deviceName, id):
jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
if not jsonCon or len(jsonCon) < id:
return
jsonCon.pop(id) jsonCon.pop(id)
if jsonCon == []: 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 = Device()
device.type = proType device.type = proType
device.masterOrSlave = masterSlaveModel device.masterOrSlave = masterSlaveModel
device.deviceName = deviceName device.deviceName = deviceName
device.deviceWidget = deviceWidget
device.areaTabWidget.append(areaTabWidget)
if proType == "DP" and masterSlaveModel == "主站": if proType == "DP" and masterSlaveModel == "主站":
curProDict = self.dpMasterDevices curProDict = self.dpMasterDevices
@ -175,15 +166,10 @@ class DevicesManange():
device.inputStartAddress = 0 device.inputStartAddress = 0
device.outputStartAddress = 0 device.outputStartAddress = 0
else: else:
device.inputStartAddress = list(curProDict.values())[-1].inputEndAddress + 1 device.inputStartAddress = list(curProDict.values())[-1].inputEndAddress
device.outputStartAddress = list(curProDict.values())[-1].outputEndAddress + 1 device.outputStartAddress = list(curProDict.values())[-1].outputEndAddress
curProDict[deviceName] = device curProDict[deviceName] = device
def initDevices(self): def initDevices(self):
pass pass
@ -203,8 +189,8 @@ class DevicesManange():
else: else:
inputAddress = list(devicesDict.values())[index - 1].inputEndAddress inputAddress = list(devicesDict.values())[index - 1].inputEndAddress
outputAddress = list(devicesDict.values())[index - 1].outputEndAddress outputAddress = list(devicesDict.values())[index - 1].outputEndAddress
device.inputStartAddress = 0 if inputAddress == 0 else inputAddress + 1 device.inputStartAddress = 0 if inputAddress == 0 else inputAddress
device.outputStartAddress = 0 if outputAddress == 0 else outputAddress + 1 device.outputStartAddress = 0 if outputAddress == 0 else outputAddress
# print(device.inputStartAddress, device.inputEndAddress, deviceName, '输入') # print(device.inputStartAddress, device.inputEndAddress, deviceName, '输入')
# print(device.outputStartAddress, device.outputEndAddress, deviceName, 'shuchu') # print(device.outputStartAddress, device.outputEndAddress, deviceName, 'shuchu')
device.recalculateAddress() device.recalculateAddress()
@ -216,15 +202,6 @@ class DevicesManange():
if deviceName in devicesDict: if deviceName in devicesDict:
return devicesDict[deviceName] 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): def writeAreas(self, deviceName, values):
# print(values) # print(values)
bytes = b"" bytes = b""
@ -259,6 +236,7 @@ class DevicesManange():
for area in forceAreas: for area in forceAreas:
# print(area.forceValue) # print(area.forceValue)
if area.type in ["AI", "AO"]: if area.type in ["AI", "AO"]:
# print(area.forceValue)
byte = floatToBytes(area.forceValue, area.bytes, order = area.order) byte = floatToBytes(area.forceValue, area.bytes, order = area.order)
elif area.type in ["DI", "DO"]: elif area.type in ["DI", "DO"]:
# if device.type == "PA" and device.masterOrSlave == "从站" and len(area.forceValue) == 16: # if device.type == "PA" and device.masterOrSlave == "从站" and len(area.forceValue) == 16:
@ -268,6 +246,7 @@ class DevicesManange():
if len(bytes) % 2 != 0: if len(bytes) % 2 != 0:
bytes += struct.pack('B', 0) bytes += struct.pack('B', 0)
# print(bytes) # print(bytes)
# print(bytes)
values = struct.unpack('!' + 'H' * int(len(bytes) / 2), bytes) values = struct.unpack('!' + 'H' * int(len(bytes) / 2), bytes)
modbusM.writeMultipleRegister(slaveId = 1, address = 0, outputValue = values) modbusM.writeMultipleRegister(slaveId = 1, address = 0, outputValue = values)
# print(struct.unpack('>f', struct.pack('!HH', *values[:2]))) # print(struct.unpack('>f', struct.pack('!HH', *values[:2])))
@ -291,26 +270,33 @@ class DevicesManange():
continue continue
inputEndAddress = max([x.inputEndAddress for x in list(curProDict.values())]) inputEndAddress = max([x.inputEndAddress for x in list(curProDict.values())])
outputEndAddress = max([x.outputEndAddress 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 bytesNums = inputEndAddress if areaType == 'input' else outputEndAddress
intNums = int(bytesNums / 2) if bytesNums % 2 == 0 else int(bytesNums / 2) + 1 intNums = int(bytesNums / 2) if bytesNums % 2 == 0 else int(bytesNums / 2) + 1
if bytesNums == 0: if bytesNums == 0:
continue continue
intValues = modbusM.readHoldingRegisters(slaveId = 1, startAddress = 0, varNums = intNums) intValues = modbusM.readHoldingRegisters(slaveId = 1, startAddress = 0, varNums = intNums)
bytesValues = struct.pack(f"!{'H' * len(intValues)}", *intValues) bytesValues = struct.pack(f"!{'H' * len(intValues)}", *intValues)
# print(bytesValues, intNums, bytesNums)
# print(bytes)
for device in curProDict.values(): for device in curProDict.values():
readAreas = device.inputAreas if areaType == 'input' else device.outputAreas readAreas = device.inputAreas if areaType == 'input' else device.outputAreas
for area in readAreas: for area in readAreas:
# print(area.startAddress, area.endAddress)
if area.startAddress == 0: if area.startAddress == 0:
bytes = bytesValues[area.startAddress:area.endAddress] bytes = bytesValues[area.startAddress:area.endAddress]
else: 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']: if area.type in ['AI', 'AO']:
for i in range(0, len(bytes), 4): for i in range(0, len(bytes), 4):
byte = bytes[i:i+4] byte = bytes[i:i+4]
if len(byte) != 4: if len(byte) != 4:
continue 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) 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']: elif area.type in ['DI', 'DO']:
if device.masterOrSlave == '主站' and device.type == 'DP': if device.masterOrSlave == '主站' and device.type == 'DP':
bytes = bytes bytes = bytes
@ -326,6 +312,7 @@ class DevicesManange():
"type": type, "type": type,
"order": order, "order": order,
"bytes": bytes, "bytes": bytes,
}]) }])
else: else:
jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson)
@ -382,12 +369,6 @@ class DevicesManange():
pass pass
@classmethod @classmethod
def getMasterSlaveModel(self, deviceName):
deviceName = deviceName
masterSlaveModel = DeviceDB.getByName(deviceName=deviceName).masterSlaveModel
if masterSlaveModel:
return masterSlaveModel
@classmethod
def getAllDevice(self): def getAllDevice(self):
# 查询所有设备 # 查询所有设备
devices = DeviceDB.get_all() devices = DeviceDB.get_all()
@ -397,3 +378,4 @@ class DevicesManange():
for x in devices: for x in devices:
l.append([x.deviceName, x.proType, x.masterSlaveModel, x.areaJson]) l.append([x.deviceName, x.proType, x.masterSlaveModel, x.areaJson])
return l return l

Loading…
Cancel
Save