runtime/PLCObject.py
changeset 798 0d2423f283a6
parent 795 afcc13faecd5
child 851 666f5bdad301
equal deleted inserted replaced
797:61280a7d9ff2 798:0d2423f283a6
   215         if self.website is not None:
   215         if self.website is not None:
   216             self.website.PLCStopped()
   216             self.website.PLCStopped()
   217         self.python_threads_vars = None
   217         self.python_threads_vars = None
   218 
   218 
   219     def PythonThreadProc(self):
   219     def PythonThreadProc(self):
   220         c_argv = ctypes.c_char_p * len(self.argv)
   220         self.PLCStatus = "Started"
   221         error = None
   221         self.StatusChange()
   222         if self._LoadNewPLC():
   222         self.StartSem.release()
   223             if self._startPLC(len(self.argv),c_argv(*self.argv)) == 0:
   223         self.evaluator(self.PrepareRuntimePy)
   224                 self.PLCStatus = "Started"
   224         res,cmd = "None","None"
   225                 self.StatusChange()
   225         while True:
   226                 self.StartSem.release()
   226             #print "_PythonIterator(", res, ")",
   227                 self.evaluator(self.PrepareRuntimePy)
   227             cmd = self._PythonIterator(res)
   228                 res,cmd = "None","None"
   228             #print " -> ", cmd
   229                 while True:
   229             if cmd is None:
   230                     #print "_PythonIterator(", res, ")",
   230                 break
   231                     cmd = self._PythonIterator(res)
   231             try :
   232                     #print " -> ", cmd
   232                 res = str(self.evaluator(eval,cmd,self.python_threads_vars))
   233                     if cmd is None:
   233             except Exception,e:
   234                         break
   234                 res = "#EXCEPTION : "+str(e)
   235                     try :
   235                 PLCprint(res)
   236                         res = str(self.evaluator(eval,cmd,self.python_threads_vars))
   236         self.PLCStatus = "Stopped"
   237                     except Exception,e:
   237         self.StatusChange()
   238                         res = "#EXCEPTION : "+str(e)
   238         self.evaluator(self.FinishRuntimePy)
   239                         PLCprint(res)
       
   240                 self.PLCStatus = "Stopped"
       
   241                 self.StatusChange()
       
   242                 self.evaluator(self.FinishRuntimePy)
       
   243             else:
       
   244                 error = "starting"
       
   245         else:
       
   246             error = "loading"
       
   247         if error is not None:
       
   248             PLCprint("Problem %s PLC"%error)
       
   249             self.PLCStatus = "Broken"
       
   250             self.StatusChange()
       
   251             self.StartSem.release()
       
   252         self._FreePLC()
       
   253     
   239     
   254     def StartPLC(self):
   240     def StartPLC(self):
   255         PLCprint("StartPLC")
   241         PLCprint("StartPLC")
   256         if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped":
   242         if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped":
   257             self.StartSem=Semaphore(0)
   243             c_argv = ctypes.c_char_p * len(self.argv)
   258             self.PythonThread = Thread(target=self.PythonThreadProc)
   244             error = None
   259             self.PythonThread.start()
   245             if self._LoadNewPLC():
   260             self.StartSem.acquire()
   246                 if self._startPLC(len(self.argv),c_argv(*self.argv)) == 0:
       
   247                     self.StartSem=Semaphore(0)
       
   248                     self.PythonThread = Thread(target=self.PythonThreadProc)
       
   249                     self.PythonThread.start()
       
   250                     self.StartSem.acquire()
       
   251                 else:
       
   252                     error = "starting"
       
   253             else:
       
   254                 error = "loading"
       
   255             if error is not None:
       
   256                 PLCprint("Problem %s PLC"%error)
       
   257                 self.PLCStatus = "Broken"
       
   258                 self.StatusChange()
       
   259                 self._FreePLC()
   261             
   260             
   262     def StopPLC(self):
   261     def StopPLC(self):
   263         PLCprint("StopPLC")
   262         PLCprint("StopPLC")
   264         if self.PLCStatus == "Started":
   263         if self.PLCStatus == "Started":
   265             self.PLCStatus = "Stopped"
       
   266             self._stopPLC()
   264             self._stopPLC()
       
   265             self.PythonThread.join()
       
   266             self._FreePLC()
   267             return True
   267             return True
   268         return False
   268         return False
   269 
   269 
   270     def _Reload(self):
   270     def _Reload(self):
   271         self.daemon.shutdown(True)
   271         self.daemon.shutdown(True)