runtime/PLCObject.py
changeset 906 de452d65865c
parent 868 7e5da4962bea
child 911 ffa24427396a
equal deleted inserted replaced
905:eaa1d3a4b52b 906:de452d65865c
   143             self._suspendDebug.restype = ctypes.c_int
   143             self._suspendDebug.restype = ctypes.c_int
   144             self._suspendDebug.argtypes = [ctypes.c_int]
   144             self._suspendDebug.argtypes = [ctypes.c_int]
   145 
   145 
   146             self._resumeDebug = self.PLClibraryHandle.resumeDebug
   146             self._resumeDebug = self.PLClibraryHandle.resumeDebug
   147             self._resumeDebug.restype = None
   147             self._resumeDebug.restype = None
   148             
   148 
       
   149             self._GetLogCount = self.PLClibraryHandle.GetLogCount
       
   150             self._GetLogCount.restype = ctypes.c_uint32
       
   151 
   149             return True
   152             return True
   150         except:
   153         except:
   151             PLCprint(traceback.format_exc())
   154             PLCprint(traceback.format_exc())
   152             return False
   155             return False
   153 
   156 
   166         self._FreeDebugData = lambda:None
   169         self._FreeDebugData = lambda:None
   167         self._GetDebugData = lambda:-1
   170         self._GetDebugData = lambda:-1
   168         self._suspendDebug = lambda x:-1
   171         self._suspendDebug = lambda x:-1
   169         self._resumeDebug = lambda:None
   172         self._resumeDebug = lambda:None
   170         self._PythonIterator = lambda:""
   173         self._PythonIterator = lambda:""
       
   174         self._GetLogCount = lambda:-1 
   171         self.PLClibraryHandle = None
   175         self.PLClibraryHandle = None
   172         # Unload library explicitely
   176         # Unload library explicitely
   173         if getattr(self,"_PLClibraryHandle",None) is not None:
   177         if getattr(self,"_PLClibraryHandle",None) is not None:
   174             dlclose(self._PLClibraryHandle)
   178             dlclose(self._PLClibraryHandle)
   175             self._PLClibraryHandle = None
   179             self._PLClibraryHandle = None
   255     def StartPLC(self):
   259     def StartPLC(self):
   256         PLCprint("StartPLC")
   260         PLCprint("StartPLC")
   257         if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped":
   261         if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped":
   258             c_argv = ctypes.c_char_p * len(self.argv)
   262             c_argv = ctypes.c_char_p * len(self.argv)
   259             error = None
   263             error = None
   260             if self._LoadNewPLC():
   264             res = self._startPLC(len(self.argv),c_argv(*self.argv))
   261                 if self._startPLC(len(self.argv),c_argv(*self.argv)) == 0:
   265             if res == 0:
   262                     self.StartSem=Semaphore(0)
   266                 self.StartSem=Semaphore(0)
   263                     self.PythonThread = Thread(target=self.PythonThreadProc)
   267                 self.PythonThread = Thread(target=self.PythonThreadProc)
   264                     self.PythonThread.start()
   268                 self.PythonThread.start()
   265                     self.StartSem.acquire()
   269                 self.StartSem.acquire()
   266                 else:
       
   267                     error = "starting"
       
   268             else:
   270             else:
   269                 error = "loading"
   271                 PLCprint(_("Problem starting PLC : error %d" % res))
   270             if error is not None:
       
   271                 PLCprint("Problem %s PLC"%error)
       
   272                 self.PLCStatus = "Broken"
   272                 self.PLCStatus = "Broken"
   273                 self.StatusChange()
   273                 self.StatusChange()
   274                 self._FreePLC()
       
   275             
   274             
   276     def StopPLC(self):
   275     def StopPLC(self):
   277         PLCprint("StopPLC")
   276         PLCprint("StopPLC")
   278         if self.PLCStatus == "Started":
   277         if self.PLCStatus == "Started":
   279             self._stopPLC()
   278             self._stopPLC()
   280             self.PythonThread.join()
   279             self.PythonThread.join()
   281             self._FreePLC()
       
   282             return True
   280             return True
   283         return False
   281         return False
   284 
   282 
   285     def _Reload(self):
   283     def _Reload(self):
   286         self.daemon.shutdown(True)
   284         self.daemon.shutdown(True)
   293         # respawn python interpreter
   291         # respawn python interpreter
   294         Timer(0.1,self._Reload).start()
   292         Timer(0.1,self._Reload).start()
   295         return True
   293         return True
   296 
   294 
   297     def GetPLCstatus(self):
   295     def GetPLCstatus(self):
   298         return self.PLCStatus
   296         return self.PLCStatus, self._GetLogCount()
   299     
   297     
   300     def NewPLC(self, md5sum, data, extrafiles):
   298     def NewPLC(self, md5sum, data, extrafiles):
   301         PLCprint("NewPLC (%s)"%md5sum)
   299         PLCprint("NewPLC (%s)"%md5sum)
   302         if self.PLCStatus in ["Stopped", "Empty", "Broken"]:
   300         if self.PLCStatus in ["Stopped", "Empty", "Broken"]:
   303             NewFileName = md5sum + lib_ext
   301             NewFileName = md5sum + lib_ext
   304             extra_files_log = os.path.join(self.workingdir,"extra_files.txt")
   302             extra_files_log = os.path.join(self.workingdir,"extra_files.txt")
       
   303 
       
   304             self._FreePLC()
       
   305             self.PLCStatus = "Empty"
       
   306 
   305             try:
   307             try:
   306                 os.remove(os.path.join(self.workingdir,
   308                 os.remove(os.path.join(self.workingdir,
   307                                        self.CurrentPLCFilename))
   309                                        self.CurrentPLCFilename))
   308                 for filename in file(extra_files_log, "r").readlines() + [extra_files_log]:
   310                 for filename in file(extra_files_log, "r").readlines() + [extra_files_log]:
   309                     try:
   311                     try:
   329                     log.write(fname+'\n')
   331                     log.write(fname+'\n')
   330 
   332 
   331                 # Store new PLC filename
   333                 # Store new PLC filename
   332                 self.CurrentPLCFilename = NewFileName
   334                 self.CurrentPLCFilename = NewFileName
   333             except:
   335             except:
       
   336                 self.PLCStatus = "Broken"
       
   337                 self.StatusChange()
   334                 PLCprint(traceback.format_exc())
   338                 PLCprint(traceback.format_exc())
   335                 return False
   339                 return False
   336             if self.PLCStatus == "Empty":
   340 
       
   341             if self._LoadNewPLC():
   337                 self.PLCStatus = "Stopped"
   342                 self.PLCStatus = "Stopped"
   338             return True
   343             else:
       
   344                 self._FreePLC()
       
   345             self.StatusChange()
       
   346 
       
   347             return self.PLCStatus == "Stopped"
   339         return False
   348         return False
   340 
   349 
   341     def MatchMD5(self, MD5):
   350     def MatchMD5(self, MD5):
   342         try:
   351         try:
   343             last_md5 = open(self._GetMD5FileName(), "r").read()
   352             last_md5 = open(self._GetMD5FileName(), "r").read()
   403                                     #PLCprint("Debug error - buffer too small ! %d != %d"%(offset, size.value))
   412                                     #PLCprint("Debug error - buffer too small ! %d != %d"%(offset, size.value))
   404                                 break
   413                                 break
   405                     self._FreeDebugData()
   414                     self._FreeDebugData()
   406                 self.PLClibraryLock.release()
   415                 self.PLClibraryLock.release()
   407             if offset and offset == size.value:
   416             if offset and offset == size.value:
   408                 return self.PLCStatus, tick.value, res
   417                 return self.PLCStatus, self._GetLogCount(), tick.value, res
   409             #elif size.value:
   418             #elif size.value:
   410                 #PLCprint("Debug error - wrong buffer unpack ! %d != %d"%(offset, size.value))
   419                 #PLCprint("Debug error - wrong buffer unpack ! %d != %d"%(offset, size.value))
   411         return self.PLCStatus, None, []
   420         return self.PLCStatus, self._GetLogCount(), None, []
   412 
   421 
   413     def RemoteExec(self, script, **kwargs):
   422     def RemoteExec(self, script, **kwargs):
   414         try:
   423         try:
   415             exec script in kwargs
   424             exec script in kwargs
   416         except:
   425         except: