diff --git a/Static/Area.qss b/Static/Area.qss new file mode 100644 index 0000000..8c6a82a --- /dev/null +++ b/Static/Area.qss @@ -0,0 +1,150 @@ + + + +QPushButton#okBtn, QPushButton#delAreaBtn, QPushButton#forceBtn { + + font-size: 22px; + +} + +QPushButton#wirteDIDOforceBtn { + + font-size: 16px; + + padding-left: 5px; + + padding-right: 5px; + + padding-top: 5px; + + padding-bottom: 5px; + +} + +QPushButton#forceBtn { + + font-size: 26px; + + padding-left: 5px; + + padding-right: 5px; + + padding-top: 5px; + + padding-bottom: 5px; + +} + + +QPushButton#deviceAddButton, QPushButton#addareabutton { + + color: #328ffc; + + font-size: 20px; + + } + +QPushButton#initAddDeviceButton, QPushButton#initAreaAddButton{ + + font-size: 45px; + + color: #328ffc; + + background-color: rgba(255, 255, 255, 0); + +} + +QPushButton#initAddDeviceButton:hover, QPushButton#initAreaAddButton:hover{ + + color: #1a86d8; + + font: bold; + + border-radius: 3px; + + margin-bottom: -4px +} + + + + +QLabel#WirteDIDOareaMessLabel, QLabel#WirteDIDOareaValueLabel{ + + font-size: 16px; + +} + +QLabel#WirteDIDOareaValueLabel{ + + color: #0160aa; + +} + +QLabel#areaMessLabel, QLabel#areaValueLabel{ + + font-size: 28px; + +} + +QLabel#areaValueLabel{ + + color: #0160aa; + +} + +QLabel#readDIDOareaMessLabel, QLabel#readDIDOareaValueLabel{ + + font-size: 23px; + + +} + +QLabel#dataTypeLabel, QLabel#dataOrderLabel, QLabel#byteLineLabel{ + + font-size: 24px; + +} + +QLabel#areaValueLabel{ + + color: #0160aa; + +} + + + +QLineEdit#byteLineEdit, QLineEdit#areaLineEdit { + + font-size: 28px; + + + +} + + + +QLineEdit#WirteDIDOareaLineEdit { + + font-size: 16px; + + +} + +QLineEdit#areaLineEdit { + + font-size: 28px; + +} + + + + +QComboBox#dataTypeCombox, QComboBox#orderCombox{ + + font-size: 20px; + +} + + + + diff --git a/Static/Main.qss b/Static/Main.qss index 888c71a..7e3b6e8 100644 --- a/Static/Main.qss +++ b/Static/Main.qss @@ -4,68 +4,16 @@ QMdiSubWindow { font-size: 18px; font-weight: bold; - } - -QPushButton#okBtn, QPushButton#delAreaBtn, QPushButton#forceBtn { - - font-size: 20px; - -} - -QPushButton#deviceAddButton, QPushButton#addareabutton { - - color: #328ffc; - - font-size: 21px; - - } - -QPushButton#initAddDeviceButton, QPushButton#initAreaAddButton{ - - font-size: 45px; - - color: #328ffc; - - background-color: rgba(255, 255, 255, 0); } -QPushButton#initAddDeviceButton:hover, QPushButton#initAreaAddButton:hover{ - color: #1a86d8; - - font: bold; - - border-radius: 3px; - - margin-bottom: -4px -} - - -QLabel#dataTypeLabel, QLabel#dataOrderLabel, QLabel#byteLineLabel, QLabel#areaMessLabel, QLabel#areaValueLabel{ - - font-size: 20px; - -} - -QLabel#areaValueLabel{ - - color: #0160aa; - -} - - -QLineEdit#byteLineEdit, QLineEdit#areaLineEdit { - - font-size: 20px; - -} QComboBox#dataTypeCombox, QComboBox#orderCombox{ - font-size: 25px; + font-size: 20px; } @@ -110,11 +58,13 @@ QTabBar::tab{ } + QTabBar#areaTabBar::tab{ - min-width: 100px; +/* min-width: 100px;*/ font: 20px; + } @@ -152,10 +102,22 @@ QDockWidget{ } QDockWidget::title{ - + + font-size: 20px; + background-color: #cbdeec; + color: white; text-align: center; + + +} + +QToolBar QToolButton{ + + font-size: 20px; + font: bold; + } \ No newline at end of file diff --git a/UI/AreaTabWidget.py b/UI/AreaTabWidget.py index 0d4025c..58264df 100644 --- a/UI/AreaTabWidget.py +++ b/UI/AreaTabWidget.py @@ -32,14 +32,14 @@ class AreaTabWidget(QTabWidget): self.setObjectName('areaTabWidget') self.setTabPosition(QTabWidget.South) self.tabBar().setObjectName('areaTabBar') - self.addAreaButton = QPushButton("添加区域") + self.addAreaButton = QPushButton("添加通道") self.addAreaButton.setObjectName('addareabutton') self.addAreaButton.setIcon(QIcon('Static/add.png')) self.addAreaButton.setFlat(True) self.setCornerWidget(self.addAreaButton) self.addAreaButton.clicked.connect(self.addAreaTab) - + # self.state = True self.initWidget() #初始化界面 # self.tabCloseRequested.connect(self.closeTab) @@ -59,15 +59,18 @@ class AreaTabWidget(QTabWidget): areas = json.loads(devices[3]) if areas: self.removeTab(0) + # self.state = False for area in areas: dataType, order = self.tran(area["type"], area["order"]) channelBytes = area["bytes"] settingValue = [dataType, order, channelBytes] self.addAreaTab(settingValue=settingValue) + else: widget = QWidget() + widget.setObjectName('initWidget') layout = QHBoxLayout() - addButton = QPushButton('添加区域') + addButton = QPushButton('添加通道') addButton.setObjectName('initAreaAddButton') icon = QIcon('Static/add.png') iconSize = QSize(50,50) @@ -126,12 +129,11 @@ class AreaWidget(QWidget): super().__init__() self.areaTabWidget = areaTabWidget self.settingValue = settingValue + self.state = True self.devicesManange = self.areaTabWidget.devicesManange self.initUI() def initUI(self): - self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) - self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.mainLayout = QHBoxLayout() self.leftLayout = QGridLayout() self.rightLayout = QGridLayout() @@ -194,8 +196,8 @@ class AreaWidget(QWidget): self.mainLayout.addLayout(self.leftLayout, 1) self.mainLayout.addWidget(line) - self.mainLayout.addLayout(self.rightLayout, 9) - self.mainLayout.setSpacing(20) + self.mainLayout.addLayout(self.rightLayout, 20) + self.mainLayout.setSpacing(10) # self.deviceWidgetManage.addArea(mainLayout=mainLayout, leftLayoutWidget=leftLayoutWidgets) @@ -219,8 +221,9 @@ class AreaWidget(QWidget): if self.okBtn.text() == '确定': if index != -1: self.areaTabWidget.removeTab(index) - if tabCount == 1: - self.areaTabWidget.initWidget() + # if tabCount == 1: + # self.areaTabWidget.initWidget() + # self.state = True #正常点击删除按钮的情况 else: @@ -233,8 +236,10 @@ class AreaWidget(QWidget): Device.delAreas(deviceName, index) self.devicesManange.getDevice(deviceName).delArea(index, datatype) self.devicesManange.recalculateAddress() - if tabCount == 1: - self.areaTabWidget.initWidget() + + if tabCount == 1: + self.areaTabWidget.initWidget() + self.state = True @@ -246,6 +251,7 @@ class AreaWidget(QWidget): areaLayout = self.rightLayout deviceName = self.areaTabWidget.deviceName + #开启软件时判断数据库是否有存在设备信息,并执行相应的操作 if self.settingValue is None: dataType = self.dataTypeCombox.currentText() @@ -296,29 +302,27 @@ class AreaWidget(QWidget): widget.deleteLater() #添加按钮布局 - buttonWidgets = ButtonWidgets(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName) - areaLayout.addWidget(buttonWidgets,0,0) - - - + self.buttonWidgets = ButtonWidgets(self, order = order, byteLineEdit = byteLineEdit, dataType = dataType, deviceName = deviceName) + areaLayout.addWidget(self.buttonWidgets) + self.state = False - areaId = DevicesManange.getAreaID(deviceName) if self.settingValue is not None: - - self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) + self.isRead = self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) + self.devicesManange.recalculateAddress() return elif areaId is not None and curIndex in areaId: + # print(areaId,curIndex,2222) DevicesManange.updataAreas(dataType, order, byteLineEdit, deviceName, curIndex) - self.devicesManange.getDevice(deviceName).editArea(index = curIndex, type = dataType, order = order, bytes = int(byteLineEdit)) + self.isRead = self.devicesManange.getDevice(deviceName).editArea(index = curIndex, type = dataType, order = order, bytes = int(byteLineEdit)) # self.readVarTimer.start(500) else: DevicesManange.addAreas(dataType, order, byteLineEdit, deviceName) - self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) + self.isRead = self.devicesManange.getDevice(deviceName).addArea(type = dataType, bytes = int(byteLineEdit), order = order, nums = 1) self.devicesManange.recalculateAddress() # self.readVarTimer.start(500) - + @@ -330,38 +334,10 @@ class AreaWidget(QWidget): self.dataTypeDict = {'不转换': 'ABCD', '字节转换': 'DCBA', '字转换': 'CDAB', '字内转换': 'BADC'} return self.dataTypeDict[order] - def wirteValue(self, deviceName, curIndex, valueList): - print(deviceName,curIndex, valueList ) - # self.devicesManange.writeAreas(deviceName = deviceName, values = valueList) - - - - - - - def readValue(self,deviceName, curIndex): - print(deviceName, curIndex) - -# if curIndex == -1: -# return -# else: -# device = self.devicesManange.getDevice(deviceName) -# values = device.getAreaValues(curIndex) -# i = 0 -# for value in values: -# areaLabel[i].setText(str(value)) -# i =+ 1 - - # - # else: - # device = self.mainwindow.devicesManange.getDevice(deviceName) - # values = device.getAreaValues(curIndex) - # areaWidgets = self.widgetList[areaIndex] - # for value, widgets in zip(values, areaWidgets): - # widgets[0].setText(str(value)) + if __name__ == '__main__': app = QApplication(sys.argv) window = AreaTabWidget() diff --git a/UI/AreaWidget.py b/UI/AreaWidget.py index 4cf7678..ecce84b 100644 --- a/UI/AreaWidget.py +++ b/UI/AreaWidget.py @@ -42,7 +42,7 @@ class AreaWidget(QWidget): self.sub_window.setWidget(self.widget) def newArea(self): - print(1) + # print(1) areaSettingWidget = AreaSettingWidget() if areaSettingWidget.exec_() == QDialog.Accepted: deviceName, proType, varType = areaSettingWidget.getParameters() diff --git a/UI/ButtonLayoutWidget.py b/UI/ButtonLayoutWidget.py index acfee6b..cd7c5dd 100644 --- a/UI/ButtonLayoutWidget.py +++ b/UI/ButtonLayoutWidget.py @@ -35,7 +35,6 @@ class ButtonWidgets(QWidget): def areaLayout(self): areaLayout = QVBoxLayout() - print(self.dataType) if self.dataType in ['AI','AO']: hLayout = QHBoxLayout() hLayout.addWidget(QSplitter()) @@ -49,11 +48,11 @@ class ButtonWidgets(QWidget): areaLayout.addWidget(QSplitter()) for i in range(int(byteLineEdit)): hLayout = QHBoxLayout() - hLayout.addWidget(QSplitter(), 2) - hLayout.addLayout(self.dateLayout(number = (i + 1)), 6) - hLayout.addWidget(QSplitter(), 2) - hLayout.addLayout(self.dateLayout(number = (i + 1) + 8), 6) - hLayout.addWidget(QSplitter(), 2) + hLayout.addWidget(QSplitter(), 1) + hLayout.addLayout(self.dateLayout(number = (i + 1)), 3) + hLayout.addWidget(QSplitter(), 1) + hLayout.addLayout(self.dateLayout(number = (i + 1) + 8), 3) + hLayout.addWidget(QSplitter(), 1) areaLayout.addLayout(hLayout) areaLayout.addWidget(QSplitter()) @@ -63,7 +62,7 @@ class ButtonWidgets(QWidget): number = number forceLayout = QHBoxLayout() - areaMessLabel = QLabel(str(self.dataType) + "{:<{}}".format(str(number), 2) + ": " + '字节长度: ' + str(self.byteLineEdit) + ' 当前值: ' ) + areaMessLabel = QLabel(str(self.dataType) + "{:<{}}".format(str(number), 2) + ": " + '字节长度: ' + str(self.byteLineEdit) + ' 当前值:' ) areaMessLabel.setObjectName('areaMessLabel') areaValueLabel = QLabel('0') areaValueLabel.setObjectName('areaValueLabel') @@ -73,21 +72,39 @@ class ButtonWidgets(QWidget): if '主站' in self.deviceName and self.dataType == 'AI' or ('从站' in self.deviceName and self.dataType == 'AO'): force = False - self.areaLabel[number] = areaValueLabel + self.areaLabel[number - 1] = areaValueLabel elif '主站' in self.deviceName and self.dataType == 'DI' or ('从站' in self.deviceName and self.dataType == 'DO'): force = False - self.areaLabel[number] = areaValueLabel + self.areaLabel[number - 1] = areaValueLabel + if force: areaLineEdit = QLineEdit('0') areaLineEdit.setObjectName('areaLineEdit') + areaLineEdit.setFixedSize(80, 33) forceBtn = forceButton(number = number, valueLabel=areaValueLabel, valueEdit=areaLineEdit) forceBtn.clicked.connect(self.forceValues) + # forceBtn.setFixedSize(50, 27) forceLayout.addWidget(areaLineEdit) forceLayout.addWidget(forceBtn) - self.areaLineEditValue.append('0') + self.areaLineEditValue.append(0) + + if self.deviceName[-2:] + self.dataType in ['从站DI','主站DO']: + areaMessLabel.setObjectName('wirteDIDOareaMessLabel') + areaValueLabel.setObjectName('wirteDIDOareaValueLabel') + areaLineEdit.setObjectName('wirteDIDOareaLineEdit') + areaLineEdit.setFixedSize(30, 27) + forceBtn.setObjectName('wirteDIDOforceBtn') + + if self.deviceName[-2:] + self.dataType in ['主站DI','从站DO']: + areaMessLabel.setObjectName('readDIDOareaMessLabel') + areaValueLabel.setObjectName('readDIDOareaValueLabel') + + - forceLayout.setSpacing(10) + + + # forceLayout.setSpacing(10) return forceLayout def wirteAreaLineEditValue(self,dataTypeAndModel, valueLabel, number, value): @@ -100,7 +117,7 @@ class ButtonWidgets(QWidget): return else: valueLabel.setText(value) - self.areaLineEditValue[number -1] = value + self.areaLineEditValue[number -1] = float(value) #判断输入值是否为0和1 elif dataTypeAndModel in ['主站DO','从站DI']: @@ -117,17 +134,19 @@ class ButtonWidgets(QWidget): return self.areaLineEditValue - def readValues(self,deviceName, curIndex): - if self.areaLabel is None: - return - elif curIndex == -1: + def readValues(self, curIndex): + print(curIndex) + if self.areaLabel is None or self.areaLabel == dict(): return + # elif curIndex == -1: + # return else: - device = self.devicesManange.getDevice(deviceName) - # print(id(device)) + print(self.deviceName, curIndex) + device = self.devicesManange.getDevice(self.deviceName) values = device.getAreaValues(curIndex) for index, value in enumerate(values): - self.areaLabel[index+1].setText(str(value)) + self.areaLabel[index].setText(str(value)) + # print(self.areaLabel[index],values) @@ -139,10 +158,10 @@ class ButtonWidgets(QWidget): dataTypeAndModel = self.deviceName[-2:] + self.dataType curIndex = self.areaWidget.areaTabWidget.currentIndex() valueList = self.wirteAreaLineEditValue(dataTypeAndModel=dataTypeAndModel, valueLabel=valueLabel,number=number, value=value) - + print(valueList, curIndex) if valueList is None: return else: - self.areaWidget.wirteValue(deviceName = self.deviceName, curIndex = curIndex, valueList = valueList) + self.devicesManange.writeAreas(deviceName = self.deviceName, areaIndex = curIndex, values = valueList) \ No newline at end of file diff --git a/UI/DeviceDialogWidget.py b/UI/DeviceDialogWidget.py index 0b7387d..a36d797 100644 --- a/UI/DeviceDialogWidget.py +++ b/UI/DeviceDialogWidget.py @@ -1,3 +1,4 @@ +import re from PyQt5.QtWidgets import QDialog, QFormLayout, QLineEdit, QDialogButtonBox, QMessageBox from PyQt5.QtGui import QIcon from PyQt5.QtCore import Qt diff --git a/UI/DeviceWidget.py b/UI/DeviceWidget.py index 98346fb..a4a7d41 100644 --- a/UI/DeviceWidget.py +++ b/UI/DeviceWidget.py @@ -45,8 +45,8 @@ class DeviceWidget(QMainWindow): self.deviceTabWidget.setCornerWidget(self.addDeviceButton) self.deviceTabWidget.setTabsClosable(True) self.deviceTabWidget.tabCloseRequested.connect(self.closeTab) - - self.initWidget(True) + self.state = True + self.initWidget() # 设置主窗口的中心部分为 QTabWidget self.setCentralWidget(self.deviceTabWidget) @@ -62,7 +62,7 @@ class DeviceWidget(QMainWindow): else: return if self.deviceTabWidget.count() == 0: - self.initWidget(True) + self.creatInitWidget() @@ -70,7 +70,7 @@ class DeviceWidget(QMainWindow): if deviceName is None: dialog = DeviceDialog() if dialog.exec_() == QDialog.Accepted: - self.titleName = dialog.getParameters() + self.titleName, pvUpperLimit, pvLowerLimit, pvUnit = dialog.getParameters() self.deviceName = self.titleName + self.dockWidget.windowTitle() DeviceDB().addDevice(deviceName = self.deviceName, proType = self.proType , masterSlaveModel = self.masterSlaveModel) areaTabWidget = AreaTabWidget(self) @@ -93,7 +93,7 @@ class DeviceWidget(QMainWindow): - def initWidget(self,state): + def initWidget(self): alldevices = DevicesManange.getAllDevice() titleName = self.dockWidget.windowTitle() if alldevices: @@ -101,27 +101,31 @@ class DeviceWidget(QMainWindow): deviceName = devices[0] if titleName in deviceName: + # print(devices,333) self.devicesManange.addDevice(proType = devices[1], masterSlaveModel = devices[2], deviceName = devices[0]) - self.addDeviceWidget(deviceName=deviceName) - - state = False - if state: - widget = QWidget() - layout = QHBoxLayout() - addButton = QPushButton('添加设备') - addButton.setObjectName('initAddDeviceButton') - icon = QIcon('Static/add.png') - iconSize = QSize(50,50) - addButton.setIcon(icon) - addButton.setIconSize(iconSize) - addButton.clicked.connect(lambda: self.addDeviceWidget(True)) - layout.addItem(self.horizontalSpacer) - layout.addWidget(addButton) - layout.addItem(self.horizontalSpacer) - widget.setLayout(layout) - self.deviceTabWidget.addTab(widget,'') - self.deviceTabWidget.tabBar().setHidden(True) - + self.addDeviceWidget(deviceName=deviceName) + self.state = False + if self.state: + self.creatInitWidget() + + def creatInitWidget(self): + widget = QWidget() + widget.setObjectName('initWidget') + layout = QHBoxLayout() + addButton = QPushButton('添加设备') + addButton.setObjectName('initAddDeviceButton') + icon = QIcon('Static/add.png') + iconSize = QSize(50,50) + addButton.setIcon(icon) + addButton.setIconSize(iconSize) + addButton.clicked.connect(lambda: self.addDeviceWidget(True)) + layout.addItem(self.horizontalSpacer) + layout.addWidget(addButton) + layout.addItem(self.horizontalSpacer) + widget.setLayout(layout) + self.deviceTabWidget.addTab(widget,'') + self.deviceTabWidget.tabBar().setHidden(True) + diff --git a/UI/MainWindow.py b/UI/MainWindow.py index d65e449..7c93f28 100644 --- a/UI/MainWindow.py +++ b/UI/MainWindow.py @@ -1,7 +1,7 @@ import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QDockWidget, QToolBar, QAction, QTabWidget, QGridLayout -from PyQt5.QtCore import Qt +from PyQt5.QtCore import Qt, QTimer from PyQt5.QtGui import QIcon from utils.DBModels.BaseModel import * from model.ClientModel.Client import Client @@ -26,18 +26,22 @@ class MainWindow(QMainWindow): def initUI(self): + self.protocolTimer = QTimer() + self.protocolTimer.timeout.connect(self.readValues) + self.toolbar = QToolBar() self.addToolBar(self.toolbar) self.startProtocolBtn = QAction("开始通讯", self) self.startProtocolBtn.setObjectName("startProtocolBtn") + self.startProtocolBtn.setCheckable(True) self.startProtocolBtn.triggered.connect(self.startProtocol) self.loadProjectBtn = QAction('导入工程', self) self.loadProjectBtn.setObjectName("loadProjectBtn") self.loadProjectBtn.triggered.connect(self.loadProject) - self.toolbar.addAction(self.loadProjectBtn) + # self.toolbar.addAction(self.loadProjectBtn) self.toolbar.addAction(self.startProtocolBtn) dpMasterDockWidget = QDockWidget('DP主站') @@ -63,29 +67,52 @@ class MainWindow(QMainWindow): self.setWindowIcon(QIcon('Static/zhjt.ico')) self.setWindowTitle("PROFIBUS") - self.showMaximized() + self.resize(800, 600) + # self.showMaximized() def startProtocol(self): + if self.startProtocolBtn.isCheckable(): + self.startProtocolBtn.setText('停止通讯') + self.startProtocolBtn.setCheckable(False) + self.protocolTimer.start(500) + + else: + self.startProtocolBtn.setText('开始通讯') + self.startProtocolBtn.setCheckable(True) + self.protocolTimer.stop() + + def readValues(self): + self.devicesManange.readAreas() dockWidgets = self.findChildren(QDockWidget) #找到四个dockWidget窗口 for dockWidget in dockWidgets: - deviceTabWidgets = dockWidget.findChildren(QTabWidget, 'deviceTabWidget') #判断四个窗口里是否有deviceTabWidget - - for deviceTabWidget in deviceTabWidgets: - areaTabWidgets = deviceTabWidget.findChildren(QTabWidget, 'areaTabWidget') - - for areaTabWidget in areaTabWidgets: - leftLayout = areaTabWidget.currentWidget().layout().itemAt(0) - - if isinstance(leftLayout,QGridLayout): - masterAndSlave = dockWidget.windowTitle()[2:5] - dataType = leftLayout.itemAtPosition(0,1).widget().currentText() - dataTypeAndModel = masterAndSlave + dataType - - if dataTypeAndModel in ['主站AI', '主站DI', '从站AO', '从站DO']: - curIndex = areaTabWidget.currentIndex() - buttonlayoutWidget = areaTabWidget.currentWidget().layout().itemAt(2).itemAtPosition(0,0).widget()#获取buttonlayout - buttonlayoutWidget.readValues(deviceName = deviceName, curIndex = curIndex) - + if dockWidget.widget().deviceTabWidget.currentWidget().objectName() == 'initWidget': + print(dockWidget.widget().deviceTabWidget.currentWidget().objectName()) + continue + + areaTabWidget = dockWidget.widget().deviceTabWidget.currentWidget()#判断四个窗口里是否有deviceTabWidget + if areaTabWidget.currentWidget().objectName() == 'initWidget': + print(2) + continue + if areaTabWidget.currentWidget().state: + print(3) + continue + + # masterAndSlave = dockWidget.windowTitle()[2:5] + # proType = dockWidget.windowTitle() + # dataType = dataTypeCombox.currentText() + # dataTypeAndModel = masterAndSlave + dataType + + # if dataTypeAndModel in ['主站AI', '主站DI', '从站AO', '从站DO']: + # devicecurIndex = deviceTabWidget.currentIndex() + # deviceTabText = deviceTabWidget.tabText(devicecurIndex) + # try: + areacurindex = areaTabWidget.currentIndex() + # deviceName = deviceTabText + proType + buttonlayoutWidget = areaTabWidget.currentWidget().buttonWidgets#获取buttonlayout + buttonlayoutWidget.readValues(curIndex = areacurindex) + # except Exception as e: + # print(e) + def loadProject(self): pass diff --git a/bin.py b/bin.py index 2e78048..2df3bbc 100644 --- a/bin.py +++ b/bin.py @@ -9,8 +9,10 @@ import sys if __name__ == '__main__': app = QApplication(sys.argv) app.setStyle(QStyleFactory.create('windowsvista')) - app.setStyleSheet(CommonHelper.readQss('static/main.qss')) + app.setStyleSheet(CommonHelper.readQss('static/main.qss') + CommonHelper.readQss('static/Area.qss')) + Client.initDB() window = MainWindow() - window.show() + window.showMaximized() + # window.show() sys.exit(app.exec_()) \ No newline at end of file diff --git a/model/ProjectModel/DeviceManage.py b/model/ProjectModel/DeviceManage.py index ae4e4d8..0fd78b8 100644 --- a/model/ProjectModel/DeviceManage.py +++ b/model/ProjectModel/DeviceManage.py @@ -20,6 +20,7 @@ class Device(): def __init__(self): self.inputAreas = [] self.outputAreas = [] + self.areas = [] self.indexDict = collections.OrderedDict() # 有序字典 键:总区域索引 值: [类型(输入 : 0, 或输出 : 1), 该类型的第几个区域索引] @@ -40,6 +41,7 @@ class Device(): area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() self.indexDict[len(self.indexDict.values())] = len(self.inputAreas) self.inputAreas.append(area) + self.areas.append(area) elif type in ["DO" , "AO"]: area.startAddress = 0 if not self.outputEndAddress else self.outputEndAddress area.endAddress = area.startAddress + area.length @@ -47,6 +49,9 @@ class Device(): area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() self.indexDict[len(self.indexDict.values())] = len(self.outputAreas) self.outputAreas.append(area) + self.areas.append(area) + if (self.masterOrSlave == '主站' and type in ['AI', 'DI']) or (self.masterOrSlave == '从站' and type in ['AO', 'DO']): + return True # print(id(self), self.inputAreas) # print(self.deviceName, area.addressList, area.startAddress, area.endAddress, self.inputAreas) @@ -58,6 +63,7 @@ class Device(): # self.recalculateAddress() def recalculateAddress(self): + # print(self.inputStartAddress) for inputOrOutput, areas in enumerate([self.inputAreas, self.outputAreas]): endAddress = 0 for index, area in enumerate(areas): @@ -71,11 +77,17 @@ class Device(): area.addressList = np.arange(area.startAddress, area.endAddress + 1, area.bytes).tolist() # print(area.addressList, area.startAddress, area.endAddress, self.deviceName) endAddress = area.endAddress - else: - if inputOrOutput == 0: - self.inputEndAddress = endAddress - elif inputOrOutput == 1: - self.outputEndAddress = endAddress + # print(endAddress) + # else: + # print(endAddress) + if endAddress == 0 and inputOrOutput == 0: + endAddress = self.inputStartAddress + if endAddress == 0 and inputOrOutput == 1: + endAddress = self.outputStartAddress + if inputOrOutput == 0: + self.inputEndAddress = endAddress + elif inputOrOutput == 1: + self.outputEndAddress = endAddress # endAddress = 0 # print(self.deviceName, self.inputEndAddress) @@ -90,12 +102,14 @@ class Device(): def getAreaValues(self, index): - if self.masterOrSlave == "从站": - return self.outputAreas[index].currentValue - else: - # print(self.inputAreas, index) - # print(id(self), self.inputAreas) - return self.inputAreas[index].currentValue + # if self.masterOrSlave == "从站": + # return self.outputAreas[index].currentValue + # else: + # # print(self.inputAreas, index) + # # print(id(self), self.inputAreas) + # return self.inputAreas[index].currentValue + # print(self.areas[index].currentValue) + return self.areas[index].currentValue def getLength(self, nums, bytes): length = int(nums) * int(bytes) @@ -110,7 +124,6 @@ class Device(): @classmethod def delAreas(self, deviceName, id): jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) - print(len(jsonCon)) if len(jsonCon) > id: jsonCon.pop(id) else: @@ -121,7 +134,7 @@ class Device(): DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() else: for index, areajsonId in enumerate(jsonCon): - areajsonId["id"] = index + 1 + areajsonId["id"] = index areaJson = json.dumps(jsonCon) DeviceDB.update(areaJson=areaJson).where(DeviceDB.deviceName == deviceName).execute() @@ -147,7 +160,7 @@ 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.0.40', port = 502) + self.dpMasterModbus = TcpMaster(host = '192.168.1.10', port = 502) self.paMasterModbus = TcpMaster(host = '192.168.3.10', port = 502) @@ -187,6 +200,8 @@ class DevicesManange(): def recalculateAddress(self): for devicesDict in [self.paMasterDevices, self.paSlaveDevices, self.dpMasterDevices, self.dpSlaveDevices]: # print(len(devicesDict)) + # print(devicesDict) + # print(self.dpMasterDevices) for index, (deviceName, device) in enumerate(devicesDict.items()): if index == 0: device.inputStartAddress = 0 @@ -197,8 +212,9 @@ class DevicesManange(): device.inputStartAddress = 0 if inputAddress == 0 else inputAddress device.outputStartAddress = 0 if outputAddress == 0 else outputAddress # print(device.inputStartAddress, device.inputEndAddress, deviceName, '输入') - # print(device.outputStartAddress, device.outputEndAddress, deviceName, 'shuchu') device.recalculateAddress() + # print(device.outputStartAddress, device.outputEndAddress, deviceName) + # print(device.outputStartAddress, device.outputEndAddress, deviceName, 'shuchu') # previousDevice = device @@ -207,34 +223,35 @@ class DevicesManange(): if deviceName in devicesDict: return devicesDict[deviceName] - def writeAreas(self, deviceName, values): + def writeAreas(self, deviceName, areaIndex, values): # print(values) bytes = b"" device = self.getDevice(deviceName) # print(device, deviceName) if device.type == "DP" and device.masterOrSlave == "主站": curProDict = self.dpMasterDevices - areas = device.outputAreas + # areas = device.outputAreas modbusM = self.dpMasterModbus elif device.type == "DP" and device.masterOrSlave == "从站": curProDict = self.dpSlaveDevices - areas = device.inputAreas + # areas = device.inputAreas modbusM = self.dpSlaveModbus elif device.type == "PA" and device.masterOrSlave == "主站": - areas = device.outputAreas + # areas = device.outputAreas curProDict = self.paMasterDevices modbusM = self.paMasterModbus elif device.type == "PA" and device.masterOrSlave == "从站": - areas = device.inputAreas + # areas = device.inputAreas curProDict = self.paSlaveDevices modbusM = self.paSlaveModbus # print(values) - for area, value in zip(areas, values): - area.forceValue = value - if area.type in ['DO', 'DI'] and device.type == 'PA': - area.forceValue = value[8:] + value[:8] - elif area.type in ['DO', 'DI'] and device.type == 'DP' and device.masterOrSlave == "主站": - area.forceValue = value[8:] + value[:8] + # for area, value in zip(areas, values): + area = device.areas[areaIndex] + area.forceValue = values + if area.type in ['DO', 'DI'] and device.type == 'PA': + area.forceValue = values[8:] + values[:8] + elif area.type in ['DO', 'DI'] and device.type == 'DP' and device.masterOrSlave == "主站": + area.forceValue = values[8:] + values[:8] for device in curProDict.values(): forceAreas = device.outputAreas if device.masterOrSlave == "主站" else device.inputAreas @@ -308,7 +325,8 @@ class DevicesManange(): else: bytes = bytes[::-1] area.currentValue = bytesToCoils(bytes) - # print(area.currentValue) + print(area.currentValue, device.deviceName, area.startAddress,area.endAddress) + # print() @classmethod def addAreas(self, type, order, bytes, deviceName): jsonCon = json.loads(DeviceDB.getByName(deviceName=deviceName).areaJson) diff --git a/model/ProjectModel/Untitled-1.py b/model/ProjectModel/Untitled-1.py deleted file mode 100644 index 8079066..0000000 --- a/model/ProjectModel/Untitled-1.py +++ /dev/null @@ -1,15 +0,0 @@ -class Solution(object): - def twoSum(self, nums, target): - """ - :type nums: List[int] - :type target: int - :rtype: List[int] - """ - - for i in range(0, len(nums)): - for j in range(1, len(nums)): - if nums[i] + nums[j] == target: - print([i,j]) - -solution = Solution() -solution.twoSum([2,7,11,15], 9) \ No newline at end of file diff --git a/protocol/ModBus/ByteOrder.py b/protocol/ModBus/ByteOrder.py index 624a933..91aae97 100644 --- a/protocol/ModBus/ByteOrder.py +++ b/protocol/ModBus/ByteOrder.py @@ -69,6 +69,7 @@ def floatToBytes(values, length, order): # hOrder = '<'if order.byte in ['ABCD', 'DCBA'] else '>' # 获取values的长度 valuesNums = len(values) + # print(values,valuesNums,6666) # 将values转换为字节流 valueByte = struct.pack(f"!{'f' * valuesNums}", *values) valueByte = reorderBytes(valueByte, format = order) + struct.pack('B' * (length - valuesNums * 4), *[0] * (length - valuesNums * 4)) diff --git a/utils/DBModels/DeviceModels.py b/utils/DBModels/DeviceModels.py index accb2fd..ae5c53b 100644 --- a/utils/DBModels/DeviceModels.py +++ b/utils/DBModels/DeviceModels.py @@ -24,7 +24,9 @@ class DeviceDB(BaseModel): proType = CharField() masterSlaveModel = CharField() areaJson = JSONField() - + pvUpperLimit = CharField() + pvLowerLimit = CharField() + pvUnit = CharField() createTime = CharField() # 查询设备是否存在 @@ -48,11 +50,14 @@ class DeviceDB(BaseModel): # 添加设备 - def addDevice(self, deviceName, proType, masterSlaveModel=masterSlaveModel, areaJson=json.dumps([])): + def addDevice(self, deviceName, proType, masterSlaveModel=masterSlaveModel, areaJson=json.dumps([]), pvLowerLimit=pvLowerLimit, pvUpperLimit=pvUpperLimit, pvUnit=pvUnit): self.deviceName = deviceName self.proType = proType self.masterSlaveModel = masterSlaveModel self.areaJson = areaJson + self.pvUpperLimit = pvUpperLimit + self.pvLowerLimit = pvLowerLimit + self.pvUnit = pvUnit self.createTime = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S') # print(self.createTime) self.save()