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