0912更新B

main
zcwBit 2 years ago
parent dd8f12cea0
commit 90644854e3

@ -19,8 +19,9 @@ class Area():
type = None
addressList = []
order = 'ABCD'
nums = None
nums = 0
forceValue = [0]
currentValue = [0] * nums
def __init__(self):
pass

@ -134,6 +134,8 @@ class DevicesManange():
self.paSlaveDevices = collections.OrderedDict()
self.dpSlaveModbus = TcpMaster(host = '192.168.2.10', port = 502)
self.paSlaveModbus = TcpMaster(host = '192.168.4.10', port = 502)
self.dpMasterModbus = TcpMaster(host = '192.168.1.10', port = 502)
self.paMasterModbus = TcpMaster(host = '192.168.3.10', port = 502)
@ -189,6 +191,7 @@ class DevicesManange():
if device.type == "DP" and device.masterOrSlave == "主站":
curProDict = self.dpMasterDevices
areas = device.outputAreas
modbusM = self.dpMasterModbus
elif device.type == "DP" and device.masterOrSlave == "从站":
curProDict = self.dpSlaveDevices
areas = device.inputAreas
@ -196,6 +199,7 @@ class DevicesManange():
elif device.type == "PA" and device.masterOrSlave == "主站":
areas = device.outputAreas
curProDict = self.paMasterDevices
modbusM = self.paMasterModbus
elif device.type == "PA" and device.masterOrSlave == "从站":
areas = device.inputAreas
curProDict = self.paSlaveDevices
@ -220,6 +224,38 @@ class DevicesManange():
modbusM.writeMultipleRegister(slaveId = 1, address = 0, outputValue = values)
# print(struct.unpack('>f', struct.pack('!HH', *values[:2])))
def readAreas(self):
for index, curProDict enumerate(devicesDict) in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]:
match index:
case 0:
areaType = 'output'
modbusM = self.paMasterModbus
case 1:
areaType = 'input'
modbusM = self.paSlaverModbus
case 2:
areaType = 'output'
modbusM = self.dpMasterModbus
case 3:
areaType = 'input'
modbusM = self.dpSlaverModbus
lastDevice = list(curProDict.values())[-1]
bytesNums = lastDevice.inputEndAddress if areaType == 'input' else lastDevice.outputEndAddress
intNums = int(bytesNums / 2) if bytesNums % 2 == 0 else int(bytesNums / 2) + 1
intValues = modbusM.readHoldingRegisters(slaveId = 1, startAddress = 0, intNums)
bytesValues = struct.pack(f"!{'H' * len(intValues)}")
for device in curProDict.values():
readAreas = device.inputAreas if areaType == 'input' else device.outputAreas
for area in readAreas:
bytes = bytesValues[area.startAddress, area.endAddress + 1]
if area.type in ['AI', 'AO']:
for i in range(0, len(bytes), 4):
byte = byte[i:i+4]
if len(byte) != 4:
return
area.currentValue[i] = struct.unpack('!f', reorderBytes(byte))
elif area.type in ['DI', 'DO']:
area.currentValue = bytesToCoils(byte)
@classmethod
def addAreas(self, type, order, bytes, deviceName):
if DeviceDB.getByName(deviceName=deviceName).areaJson is None:

@ -51,6 +51,18 @@ def CDABToFloat(value):
valueByte = struct.unpack('<f', struct.pack('<HH', value[0], value[1]))
return valueByte[0]
def bytesTOFloat(value, order):
match order:
case 'ABCD':
return ABCDToFloat(value)
case 'DCBA':
return DCBAToFloat(value)
case 'CDAB':
return CDABToFloat(value)
case 'BADC':
return BADCToFloat(value)
def floatToBytes(values, length, order):
# 判断order是否为ABCD或BADC
# order = '>' if order in ['ABCD', 'BADC'] else '<'
@ -76,7 +88,10 @@ def coilsToBytes(values, length):
valueByte = struct.pack("B" * length, *decimalNumbers, *[0] * (length - len(decimalNumbers)))
return valueByte
# print(coilsToBytes([1] * 2, 3))
# floatToBytes([3.14], 5, 'ABCD')
def bytesToCoils(valueByte):
binaryNumber = ''.join([format(x, '08b') for x in valueByte])
values = list(reversed([int(x) for x in binaryNumber]))
return values

@ -29,16 +29,7 @@ class TcpMaster():
def readHoldingRegisters(self, slaveId, startAddress, varNums):
try:
value = self.master.execute(slaveId, cst.READ_HOLDING_REGISTERS, startAddress, varNums)
# if order == 'ABCD': # 大端模式
# valueByte = ABCDToFloat(value)
# elif order == 'DCBA': # 小端模式
# valueByte = DCBAToFloat(value)
# elif order == 'BADC':
# valueByte = BADCToFloat(value)
# elif order == 'CDAB':
# valueByte = CDABToFloat(value)
return value
except:
return 'error'

Loading…
Cancel
Save