main
parent f68909be12
commit aa29723c64

@ -137,7 +137,7 @@ class AreaTabWidget(QMainWindow):
areaLayout.addWidget(areaLabel, 0, 0) areaLayout.addWidget(areaLabel, 0, 0)
areaLayout.addWidget(areaLabel2, 0, 1) areaLayout.addWidget(areaLabel2, 0, 1)
areaLayout.addItem(self.horizontalSpacer, 0, 4) areaLayout.addItem(self.horizontalSpacer, 0, 4)
widgetLists.append([areaLabel2, areaLayout]) widgetLists.append([areaLabel2, areaLayout, areaLabel])
elif '主站' in deviceName and dataType == 'AO' or ('从站' in deviceName and dataType == 'AI'): elif '主站' in deviceName and dataType == 'AO' or ('从站' in deviceName and dataType == 'AI'):
areaLineEdit = QLineEdit('0') areaLineEdit = QLineEdit('0')
@ -148,7 +148,7 @@ class AreaTabWidget(QMainWindow):
areaLayout.addWidget(editbtn, 0, 3) areaLayout.addWidget(editbtn, 0, 3)
areaLayout.addItem(self.horizontalSpacer, 0, 4) areaLayout.addItem(self.horizontalSpacer, 0, 4)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.wirteValue(btn)) editbtn.clicked.connect(lambda checked, btn=editbtn: self.wirteValue(btn))
widgetLists.append([areaLabel2, areaLineEdit, editbtn, areaLayout]) widgetLists.append([areaLabel2, areaLineEdit, editbtn, areaLayout, areaLabel])
self.widgetList.append(widgetLists) self.widgetList.append(widgetLists)
else: else:
@ -161,14 +161,14 @@ class AreaTabWidget(QMainWindow):
areaLabel2 = QLabel('0') areaLabel2 = QLabel('0')
areaLayout.addWidget(areaLabel, i // 2, i % 2) areaLayout.addWidget(areaLabel, i // 2, i % 2)
areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 1) areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 1)
widgetLists.append([areaLabel2, areaLayout]) widgetLists.append([areaLabel2, areaLayout, areaLabel])
else: else:
areaLabel = QLabel(dataType + str(i + 1) + ": " + byteLineEdit + 'Byte') areaLabel = QLabel(dataType + str(i + 1) + ": " + byteLineEdit + 'Byte')
areaLabel2 = QLabel('0') areaLabel2 = QLabel('0')
areaLayout.addWidget(areaLabel, i // 2, i % 2 + 2) areaLayout.addWidget(areaLabel, i // 2, i % 2 + 2)
areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 3) areaLayout.addWidget(areaLabel2, i // 2, i % 2 + 3)
widgetLists.append([areaLabel2, areaLayout]) widgetLists.append([areaLabel2, areaLayout, areaLabel])
self.widgetList.append(widgetLists) self.widgetList.append(widgetLists)
if '主站' in deviceName and dataType == 'DO' or ( if '主站' in deviceName and dataType == 'DO' or (
'从站' in deviceName and dataType == 'DI'): '从站' in deviceName and dataType == 'DI'):
@ -184,7 +184,7 @@ class AreaTabWidget(QMainWindow):
areaLayout.addWidget(areaLineEdit, i // 2, i % 2 + 2) areaLayout.addWidget(areaLineEdit, i // 2, i % 2 + 2)
areaLayout.addWidget(editbtn, i // 2, i % 2 + 3) areaLayout.addWidget(editbtn, i // 2, i % 2 + 3)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.wirteValue(btn)) editbtn.clicked.connect(lambda checked, btn=editbtn: self.wirteValue(btn))
widgetLists.append([areaLabel2, areaLineEdit, editbtn]) widgetLists.append([areaLabel2, areaLineEdit, editbtn, areaLabel])
else: else:
areaLabel = QLabel(dataType + str(i + 1) + ": " + byteLineEdit + 'Byte') areaLabel = QLabel(dataType + str(i + 1) + ": " + byteLineEdit + 'Byte')
areaLabel2 = QLabel('0') areaLabel2 = QLabel('0')
@ -197,7 +197,7 @@ class AreaTabWidget(QMainWindow):
areaLayout.addWidget(editbtn, i // 2, i % 2 + 7) areaLayout.addWidget(editbtn, i // 2, i % 2 + 7)
editbtn.clicked.connect(lambda checked, btn=editbtn: self.wirteValue(btn)) editbtn.clicked.connect(lambda checked, btn=editbtn: self.wirteValue(btn))
widgetLists.append([areaLabel2, areaLineEdit, editbtn]) widgetLists.append([areaLabel2, areaLineEdit, editbtn, areaLabel])
self.widgetList.append(widgetLists) self.widgetList.append(widgetLists)
areaLayout.addItem(self.verticalSpacer, int(byteLineEdit) * 8 ,0) areaLayout.addItem(self.verticalSpacer, int(byteLineEdit) * 8 ,0)
@ -208,13 +208,16 @@ class AreaTabWidget(QMainWindow):
del self.widgetList[index - 1] del self.widgetList[index - 1]
if init: if init:
# print(222)
# self.mainwindow.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), nums = 1)
# self.mainwindow.devicesManange.recalculateAddress()
return return
DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, index) DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, index)
self.mainwindow.devicesManange.getDevice(deviceName).editArea(index = index - 1, type = dataType, order = order, bytes = int(byteLineEdit)) self.mainwindow.devicesManange.getDevice(deviceName).editArea(index = index - 1, type = dataType, order = order, bytes = int(byteLineEdit))
self.mainwindow.devicesManange.recalculateAddress() self.mainwindow.devicesManange.recalculateAddress()
else: else:
DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName) DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName)
self.mainwindow.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), nums = 1) self.mainwindow.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1)
self.mainwindow.devicesManange.recalculateAddress() self.mainwindow.devicesManange.recalculateAddress()
@ -229,7 +232,7 @@ class AreaTabWidget(QMainWindow):
deviceName = self.areaTabWidget.parent().parent().parent().parent().parent().windowTitle() deviceName = self.areaTabWidget.parent().parent().parent().parent().parent().windowTitle()
# index = self.areaTabWidget.currentIndex() # index = self.areaTabWidget.currentIndex()
valueList = [] valueList = []
didoValueList = []
if len(self.widgetList) > 0: if len(self.widgetList) > 0:
for widgetLists in self.widgetList: for widgetLists in self.widgetList:
for widgetList in widgetLists: for widgetList in widgetLists:
@ -237,7 +240,13 @@ class AreaTabWidget(QMainWindow):
widgetList[0].setText(widgetList[1].text()) widgetList[0].setText(widgetList[1].text())
if isinstance(widgetList[1], QLineEdit): if isinstance(widgetList[1], QLineEdit):
valueList.append(float(widgetList[1].text())) dataType = widgetList[-1].text()[0:2]
# if dataType in ['DI', "DO"]:
didoValueList.append(float(widgetList[1].text()))
valueList.append(didoValueList)
didoValueList = []
# print(valueList)
self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList) self.mainwindow.devicesManange.writeAreas(deviceName = deviceName, values = valueList)

@ -117,7 +117,9 @@ class MainWindow(QMainWindow):
for area in areas: for area in areas:
dataType, order = self.tran(area["type"], area["order"]) dataType, order = self.tran(area["type"], area["order"])
channelBytes = area["bytes"] channelBytes = area["bytes"]
self.devicesManange.getDevice(deviceName = devices[0]).addArea(type = area["type"], order = order, bytes = int(channelBytes), nums = 1) dev = self.devicesManange.getDevice(deviceName = devices[0])
dev.addArea(type = area["type"], order = area["order"], bytes = int(channelBytes), nums = 1)
self.devicesManange.recalculateAddress() self.devicesManange.recalculateAddress()
areaTabWidget.initAreaTab(dataType, order, channelBytes) areaTabWidget.initAreaTab(dataType, order, channelBytes)
@ -169,8 +171,8 @@ class AreaQMdiSubWindow(QMdiSubWindow):
self.parentWindow = parentWindow self.parentWindow = parentWindow
def closeEvent(self, event): def closeEvent(self, event):
self.parentWindow.subWindows.remove(self) self.parentWindow.subWindows.remove(self)
DeviceDB.deleteDevice(deviceName = self.windowTitle())
self.parentWindow.devicesManange.delDevice(deviceName = self.windowTitle()) self.parentWindow.devicesManange.delDevice(deviceName = self.windowTitle())
DeviceDB.deleteDevice(deviceName = self.windowTitle())

@ -20,7 +20,7 @@ class Area():
addressList = [] addressList = []
order = 'ABCD' order = 'ABCD'
nums = None nums = None
forceValue = 0 forceValue = [0]
def __init__(self): def __init__(self):
pass pass

@ -4,13 +4,12 @@ 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
from protocol.ModBus.ByteOrder import * from protocol.ModBus.ByteOrder import *
from protocol.ModBus.TCPMaster import *
import struct import struct
#从站 "AI" "DI"可强制 #从站 "AI" "DI"可强制
#主站 "AO" "DO"可强制 #主站 "AO" "DO"可强制
class Device(): class Device():
inputAreas = []
outputAreas = []
inputStartAddress = None inputStartAddress = None
inputEndAddress = None inputEndAddress = None
outputStartAddress = None outputStartAddress = None
@ -19,7 +18,8 @@ class Device():
masterOrSlave = None masterOrSlave = None
deviceName = None deviceName = None
def __init__(self): def __init__(self):
pass self.inputAreas = []
self.outputAreas = []
def addArea(self, type, nums, bytes, order = 'ABCD'): def addArea(self, type, nums, bytes, order = 'ABCD'):
area = Area() area = Area()
@ -41,7 +41,9 @@ class Device():
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.outputAreas.append(area) self.outputAreas.append(area)
print(area.addressList, area.startAddress, self.inputEndAddress) # print(self.inputAreas)
# print(area.addressList, area.startAddress, self.inputEndAddress)
def delArea(self, index, type): def delArea(self, index, type):
if type in ["DI", "AI"]: if type in ["DI", "AI"]:
@ -129,6 +131,8 @@ class DevicesManange():
self.dpSlaveDevices = collections.OrderedDict() # 有序字典 (OrderedDict) self.dpSlaveDevices = collections.OrderedDict() # 有序字典 (OrderedDict)
self.paMasterDevices = collections.OrderedDict() self.paMasterDevices = collections.OrderedDict()
self.paSlaveDevices = collections.OrderedDict() self.paSlaveDevices = collections.OrderedDict()
self.dpSlaveModbus = TcpMaster(host = '192.168.2.10', port = 502)
self.paSlaveModbus = TcpMaster(host = '192.168.4.10', port = 502)
@ -137,7 +141,6 @@ class DevicesManange():
device.type = proType device.type = proType
device.masterOrSlave = masterSlaveModel device.masterOrSlave = masterSlaveModel
device.deviceName = deviceName device.deviceName = deviceName
masterSlaveModel = masterSlaveModel
if proType == "DP" and masterSlaveModel == "主站": if proType == "DP" and masterSlaveModel == "主站":
curProDict = self.dpMasterDevices curProDict = self.dpMasterDevices
@ -152,8 +155,8 @@ class DevicesManange():
device.inputStartAddress = 0 device.inputStartAddress = 0
device.outputStartAddress = 0 device.outputStartAddress = 0
else: else:
device.inputStartAddress = curProDict.values[-1].inputEndAddress + 1 device.inputStartAddress = list(curProDict.values())[-1].inputEndAddress + 1
device.outputStartAddress = curProDict.values[-1].outputEndAddress + 1 device.outputStartAddress = list(curProDict.values())[-1].outputEndAddress + 1
curProDict[deviceName] = device curProDict[deviceName] = device
def initDevices(self): def initDevices(self):
@ -168,9 +171,10 @@ class DevicesManange():
def recalculateAddress(self): 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(devicesDict.items()): for index, (deviceName, device) in enumerate(devicesDict.items()):
device.startAddress = 0 if index == 0 else previousDevice.endAddress + 1 device.inputStartAddress = 0 if index == 0 else list(devicesDict.values())[index - 1].inputEndAddress + 1
device.outputStartAddress = 0 if index == 0 else list(devicesDict.values())[index - 1].outputEndAddress + 1
device.recalculateAddress() device.recalculateAddress()
previousDevice = device # previousDevice = device
def getDevice(self, deviceName): def getDevice(self, deviceName):
@ -187,30 +191,33 @@ class DevicesManange():
elif device.type == "DP" and device.masterOrSlave == "从站": elif device.type == "DP" and device.masterOrSlave == "从站":
curProDict = self.dpSlaveDevices curProDict = self.dpSlaveDevices
areas = device.inputAreas areas = device.inputAreas
modbusM = self.dpSlaveModbus
elif device.type == "PA" and device.masterOrSlave == "主站": elif device.type == "PA" and device.masterOrSlave == "主站":
areas = device.outputAreas areas = device.outputAreas
curProDict = self.paMasterDevices curProDict = self.paMasterDevices
elif device.type == "PA" and device.masterOrSlave == "从站": elif device.type == "PA" and device.masterOrSlave == "从站":
areas = device.inputAreas areas = device.inputAreas
curProDict = self.paSlaveDevices curProDict = self.paSlaveDevices
modbusM = self.paSlaveModbus
for area, value in zip(areas, values): for area, value in zip(areas, values):
area.forceValue = value area.forceValue = value
for device in curProDict.values(): for device in curProDict.values():
forceAreas = device.outputAreas if device.masterOrSlave == "主站" else device.inputAreas forceAreas = device.outputAreas if device.masterOrSlave == "主站" else device.inputAreas
for area in forceAreas: for area in forceAreas:
# print(area.type)
if area.type in ["AI", "AO"]: if area.type in ["AI", "AO"]:
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"]:
byte = coilsToBytes([int(x) for x in [area.forceValue]], area.bytes) if device.type == "PA" and device.masterOrSlave == "从站" and len(area.forceValue) == 16:
order = '<'if order.byte in ['ABCD', 'DCBA'] else '>' area.forceValue = area.forceValue[8:] + area.forceValue[:8]
else: byte = coilsToBytes([int(x) for x in area.forceValue], area.bytes)
if len(bytes) % 2 != 0: bytes += byte
bytes += struct.pack('b', 0) else:
if len(bytes) % 2 != 0:
values = struct.pack('') bytes += struct.pack('B', 0)
print(len(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])))
@classmethod @classmethod
def addAreas(self, type, order, bytes, deviceName): def addAreas(self, type, order, bytes, deviceName):

@ -2,13 +2,13 @@ import struct
def reorderBytes(byteStream, format): def reorderBytes(byteStream, format):
if format == 'ABCD': if format == 'ABCD':
return byteStream
elif format == 'DCBA':
return byteStream[::-1] return byteStream[::-1]
elif format == 'DCBA':
return byteStream
elif format == 'BADC': elif format == 'BADC':
return bytes([byteStream[1], byteStream[0], byteStream[3], byteStream[2]])
elif format == 'CDAB':
return bytes([byteStream[2], byteStream[3], byteStream[0], byteStream[1]]) return bytes([byteStream[2], byteStream[3], byteStream[0], byteStream[1]])
elif format == 'CDAB':
return bytes([byteStream[1], byteStream[0], byteStream[3], byteStream[2]])
else: else:
raise ValueError("Invalid format") raise ValueError("Invalid format")
@ -59,11 +59,11 @@ def floatToBytes(values, length, order):
valuesNums = len(values) valuesNums = len(values)
# 将values转换为字节流 # 将values转换为字节流
valueByte = struct.pack(f"!{'f' * valuesNums}", *values) valueByte = struct.pack(f"!{'f' * valuesNums}", *values)
valueByte = reorderBytes(valueByte, format = order) valueByte = reorderBytes(valueByte, format = order) + struct.pack('B' * (length - valuesNums * 4), *[0] * (length - valuesNums * 4))
print(ABCDToFloat(struct.unpack('!HH', valueByte)))
# {'B' * (length - 4 * valuesNums) *[0] * (length - 4 * valuesNums) # {'B' * (length - 4 * valuesNums) *[0] * (length - 4 * valuesNums)
# print(valueByte)
# 返回转换后的字节流 # 返回转换后的字节流
# return valueByte return valueByte
def coilsToBytes(values, length): def coilsToBytes(values, length):
decimalNumbers = [] decimalNumbers = []
@ -77,6 +77,6 @@ def coilsToBytes(values, length):
return valueByte return valueByte
# print(coilsToBytes([1] * 2, 3)) # print(coilsToBytes([1] * 2, 3))
floatToBytes([3.14], 5, 'ABCD') # floatToBytes([3.14], 5, 'ABCD')

@ -20,8 +20,9 @@ class TcpMaster():
def writeMultipleRegister(self, slaveId, address, outputValue): def writeMultipleRegister(self, slaveId, address, outputValue):
try: try:
self.master.execute(slaveId, cst.WRITE_MULTIPLE_REGISTERS, starting_address = address, output_value=valueByte) self.master.execute(slaveId, cst.WRITE_MULTIPLE_REGISTERS, starting_address = address, output_value=outputValue)
except Exception as e: except Exception as e:
print(e)
return 'error' return 'error'

Loading…
Cancel
Save