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): |