class Ui_SplashScreen(object): def setupUi(self, SplashScreen): SplashScreen.setObjectName("SplashScreen") SplashScreen.resize(400, 300) SplashScreen.setWindowIcon(Hariku_Style.getIcon()) self.centralwidget = QWidget(SplashScreen) self.centralwidget.setObjectName("centralwidget") self.verticalLayout = QVBoxLayout(self.centralwidget) self.verticalLayout.setContentsMargins(10, 10, 10, 10) self.verticalLayout.setSpacing(0) self.verticalLayout.setObjectName("verticalLayout") self.dropShadowFrame = QFrame(self.centralwidget) self.dropShadowFrame.setFont(Hariku_Style.get_font(6)) self.dropShadowFrame.setStyleSheet( Hariku_Style.get_drop_shadow_stylesheet()) self.dropShadowFrame.setFrameShape(QFrame.StyledPanel) self.dropShadowFrame.setFrameShadow(QFrame.Raised) self.dropShadowFrame.setObjectName("dropShadowFrame") self.verticalLayout_2 = QVBoxLayout(self.dropShadowFrame) self.verticalLayout_2.setObjectName("verticalLayout_2") self.label_pic = QLabel(self.dropShadowFrame) self.label_pic.setEnabled(True) self.label_pic.setMaximumSize(QtCore.QSize(50, 60)) self.label_pic.setTextFormat(QtCore.Qt.AutoText) self.label_pic.setPixmap( QtGui.QPixmap("splashsceen\\../assets/Hariku-logo.png")) self.label_pic.setScaledContents(True) self.label_pic.setStyleSheet("QLabel { margin-top:10px }") self.label_pic.setAlignment(QtCore.Qt.AlignCenter) self.label_pic.setObjectName("label_pic") self.verticalLayout_2.addWidget(self.label_pic, 0, QtCore.Qt.AlignHCenter) self.label_desc = QLabel(self.dropShadowFrame) self.label_desc.setFont(Hariku_Style.get_font(10)) self.label_desc.setStyleSheet("") self.label_desc.setObjectName("label_desc") self.verticalLayout_2.addWidget(self.label_desc) self.progressBar = QProgressBar(self.dropShadowFrame) self.progressBar.setStyleSheet( Hariku_Style.get_progressbar_stylesheet()) self.progressBar.setProperty("value", 24) self.progressBar.setObjectName("progressBar") self.verticalLayout_2.addWidget(self.progressBar) self.label_loading = QLabel(self.dropShadowFrame) self.label_loading.setFont(Hariku_Style.get_font(8)) self.label_loading.setStyleSheet("") self.label_loading.setObjectName("label_loading") self.verticalLayout_2.addWidget(self.label_loading) self.verticalLayout.addWidget(self.dropShadowFrame) SplashScreen.setCentralWidget(self.centralwidget) self.retranslateUi(SplashScreen) QtCore.QMetaObject.connectSlotsByName(SplashScreen) def retranslateUi(self, SplashScreen): _translate = QtCore.QCoreApplication.translate SplashScreen.setWindowTitle(_translate("SplashScreen", "MainWindow")) self.label_desc.setText( _translate("SplashScreen", "<center> Loading <Strong> Apps</Strong> </center>")) self.label_loading.setText( _translate("SplashScreen", "<center><Strong> loading .</Strong></center>"))
class App(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): global flList global datatypes self.versionPr = 'FOTON OPC v 0.10' self.setGeometry(400, 200, 1000, 520) self.setWindowTitle(self.versionPr) #self.setWindowIcon(QIcon(self.imgPath + 'gnome-monitor.png')) self.h = self.frameGeometry().height() font = QFont() font.setPointSize(12) self.label0 = QLabel(self) self.label0.setFont(font) self.label0.move(50, 20) self.label0.resize(300, 25) self.label0.setText("IP сервера:") self.tty = QLineEdit(self) self.tty.setFont(font) self.tty.move(50, 50) self.tty.resize(150, 25) self.label0 = QLabel(self) self.label0.setFont(font) self.label0.move(50, 80) self.label0.resize(300, 25) self.label0.setText("Порт:") self.port = QLineEdit(self) self.port.setFont(font) self.port.move(50, 110) self.port.resize(150, 25) self.labelv = QLabel(self) self.labelv.setFont(font) self.labelv.move(50, 140) self.labelv.resize(300, 25) self.labelv.setText("Переменная:") self.labelv = QLabel(self) self.labelv.setFont(font) self.labelv.move(50, 220) self.labelv.resize(300, 25) self.labelv.setText("Значение:") self.labelt = QLabel(self) self.labelt.setFont(font) self.labelt.move(520, 200) self.labelt.resize(300, 25) self.labelt.setText("Тип данных:") self.modlabel = QLabel(self) self.modlabel.setFont(font) self.modlabel.move(520, 20) self.modlabel.resize(300, 25) self.modlabel.setText("Modbus устройство:") self.modlabel2 = QLabel(self) self.modlabel2.setFont(font) self.modlabel2.move(520, 120) self.modlabel2.resize(300, 25) self.modlabel2.setText("Название переменной:") self.variable = QLineEdit(self) self.variable.setFont(font) self.variable.move(520, 160) self.variable.resize(150, 25) self.modlabel3 = QLabel(self) self.modlabel3.setFont(font) self.modlabel3.move(720, 120) self.modlabel3.resize(300, 25) self.modlabel3.setText("Начальный регистр:") self.startr = QLineEdit(self) self.startr.setFont(font) self.startr.move(720, 160) self.startr.resize(150, 25) self.value = QLineEdit(self) self.value.setFont(font) self.value.move(50, 250) self.value.resize(150, 25) self.button1 = QPushButton("Start", self) self.button1.move(50, 290) self.button1.clicked.connect(self.button_click) self.button2 = QPushButton("Stop", self) self.button2.move(150, 290) self.button2.clicked.connect(self.button_click2) self.buttonadd = QPushButton("Add", self) self.buttonadd.move(250, 290) self.buttonadd.clicked.connect(self.button_add) self.buttonsave = QPushButton("Save", self) self.buttonsave.move(350, 290) self.buttonsave.clicked.connect(self.button_save) self.buttonmod = QPushButton("Listen Modbus", self) self.buttonmod.move(650, 290) self.buttonmod.clicked.connect(self.startModbus) self.buttonaddm = QPushButton("Add register", self) self.buttonaddm.move(750, 240) self.buttonaddm.clicked.connect(self.addvariable) self.buttoncon = QPushButton("Connect", self) self.buttoncon.move(550, 290) self.buttoncon.clicked.connect(self.connect) self.buttonupd = QPushButton("Update", self) self.buttonupd.move(750, 290) self.buttonupd.clicked.connect(self.Update) self.datatypes = QComboBox(self) self.datatypes.move(520, 230) self.datatypes.setFont(font) self.datatypes.resize(120, 25) self.datatypes.addItems(datatypes2) self.ports = QComboBox(self) self.ports.move(550, 50) self.ports.setFont(font) self.ports.resize(120, 25) self.ports.addItems(PortsList) self.velocity = QComboBox(self) self.velocity.move(550, 80) self.velocity.setFont(font) self.velocity.resize(120, 25) self.velocity.addItems(VeloList) #self.regs = QLineEdit(self) #self.regs.setFont(font) #self.regs.move(550, 150) #self.regs.resize(150, 25) self.frameTable = QFrame(self) self.frameTable.move(50, 350) self.frameTable.setFont(font) self.frameTable.resize(1350, 950) self.frameTable.setVisible(True) self.treeTable = QTableWidget(self.frameTable) fontTable = QFont() fontTable.setPointSize(10) self.treeTable.setFont(fontTable) self.treeTable.resize(1000, 200) self.treeTable.setColumnCount(4) self.treeTable.setRowCount(1) self.treeTable.setHorizontalHeaderLabels( ['Имя переменной', 'Начальный регистр', 'Тип данных', 'Значение']) self.treeTable.resizeColumnsToContents() self.treeTable.setColumnWidth(0, 250) self.treeTable.setColumnWidth(1, 250) self.treeTable.setColumnWidth(2, 250) self.treeTable.setColumnWidth(3, 250) #self.thread = QThread() #self.thread.started.connect(self.getModbus) #self.thread.start() openFile = QAction(QIcon('open.png'), 'Open', self) openFile.setShortcut('Ctrl+O') openFile.setStatusTip('Open new File') openFile.triggered.connect(self.showDialog) menubar = self.menuBar() fileMenu = menubar.addMenu('&File') fileMenu.addAction(openFile) self.show() def showDialog(self): global typesfromfl global namesfromfl fname = QFileDialog.getOpenFileName(self, 'Open file', '/home')[0] f = open(fname, 'r') e = ET.parse(fname) doc = e.getroot() for v in e.findall('var'): typesfromfl.append(v.get('type')) namesfromfl.append(v.get('name')) new_var = [v.get('name'), 'value', v.get('type')] variables.append(new_var) print(variables) self.treeTable.setRowCount(len(variables)) for i in range(0, len(variables)): self.treeTable.setItem(i, 0, QTableWidgetItem(variables[i][0])) self.treeTable.setItem(i, 1, QTableWidgetItem(variables[i][1])) self.treeTable.setItem(i, 2, QTableWidgetItem(variables[i][2])) #with f: #data = f.read() #print(data) def button_click(self): a = self.port.text() print(a) global status status = True print(status) def connect(self): ind = self.ports.currentIndex() port = PortsList[ind] baud = self.velocity.currentIndex() portbaud = int(VeloList[baud]) connect(port, portbaud) def button_click2(self): global status status = False print(status) disconnect() datatypes2 = [ 'Boolean', 'Byte', 'Double', 'String', 'UInt16', 'UInt32', 'Float' ] def addvariable(self): global registersnum global variables global myobj global idx idt = self.datatypes.currentText() name = self.variable.text() startr = self.startr.text() new_var = [name, startr, idt, 0] variables.append(new_var) print(variables) registers.append(int(startr)) print(registers) registersnum = registersnum + 2 print(registersnum) myobj.add_variable(idx, name, 0.0) self.treeTable.setRowCount(len(variables)) for i in range(len(variables)): self.treeTable.setItem(i, 0, QTableWidgetItem(variables[i][0])) self.treeTable.setItem(i, 1, QTableWidgetItem(variables[i][1])) self.treeTable.setItem(i, 2, QTableWidgetItem(variables[i][2])) def startModbus(self): self.myThread = ModbusThread(registersnum, min(registers), 1) self.myThread.start() def button_save(self): createXML() def Update(self): bytes = self.regs.text() print(bytes) try: self.myThread.quant = int(bytes) values_for_transmit.append(0) except Exception as ex: print(ex) def button_add(self): global idx global objects global datatype global variable global variables global values_for_transmit indexdt = self.datatypes.currentIndex() name = self.variable.text() a = name print(name) value = self.value.text() print(value) index = self.folders.currentIndex() if indexdt == 0: value = bool(value) a = flListopc[index].add_variable(idx, name, value, ua.VariantType.Boolean) datatype = 'bool' if indexdt == 1: value = int(value) a = flListopc[index].add_variable(idx, name, value, ua.VariantType.Byte) datatype = 'byte' if indexdt == 2: value = int(value) a = flListopc[index].add_variable(idx, name, value, ua.VariantType.Double) a.set_writable() datatype = 'double' if indexdt == 3: value = str(value) a = flListopc[index].add_variable(idx, name, value, ua.VariantType.String) datatype = 'string' if indexdt == 4: value = int(value) a = flListopc[index].add_variable(idx, name, value, ua.VariantType.UInt16) datatype = 'UInt16' if indexdt == 5: value = int(value) a = flListopc[index].add_variable(idx, name, value, ua.VariantType.UInt32) datatype = 'UInt32' if indexdt == 6: try: for val in values_for_transmit: a = flListopc[index].add_variable( idx, 'value' + str(values_for_transmit.index(val)), val, ua.VariantType.Float) datatype = 'Float' except Exception as e: print(e) print(a, value, name, datatype) new_var = [name, value, datatype] variables.append(new_var) print(variables) self.treeTable.setRowCount(len(variables)) for i in range(len(variables)): self.treeTable.setItem(i, 0, QTableWidgetItem(variables[i][0])) self.treeTable.setItem(i, 1, QTableWidgetItem(variables[i][1])) self.treeTable.setItem(i, 2, QTableWidgetItem(variables[i][2]))
class App(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.srvList=["", "master_mercury230", "master_modbusRTU", "master_modbusTCP", "master_http", "master_dcon", "master_ping"] self.slvList=["","opcUA","modbusTCP"] if(os.name=='nt'): self.appPath=os.path.abspath(sys.argv[0]).replace(os.path.basename(__file__),'') self.imgPath=self.appPath+"img\\" self.dbPath=self.appPath+"db\\srvDb.db" else: self.appPath=os.path.abspath(sys.argv[0]).replace(os.path.basename(__file__),'') self.imgPath=self.appPath+"img/" self.dbPath=self.appPath+"db/srvDb.db" self.versionPr='ScadaPy Конфигуратор сервера v.3.11' self.setGeometry(400, 200, 1000, 520) self.setWindowTitle(self.versionPr) self.setWindowIcon(QIcon( self.imgPath+'gnome-monitor.png')) self.h=self.frameGeometry().height() font = QFont() font.setPointSize(12) self.label0=QLabel(self) self.label0.setFont(font) self.label0.move(400, 60) self.label0.resize(300,25) self.label0.setText("ID сервера") self.label00=QLabel(self) self.label00.setFont(font) self.label00.move(550, 60) self.label00.resize(300,25) self.label00.setText("") self.label1=QLabel(self) self.label1.setFont(font) self.label1.move(400, 90) self.label1.resize(140,25) self.label1.setText("Название сервера") self.srvName = QLineEdit(self) self.srvName.setToolTip('Пример: Сервер Маш.Зала №1') self.srvName.move(550, 90) self.srvName.setFont(font) self.srvName.resize(300,25) self.label2=QLabel(self) self.label2.setFont(font) self.label2.move(400, 120) self.label2.resize(140,25) self.label2.setText("Slave IP address") self.slaveIP = QLineEdit(self) self.slaveIP.setToolTip('Пример: 192.168.0.111') self.slaveIP.move(550, 120) self.slaveIP.setFont(font) self.slaveIP.resize(300,25) self.label2=QLabel(self) self.label2.setFont(font) self.label2.move(400, 150) self.label2.resize(140,25) self.label2.setText("Slave Port") self.slavePort = QLineEdit(self) self.slavePort.setToolTip('Пример modbus: 502\nПример opcua: 4840') self.slavePort.move(550, 150) self.slavePort.setFont(font) self.slavePort.resize(100,25) self.label7=QLabel(self) self.label7.setFont(font) self.label7.move(680, 150) self.label7.resize(140,25) self.label7.setText("Timeout") self.serverTimeout = QLineEdit(self) self.serverTimeout.setToolTip('Пример ms: 1 ') self.serverTimeout.move(750, 150) self.serverTimeout.setFont(font) self.serverTimeout.resize(100,25) self.label3=QLabel(self) self.label3.setFont(font) self.label3.move(400, 180) self.label3.resize(140,25) self.label3.setText("Тип Master") self.label3=QLabel(self) self.label3.setFont(font) self.label3.move(550, 180) self.label3.resize(340,25) self.label3.setText("---") self.combo1 = QComboBox(self) self.combo1.move(550, 210) self.combo1.setFont(font) self.combo1.resize(320,25) self.combo1.addItems(self.srvList) self.label4=QLabel(self) self.label4.setFont(font) self.label4.move(400, 240) self.label4.resize(140,25) self.label4.setText("Тип Slave") self.label4=QLabel(self) self.label4.setFont(font) self.label4.move(550, 240) self.label4.resize(340,25) self.label4.setText("---") self.combo2 = QComboBox(self) self.combo2.move(550, 270) self.combo2.setFont(font) self.combo2.resize(320,25) self.combo2.addItems(self.slvList) self.label5=QLabel(self) self.label5.setFont(font) self.label5.move(400, 300) self.label5.resize(140,25) self.label5.setText("Порт /dev/tty*") self.tty=QLineEdit(self) self.tty.setToolTip('Пример linux: /dev/ttyUSB0\nПример windows: com19') self.tty.setFont(font) self.tty.move(550, 300) self.tty.resize(150,25) self.label6=QLabel(self) self.label6.setFont(font) self.label6.move(720, 300) self.label6.resize(140,25) self.label6.setText("скорость") self.ttySpeed=QLineEdit(self) self.ttySpeed.setToolTip('Пример : 9600') self.ttySpeed.setFont(font) self.ttySpeed.move(800, 300) self.ttySpeed.resize(150,25) exitAction = QAction(QIcon( self.imgPath+'exit.png'), '&Выход', self) exitAction.setShortcut('Ctrl+Q') exitAction.setStatusTip('Выход из программы') exitAction.triggered.connect(qApp.quit) addServerAction = QAction(QIcon(self.imgPath+'add.png'), '&Добавить', self) addServerAction.setStatusTip('Добавить сервер') addServerAction.triggered.connect(self.addNewServer) delServerAction = QAction(QIcon(self.imgPath+'button_cancel.png'), '&Удалить', self) delServerAction.setStatusTip('Удалить сервер') delServerAction.triggered.connect(self.delServer) saveServerAction = QAction(QIcon(self.imgPath+'filesave.png'), '&Сохранить', self) saveServerAction.setStatusTip('Сохранить сервер') saveServerAction.triggered.connect(self.saveServer) saveScr = QAction(QIcon(self.imgPath+'bottom.png'), '&Сохранить скрипт', self) saveScr.setStatusTip('Сохранить скрипт') saveScr.triggered.connect(self.saveScr) runScr = QAction(QIcon(self.imgPath+'run.png'), '&Запустить скрипт', self) runScr.setStatusTip('Запустить скрипт') runScr.triggered.connect(self.runScr) menubar = self.menuBar() fileMenu = menubar.addMenu('&Команды') fileMenu.addAction(addServerAction) fileMenu.addAction(delServerAction) fileMenu.addAction(saveServerAction) fileMenu.addAction(saveScr) fileMenu.addAction(runScr) fileMenu.addAction(exitAction) self.toolbar = self.addToolBar('Выход') self.toolbar.addAction(exitAction) self.toolbar.addAction(addServerAction) self.toolbar.addAction(delServerAction) self.toolbar.addAction(saveServerAction) self.toolbar.addAction(saveScr) self.toolbar.addAction(runScr) # self.statusBar().showMessage('Загрузка данных') self.treeView = QTreeView(self) self.treeView.setFont(font) self.treeView.setObjectName("treeView") self.model = QStandardItemModel() self.treeView.setModel(self.model) self.header = ['Название сервера'] self.model.setHorizontalHeaderLabels(self.header) self.sqlLoad() self.treeView.clicked.connect(self.onClickItem) self.frameTable = QFrame(self) self.frameTable.move(380, 350) self.frameTable.setFont(font) self.frameTable.resize(1350,950) self.frameTable.setVisible(True) self.addRow = QPushButton(self.frameTable) self.addRow.setIcon(QIcon(self.imgPath+'add.png')) self.addRow.move(10, 10) self.addRow.resize(30,30) self.addRow.clicked.connect(self.addRowTable) self.saveTable = QPushButton(self.frameTable) self.saveTable.setIcon(QIcon(self.imgPath+'filesave.png')) self.saveTable.resize(30,30) self.saveTable.move(50, 10) self.saveTable.clicked.connect(self.saveRowTable) self.treeTable = QTableWidget(self.frameTable) fontTable = QFont() fontTable.setPointSize(10) self.treeTable.setFont(fontTable) self.show() def addRowTable(self): self.treeTable.insertRow(self.treeTable.rowCount()) def getDataPing(self): self.treeTable.clear() self.treeTable.setColumnCount(2) self.treeTable.setRowCount(1) self.treeTable.setHorizontalHeaderLabels(['IP адрес сервера','Имя переменной']) self.treeTable.resizeColumnsToContents() self.treeTable.setColumnWidth(0, 380) self.treeTable.setColumnWidth(1, 400) connDb = sqlite3.connect(self.dbPath) cursor = connDb.cursor() cursor.execute("select ip,name from master_ping where serverId = "+self.label00.text()) dt=cursor.fetchall() self.treeTable.setRowCount(len(dt)) for i in range(0,len(dt)): self.treeTable.setItem(i, 0, QTableWidgetItem(dt[i][0])) self.treeTable.setItem(i, 1, QTableWidgetItem(dt[i][1])) i+=1 def getDataMercury(self): self.treeTable.clear() self.treeTable.setColumnCount(2) self.treeTable.setRowCount(1) self.treeTable.setHorizontalHeaderLabels(['Сетевой адрес счетчика','Имя переменной']) self.treeTable.resizeColumnsToContents() self.treeTable.setColumnWidth(0, 380) self.treeTable.setColumnWidth(1, 400) connDb = sqlite3.connect(self.dbPath) cursor = connDb.cursor() cursor.execute("select netAdr, serNum from master_mercury230 where serverId = "+self.label00.text()) dt=cursor.fetchall() self.treeTable.setRowCount(len(dt)) for i in range(0,len(dt)): self.treeTable.setItem(i, 0, QTableWidgetItem(dt[i][0])) self.treeTable.setItem(i, 1, QTableWidgetItem(dt[i][1])) i+=1 def getDataModbusTCP(self): self.treeTable.clear() self.treeTable.setColumnCount(8) self.treeTable.setRowCount(1) self.treeTable.setHorizontalHeaderLabels(['IP адрес','Порт','Адрес\nRTU','Название регистра','Адрес\nячейки','Кол-во\nячеек','Адрес на\nсервере','Имя переменной']) self.treeTable.resizeColumnsToContents() self.treeTable.setColumnWidth(0, 110) self.treeTable.setColumnWidth(1, 50) self.treeTable.setColumnWidth(2, 80) self.treeTable.setColumnWidth(3, 220) self.treeTable.setColumnWidth(4, 80) self.treeTable.setColumnWidth(5, 80) self.treeTable.setColumnWidth(6, 80) self.treeTable.setColumnWidth(7, 160) connDb = sqlite3.connect(self.dbPath) cursor = connDb.cursor() cursor.execute("select ip,port,adrRtu,reg,fromAdr,fromCount,toAdr,comment serNum from master_modbusTCP where serverId = "+self.label00.text()) dt=cursor.fetchall() self.treeTable.setRowCount(len(dt)) for i in range(0,len(dt)): self.treeTable.setItem(i, 0, QTableWidgetItem(dt[i][0])) self.treeTable.setItem(i, 1, QTableWidgetItem(dt[i][1])) self.treeTable.setItem(i, 2, QTableWidgetItem(dt[i][2])) self.treeTable.setItem(i, 3, QTableWidgetItem(dt[i][3])) self.treeTable.setItem(i, 4, QTableWidgetItem(dt[i][4])) self.treeTable.setItem(i, 5, QTableWidgetItem(dt[i][5])) self.treeTable.setItem(i, 6, QTableWidgetItem(dt[i][6])) self.treeTable.setItem(i, 7, QTableWidgetItem(dt[i][7])) i+=1 def getDataHttp(self): self.treeTable.clear() self.treeTable.setColumnCount(7) self.treeTable.setRowCount(1) self.treeTable.setHorizontalHeaderLabels(['Адрес http','Название регистра','modbus-Адрес ячейки\nopc-тип переменной','Количество \nячеек','Объект','Login','Password']) self.treeTable.resizeColumnsToContents() self.treeTable.setColumnWidth(0, 310) self.treeTable.setColumnWidth(1, 160) self.treeTable.setColumnWidth(2, 150) self.treeTable.setColumnWidth(3, 120) self.treeTable.setColumnWidth(4, 120) self.treeTable.setColumnWidth(5, 120) self.treeTable.setColumnWidth(6, 120) connDb = sqlite3.connect(self.dbPath) cursor = connDb.cursor() cursor.execute("select ip,reg,toAdr,fromCount,comment,login,password from master_http where serverId = "+self.label00.text()) dt=cursor.fetchall() self.treeTable.setRowCount(len(dt)) for i in range(0,len(dt)): self.treeTable.setItem(i, 0, QTableWidgetItem(dt[i][0])) self.treeTable.setItem(i, 1, QTableWidgetItem(dt[i][1])) self.treeTable.setItem(i, 2, QTableWidgetItem(dt[i][2])) self.treeTable.setItem(i, 3, QTableWidgetItem(dt[i][3])) self.treeTable.setItem(i, 4, QTableWidgetItem(dt[i][4])) self.treeTable.setItem(i, 5, QTableWidgetItem(dt[i][5])) self.treeTable.setItem(i, 6, QTableWidgetItem(dt[i][6])) i+=1 def getDataDcon(self): self.treeTable.clear() self.treeTable.setColumnCount(4) self.treeTable.setRowCount(1) self.treeTable.setHorizontalHeaderLabels(['Модель','Адрес\nRTU','Адрес ячейки на\nсервере','Имя переменной']) self.treeTable.resizeColumnsToContents() self.treeTable.setColumnWidth(0, 110) self.treeTable.setColumnWidth(1, 80) self.treeTable.setColumnWidth(2, 120) self.treeTable.setColumnWidth(3, 320) connDb = sqlite3.connect(self.dbPath) cursor = connDb.cursor() cursor.execute("select model,adrRtu,toAdr,comment from master_dcon where serverId = "+self.label00.text()) dt=cursor.fetchall() self.treeTable.setRowCount(len(dt)) for i in range(0,len(dt)): self.treeTable.setItem(i, 0, QTableWidgetItem(dt[i][0])) self.treeTable.setItem(i, 1, QTableWidgetItem(dt[i][1])) self.treeTable.setItem(i, 2, QTableWidgetItem(dt[i][2])) self.treeTable.setItem(i, 3, QTableWidgetItem(dt[i][3])) i+=1 def getDataModbusRTU(self): self.treeTable.clear() self.treeTable.setColumnCount(6) self.treeTable.setRowCount(1) self.treeTable.setHorizontalHeaderLabels(['Адрес\nRTU','Название регистра','Адрес\nячейки','Кол-во\nячеек','Адрес на\nсервере','Имя переменной']) self.treeTable.resizeColumnsToContents() self.treeTable.setColumnWidth(0, 50) self.treeTable.setColumnWidth(1, 220) self.treeTable.setColumnWidth(2, 80) self.treeTable.setColumnWidth(3, 80) self.treeTable.setColumnWidth(4, 80) self.treeTable.setColumnWidth(5, 220) connDb = sqlite3.connect(self.dbPath) cursor = connDb.cursor() cursor.execute("select adrRtu,reg,fromAdr,fromCount,toAdr,comment serNum from master_modbusRTU where serverId = "+self.label00.text()) dt=cursor.fetchall() self.treeTable.setRowCount(len(dt)) for i in range(0,len(dt)): self.treeTable.setItem(i, 0, QTableWidgetItem(dt[i][0])) self.treeTable.setItem(i, 1, QTableWidgetItem(dt[i][1])) self.treeTable.setItem(i, 2, QTableWidgetItem(dt[i][2])) self.treeTable.setItem(i, 3, QTableWidgetItem(dt[i][3])) self.treeTable.setItem(i, 4, QTableWidgetItem(dt[i][4])) self.treeTable.setItem(i, 5, QTableWidgetItem(dt[i][5])) i+=1 def saveRowTable(self): connDb = sqlite3.connect(self.dbPath) cursor = connDb.cursor() if(self.label3.text()=="master_ping"): cursor.execute("delete from master_ping where serverId= '"+self.label00.text()+"'" ) connDb.commit() for i in range(0,self.treeTable.rowCount()): try: if( len(self.treeTable.item(i,0).text()) > 0 and len(self.treeTable.item(i,1).text()) > 0 ): cursor.execute("INSERT INTO master_ping(serverId,ip,name,valid)\ VALUES('"+self.label00.text()+"','"+self.treeTable.item(i,0).text()+"'\ ,'"+self.treeTable.item(i,1).text()+"',1)" ) connDb.commit() except Exception as e: #print(e) pass i+=1 self.getDataPing() if(self.label3.text()=="master_mercury230"): cursor.execute("delete from master_mercury230 where serverId= '"+self.label00.text()+"'" ) connDb.commit() for i in range(0,self.treeTable.rowCount()): try: if( len(self.treeTable.item(i,0).text()) > 0 and len(self.treeTable.item(i,1).text()) > 0 ): cursor.execute("INSERT INTO master_mercury230(serverId,netAdr,serNum,valid)\ VALUES('"+self.label00.text()+"','"+self.treeTable.item(i,0).text()+"'\ ,'"+self.treeTable.item(i,1).text()+"',1)" ) connDb.commit() except Exception as e: #print(e) pass i+=1 self.getDataMercury() if(self.label3.text()=="master_modbusTCP"): cursor.execute("delete from master_modbusTCP where serverId= '"+self.label00.text()+"'" ) connDb.commit() for i in range(0,self.treeTable.rowCount()): try: if( len(self.treeTable.item(i,0).text()) > 0 and len(self.treeTable.item(i,1).text()) > 0 and len(self.treeTable.item(i,2).text()) > 0 and len(self.treeTable.item(i,3).text()) > 0 and len(self.treeTable.item(i,4).text()) > 0 and len(self.treeTable.item(i,5).text()) > 0 and len(self.treeTable.item(i,6).text()) > 0 and len(self.treeTable.item(i,7).text()) > 0 ): cursor.execute("INSERT INTO master_modbusTCP(serverId,ip,port,adrRtu,reg,fromAdr,fromCount,toAdr,comment,valid)\ VALUES('"+self.label00.text()+"',\ '"+self.treeTable.item(i,0).text()+"',\ '"+self.treeTable.item(i,1).text()+"',\ '"+self.treeTable.item(i,2).text()+"',\ '"+self.treeTable.item(i,3).text()+"',\ '"+self.treeTable.item(i,4).text()+"',\ '"+self.treeTable.item(i,5).text()+"',\ '"+self.treeTable.item(i,6).text()+"',\ '"+self.treeTable.item(i,7).text()+"',\ 1)" ) connDb.commit() except Exception as e: #print(e) pass i+=1 self.getDataModbusTCP() if(self.label3.text()=="master_modbusRTU"): cursor.execute("delete from master_modbusRTU where serverId= '"+self.label00.text()+"'" ) connDb.commit() for i in range(0,self.treeTable.rowCount()): try: if( len(self.treeTable.item(i,0).text()) > 0 and len(self.treeTable.item(i,1).text()) > 0 and len(self.treeTable.item(i,2).text()) > 0 and len(self.treeTable.item(i,3).text()) > 0 and len(self.treeTable.item(i,4).text()) > 0 and len(self.treeTable.item(i,5).text()) > 0 ): cursor.execute("INSERT INTO master_modbusRTU(serverId,adrRtu,reg,fromAdr,fromCount,toAdr,comment,valid)\ VALUES('"+self.label00.text()+"',\ '"+self.treeTable.item(i,0).text()+"',\ '"+self.treeTable.item(i,1).text()+"',\ '"+self.treeTable.item(i,2).text()+"',\ '"+self.treeTable.item(i,3).text()+"',\ '"+self.treeTable.item(i,4).text()+"',\ '"+self.treeTable.item(i,5).text()+"',\ 1)" ) connDb.commit() except Exception as e: #print(e) pass i+=1 self.getDataModbusRTU() if(self.label3.text()=="master_dcon"): cursor.execute("delete from master_dcon where serverId= '"+self.label00.text()+"'" ) connDb.commit() for i in range(0,self.treeTable.rowCount()): try: if( len(self.treeTable.item(i,0).text()) > 0 and len(self.treeTable.item(i,1).text()) > 0 and len(self.treeTable.item(i,2).text()) > 0 and len(self.treeTable.item(i,3).text()) > 0 ): cursor.execute("INSERT INTO master_dcon (serverId,model,adrRtu,toAdr,comment,valid)\ VALUES('"+self.label00.text()+"',\ '"+self.treeTable.item(i,0).text()+"',\ '"+self.treeTable.item(i,1).text()+"',\ '"+self.treeTable.item(i,2).text()+"',\ '"+self.treeTable.item(i,3).text()+"',\ 1)" ) connDb.commit() except Exception as e: #print(e) pass i+=1 self.getDataDcon() if(self.label3.text()=="master_http"): cursor.execute("delete from master_http where serverId= '"+self.label00.text()+"'" ) connDb.commit() for i in range(0,self.treeTable.rowCount()): try: if( len(self.treeTable.item(i,0).text()) > 0 and len(self.treeTable.item(i,1).text()) > 0 and len(self.treeTable.item(i,2).text()) > 0 and len(self.treeTable.item(i,3).text()) > 0 ): cursor.execute("INSERT INTO master_http (serverId,ip,reg,toAdr,fromCount,comment,login,password,valid)\ VALUES('"+self.label00.text()+"',\ '"+self.treeTable.item(i,0).text()+"',\ '"+self.treeTable.item(i,1).text()+"',\ '"+self.treeTable.item(i,2).text()+"',\ '"+self.treeTable.item(i,3).text()+"',\ '"+self.treeTable.item(i,4).text()+"',\ '"+self.treeTable.item(i,5).text()+"',\ '"+self.treeTable.item(i,6).text()+"',\ 1)" ) connDb.commit() except Exception as e: print(e) pass i+=1 self.getDataHttp() def truePanel (self,index): if(index == 'master_ping'): self.getDataPing() if(index == 'master_mercury230'): self.getDataMercury() if(index == 'master_modbusTCP'): self.getDataModbusTCP() if(index == 'master_modbusRTU'): self.getDataModbusRTU() if(index == 'master_dcon'): self.getDataDcon() if(index == 'master_http'): self.getDataHttp() def onClickItem (self): self.treeTable.clear() self.treeTable.setRowCount(0) self.srvName.setText("") self.label00.setText("") self.slaveIP.setText("") self.slavePort.setText("") self.label3.setText("") self.tty.setText("") self.ttySpeed.setText("") self.label4.setText("") self.serverTimeout.setText("") try: self.slaveIP.setEnabled(True) self.slavePort.setEnabled(True) self.tty.setEnabled(True) self.ttySpeed.setEnabled(True) index_list =[i.data() for i in self.treeView.selectedIndexes()] s=index_list[0].split(':') self.srvName.setText(s[1]) self.label00.setText(s[0]) connDb = sqlite3.connect(self.dbPath) cursor = connDb.cursor() cursor.execute("select ip, port,stype,mtype,tty,speed,timeout from servers where id = "+s[0]) dt=cursor.fetchone() self.slaveIP.setText(dt[0]) self.slavePort.setText(dt[1]) self.label4.setText(dt[2]) self.label3.setText(dt[3]) self.tty.setText(dt[4]) self.ttySpeed.setText(dt[5]) self.serverTimeout.setText(dt[6]) self.slvList[0]=dt[2] self.srvList[0]=dt[3] self.truePanel (self.label3.text()) except Exception as e: index_list =[i.data() for i in self.treeView.selectedIndexes()] self.srvName.setText(index_list[0]) self.slaveIP.setEnabled(False) self.slavePort.setEnabled(False) self.tty.setEnabled(False) self.ttySpeed.setEnabled(False) # print(e) self.combo1.clear() self.combo1.addItems(self.srvList) self.combo2.clear() self.combo2.addItems(self.slvList) def addNewServer(self): sender = self.sender() self.statusBar().showMessage('Добавление нового сервера') self.model.appendRow(QStandardItem("Новый Сервер ")) def closeEvent(self, event): reply = QMessageBox.question(self, 'Сообщение', "Вы уверены, что хотите выйти?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if reply == QMessageBox.Yes: event.accept() else: event.ignore() def resizeEvent(self,event): self.h=self.frameGeometry().height() self.treeView.setGeometry(QtCore.QRect(0, 60, 350, self.h-120)) self.treeTable.setGeometry(QtCore.QRect(10, 50, 1140, self.h-460)) self.frameTable.setGeometry(QtCore.QRect(380, 350, 1150, self.h-400)) def sqlLoad(self): connDb = sqlite3.connect(self.dbPath) cursor = connDb.cursor() for row in cursor.execute('SELECT name, id FROM servers where valid=1 ORDER BY id'): self.model.appendRow(QStandardItem(str(row[1])+":"+row[0])) def saveServer(self): self.treeTable.clear() self.truePanel ("") connDb = sqlite3.connect(self.dbPath) cursor = connDb.cursor() if(len(self.label00.text())>0 and int(self.label00.text()) >0): if(len(self.srvName.text()) > 1): connDb.execute("update servers set name ='"+self.srvName.text()+ "', ip = '"+self.slaveIP.text()+"', port = '"+self.slavePort.text()+"'\ ,mtype='"+self.combo1.currentText()+"',stype='"+self.combo2.currentText()+"',tty='"+self.tty.text()+"'\ ,speed='"+self.ttySpeed.text()+"',timeout='"+self.serverTimeout.text()+"' where id = "+self.label00.text()+" ") connDb.commit() cursor.execute("select ip, port, mtype,stype,tty,speed,timeout from servers where id = "+self.label00.text()) dt=cursor.fetchone() self.slaveIP.setText(dt[0]) self.slavePort.setText(dt[1]) self.label3.setText(dt[2]) self.label4.setText(dt[3]) self.tty.setText(dt[4]) self.ttySpeed.setText(dt[5]) self.slvList[0]=dt[3] self.srvList[0]=dt[2] self.serverTimeout.setText(dt[6]) else: try: if(len(self.srvName.text()) > 1): cursor.execute("INSERT INTO servers(name,valid) VALUES( '"+self.srvName.text()+"',1)" ) connDb.commit() except Exception as e: print(e) pass self.model.clear() self.model.setHorizontalHeaderLabels(self.header) cursor = connDb.cursor() for row in cursor.execute('SELECT name, id FROM servers where valid=1 ORDER BY id'): self.model.appendRow(QStandardItem(str(row[1])+":"+row[0])) self.combo1.clear() self.combo1.addItems(self.srvList) self.combo2.clear() self.combo2.addItems(self.slvList) self.truePanel (self.label3.text()) def saveScr(self): pathFolder = self.appPath if(os.name=='nt'): slash='\\' bat='.bat' rem ='rem ' command = 'start ' else: slash='/' bat='.sh' rem='# ' command='' f=open(pathFolder +'scr'+slash+'start_'+self.label00.text() + bat,'w') f.write(rem+'Скрипт создан в программе \''+self.versionPr+'\'\n') f.write(rem+'Название сервера \''+self.srvName.text()+'\'\n') f.write(rem+'Slave адрес \''+self.slaveIP.text()+'\'\n') f.write(rem+'Slave порт \''+self.slavePort.text()+'\'\n') f.write(rem+'Тип master \''+self.label3.text()+'\'\n') f.write(rem+'Тип slave \''+self.label4.text()+'\'\n') f.write(rem+'Интерфейс tty \''+self.tty.text()+'\'\n') f.write(rem+'Скорость tty \''+self.ttySpeed.text()+'\'\n') if(self.label4.text() == 'opcUA' and self.label3.text() =='master_modbusTCP'): f.write(command+sys.executable+' '+pathFolder +'source'+slash+'opcua_master_tcp.py '+self.label00.text() +' '+pathFolder +'db'+slash+'srvDb.db') if(self.label4.text() == 'opcUA' and self.label3.text() =='master_ping'): f.write(command+sys.executable+' '+pathFolder +'source'+slash+'opcua_master_ping.py '+self.label00.text() +' '+pathFolder +'db'+slash+'srvDb.db') if(self.label4.text() == 'opcUA' and self.label3.text() =='master_dcon'): f.write(command+sys.executable+' '+pathFolder +'source'+slash+'opcua_master_dcon.py '+self.label00.text() +' '+pathFolder +'db'+slash+'srvDb.db') if(self.label4.text() == 'opcUA' and self.label3.text() =='master_mercury230'): f.write(command+sys.executable+' '+pathFolder +'source'+slash+'opcua_master_mercury230.py '+self.label00.text() +' '+pathFolder +'db'+slash+'srvDb.db') if(self.label4.text() == 'opcUA' and self.label3.text() =='master_modbusRTU'): f.write(command+sys.executable+' '+pathFolder +'source'+slash+'opcua_master_rtu.py '+self.label00.text() +' '+pathFolder +'db'+slash+'srvDb.db') if(self.label4.text() == 'opcUA' and self.label3.text() =='master_http'): f.write(command+sys.executable+' '+pathFolder +'source'+slash+'opcua_master_http.py '+self.label00.text() +' '+pathFolder +'db'+slash+'srvDb.db') if(self.label4.text() == 'modbusTCP' and self.label3.text() =='master_modbusTCP'): f.write(command+sys.executable+' '+pathFolder +'source'+slash+'modbustcp_master_tcp.py '+self.label00.text() +' '+pathFolder +'db'+slash+'srvDb.db') if(self.label4.text() == 'modbusTCP' and self.label3.text() =='master_ping'): f.write(command+sys.executable+' '+pathFolder +'source'+slash+'modbustcp_master_ping.py '+self.label00.text() +' '+pathFolder +'db'+slash+'srvDb.db') if(self.label4.text() == 'modbusTCP' and self.label3.text() =='master_dcon'): f.write(command+sys.executable+' '+pathFolder +'source'+slash+'modbustcp_master_dcon.py '+self.label00.text() +' '+pathFolder +'db'+slash+'srvDb.db') if(self.label4.text() == 'modbusTCP' and self.label3.text() =='master_mercury230'): f.write(command+sys.executable+' '+pathFolder +'source'+slash+'modbustcp_master_mercury230.py '+self.label00.text() +' '+pathFolder +'db'+slash+'srvDb.db') if(self.label4.text() == 'modbusTCP' and self.label3.text() =='master_modbusRTU'): f.write(command+sys.executable+' '+pathFolder +'source'+slash+'modbustcp_master_rtu.py '+self.label00.text() +' '+pathFolder +'db'+slash+'srvDb.db') if(self.label4.text() == 'modbusTCP' and self.label3.text() =='master_http'): f.write(command+sys.executable+' '+pathFolder +'source'+slash+'modbustcp_master_http.py '+self.label00.text() +' '+pathFolder +'db'+slash+'srvDb.db') f.close() ret = pathFolder +''+slash+'scr'+slash+'start_'+self.label00.text() + bat return ret def runScr(self): if(os.name=='nt'): os.system(self.saveScr()) else: os.system('chmod 777 '+self.saveScr()) os.system('xfce4-terminal --command=\'sudo '+self.saveScr()+'\'') def delServer(self): self.treeTable.clear() self.treeTable.setRowCount(0) connDb = sqlite3.connect(self.dbPath) if(len(self.label00.text())>0 and int(self.label00.text()) >0): if(len(self.srvName.text()) > 1): connDb.execute("update servers set valid=0 where id = "+self.label00.text()+" ") connDb.commit() self.model.clear() self.model.setHorizontalHeaderLabels(self.header) cursor = connDb.cursor() for row in cursor.execute('SELECT name, id FROM servers where valid=1 ORDER BY id'): self.model.appendRow(QStandardItem(str(row[1])+":"+row[0])) self.slaveIP.setText("") self.slavePort.setText("") self.label3.setText("") self.srvName.setText("")