Add option for software watchdog and driver reset action

This commit is contained in:
2020-10-13 20:02:37 +02:00
parent 5eafb2a125
commit 146dd74c95
7 changed files with 309 additions and 184 deletions

View File

@@ -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"))

View File

@@ -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"))

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>452</width>
<height>503</height>
<width>416</width>
<height>522</height>
</rect>
</property>
<property name="windowTitle">
@@ -27,23 +27,6 @@
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QSpinBox" name="sbx_autoreloaddelay">
<property name="minimum">
<number>5</number>
</property>
<property name="maximum">
<number>120</number>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QCheckBox" name="cbx_zeroonexit">
<property name="text">
<string>... sucessfully without error</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QCheckBox" name="cbx_zeroonerror">
<property name="text">
@@ -58,10 +41,29 @@
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QCheckBox" name="cbx_autoreload">
<item row="8" column="1" colspan="2">
<widget class="QComboBox" name="cbb_reset_driver_action">
<item>
<property name="text">
<string>Restart PLC program after exit or crash</string>
<string>Do nothing</string>
</property>
</item>
<item>
<property name="text">
<string>Restart after piCtory changed</string>
</property>
</item>
<item>
<property name="text">
<string>Always restart the PLC program</string>
</property>
</item>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="lbl_reset_driver_action">
<property name="text">
<string>Driver reset action:</string>
</property>
</widget>
</item>
@@ -72,9 +74,6 @@
</property>
</widget>
</item>
<item row="7" column="1" colspan="2">
<widget class="QLineEdit" name="txt_replace_io"/>
</item>
<item row="6" column="1" colspan="2">
<widget class="QComboBox" name="cbb_replace_io">
<item>
@@ -99,6 +98,13 @@
</item>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QCheckBox" name="cbx_zeroonexit">
<property name="text">
<string>... sucessfully without error</string>
</property>
</widget>
</item>
<item row="2" column="0" colspan="2">
<widget class="QLabel" name="lbl_plc_delay">
<property name="text">
@@ -106,6 +112,33 @@
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QSpinBox" name="sbx_autoreloaddelay">
<property name="minimum">
<number>5</number>
</property>
<property name="maximum">
<number>120</number>
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QCheckBox" name="cbx_autoreload">
<property name="text">
<string>Restart PLC program after exit or crash</string>
</property>
</widget>
</item>
<item row="7" column="1" colspan="2">
<widget class="QLineEdit" name="txt_replace_io"/>
</item>
<item row="9" column="0" colspan="3">
<widget class="QLabel" name="lbl_lbl_reset_driver_action">
<property name="text">
<string>PLC program behavior after piCtory driver reset clicked</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>

View File

@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>488</width>
<height>500</height>
<width>400</width>
<height>501</height>
</rect>
</property>
<property name="windowTitle">
@@ -20,15 +20,8 @@
<string>PLC program</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="3" column="1">
<widget class="QRadioButton" name="rbn_pythonversion_2">
<property name="text">
<string>Python 2</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QLineEdit" name="txt_plcarguments"/>
<item row="1" column="0" colspan="3">
<widget class="QComboBox" name="cbb_plcprogram"/>
</item>
<item row="3" column="2">
<widget class="QRadioButton" name="rbn_pythonversion_3">
@@ -37,13 +30,6 @@
</property>
</widget>
</item>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="lbl_plcprogram">
<property name="text">
<string>Python PLC start program:</string>
</property>
</widget>
</item>
<item row="4" column="0" colspan="3">
<widget class="QCheckBox" name="cbx_plcworkdir_set_uid">
<property name="text">
@@ -51,8 +37,12 @@
</property>
</widget>
</item>
<item row="1" column="0" colspan="3">
<widget class="QComboBox" name="cbb_plcprogram"/>
<item row="0" column="0" colspan="3">
<widget class="QLabel" name="lbl_plcprogram">
<property name="text">
<string>Python PLC start program:</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="lbl_pythonversion">
@@ -61,6 +51,13 @@
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QRadioButton" name="rbn_pythonversion_2">
<property name="text">
<string>Python 2</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="lbl_plcarguments">
<property name="text">
@@ -68,6 +65,26 @@
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QLineEdit" name="txt_plcarguments"/>
</item>
<item row="5" column="2">
<widget class="QSpinBox" name="sbx_plcprogram_watchdog">
<property name="suffix">
<string> sec.</string>
</property>
<property name="maximum">
<number>600</number>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<widget class="QLabel" name="lbl_plcprogram_watchdog">
<property name="text">
<string>Software watchdog (0=disabled):</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>

View File

@@ -134,15 +134,25 @@ Unsaved changes will be lost</source>
<context>
<name>DebugIos</name>
<message>
<location filename="../debugios.py" line="190"/>
<location filename="../debugios.py" line="204"/>
<source>signed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugios.py" line="195"/>
<location filename="../debugios.py" line="209"/>
<source>big_endian</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugios.py" line="198"/>
<source>as text</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../debugios.py" line="200"/>
<source>as number</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>MqttManager</name>
@@ -437,7 +447,7 @@ Select &apos;Yes&apos; to override, &apos;No&apos; to download only missing file
<context>
<name>RevPiOption</name>
<message>
<location filename="../revpioption.py" line="301"/>
<location filename="../revpioption.py" line="302"/>
<source>Question</source>
<translation type="unfinished"></translation>
</message>
@@ -449,74 +459,74 @@ ACL changes and service settings are applied immediately.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="197"/>
<location filename="../revpioption.py" line="198"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="197"/>
<location filename="../revpioption.py" line="198"/>
<source>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.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="207"/>
<location filename="../revpioption.py" line="208"/>
<source>Do you really want to quit?
Unsaved changes will be lost.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="250"/>
<location filename="../revpioption.py" line="251"/>
<source>running</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="250"/>
<location filename="../revpioption.py" line="251"/>
<source>stopped</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="241"/>
<location filename="../revpioption.py" line="242"/>
<source>The MQTT service is not available on your RevPiPyLoad version.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="281"/>
<location filename="../revpioption.py" line="282"/>
<source>read only</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="281"/>
<location filename="../revpioption.py" line="282"/>
<source>read and write</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="301"/>
<location filename="../revpioption.py" line="302"/>
<source>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!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="313"/>
<location filename="../revpioption.py" line="314"/>
<source>Start/Stop PLC program and read logs</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="313"/>
<location filename="../revpioption.py" line="314"/>
<source>+ read IOs in watch mode</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="313"/>
<location filename="../revpioption.py" line="314"/>
<source>+ read properties and download PLC program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="313"/>
<location filename="../revpioption.py" line="314"/>
<source>+ upload PLC program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpioption.py" line="313"/>
<location filename="../revpioption.py" line="314"/>
<source>+ set properties</source>
<translation type="unfinished"></translation>
</message>
@@ -543,258 +553,258 @@ Unsaved changes will be lost.</source>
<context>
<name>RevPiProgram</name>
<message>
<location filename="../revpiprogram.py" line="690"/>
<location filename="../revpiprogram.py" line="693"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="110"/>
<location filename="../revpiprogram.py" line="112"/>
<source>You have to select a start program, before uploading the settings.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="152"/>
<location filename="../revpiprogram.py" line="155"/>
<source>Question</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="118"/>
<location filename="../revpiprogram.py" line="120"/>
<source>The settings will be set on the Revolution Pi now.
If you made changes on the &apos;PCL Program&apos; section, your plc program will restart now!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="142"/>
<location filename="../revpiprogram.py" line="145"/>
<source>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.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="152"/>
<location filename="../revpiprogram.py" line="155"/>
<source>Do you really want to quit?
Unsaved changes will be lost.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="192"/>
<location filename="../revpiprogram.py" line="195"/>
<source>Reset driver...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="192"/>
<location filename="../revpiprogram.py" line="195"/>
<source>Reset piControl driver after successful uploading new piCtory configuration?
The process image will be interrupted for a short time!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="207"/>
<location filename="../revpiprogram.py" line="210"/>
<source>Got an network error while send data to Revolution Pi.
Please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="700"/>
<location filename="../revpiprogram.py" line="703"/>
<source>Success</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="216"/>
<location filename="../revpiprogram.py" line="219"/>
<source>The transfer of the piCtory configuration and the reset of piControl have been successfully executed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="224"/>
<location filename="../revpiprogram.py" line="227"/>
<source>The piCtory configuration was successfully transferred.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="231"/>
<location filename="../revpiprogram.py" line="234"/>
<source>Can not process the transferred file.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="237"/>
<location filename="../revpiprogram.py" line="240"/>
<source>Can not find main elements in piCtory file.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="243"/>
<location filename="../revpiprogram.py" line="246"/>
<source>Contained devices could not be found on Revolution Pi. The configuration may be from a newer piCtory version!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="250"/>
<location filename="../revpiprogram.py" line="253"/>
<source>Could not load RAP catalog on Revolution Pi.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="256"/>
<location filename="../revpiprogram.py" line="259"/>
<source>The piCtory configuration could not be written on the Revolution Pi.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="263"/>
<location filename="../revpiprogram.py" line="266"/>
<source>Warning</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="263"/>
<location filename="../revpiprogram.py" line="266"/>
<source>The piCtroy configuration has been saved successfully.
An error occurred on piControl reset!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="330"/>
<location filename="../revpiprogram.py" line="333"/>
<source>Save ZIP archive...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="428"/>
<location filename="../revpiprogram.py" line="431"/>
<source>ZIP archive (*.zip);;All files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="351"/>
<location filename="../revpiprogram.py" line="354"/>
<source>Save TGZ archive...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="351"/>
<location filename="../revpiprogram.py" line="354"/>
<source>TGZ archive (*.tgz);;All files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="381"/>
<location filename="../revpiprogram.py" line="384"/>
<source>Could not load PLC program from Revolution Pi.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="394"/>
<location filename="../revpiprogram.py" line="397"/>
<source>Coud not save the archive or extract the files!
Please retry.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="400"/>
<location filename="../revpiprogram.py" line="403"/>
<source>Transfer successfully completed.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="428"/>
<location filename="../revpiprogram.py" line="431"/>
<source>Upload content of ZIP archive...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="453"/>
<location filename="../revpiprogram.py" line="456"/>
<source>The selected file ist not a ZIP archive.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="462"/>
<location filename="../revpiprogram.py" line="465"/>
<source>Upload content of TAR archive...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="462"/>
<location filename="../revpiprogram.py" line="465"/>
<source>TAR archive (*.tgz);;All files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="487"/>
<location filename="../revpiprogram.py" line="490"/>
<source>The selected file ist not a TAR archive.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="496"/>
<location filename="../revpiprogram.py" line="499"/>
<source>No files to upload...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="496"/>
<location filename="../revpiprogram.py" line="499"/>
<source>Found no files to upload in given location or archive.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="507"/>
<location filename="../revpiprogram.py" line="510"/>
<source>There was an error deleting the files on the Revolution Pi.
Upload aborted! Please try again.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="553"/>
<location filename="../revpiprogram.py" line="556"/>
<source>The PLC program was transferred successfully.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="561"/>
<location filename="../revpiprogram.py" line="564"/>
<source>Information</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="561"/>
<location filename="../revpiprogram.py" line="564"/>
<source>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</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="574"/>
<location filename="../revpiprogram.py" line="577"/>
<source>There is no piCtory configuration in this archive.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="581"/>
<location filename="../revpiprogram.py" line="584"/>
<source>The Revolution Pi could not process some parts of the transmission.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="588"/>
<location filename="../revpiprogram.py" line="591"/>
<source>Errors occurred during transmission.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="607"/>
<location filename="../revpiprogram.py" line="610"/>
<source>Save piCtory file...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="648"/>
<location filename="../revpiprogram.py" line="651"/>
<source>piCtory file (*.rsc);;All files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="626"/>
<location filename="../revpiprogram.py" line="629"/>
<source>Could not load piCtory file from Revolution Pi.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="636"/>
<location filename="../revpiprogram.py" line="639"/>
<source>piCtory configuration successfully loaded and saved to:
{0}.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="648"/>
<location filename="../revpiprogram.py" line="651"/>
<source>Upload piCtory file...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="669"/>
<location filename="../revpiprogram.py" line="672"/>
<source>Save piControl file...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="669"/>
<location filename="../revpiprogram.py" line="672"/>
<source>Process image file (*.img);;All files (*.*)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="690"/>
<location filename="../revpiprogram.py" line="693"/>
<source>Could not load process image from Revolution Pi.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../revpiprogram.py" line="700"/>
<location filename="../revpiprogram.py" line="703"/>
<source>Process image successfully loaded and saved to:
{0}.</source>
<translation type="unfinished"></translation>
@@ -1024,100 +1034,125 @@ Publish values with topic: [basetopic]/set/[outputname]</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="43"/>
<location filename="../../include/ui_dev/revpioption.ui" line="104"/>
<source>... sucessfully without error</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="50"/>
<location filename="../../include/ui_dev/revpioption.ui" line="33"/>
<source>... after exception and errors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="57"/>
<location filename="../../include/ui_dev/revpioption.ui" line="40"/>
<source>Start PLC program automatically</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="64"/>
<location filename="../../include/ui_dev/revpioption.ui" line="128"/>
<source>Restart PLC program after exit or crash</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="71"/>
<location filename="../../include/ui_dev/revpioption.ui" line="73"/>
<source>Set process image to NULL if program terminates...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="82"/>
<location filename="../../include/ui_dev/revpioption.ui" line="81"/>
<source>Do not use replace io file</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="87"/>
<location filename="../../include/ui_dev/revpioption.ui" line="86"/>
<source>Use static file from RevPiPyLoad</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="92"/>
<location filename="../../include/ui_dev/revpioption.ui" line="91"/>
<source>Use dynamic file from work directory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="97"/>
<location filename="../../include/ui_dev/revpioption.ui" line="96"/>
<source>Give own path and filename</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="105"/>
<location filename="../../include/ui_dev/revpioption.ui" line="111"/>
<source>Restart delay in seconds:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="115"/>
<location filename="../../include/ui_dev/revpioption.ui" line="148"/>
<source>RevPiPyLoad server services</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="189"/>
<location filename="../../include/ui_dev/revpioption.ui" line="222"/>
<source>Edit ACL</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="128"/>
<location filename="../../include/ui_dev/revpioption.ui" line="161"/>
<source>MQTT process image publisher</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="135"/>
<location filename="../../include/ui_dev/revpioption.ui" line="168"/>
<source>Start RevPi piControl server</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="162"/>
<location filename="../../include/ui_dev/revpioption.ui" line="195"/>
<source>status</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="152"/>
<location filename="../../include/ui_dev/revpioption.ui" line="185"/>
<source>piControl server is:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="172"/>
<location filename="../../include/ui_dev/revpioption.ui" line="205"/>
<source>MQTT publish service is:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="182"/>
<location filename="../../include/ui_dev/revpioption.ui" line="215"/>
<source>Settings</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="196"/>
<location filename="../../include/ui_dev/revpioption.ui" line="229"/>
<source>Activate XML-RPC for RevPiPyControl</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="48"/>
<source>Do nothing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="53"/>
<source>Restart after piCtory changed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="58"/>
<source>Always restart the PLC program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="66"/>
<source>Driver reset action:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpioption.ui" line="138"/>
<source>PLC program behavior after piCtory driver reset clicked</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>diag_program</name>
@@ -1127,12 +1162,12 @@ Publish values with topic: [basetopic]/set/[outputname]</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="26"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="57"/>
<source>Python 2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="36"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="29"/>
<source>Python 3</source>
<translation type="unfinished"></translation>
</message>
@@ -1142,75 +1177,85 @@ Publish values with topic: [basetopic]/set/[outputname]</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="50"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="36"/>
<source>Set write permissions for plc program to workdirectory</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="60"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="50"/>
<source>Python version:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="67"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="64"/>
<source>Program arguments:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="77"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="94"/>
<source>Transfair PLC program</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="84"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="101"/>
<source>ZIP archive</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="89"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="106"/>
<source>TGZ archive</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="155"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="172"/>
<source>Upload</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="148"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="165"/>
<source>Download</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="111"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="128"/>
<source>Transfair format:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="118"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="135"/>
<source>Including piCtory configuration</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="125"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="142"/>
<source>Remove all files on Revolution Pi before upload</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="135"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="152"/>
<source>Control files</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="162"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="179"/>
<source>piCtory configuraiton</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="169"/>
<location filename="../../include/ui_dev/revpiprogram.ui" line="186"/>
<source>Process image from piControl0</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="74"/>
<source> sec.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../include/ui_dev/revpiprogram.ui" line="84"/>
<source>Software watchdog (0=disabled):</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>diag_revpiinfo</name>

View File

@@ -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()

View File

@@ -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,