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