runtime/PLCObject.py
changeset 911 ffa24427396a
parent 906 de452d65865c
child 914 94436558f0ce
equal deleted inserted replaced
910:f6d06bdd31e8 911:ffa24427396a
    76             self.CurrentPLCFilename=None
    76             self.CurrentPLCFilename=None
    77 
    77 
    78     def StatusChange(self):
    78     def StatusChange(self):
    79         if self.statuschange is not None:
    79         if self.statuschange is not None:
    80             self.statuschange(self.PLCStatus)
    80             self.statuschange(self.PLCStatus)
       
    81 
       
    82     def LogMessage(self, msg):
       
    83         return self._LogMessage(msg, len(msg))
       
    84 
       
    85 
       
    86     def GetLogCount(self):
       
    87         if self._GetLogCount is not None :
       
    88             return int(self._GetLogCount())
       
    89 
       
    90     def GetLogMessage(self, msgid):
       
    91         maxsz = len(self._log_read_buffer)-1
       
    92         sz = self._GetLogMessage(msgid, self._log_read_buffer, maxsz)
       
    93         if sz and sz <= maxsz:
       
    94             self._log_read_buffer[sz] = '\x00'
       
    95             return self._log_read_buffer.value
       
    96         else :
       
    97             return None
    81 
    98 
    82     def _GetMD5FileName(self):
    99     def _GetMD5FileName(self):
    83         return os.path.join(self.workingdir, "lasttransferedPLC.md5")
   100         return os.path.join(self.workingdir, "lasttransferedPLC.md5")
    84 
   101 
    85     def _GetLibFileName(self):
   102     def _GetLibFileName(self):
   147             self._resumeDebug.restype = None
   164             self._resumeDebug.restype = None
   148 
   165 
   149             self._GetLogCount = self.PLClibraryHandle.GetLogCount
   166             self._GetLogCount = self.PLClibraryHandle.GetLogCount
   150             self._GetLogCount.restype = ctypes.c_uint32
   167             self._GetLogCount.restype = ctypes.c_uint32
   151 
   168 
       
   169             self._LogMessage = self.PLClibraryHandle.LogMessage
       
   170             self._LogMessage.restype = ctypes.c_int
       
   171             self._LogMessage.argtypes = [ctypes.c_char_p, ctypes.c_uint32]
       
   172             
       
   173             self._log_read_buffer = ctypes.create_string_buffer(1<<14) #16K
       
   174             self._GetLogMessage = self.PLClibraryHandle.GetLogMessage
       
   175             self._GetLogMessage.restype = ctypes.c_uint32
       
   176             self._GetLogMessage.argtypes = [ctypes.c_uint32, ctypes.c_char_p, ctypes.c_uint32]
       
   177 
   152             return True
   178             return True
   153         except:
   179         except:
   154             PLCprint(traceback.format_exc())
   180             PLCprint(traceback.format_exc())
   155             return False
   181             return False
   156 
   182 
   169         self._FreeDebugData = lambda:None
   195         self._FreeDebugData = lambda:None
   170         self._GetDebugData = lambda:-1
   196         self._GetDebugData = lambda:-1
   171         self._suspendDebug = lambda x:-1
   197         self._suspendDebug = lambda x:-1
   172         self._resumeDebug = lambda:None
   198         self._resumeDebug = lambda:None
   173         self._PythonIterator = lambda:""
   199         self._PythonIterator = lambda:""
   174         self._GetLogCount = lambda:-1 
   200         self._GetLogCount = None 
       
   201         self._LogMessage = lambda m,s:PLCprint("OFF LOG :"+m)
       
   202         self._GetLogMessage = lambda i,b,s:None
   175         self.PLClibraryHandle = None
   203         self.PLClibraryHandle = None
   176         # Unload library explicitely
   204         # Unload library explicitely
   177         if getattr(self,"_PLClibraryHandle",None) is not None:
   205         if getattr(self,"_PLClibraryHandle",None) is not None:
   178             dlclose(self._PLClibraryHandle)
   206             dlclose(self._PLClibraryHandle)
   179             self._PLClibraryHandle = None
   207             self._PLClibraryHandle = None
   256         self.StatusChange()
   284         self.StatusChange()
   257         self.evaluator(self.FinishRuntimePy)
   285         self.evaluator(self.FinishRuntimePy)
   258     
   286     
   259     def StartPLC(self):
   287     def StartPLC(self):
   260         PLCprint("StartPLC")
   288         PLCprint("StartPLC")
       
   289         self.LogMessage("Hello Log")
   261         if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped":
   290         if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped":
   262             c_argv = ctypes.c_char_p * len(self.argv)
   291             c_argv = ctypes.c_char_p * len(self.argv)
   263             error = None
   292             error = None
   264             res = self._startPLC(len(self.argv),c_argv(*self.argv))
   293             res = self._startPLC(len(self.argv),c_argv(*self.argv))
   265             if res == 0:
   294             if res == 0:
   291         # respawn python interpreter
   320         # respawn python interpreter
   292         Timer(0.1,self._Reload).start()
   321         Timer(0.1,self._Reload).start()
   293         return True
   322         return True
   294 
   323 
   295     def GetPLCstatus(self):
   324     def GetPLCstatus(self):
   296         return self.PLCStatus, self._GetLogCount()
   325         return self.PLCStatus, self.GetLogCount()
   297     
   326     
   298     def NewPLC(self, md5sum, data, extrafiles):
   327     def NewPLC(self, md5sum, data, extrafiles):
   299         PLCprint("NewPLC (%s)"%md5sum)
   328         PLCprint("NewPLC (%s)"%md5sum)
   300         if self.PLCStatus in ["Stopped", "Empty", "Broken"]:
   329         if self.PLCStatus in ["Stopped", "Empty", "Broken"]:
   301             NewFileName = md5sum + lib_ext
   330             NewFileName = md5sum + lib_ext
   412                                     #PLCprint("Debug error - buffer too small ! %d != %d"%(offset, size.value))
   441                                     #PLCprint("Debug error - buffer too small ! %d != %d"%(offset, size.value))
   413                                 break
   442                                 break
   414                     self._FreeDebugData()
   443                     self._FreeDebugData()
   415                 self.PLClibraryLock.release()
   444                 self.PLClibraryLock.release()
   416             if offset and offset == size.value:
   445             if offset and offset == size.value:
   417                 return self.PLCStatus, self._GetLogCount(), tick.value, res
   446                 return self.PLCStatus, self.GetLogCount(), tick.value, res
   418             #elif size.value:
   447             #elif size.value:
   419                 #PLCprint("Debug error - wrong buffer unpack ! %d != %d"%(offset, size.value))
   448                 #PLCprint("Debug error - wrong buffer unpack ! %d != %d"%(offset, size.value))
   420         return self.PLCStatus, self._GetLogCount(), None, []
   449         return self.PLCStatus, self.GetLogCount(), None, []
   421 
   450 
   422     def RemoteExec(self, script, **kwargs):
   451     def RemoteExec(self, script, **kwargs):
   423         try:
   452         try:
   424             exec script in kwargs
   453             exec script in kwargs
   425         except:
   454         except: