main
zcwBit 2 years ago
parent a8367e57b6
commit 7090bbbcf9

@ -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

Loading…
Cancel
Save