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