--- a/Beremiz_service.py Tue Oct 23 11:34:37 2012 +0200
+++ b/Beremiz_service.py Wed Oct 24 11:19:11 2012 +0200
@@ -434,8 +434,12 @@
if not os.path.isdir(WorkingDir):
-def default_evaluator(callable, *args, **kwargs):
- return callable(*args,**kwargs)
+def default_evaluator(tocall, *args, **kwargs): + res=(tocall(*args,**kwargs), None) def __init__(self, servicename, ip_addr, port, workdir, argv, autostart=False, statuschange=None, evaluator=default_evaluator, website=None):
@@ -681,29 +685,26 @@
from threading import Semaphore
wx_eval_lock = Semaphore(0)
- mythread = currentThread()
+ main_thread = currentThread() def statuschange(status):
wx.CallAfter(taskbar_instance.UpdateIcon,status)
- def wx_evaluator(callable, *args, **kwargs):
- eval_res=callable(*args,**kwargs)
- PLCprint("#EXCEPTION : "+str(e))
+ def wx_evaluator(obj, *args, **kwargs): + tocall,args,kwargs = obj.call + obj.res = default_evaluator(tocall, *args, **kwargs) - def evaluator(callable, *args, **kwargs):
- # call directly the callable function if call from the wx mainloop (avoid dead lock)
- if(mythread == currentThread()):
- callable(*args,**kwargs)
+ def evaluator(tocall, *args, **kwargs): + if(main_thread == currentThread()): + # avoid dead lock if called from the wx mainloop + return default_evaluator(tocall, *args, **kwargs) - wx.CallAfter(wx_evaluator,callable,*args,**kwargs)
+ o=type('',(object,),dict(call=(tocall, args, kwargs), res=None)) + wx.CallAfter(wx_evaluator,o)
pyroserver = Server(servicename, given_ip, port, WorkingDir, argv, autostart, statuschange, evaluator, website)
taskbar_instance = BeremizTaskBarIcon(pyroserver, enablewx)
--- a/runtime/PLCObject.py Tue Oct 23 11:34:37 2012 +0200
+++ b/runtime/PLCObject.py Wed Oct 24 11:19:11 2012 +0200
@@ -222,18 +222,32 @@
self.evaluator(self.PrepareRuntimePy)
res,cmd,blkid = "None","None",ctypes.c_void_p()
# print "_PythonIterator(", res, ")",
cmd = self._PythonIterator(res,blkid)
# print " -> ", cmd, blkid
- self.python_threads_vars["FBID"]=blkid.value
- res = str(self.evaluator(eval,cmd,self.python_threads_vars))
+ self.python_threads_vars["FBID"]=FBID + ccmd,AST =compile_cache.get(FBID, (None,None)) + if ccmd is None or ccmd!=cmd: + AST = compile(cmd, '<plc>', 'eval') + compile_cache[FBID]=(cmd,AST) + result,exp = self.evaluator(eval,cmd,self.python_threads_vars) + self.python_threads_vars["FBID"]=None res = "#EXCEPTION : "+str(e)
+ PLCprint(('*** Python eval EXCEPTION ***\n'+ + '| Function Block ID: %d\n'+ + '| Exception : "%s"')%(FBID,cmd,str(e))) self.PLCStatus = "Stopped"
self.evaluator(self.FinishRuntimePy)