runtime/PLCObject.py
changeset 2635 ae099881d800
parent 2625 e5ce6c4a8672
child 2646 d692e01d94f4
child 2649 db68cb0e6bdc
equal deleted inserted replaced
2634:4de945ddc223 2635:ae099881d800
   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()