diff -r 8872223a675b -r 4a45f6642523 runtime/PLCObject.py --- a/runtime/PLCObject.py Thu Jan 29 19:11:34 2015 +0100 +++ b/runtime/PLCObject.py Fri Jan 30 10:45:11 2015 +0100 @@ -2,7 +2,7 @@ # -*- coding: utf-8 -*- #This file is part of Beremiz, a Integrated Development Environment for -#programming IEC 61131-3 automates supporting plcopen standard and CanFestival. +#programming IEC 61131-3 automates supporting plcopen standard and CanFestival. # #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD # @@ -68,7 +68,7 @@ self.website = website self._loading_error = None self.python_runtime_vars = None - + # Get the last transfered PLC if connector must be restart try: self.CurrentPLCFilename=open( @@ -107,7 +107,7 @@ tv_nsec = ctypes.c_uint32() if self._GetLogMessage is not None: maxsz = len(self._log_read_buffer)-1 - sz = self._GetLogMessage(level, msgid, + sz = self._GetLogMessage(level, msgid, self._log_read_buffer, maxsz, ctypes.byref(tick), ctypes.byref(tv_sec), @@ -134,23 +134,23 @@ try: self._PLClibraryHandle = dlopen(self._GetLibFileName()) self.PLClibraryHandle = ctypes.CDLL(self.CurrentPLCFilename, handle=self._PLClibraryHandle) - + self._startPLC = self.PLClibraryHandle.startPLC self._startPLC.restype = ctypes.c_int self._startPLC.argtypes = [ctypes.c_int, ctypes.POINTER(ctypes.c_char_p)] - + self._stopPLC_real = self.PLClibraryHandle.stopPLC self._stopPLC_real.restype = None - + self._PythonIterator = getattr(self.PLClibraryHandle, "PythonIterator", None) if self._PythonIterator is not None: self._PythonIterator.restype = ctypes.c_char_p self._PythonIterator.argtypes = [ctypes.c_char_p, ctypes.POINTER(ctypes.c_void_p)] - + self._stopPLC = self._stopPLC_real else: # If python confnode is not enabled, we reuse _PythonIterator - # as a call that block pythonthread until StopPLC + # as a call that block pythonthread until StopPLC self.PythonIteratorLock = Lock() self.PythonIteratorLock.acquire() def PythonIterator(res, blkid): @@ -158,25 +158,25 @@ self.PythonIteratorLock.release() return None self._PythonIterator = PythonIterator - + def __StopPLC(): self._stopPLC_real() self.PythonIteratorLock.release() self._stopPLC = __StopPLC - - + + self._ResetDebugVariables = self.PLClibraryHandle.ResetDebugVariables self._ResetDebugVariables.restype = None - + self._RegisterDebugVariable = self.PLClibraryHandle.RegisterDebugVariable self._RegisterDebugVariable.restype = None self._RegisterDebugVariable.argtypes = [ctypes.c_int, ctypes.c_void_p] - + self._FreeDebugData = self.PLClibraryHandle.FreeDebugData self._FreeDebugData.restype = None - + self._GetDebugData = self.PLClibraryHandle.GetDebugData - self._GetDebugData.restype = ctypes.c_int + self._GetDebugData.restype = ctypes.c_int self._GetDebugData.argtypes = [ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ctypes.c_void_p)] self._suspendDebug = self.PLClibraryHandle.suspendDebug @@ -233,7 +233,7 @@ self._suspendDebug = lambda x:-1 self._resumeDebug = lambda:None self._PythonIterator = lambda:"" - self._GetLogCount = None + self._GetLogCount = None self._LogMessage = lambda l,m,s:PLCprint("OFF LOG :"+m) self._GetLogMessage = None self.PLClibraryHandle = None @@ -241,18 +241,18 @@ if getattr(self,"_PLClibraryHandle",None) is not None: dlclose(self._PLClibraryHandle) self._PLClibraryHandle = None - + self.PLClibraryLock.release() return False def PythonRuntimeCall(self, methodname): - """ - Calls init, start, stop or cleanup method provided by + """ + Calls init, start, stop or cleanup method provided by runtime python files, loaded when new PLC uploaded """ for method in self.python_runtime_vars.get("_runtime_%s"%methodname, []): res,exp = self.evaluator(method) - if exp is not None: + if exp is not None: self.LogMessage(0,'\n'.join(traceback.format_exception(*exp))) def PythonRuntimeInit(self): @@ -286,14 +286,14 @@ name, ext = os.path.splitext(filename) if name.upper().startswith("RUNTIME") and ext.upper() == ".PY": execfile(os.path.join(self.workingdir, filename), self.python_runtime_vars) - for methodname in MethodNames: + for methodname in MethodNames: method = self.python_runtime_vars.get("_%s_%s" % (name, methodname), None) if method is not None: self.python_runtime_vars["_runtime_%s"%methodname].append(method) except: self.LogMessage(0,traceback.format_exc()) raise - + self.PythonRuntimeCall("init") if self.website is not None: @@ -319,7 +319,7 @@ while True: # print "_PythonIterator(", res, ")", cmd = self._PythonIterator(res,blkid) - FBID = blkid.value + FBID = blkid.value # print " -> ", cmd, blkid if cmd is None: break @@ -330,7 +330,7 @@ AST = compile(cmd, '', 'eval') compile_cache[FBID]=(cmd,AST) result,exp = self.evaluator(eval,AST,self.python_runtime_vars) - if exp is not None: + if exp is not None: res = "#EXCEPTION : "+str(exp[1]) self.LogMessage(1,('PyEval@0x%x(Code="%s") Exception "%s"')%(FBID,cmd, '\n'.join(traceback.format_exception(*exp)))) @@ -343,7 +343,7 @@ self.PLCStatus = "Stopped" self.StatusChange() self.PythonRuntimeCall("stop") - + def StartPLC(self): if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped": c_argv = ctypes.c_char_p * len(self.argv) @@ -359,7 +359,7 @@ self.LogMessage(0,_("Problem starting PLC : error %d" % res)) self.PLCStatus = "Broken" self.StatusChange() - + def StopPLC(self): if self.PLCStatus == "Started": self.LogMessage("PLC stopped") @@ -382,7 +382,7 @@ def GetPLCstatus(self): return self.PLCStatus, map(self.GetLogCount,xrange(LogLevelsCount)) - + def NewPLC(self, md5sum, data, extrafiles): if self.PLCStatus in ["Stopped", "Empty", "Broken"]: NewFileName = md5sum + lib_ext @@ -403,15 +403,15 @@ pass except: pass - + try: # Create new PLC file open(os.path.join(self.workingdir,NewFileName), 'wb').write(data) - + # Store new PLC filename based on md5 key open(self._GetMD5FileName(), "w").write(md5sum) - + # Then write the files log = file(extra_files_log, "w") for fname,fdata in extrafiles: @@ -443,12 +443,10 @@ return last_md5 == MD5 except: return False - - - + def SetTraceVariablesList(self, idxs): """ - Call ctype imported function to append + Call ctype imported function to append these indexes to registred variables in PLC debugger """ if idxs: @@ -462,7 +460,7 @@ c_type,unpack_func, pack_func = \ TypeTranslator.get(iectype, (None,None,None)) - force = ctypes.byref(pack_func(c_type,force)) + force = ctypes.byref(pack_func(c_type,force)) self._RegisterDebugVariable(idx, force) self._resumeDebug() else: @@ -477,18 +475,18 @@ tick = ctypes.c_uint32() size = ctypes.c_uint32() buff = ctypes.c_void_p() - TraceVariables = None + TraceBuffer = None if self.PLClibraryLock.acquire(False): if self._GetDebugData(ctypes.byref(tick), ctypes.byref(size), ctypes.byref(buff)) == 0: if size.value: - TraceVariables = UnpackDebugBuffer(buff, size.value, self._Idxs) + TraceBuffer = ctypes.string_at(buff.value, size.value) self._FreeDebugData() self.PLClibraryLock.release() - if TraceVariables is not None: - return self.PLCStatus, tick.value, TraceVariables - return self.PLCStatus, None, [] + if TraceBuffer is not None: + return self.PLCStatus, tick.value, TraceBuffer + return self.PLCStatus, None, None def RemoteExec(self, script, **kwargs): try: @@ -496,8 +494,8 @@ except: e_type, e_value, e_traceback = sys.exc_info() line_no = traceback.tb_lineno(get_last_traceback(e_traceback)) - return (-1, "RemoteExec script failed!\n\nLine %d: %s\n\t%s" % + return (-1, "RemoteExec script failed!\n\nLine %d: %s\n\t%s" % (line_no, e_value, script.splitlines()[line_no - 1])) return (0, kwargs.get("returnVal", None)) - - + +