runtime/PLCObject.py
changeset 1734 750eeb7230a1
parent 1732 94ffe74e6895
child 1736 7e61baa047f0
equal deleted inserted replaced
1733:dea107dce0c4 1734:750eeb7230a1
   262     def PythonRuntimeCall(self, methodname):
   262     def PythonRuntimeCall(self, methodname):
   263         """
   263         """
   264         Calls init, start, stop or cleanup method provided by
   264         Calls init, start, stop or cleanup method provided by
   265         runtime python files, loaded when new PLC uploaded
   265         runtime python files, loaded when new PLC uploaded
   266         """
   266         """
   267         for method in self.python_runtime_vars.get("_runtime_%s"%methodname, []):
   267         for method in self.python_runtime_vars.get("_runtime_%s" % methodname, []):
   268             res,exp = self.evaluator(method)
   268             res,exp = self.evaluator(method)
   269             if exp is not None:
   269             if exp is not None:
   270                 self.LogMessage(0,'\n'.join(traceback.format_exception(*exp)))
   270                 self.LogMessage(0,'\n'.join(traceback.format_exception(*exp)))
   271 
   271 
   272     def PythonRuntimeInit(self):
   272     def PythonRuntimeInit(self):
   277         class PLCSafeGlobals:
   277         class PLCSafeGlobals:
   278             def __getattr__(_self, name):
   278             def __getattr__(_self, name):
   279                 try :
   279                 try :
   280                     t = self.python_runtime_vars["_"+name+"_ctype"]
   280                     t = self.python_runtime_vars["_"+name+"_ctype"]
   281                 except KeyError:
   281                 except KeyError:
   282                     raise KeyError("Try to get unknown shared global variable : %s"%name)
   282                     raise KeyError("Try to get unknown shared global variable : %s" % name)
   283                 v = t()
   283                 v = t()
   284                 r = self.python_runtime_vars["_PySafeGetPLCGlob_"+name](ctypes.byref(v))
   284                 r = self.python_runtime_vars["_PySafeGetPLCGlob_"+name](ctypes.byref(v))
   285                 return self.python_runtime_vars["_"+name+"_unpack"](v)
   285                 return self.python_runtime_vars["_"+name+"_unpack"](v)
   286             def __setattr__(_self, name, value):
   286             def __setattr__(_self, name, value):
   287                 try :
   287                 try :
   288                     t = self.python_runtime_vars["_"+name+"_ctype"]
   288                     t = self.python_runtime_vars["_"+name+"_ctype"]
   289                 except KeyError:
   289                 except KeyError:
   290                     raise KeyError("Try to set unknown shared global variable : %s"%name)
   290                     raise KeyError("Try to set unknown shared global variable : %s" % name)
   291                 v = self.python_runtime_vars["_"+name+"_pack"](t,value)
   291                 v = self.python_runtime_vars["_"+name+"_pack"](t,value)
   292                 self.python_runtime_vars["_PySafeSetPLCGlob_"+name](ctypes.byref(v))
   292                 self.python_runtime_vars["_PySafeSetPLCGlob_"+name](ctypes.byref(v))
   293 
   293 
   294         self.python_runtime_vars.update({
   294         self.python_runtime_vars.update({
   295             "PLCGlobals" : PLCSafeGlobals(),
   295             "PLCGlobals" : PLCSafeGlobals(),
   297             "PLCObject"  : self,
   297             "PLCObject"  : self,
   298             "PLCBinary"  : self.PLClibraryHandle,
   298             "PLCBinary"  : self.PLClibraryHandle,
   299             "PLCGlobalsDesc" : []})
   299             "PLCGlobalsDesc" : []})
   300 
   300 
   301         for methodname in MethodNames :
   301         for methodname in MethodNames :
   302             self.python_runtime_vars["_runtime_%s"%methodname] = []
   302             self.python_runtime_vars["_runtime_%s" % methodname] = []
   303 
   303 
   304         try:
   304         try:
   305             filenames = os.listdir(self.workingdir)
   305             filenames = os.listdir(self.workingdir)
   306             filenames.sort()
   306             filenames.sort()
   307             for filename in filenames:
   307             for filename in filenames:
   309                 if name.upper().startswith("RUNTIME") and ext.upper() == ".PY":
   309                 if name.upper().startswith("RUNTIME") and ext.upper() == ".PY":
   310                     execfile(os.path.join(self.workingdir, filename), self.python_runtime_vars)
   310                     execfile(os.path.join(self.workingdir, filename), self.python_runtime_vars)
   311                     for methodname in MethodNames:
   311                     for methodname in MethodNames:
   312                         method = self.python_runtime_vars.get("_%s_%s" % (name, methodname), None)
   312                         method = self.python_runtime_vars.get("_%s_%s" % (name, methodname), None)
   313                         if method is not None:
   313                         if method is not None:
   314                             self.python_runtime_vars["_runtime_%s"%methodname].append(method)
   314                             self.python_runtime_vars["_runtime_%s" % methodname].append(method)
   315         except:
   315         except:
   316             self.LogMessage(0,traceback.format_exc())
   316             self.LogMessage(0,traceback.format_exc())
   317             raise
   317             raise
   318 
   318 
   319         self.PythonRuntimeCall("init")
   319         self.PythonRuntimeCall("init")
   344                     AST = compile(cmd, '<plc>', 'eval')
   344                     AST = compile(cmd, '<plc>', 'eval')
   345                     compile_cache[FBID]=(cmd,AST)
   345                     compile_cache[FBID]=(cmd,AST)
   346                 result,exp = self.evaluator(eval,AST,self.python_runtime_vars)
   346                 result,exp = self.evaluator(eval,AST,self.python_runtime_vars)
   347                 if exp is not None:
   347                 if exp is not None:
   348                     res = "#EXCEPTION : "+str(exp[1])
   348                     res = "#EXCEPTION : "+str(exp[1])
   349                     self.LogMessage(1,('PyEval@0x%x(Code="%s") Exception "%s"')%(FBID,cmd,
   349                     self.LogMessage(1,('PyEval@0x%x(Code="%s") Exception "%s"') % (FBID,cmd,
   350                         '\n'.join(traceback.format_exception(*exp))))
   350                         '\n'.join(traceback.format_exception(*exp))))
   351                 else:
   351                 else:
   352                     res=str(result)
   352                     res=str(result)
   353                 self.python_runtime_vars["FBID"]=None
   353                 self.python_runtime_vars["FBID"]=None
   354             except Exception,e:
   354             except Exception,e:
   355                 res = "#EXCEPTION : "+str(e)
   355                 res = "#EXCEPTION : "+str(e)
   356                 self.LogMessage(1,('PyEval@0x%x(Code="%s") Exception "%s"')%(FBID,cmd,str(e)))
   356                 self.LogMessage(1,('PyEval@0x%x(Code="%s") Exception "%s"') % (FBID,cmd,str(e)))
   357 
   357 
   358     def StartPLC(self):
   358     def StartPLC(self):
   359         if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped":
   359         if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped":
   360             c_argv = ctypes.c_char_p * len(self.argv)
   360             c_argv = ctypes.c_char_p * len(self.argv)
   361             error = None
   361             error = None
   409             NewFileName = md5sum + lib_ext
   409             NewFileName = md5sum + lib_ext
   410             extra_files_log = os.path.join(self.workingdir,"extra_files.txt")
   410             extra_files_log = os.path.join(self.workingdir,"extra_files.txt")
   411 
   411 
   412             self.UnLoadPLC()
   412             self.UnLoadPLC()
   413 
   413 
   414             self.LogMessage("NewPLC (%s)"%md5sum)
   414             self.LogMessage("NewPLC (%s)" % md5sum)
   415             self.PLCStatus = "Empty"
   415             self.PLCStatus = "Empty"
   416 
   416 
   417             try:
   417             try:
   418                 os.remove(os.path.join(self.workingdir,
   418                 os.remove(os.path.join(self.workingdir,
   419                                        self.CurrentPLCFilename))
   419                                        self.CurrentPLCFilename))