Parameter for shutdown timeout in seconds for plc program (default is and was 5 seconds)

This commit is contained in:
2021-02-27 15:05:09 +01:00
parent e4ced5539e
commit 3fe69b54cc
4 changed files with 22 additions and 2 deletions

View File

@@ -5,6 +5,7 @@ autostart = 1
plcworkdir = /var/lib/revpipyload
plcworkdir_set_uid = 1
plcprogram = program.py
plcprogram_stop_timeout = 5
plcprogram_watchdog = 0
plcarguments =
plcuid = 1000

View File

@@ -40,6 +40,7 @@ class RevPiPlc(Thread):
self._program = program
self._procplc = None
self._pversion = pversion
self._stop_timeout_steps = 10
self.autoreload = False
self.exitcode = None
self.gid = 65534
@@ -257,7 +258,7 @@ class RevPiPlc(Thread):
proginit.logger.debug("leave RevPiPlc.stop()")
return
while self._procplc.poll() is None and count < 10:
while self._procplc.poll() is None and count < self._stop_timeout_steps:
count += 1
proginit.logger.info(
"wait term plc program {0} seconds".format(count * 0.5)
@@ -284,3 +285,15 @@ class RevPiPlc(Thread):
proginit.logger.debug("leave RevPiPlc.stop()")
autoreloaddelay = property(__get_autoreloaddelay, __set_autoreloaddelay)
@property
def stop_timeout(self) -> int:
"""Get program stop timeout in seconds."""
return self._stop_timeout_steps // 2
@stop_timeout.setter
def stop_timeout(self, value: int):
"""Set program stop timeout in seconds."""
if type(value) != int:
raise TypeError("Value of stop_timeout must be <class 'int'>")
self._stop_timeout_steps = value * 2

View File

@@ -220,6 +220,8 @@ class RevPiPyLoad:
"plcworkdir", ".")
self.plcprogram = self.globalconfig["DEFAULT"].get(
"plcprogram", "none.py")
self.plcprogram_stop_timeout = self.globalconfig.getint(
"DEFAULT", "plcprogram_stop_timeout", fallback=5)
self.plcprogram_watchdog = self.globalconfig["DEFAULT"].getint(
"plcprogram_watchdog", 0)
self.plcarguments = self.globalconfig["DEFAULT"].get(
@@ -376,6 +378,7 @@ class RevPiPyLoad:
self.plc.autoreload = self.autoreload
self.plc.autoreloaddelay = self.autoreloaddelay
self.plc.softdog.timeout = self.plcprogram_watchdog
self.plc.stop_timeout = self.plcprogram_stop_timeout
self.plc.zeroonerror = self.zeroonerror
self.plc.zeroonexit = self.zeroonexit
@@ -581,6 +584,7 @@ class RevPiPyLoad:
th_plc.softdog.address = \
0 if self.revpi_led_address < 0 else self.revpi_led_address
th_plc.softdog.timeout = self.plcprogram_watchdog
th_plc.stop_timeout = self.plcprogram_stop_timeout
th_plc.zeroonerror = self.zeroonerror
th_plc.zeroonexit = self.zeroonexit
@@ -964,6 +968,7 @@ class RevPiPyLoad:
dc["plcworkdir"] = self.plcworkdir
dc["plcworkdir_set_uid"] = int(self.plcworkdir_set_uid)
dc["plcprogram"] = self.plcprogram
dc["plcprogram_stop_timeout"] = self.plcprogram_stop_timeout
dc["plcprogram_watchdog"] = self.plcprogram_watchdog
dc["plcarguments"] = self.plcarguments
dc["plcuid"] = self.plcuid
@@ -1253,6 +1258,7 @@ class RevPiPyLoad:
"autoreloaddelay": "[0-9]+",
"autostart": "[01]",
"plcprogram": ".+",
"plcprogram_stop_timeout": "[0-9]+",
"plcprogram_watchdog": "[0-9]+",
"plcarguments": ".*",
"plcworkdir_set_uid": "[01]",

View File

@@ -27,7 +27,7 @@ setup(
license="LGPLv3",
name="revpipyload",
version="0.9.6",
version="0.9.6a",
scripts=[
"data/revpipyload",