|
|
@ -1,56 +1,90 @@
|
|
|
|
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
|
|
|
|
|
|
|
|
import numpy as np
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Device():
|
|
|
|
class Device():
|
|
|
|
areas = []
|
|
|
|
inputAreas = []
|
|
|
|
startAddress = 0
|
|
|
|
outputAreas = []
|
|
|
|
endAddress = 0
|
|
|
|
inputStartAddress = None
|
|
|
|
|
|
|
|
inputEndAddress = None
|
|
|
|
|
|
|
|
outputStartAddress = None
|
|
|
|
|
|
|
|
outputEndAddress = None
|
|
|
|
protocolType = None
|
|
|
|
protocolType = None
|
|
|
|
masterOrSlave = None
|
|
|
|
masterOrSlave = None
|
|
|
|
deviceName = None
|
|
|
|
deviceName = None
|
|
|
|
def __init__(self):
|
|
|
|
def __init__(self):
|
|
|
|
pass
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
# def addArea(self, type, nums, bytes):
|
|
|
|
def addArea(self, type, nums, bytes, order = 'ABCD'):
|
|
|
|
# area = Area()
|
|
|
|
area = Area()
|
|
|
|
# area.type = type
|
|
|
|
bytes = int(bytes)
|
|
|
|
# area.startAddress = 0 if not self.startAddress else: self.endAddress + 1
|
|
|
|
area.type = type
|
|
|
|
# area.length = self.getLength(nums, bytes)
|
|
|
|
area.order = order
|
|
|
|
# area.endAddress = startAddress + length
|
|
|
|
area.bytes = bytes
|
|
|
|
# self.endAddress = area.endAddress
|
|
|
|
area.length = self.getLength(nums, bytes)
|
|
|
|
# area.addressList = list(range(area.startAddress, area.endAddress + 1, bytes))
|
|
|
|
if type in ["AI", "DI"]:
|
|
|
|
# areas.append(area)
|
|
|
|
area.startAddress = 0 if not self.inputEndAddress else self.inputEndAddress + 1
|
|
|
|
|
|
|
|
area.endAddress = area.startAddress + area.length
|
|
|
|
def delArea(self, index):
|
|
|
|
self.inputEndAddress = area.endAddress
|
|
|
|
self.areas.pop(index)
|
|
|
|
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist()
|
|
|
|
self.recalculateAddress()
|
|
|
|
self.inputAreas.append(area)
|
|
|
|
|
|
|
|
elif type in ["DO" , "AO"]:
|
|
|
|
|
|
|
|
area.startAddress = 0 if not self.outputEndAddress else self.outputEndAddress + 1
|
|
|
|
|
|
|
|
area.endAddress = area.startAddress + area.length
|
|
|
|
|
|
|
|
self.outputEndAddress = area.endAddress
|
|
|
|
|
|
|
|
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist()
|
|
|
|
|
|
|
|
self.outputAreas.append(area)
|
|
|
|
|
|
|
|
print(area.addressList, area.startAddress, self.inputEndAddress)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def delArea(self, index, type):
|
|
|
|
|
|
|
|
if type in ["DI", "AI"]:
|
|
|
|
|
|
|
|
self.inputAreas.pop(index)
|
|
|
|
|
|
|
|
elif type in ["AO", "DO"]:
|
|
|
|
|
|
|
|
self.outputAreas.pop(index)
|
|
|
|
|
|
|
|
# self.recalculateAddress()
|
|
|
|
|
|
|
|
|
|
|
|
def recalculateAddress(self):
|
|
|
|
def recalculateAddress(self):
|
|
|
|
for index, area in enumerate(self.areas):
|
|
|
|
endAddress = 0
|
|
|
|
area.startAddress = self.startAddress
|
|
|
|
for inputOrOutput, areas in enumerate([self.inputAreas, self.outputAreas]):
|
|
|
|
|
|
|
|
for index, area in enumerate(areas):
|
|
|
|
|
|
|
|
if index == 0 and inputOrOutput == 0:
|
|
|
|
|
|
|
|
area.startAddress = self.inputStartAddress
|
|
|
|
|
|
|
|
elif index == 0 and inputOrOutput == 1:
|
|
|
|
|
|
|
|
area.startAddress = self.outputStartAddress
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
area.startAddress = areas[index - 1].endAddress
|
|
|
|
area.endAddress = area.startAddress + area.length
|
|
|
|
area.endAddress = area.startAddress + area.length
|
|
|
|
area.addressList = list(range(area.startAddress, area.endAddress + 1, area.bytes))
|
|
|
|
area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist()
|
|
|
|
|
|
|
|
endAddress = area.endAddress
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
self.endAddress = area.endAddress
|
|
|
|
if inputOrOutput == 0:
|
|
|
|
|
|
|
|
self.inputEndAddress = endAddress
|
|
|
|
|
|
|
|
elif inputOrOutput == 1:
|
|
|
|
|
|
|
|
self.outputEndAddress = endAddress
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def editAreaType(self, index, type):
|
|
|
|
def editArea(self, index, type, order, bytes):
|
|
|
|
self.areas[index].type = type
|
|
|
|
if type in ["DI", "AI"]:
|
|
|
|
|
|
|
|
self.inputAreas[index].type = type
|
|
|
|
|
|
|
|
self.inputAreas[index].order = order
|
|
|
|
|
|
|
|
self.inputAreas[index].bytes = bytes
|
|
|
|
|
|
|
|
elif type in ["AO", "DO"]:
|
|
|
|
|
|
|
|
self.outputAreas[index].type = type
|
|
|
|
|
|
|
|
self.outputAreas[index].order = order
|
|
|
|
|
|
|
|
self.outputAreas[index].bytes = bytes
|
|
|
|
|
|
|
|
# self.recalculateAddress()
|
|
|
|
|
|
|
|
|
|
|
|
def editAreaValueType(self, index, varType):
|
|
|
|
|
|
|
|
self.areas[index].valueType = varType
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def getArea(self, index):
|
|
|
|
def getArea(self, index):
|
|
|
|
return self.areas[index]
|
|
|
|
return self.areas[index]
|
|
|
|
|
|
|
|
|
|
|
|
def getLength(self, nums, bytes):
|
|
|
|
def getLength(self, nums, bytes):
|
|
|
|
length = int(nums) * int(bytes)
|
|
|
|
length = int(nums) * int(bytes)
|
|
|
|
if length % 2 != 0:
|
|
|
|
|
|
|
|
length = (length + 1) // 2
|
|
|
|
|
|
|
|
else:
|
|
|
|
|
|
|
|
length = length / 2
|
|
|
|
length = length / 2
|
|
|
|
|
|
|
|
return length
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -111,26 +145,28 @@ class DevicesManange():
|
|
|
|
curProDict = self.paSlaveDevices
|
|
|
|
curProDict = self.paSlaveDevices
|
|
|
|
|
|
|
|
|
|
|
|
if len(curProDict) == 0:
|
|
|
|
if len(curProDict) == 0:
|
|
|
|
device.startAddress = 0
|
|
|
|
device.inputStartAddress = 0
|
|
|
|
|
|
|
|
device.outputStartAddress = 0
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
device.startAddress = curProDict.values[-1].endAddress + 1
|
|
|
|
device.inputStartAddress = curProDict.values[-1].inputEndAddress + 1
|
|
|
|
|
|
|
|
device.outputStartAddress = curProDict.values[-1].outputEndAddress + 1
|
|
|
|
curProDict[deviceName] = device
|
|
|
|
curProDict[deviceName] = device
|
|
|
|
|
|
|
|
|
|
|
|
def initDevices(self):
|
|
|
|
def initDevices(self):
|
|
|
|
pass
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
|
|
def delDevice(self):
|
|
|
|
def delDevice(self, deviceName):
|
|
|
|
for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]:
|
|
|
|
for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]:
|
|
|
|
if deviceName in devicesDict:
|
|
|
|
if deviceName in devicesDict:
|
|
|
|
del deviceDict[deviceName]
|
|
|
|
del devicesDict[deviceName]
|
|
|
|
self.recalculateAddress()
|
|
|
|
self.recalculateAddress()
|
|
|
|
|
|
|
|
|
|
|
|
# def recalculateAddress(self, deviceDict):
|
|
|
|
def recalculateAddress(self):
|
|
|
|
# for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]:
|
|
|
|
for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]:
|
|
|
|
# for index, (deviceName, device) in enumerate(ordered_dict.items()):
|
|
|
|
for index, (deviceName, device) in enumerate(devicesDict.items()):
|
|
|
|
# device.startAddress = 0 in index = 0 else: device = previousDevice.endAddress + 1
|
|
|
|
device.startAddress = 0 if index == 0 else previousDevice.endAddress + 1
|
|
|
|
# device.recalculateAddress()
|
|
|
|
device.recalculateAddress()
|
|
|
|
# previousDevice = device
|
|
|
|
previousDevice = device
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def getDevice(self, deviceName):
|
|
|
|
def getDevice(self, deviceName):
|
|
|
@ -212,3 +248,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
|
|
|
|
|
|
|
|
|
|
|
|