From 146dd74c95f3c9373df9884770a0a50aa8f84cb8 Mon Sep 17 00:00:00 2001 From: Sven Sager Date: Tue, 13 Oct 2020 20:02:37 +0200 Subject: [PATCH] Add option for software watchdog and driver reset action --- include/ui/revpioption_ui.py | 51 +++-- include/ui/revpiprogram_ui.py | 45 ++-- include/ui_dev/revpioption.ui | 83 ++++--- include/ui_dev/revpiprogram.ui | 57 +++-- revpicommander/locale/revpicommander_de.ts | 247 ++++++++++++--------- revpicommander/revpioption.py | 5 +- revpicommander/revpiprogram.py | 5 +- 7 files changed, 309 insertions(+), 184 deletions(-) diff --git a/include/ui/revpioption_ui.py b/include/ui/revpioption_ui.py index ff141c0..6407217 100644 --- a/include/ui/revpioption_ui.py +++ b/include/ui/revpioption_ui.py @@ -11,7 +11,7 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_diag_options(object): def setupUi(self, diag_options): diag_options.setObjectName("diag_options") - diag_options.resize(452, 503) + diag_options.resize(416, 522) self.verticalLayout = QtWidgets.QVBoxLayout(diag_options) self.verticalLayout.setObjectName("verticalLayout") self.gb_plc = QtWidgets.QGroupBox(diag_options) @@ -21,29 +21,24 @@ class Ui_diag_options(object): self.lbl_replace_io = QtWidgets.QLabel(self.gb_plc) self.lbl_replace_io.setObjectName("lbl_replace_io") self.gridLayout.addWidget(self.lbl_replace_io, 6, 0, 1, 1) - self.sbx_autoreloaddelay = QtWidgets.QSpinBox(self.gb_plc) - self.sbx_autoreloaddelay.setMinimum(5) - self.sbx_autoreloaddelay.setMaximum(120) - self.sbx_autoreloaddelay.setObjectName("sbx_autoreloaddelay") - self.gridLayout.addWidget(self.sbx_autoreloaddelay, 2, 2, 1, 1) - self.cbx_zeroonexit = QtWidgets.QCheckBox(self.gb_plc) - self.cbx_zeroonexit.setObjectName("cbx_zeroonexit") - self.gridLayout.addWidget(self.cbx_zeroonexit, 4, 1, 1, 2) self.cbx_zeroonerror = QtWidgets.QCheckBox(self.gb_plc) self.cbx_zeroonerror.setObjectName("cbx_zeroonerror") self.gridLayout.addWidget(self.cbx_zeroonerror, 5, 1, 1, 2) self.cbx_autostart = QtWidgets.QCheckBox(self.gb_plc) self.cbx_autostart.setObjectName("cbx_autostart") self.gridLayout.addWidget(self.cbx_autostart, 0, 0, 1, 3) - self.cbx_autoreload = QtWidgets.QCheckBox(self.gb_plc) - self.cbx_autoreload.setObjectName("cbx_autoreload") - self.gridLayout.addWidget(self.cbx_autoreload, 1, 0, 1, 3) + self.cbb_reset_driver_action = QtWidgets.QComboBox(self.gb_plc) + self.cbb_reset_driver_action.setObjectName("cbb_reset_driver_action") + self.cbb_reset_driver_action.addItem("") + self.cbb_reset_driver_action.addItem("") + self.cbb_reset_driver_action.addItem("") + self.gridLayout.addWidget(self.cbb_reset_driver_action, 8, 1, 1, 2) + self.lbl_reset_driver_action = QtWidgets.QLabel(self.gb_plc) + self.lbl_reset_driver_action.setObjectName("lbl_reset_driver_action") + self.gridLayout.addWidget(self.lbl_reset_driver_action, 8, 0, 1, 1) self.lbl_plc_zero = QtWidgets.QLabel(self.gb_plc) self.lbl_plc_zero.setObjectName("lbl_plc_zero") self.gridLayout.addWidget(self.lbl_plc_zero, 3, 0, 1, 3) - self.txt_replace_io = QtWidgets.QLineEdit(self.gb_plc) - self.txt_replace_io.setObjectName("txt_replace_io") - self.gridLayout.addWidget(self.txt_replace_io, 7, 1, 1, 2) self.cbb_replace_io = QtWidgets.QComboBox(self.gb_plc) self.cbb_replace_io.setObjectName("cbb_replace_io") self.cbb_replace_io.addItem("") @@ -51,9 +46,26 @@ class Ui_diag_options(object): self.cbb_replace_io.addItem("") self.cbb_replace_io.addItem("") self.gridLayout.addWidget(self.cbb_replace_io, 6, 1, 1, 2) + self.cbx_zeroonexit = QtWidgets.QCheckBox(self.gb_plc) + self.cbx_zeroonexit.setObjectName("cbx_zeroonexit") + self.gridLayout.addWidget(self.cbx_zeroonexit, 4, 1, 1, 2) self.lbl_plc_delay = QtWidgets.QLabel(self.gb_plc) self.lbl_plc_delay.setObjectName("lbl_plc_delay") self.gridLayout.addWidget(self.lbl_plc_delay, 2, 0, 1, 2) + self.sbx_autoreloaddelay = QtWidgets.QSpinBox(self.gb_plc) + self.sbx_autoreloaddelay.setMinimum(5) + self.sbx_autoreloaddelay.setMaximum(120) + self.sbx_autoreloaddelay.setObjectName("sbx_autoreloaddelay") + self.gridLayout.addWidget(self.sbx_autoreloaddelay, 2, 2, 1, 1) + self.cbx_autoreload = QtWidgets.QCheckBox(self.gb_plc) + self.cbx_autoreload.setObjectName("cbx_autoreload") + self.gridLayout.addWidget(self.cbx_autoreload, 1, 0, 1, 3) + self.txt_replace_io = QtWidgets.QLineEdit(self.gb_plc) + self.txt_replace_io.setObjectName("txt_replace_io") + self.gridLayout.addWidget(self.txt_replace_io, 7, 1, 1, 2) + self.lbl_lbl_reset_driver_action = QtWidgets.QLabel(self.gb_plc) + self.lbl_lbl_reset_driver_action.setObjectName("lbl_lbl_reset_driver_action") + self.gridLayout.addWidget(self.lbl_lbl_reset_driver_action, 9, 0, 1, 3) self.verticalLayout.addWidget(self.gb_plc) self.gb_server = QtWidgets.QGroupBox(diag_options) self.gb_server.setObjectName("gb_server") @@ -110,16 +122,21 @@ class Ui_diag_options(object): diag_options.setWindowTitle(_translate("diag_options", "RevPi Python PLC Options")) self.gb_plc.setTitle(_translate("diag_options", "Start / Stop behavior of PLC program")) self.lbl_replace_io.setText(_translate("diag_options", "Replace IO file:")) - self.cbx_zeroonexit.setText(_translate("diag_options", "... sucessfully without error")) self.cbx_zeroonerror.setText(_translate("diag_options", "... after exception and errors")) self.cbx_autostart.setText(_translate("diag_options", "Start PLC program automatically")) - self.cbx_autoreload.setText(_translate("diag_options", "Restart PLC program after exit or crash")) + self.cbb_reset_driver_action.setItemText(0, _translate("diag_options", "Do nothing")) + self.cbb_reset_driver_action.setItemText(1, _translate("diag_options", "Restart after piCtory changed")) + self.cbb_reset_driver_action.setItemText(2, _translate("diag_options", "Always restart the PLC program")) + self.lbl_reset_driver_action.setText(_translate("diag_options", "Driver reset action:")) self.lbl_plc_zero.setText(_translate("diag_options", "Set process image to NULL if program terminates...")) self.cbb_replace_io.setItemText(0, _translate("diag_options", "Do not use replace io file")) self.cbb_replace_io.setItemText(1, _translate("diag_options", "Use static file from RevPiPyLoad")) self.cbb_replace_io.setItemText(2, _translate("diag_options", "Use dynamic file from work directory")) self.cbb_replace_io.setItemText(3, _translate("diag_options", "Give own path and filename")) + self.cbx_zeroonexit.setText(_translate("diag_options", "... sucessfully without error")) self.lbl_plc_delay.setText(_translate("diag_options", "Restart delay in seconds:")) + self.cbx_autoreload.setText(_translate("diag_options", "Restart PLC program after exit or crash")) + self.lbl_lbl_reset_driver_action.setText(_translate("diag_options", "PLC program behavior after piCtory driver reset clicked")) self.gb_server.setTitle(_translate("diag_options", "RevPiPyLoad server services")) self.btn_aclplcslave.setText(_translate("diag_options", "Edit ACL")) self.cbx_mqtt.setText(_translate("diag_options", "MQTT process image publisher")) diff --git a/include/ui/revpiprogram_ui.py b/include/ui/revpiprogram_ui.py index b641284..9552c5d 100644 --- a/include/ui/revpiprogram_ui.py +++ b/include/ui/revpiprogram_ui.py @@ -11,37 +11,44 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_diag_program(object): def setupUi(self, diag_program): diag_program.setObjectName("diag_program") - diag_program.resize(488, 500) + diag_program.resize(400, 501) self.verticalLayout = QtWidgets.QVBoxLayout(diag_program) self.verticalLayout.setObjectName("verticalLayout") self.gb_plc = QtWidgets.QGroupBox(diag_program) self.gb_plc.setObjectName("gb_plc") self.gridLayout = QtWidgets.QGridLayout(self.gb_plc) self.gridLayout.setObjectName("gridLayout") - self.rbn_pythonversion_2 = QtWidgets.QRadioButton(self.gb_plc) - self.rbn_pythonversion_2.setObjectName("rbn_pythonversion_2") - self.gridLayout.addWidget(self.rbn_pythonversion_2, 3, 1, 1, 1) - self.txt_plcarguments = QtWidgets.QLineEdit(self.gb_plc) - self.txt_plcarguments.setObjectName("txt_plcarguments") - self.gridLayout.addWidget(self.txt_plcarguments, 2, 1, 1, 2) - self.rbn_pythonversion_3 = QtWidgets.QRadioButton(self.gb_plc) - self.rbn_pythonversion_3.setObjectName("rbn_pythonversion_3") - self.gridLayout.addWidget(self.rbn_pythonversion_3, 3, 2, 1, 1) - self.lbl_plcprogram = QtWidgets.QLabel(self.gb_plc) - self.lbl_plcprogram.setObjectName("lbl_plcprogram") - self.gridLayout.addWidget(self.lbl_plcprogram, 0, 0, 1, 3) - self.cbx_plcworkdir_set_uid = QtWidgets.QCheckBox(self.gb_plc) - self.cbx_plcworkdir_set_uid.setObjectName("cbx_plcworkdir_set_uid") - self.gridLayout.addWidget(self.cbx_plcworkdir_set_uid, 4, 0, 1, 3) self.cbb_plcprogram = QtWidgets.QComboBox(self.gb_plc) self.cbb_plcprogram.setObjectName("cbb_plcprogram") self.gridLayout.addWidget(self.cbb_plcprogram, 1, 0, 1, 3) + self.rbn_pythonversion_3 = QtWidgets.QRadioButton(self.gb_plc) + self.rbn_pythonversion_3.setObjectName("rbn_pythonversion_3") + self.gridLayout.addWidget(self.rbn_pythonversion_3, 3, 2, 1, 1) + self.cbx_plcworkdir_set_uid = QtWidgets.QCheckBox(self.gb_plc) + self.cbx_plcworkdir_set_uid.setObjectName("cbx_plcworkdir_set_uid") + self.gridLayout.addWidget(self.cbx_plcworkdir_set_uid, 4, 0, 1, 3) + self.lbl_plcprogram = QtWidgets.QLabel(self.gb_plc) + self.lbl_plcprogram.setObjectName("lbl_plcprogram") + self.gridLayout.addWidget(self.lbl_plcprogram, 0, 0, 1, 3) self.lbl_pythonversion = QtWidgets.QLabel(self.gb_plc) self.lbl_pythonversion.setObjectName("lbl_pythonversion") self.gridLayout.addWidget(self.lbl_pythonversion, 3, 0, 1, 1) + self.rbn_pythonversion_2 = QtWidgets.QRadioButton(self.gb_plc) + self.rbn_pythonversion_2.setObjectName("rbn_pythonversion_2") + self.gridLayout.addWidget(self.rbn_pythonversion_2, 3, 1, 1, 1) self.lbl_plcarguments = QtWidgets.QLabel(self.gb_plc) self.lbl_plcarguments.setObjectName("lbl_plcarguments") self.gridLayout.addWidget(self.lbl_plcarguments, 2, 0, 1, 1) + self.txt_plcarguments = QtWidgets.QLineEdit(self.gb_plc) + self.txt_plcarguments.setObjectName("txt_plcarguments") + self.gridLayout.addWidget(self.txt_plcarguments, 2, 1, 1, 2) + self.sbx_plcprogram_watchdog = QtWidgets.QSpinBox(self.gb_plc) + self.sbx_plcprogram_watchdog.setMaximum(600) + self.sbx_plcprogram_watchdog.setObjectName("sbx_plcprogram_watchdog") + self.gridLayout.addWidget(self.sbx_plcprogram_watchdog, 5, 2, 1, 1) + self.lbl_plcprogram_watchdog = QtWidgets.QLabel(self.gb_plc) + self.lbl_plcprogram_watchdog.setObjectName("lbl_plcprogram_watchdog") + self.gridLayout.addWidget(self.lbl_plcprogram_watchdog, 5, 0, 1, 2) self.verticalLayout.addWidget(self.gb_plc) self.cb_transfair = QtWidgets.QGroupBox(diag_program) self.cb_transfair.setObjectName("cb_transfair") @@ -115,12 +122,14 @@ class Ui_diag_program(object): _translate = QtCore.QCoreApplication.translate diag_program.setWindowTitle(_translate("diag_program", "PLC program")) self.gb_plc.setTitle(_translate("diag_program", "PLC program")) - self.rbn_pythonversion_2.setText(_translate("diag_program", "Python 2")) self.rbn_pythonversion_3.setText(_translate("diag_program", "Python 3")) - self.lbl_plcprogram.setText(_translate("diag_program", "Python PLC start program:")) self.cbx_plcworkdir_set_uid.setText(_translate("diag_program", "Set write permissions for plc program to workdirectory")) + self.lbl_plcprogram.setText(_translate("diag_program", "Python PLC start program:")) self.lbl_pythonversion.setText(_translate("diag_program", "Python version:")) + self.rbn_pythonversion_2.setText(_translate("diag_program", "Python 2")) self.lbl_plcarguments.setText(_translate("diag_program", "Program arguments:")) + self.sbx_plcprogram_watchdog.setSuffix(_translate("diag_program", " sec.")) + self.lbl_plcprogram_watchdog.setText(_translate("diag_program", "Software watchdog (0=disabled):")) self.cb_transfair.setTitle(_translate("diag_program", "Transfair PLC program")) self.cbb_format.setItemText(0, _translate("diag_program", "ZIP archive")) self.cbb_format.setItemText(1, _translate("diag_program", "TGZ archive")) diff --git a/include/ui_dev/revpioption.ui b/include/ui_dev/revpioption.ui index 88d2eb3..21dc69d 100644 --- a/include/ui_dev/revpioption.ui +++ b/include/ui_dev/revpioption.ui @@ -6,8 +6,8 @@ 0 0 - 452 - 503 + 416 + 522 @@ -27,23 +27,6 @@ - - - - 5 - - - 120 - - - - - - - ... sucessfully without error - - - @@ -58,10 +41,29 @@ - - + + + + + Do nothing + + + + + Restart after piCtory changed + + + + + Always restart the PLC program + + + + + + - Restart PLC program after exit or crash + Driver reset action: @@ -72,9 +74,6 @@ - - - @@ -99,6 +98,13 @@ + + + + ... sucessfully without error + + + @@ -106,6 +112,33 @@ + + + + 5 + + + 120 + + + + + + + Restart PLC program after exit or crash + + + + + + + + + + PLC program behavior after piCtory driver reset clicked + + + diff --git a/include/ui_dev/revpiprogram.ui b/include/ui_dev/revpiprogram.ui index 4a50e50..f6dccb1 100644 --- a/include/ui_dev/revpiprogram.ui +++ b/include/ui_dev/revpiprogram.ui @@ -6,8 +6,8 @@ 0 0 - 488 - 500 + 400 + 501 @@ -20,15 +20,8 @@ PLC program - - - - Python 2 - - - - - + + @@ -37,13 +30,6 @@ - - - - Python PLC start program: - - - @@ -51,8 +37,12 @@ - - + + + + Python PLC start program: + + @@ -61,6 +51,13 @@ + + + + Python 2 + + + @@ -68,6 +65,26 @@ + + + + + + + sec. + + + 600 + + + + + + + Software watchdog (0=disabled): + + + diff --git a/revpicommander/locale/revpicommander_de.ts b/revpicommander/locale/revpicommander_de.ts index 68fc9a7..c0e0a60 100644 --- a/revpicommander/locale/revpicommander_de.ts +++ b/revpicommander/locale/revpicommander_de.ts @@ -134,15 +134,25 @@ Unsaved changes will be lost DebugIos - + signed - + big_endian + + + as text + + + + + as number + + MqttManager @@ -437,7 +447,7 @@ Select 'Yes' to override, 'No' to download only missing file RevPiOption - + Question @@ -449,74 +459,74 @@ ACL changes and service settings are applied immediately. - + Error - + The settings could not be saved on the Revolution Pi! Try to save the values one mor time and check the log files of RevPiPyLoad if the error rises again. - + Do you really want to quit? Unsaved changes will be lost. - + running - + stopped - + The MQTT service is not available on your RevPiPyLoad version. - + read only - + read and write - + Are you sure you want to deactivate the XML-RPC server? You will NOT be able to access the Revolution Pi with this program after saving the options! - + Start/Stop PLC program and read logs - + + read IOs in watch mode - + + read properties and download PLC program - + + upload PLC program - + + set properties @@ -543,258 +553,258 @@ Unsaved changes will be lost. RevPiProgram - + Error - + You have to select a start program, before uploading the settings. - + Question - + The settings will be set on the Revolution Pi now. If you made changes on the 'PCL Program' section, your plc program will restart now! - + The settings could not be saved on the Revolution Pi! Try to save the values one mor time and check the log files of RevPiPyLoad if the error rises again. - + Do you really want to quit? Unsaved changes will be lost. - + Reset driver... - + Reset piControl driver after successful uploading new piCtory configuration? The process image will be interrupted for a short time! - + Got an network error while send data to Revolution Pi. Please try again. - + Success - + The transfer of the piCtory configuration and the reset of piControl have been successfully executed. - + The piCtory configuration was successfully transferred. - + Can not process the transferred file. - + Can not find main elements in piCtory file. - + Contained devices could not be found on Revolution Pi. The configuration may be from a newer piCtory version! - + Could not load RAP catalog on Revolution Pi. - + The piCtory configuration could not be written on the Revolution Pi. - + Warning - + The piCtroy configuration has been saved successfully. An error occurred on piControl reset! - + Save ZIP archive... - + ZIP archive (*.zip);;All files (*.*) - + Save TGZ archive... - + TGZ archive (*.tgz);;All files (*.*) - + Could not load PLC program from Revolution Pi. - + Coud not save the archive or extract the files! Please retry. - + Transfer successfully completed. - + Upload content of ZIP archive... - + The selected file ist not a ZIP archive. - + Upload content of TAR archive... - + TAR archive (*.tgz);;All files (*.*) - + The selected file ist not a TAR archive. - + No files to upload... - + Found no files to upload in given location or archive. - + There was an error deleting the files on the Revolution Pi. Upload aborted! Please try again. - + The PLC program was transferred successfully. - + Information - + Could not find the selected PLC start program in uploaded files. This is not an error, if the file was already on the Revolution Pi. Check PLC start program field - + There is no piCtory configuration in this archive. - + The Revolution Pi could not process some parts of the transmission. - + Errors occurred during transmission. - + Save piCtory file... - + piCtory file (*.rsc);;All files (*.*) - + Could not load piCtory file from Revolution Pi. - + piCtory configuration successfully loaded and saved to: {0}. - + Upload piCtory file... - + Save piControl file... - + Process image file (*.img);;All files (*.*) - + Could not load process image from Revolution Pi. - + Process image successfully loaded and saved to: {0}. @@ -1024,100 +1034,125 @@ Publish values with topic: [basetopic]/set/[outputname] - + ... sucessfully without error - + ... after exception and errors - + Start PLC program automatically - + Restart PLC program after exit or crash - + Set process image to NULL if program terminates... - + Do not use replace io file - + Use static file from RevPiPyLoad - + Use dynamic file from work directory - + Give own path and filename - + Restart delay in seconds: - + RevPiPyLoad server services - + Edit ACL - + MQTT process image publisher - + Start RevPi piControl server - + status - + piControl server is: - + MQTT publish service is: - + Settings - + Activate XML-RPC for RevPiPyControl + + + Do nothing + + + + + Restart after piCtory changed + + + + + Always restart the PLC program + + + + + Driver reset action: + + + + + PLC program behavior after piCtory driver reset clicked + + diag_program @@ -1127,12 +1162,12 @@ Publish values with topic: [basetopic]/set/[outputname] - + Python 2 - + Python 3 @@ -1142,75 +1177,85 @@ Publish values with topic: [basetopic]/set/[outputname] - + Set write permissions for plc program to workdirectory - + Python version: - + Program arguments: - + Transfair PLC program - + ZIP archive - + TGZ archive - + Upload - + Download - + Transfair format: - + Including piCtory configuration - + Remove all files on Revolution Pi before upload - + Control files - + piCtory configuraiton - + Process image from piControl0 + + + sec. + + + + + Software watchdog (0=disabled): + + diag_revpiinfo diff --git a/revpicommander/revpioption.py b/revpicommander/revpioption.py index a63ddc8..143c81d 100644 --- a/revpicommander/revpioption.py +++ b/revpicommander/revpioption.py @@ -82,8 +82,7 @@ class RevPiOption(QtWidgets.QDialog, Ui_diag_options): int(self.cbx_zeroonexit.isChecked()) != self.dc.get("zeroonexit", 0) or int(self.cbx_zeroonerror.isChecked()) != self.dc.get("zeroonerror", 0) or self.txt_replace_io.text() != self.dc.get("replace_ios", "") or - # todo: self.dc.get("plcprogram_watchdog", 0) - # todo: self.dc.get("reset_driver_action", 2) + self.cbb_reset_driver_action.currentIndex() != self.dc.get("reset_driver_action", 2) or # todo: self.dc.get("rtlevel", 2) int(self.cbx_plcslave.isChecked()) != self.dc.get("plcslave", 0) or @@ -120,6 +119,7 @@ class RevPiOption(QtWidgets.QDialog, Ui_diag_options): self.cbx_zeroonexit.setChecked(bool(self.dc.get("zeroonexit", 0))) self.cbx_zeroonerror.setChecked(bool(self.dc.get("zeroonerror", 0))) self.txt_replace_io.setText(self.dc.get("replace_ios", "")) + self.cbb_reset_driver_action.setCurrentIndex(self.dc.get("reset_driver_action", 2)) self.cbx_plcslave.setChecked(bool(self.dc.get("plcslave", 0))) self.acl_plcslave = self.dc.get("plcslaveacl", "") self.cbx_mqtt.setChecked(bool(self.dc.get("mqtt", 0))) @@ -159,6 +159,7 @@ class RevPiOption(QtWidgets.QDialog, Ui_diag_options): self.dc["autostart"] = int(self.cbx_autostart.isChecked()) self.dc["autoreload"] = int(self.cbx_autoreload.isChecked()) self.dc["autoreloaddelay"] = self.sbx_autoreloaddelay.value() + self.dc["reset_driver_action"] = self.cbb_reset_driver_action.currentIndex() self.dc["zeroonexit"] = int(self.cbx_zeroonexit.isChecked()) self.dc["zeroonerror"] = int(self.cbx_zeroonerror.isChecked()) self.dc["replace_ios"] = self.txt_replace_io.text() diff --git a/revpicommander/revpiprogram.py b/revpicommander/revpiprogram.py index d65236f..c9b8ba1 100644 --- a/revpicommander/revpiprogram.py +++ b/revpicommander/revpiprogram.py @@ -63,7 +63,8 @@ class RevPiProgram(QtWidgets.QDialog, Ui_diag_program): self.txt_plcarguments.text() != self.dc.get("plcarguments", "") or \ self.rbn_pythonversion_2.isChecked() != (self.dc.get("pythonversion", 3) == 2) or \ self.rbn_pythonversion_3.isChecked() != (self.dc.get("pythonversion", 3) == 3) or \ - int(self.cbx_plcworkdir_set_uid.isChecked()) != self.dc.get("plcworkdir_set_uid", 0) + int(self.cbx_plcworkdir_set_uid.isChecked()) != self.dc.get("plcworkdir_set_uid", 0) or \ + self.sbx_plcprogram_watchdog.value() != self.dc.get("plcprogram_watchdog", 0) def _load_settings(self, files_only=False): """Load values to GUI widgets.""" @@ -98,6 +99,7 @@ class RevPiProgram(QtWidgets.QDialog, Ui_diag_program): self.rbn_pythonversion_2.setChecked(self.dc.get("pythonversion", 3) == 2) self.rbn_pythonversion_3.setChecked(self.dc.get("pythonversion", 3) == 3) self.cbx_plcworkdir_set_uid.setChecked(bool(self.dc.get("plcworkdir_set_uid", 0))) + self.sbx_plcprogram_watchdog.setValue(self.dc.get("plcprogram_watchdog", 0)) def accept(self) -> None: # todo: After upload ask for restart pcl program? @@ -129,6 +131,7 @@ class RevPiProgram(QtWidgets.QDialog, Ui_diag_program): self.dc["plcarguments"] = self.txt_plcarguments.text() self.dc["pythonversion"] = 2 if self.rbn_pythonversion_2.isChecked() else 3 self.dc["plcworkdir_set_uid"] = int(self.cbx_plcworkdir_set_uid.isChecked()) + self.dc["plcprogram_watchdog"] = self.sbx_plcprogram_watchdog.value() saved = helper.cm.call_remote_function( "set_config", self.dc, ask,