runtime/PLCObject.py
changeset 867 06495975e8a4
parent 851 666f5bdad301
child 868 7e5da4962bea
equal deleted inserted replaced
866:ee6adf7586c1 867:06495975e8a4
   220         self.PLCStatus = "Started"
   220         self.PLCStatus = "Started"
   221         self.StatusChange()
   221         self.StatusChange()
   222         self.StartSem.release()
   222         self.StartSem.release()
   223         self.evaluator(self.PrepareRuntimePy)
   223         self.evaluator(self.PrepareRuntimePy)
   224         res,cmd,blkid = "None","None",ctypes.c_void_p()
   224         res,cmd,blkid = "None","None",ctypes.c_void_p()
       
   225         compile_cache={}
   225         while True:
   226         while True:
   226             # print "_PythonIterator(", res, ")",
   227             # print "_PythonIterator(", res, ")",
   227             cmd = self._PythonIterator(res,blkid)
   228             cmd = self._PythonIterator(res,blkid)
       
   229             FBID = blkid.value 
   228             # print " -> ", cmd, blkid
   230             # print " -> ", cmd, blkid
   229             if cmd is None:
   231             if cmd is None:
   230                 break
   232                 break
   231             try :
   233             try :
   232                 self.python_threads_vars["FBID"]=blkid.value
   234                 self.python_threads_vars["FBID"]=FBID
   233                 res = str(self.evaluator(eval,cmd,self.python_threads_vars))
   235                 ccmd,AST =compile_cache.get(FBID, (None,None))
       
   236                 if ccmd is None or ccmd!=cmd:
       
   237                     AST = compile(cmd, '<plc>', 'eval')
       
   238                     compile_cache[FBID]=(cmd,AST)
       
   239                 result,exp = self.evaluator(eval,cmd,self.python_threads_vars)
       
   240                 if exp is not None: 
       
   241                     raise(exp)
       
   242                 else:
       
   243                     res=str(result)
       
   244                 self.python_threads_vars["FBID"]=None
   234             except Exception,e:
   245             except Exception,e:
   235                 res = "#EXCEPTION : "+str(e)
   246                 res = "#EXCEPTION : "+str(e)
   236                 PLCprint(res)
   247                 PLCprint(('*** Python eval EXCEPTION ***\n'+
       
   248                           '| Function Block ID: %d\n'+
       
   249                           '| Command : "%s"\n'+
       
   250                           '| Exception : "%s"')%(FBID,cmd,str(e)))
   237         self.PLCStatus = "Stopped"
   251         self.PLCStatus = "Stopped"
   238         self.StatusChange()
   252         self.StatusChange()
   239         self.evaluator(self.FinishRuntimePy)
   253         self.evaluator(self.FinishRuntimePy)
   240     
   254     
   241     def StartPLC(self):
   255     def StartPLC(self):