equal
deleted
inserted
replaced
317 finally: |
317 finally: |
318 self.PLClibraryLock.release() |
318 self.PLClibraryLock.release() |
319 |
319 |
320 return False |
320 return False |
321 |
321 |
322 def PythonRuntimeCall(self, methodname, use_evaluator=True): |
322 def PythonRuntimeCall(self, methodname, use_evaluator=True, reverse_order=False): |
323 """ |
323 """ |
324 Calls init, start, stop or cleanup method provided by |
324 Calls init, start, stop or cleanup method provided by |
325 runtime python files, loaded when new PLC uploaded |
325 runtime python files, loaded when new PLC uploaded |
326 """ |
326 """ |
327 for method in self.python_runtime_vars.get("_runtime_%s" % methodname, []): |
327 methods = self.python_runtime_vars.get("_runtime_%s" % methodname, []) |
|
328 if reverse_order: |
|
329 methods = reversed(methods) |
|
330 for method in methods: |
328 if use_evaluator: |
331 if use_evaluator: |
329 _res, exp = self.evaluator(method) |
332 _res, exp = self.evaluator(method) |
330 else: |
333 else: |
331 _res, exp = default_evaluator(method) |
334 _res, exp = default_evaluator(method) |
332 if exp is not None: |
335 if exp is not None: |
393 # used internaly |
396 # used internaly |
394 def PythonRuntimeCleanup(self): |
397 def PythonRuntimeCleanup(self): |
395 if self.python_runtime_vars is not None: |
398 if self.python_runtime_vars is not None: |
396 self.PythonThreadCommand("Finish") |
399 self.PythonThreadCommand("Finish") |
397 self.PythonThread.join() |
400 self.PythonThread.join() |
398 self.PythonRuntimeCall("cleanup", use_evaluator=False) |
401 self.PythonRuntimeCall("cleanup", use_evaluator=False, reverse_order=True) |
399 |
402 |
400 self.python_runtime_vars = None |
403 self.python_runtime_vars = None |
401 |
404 |
402 def PythonThreadLoop(self): |
405 def PythonThreadLoop(self): |
403 res, cmd, blkid = "None", "None", ctypes.c_void_p() |
406 res, cmd, blkid = "None", "None", ctypes.c_void_p() |
436 self.PythonThreadCondLock.release() |
439 self.PythonThreadCondLock.release() |
437 |
440 |
438 if cmd == "Activate": |
441 if cmd == "Activate": |
439 self.PythonRuntimeCall("start") |
442 self.PythonRuntimeCall("start") |
440 self.PythonThreadLoop() |
443 self.PythonThreadLoop() |
441 self.PythonRuntimeCall("stop") |
444 self.PythonRuntimeCall("stop", reverse_order=True) |
442 else: # "Finish" |
445 else: # "Finish" |
443 break |
446 break |
444 |
447 |
445 def PythonThreadCommand(self, cmd): |
448 def PythonThreadCommand(self, cmd): |
446 self.PythonThreadCondLock.acquire() |
449 self.PythonThreadCondLock.acquire() |