|
|
@ -33,14 +33,15 @@ class Device():
|
|
|
|
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
|
|
|
|
area.startAddress = 0 if not self.inputEndAddress else self.inputEndAddress
|
|
|
|
area.endAddress = area.startAddress + area.length
|
|
|
|
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
|
|
|
|
area.startAddress = 0 if not self.outputEndAddress else self.outputEndAddress
|
|
|
|
area.endAddress = area.startAddress + area.length
|
|
|
|
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()
|
|
|
@ -65,10 +66,10 @@ 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)
|
|
|
|
endAddress = area.endAddress
|
|
|
|
endAddress = area.endAddress
|
|
|
|
else:
|
|
|
|
else:
|
|
|
|
if inputOrOutput == 0:
|
|
|
|
if inputOrOutput == 0:
|
|
|
@ -165,8 +166,8 @@ 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):
|
|
|
@ -188,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()
|
|
|
@ -233,6 +234,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:
|
|
|
@ -242,6 +244,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])))
|
|
|
@ -265,26 +268,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']:
|
|
|
|
bytes = bytes[::-1]
|
|
|
|
bytes = bytes[::-1]
|
|
|
|
area.currentValue = bytesToCoils(bytes)
|
|
|
|
area.currentValue = bytesToCoils(bytes)
|
|
|
|