63 self._FreePLC() |
63 self._FreePLC() |
64 self.daemon = daemon |
64 self.daemon = daemon |
65 self.statuschange = statuschange |
65 self.statuschange = statuschange |
66 self.hmi_frame = None |
66 self.hmi_frame = None |
67 self.website = website |
67 self.website = website |
|
68 self._loading_error = None |
68 |
69 |
69 # Get the last transfered PLC if connector must be restart |
70 # Get the last transfered PLC if connector must be restart |
70 try: |
71 try: |
71 self.CurrentPLCFilename=open( |
72 self.CurrentPLCFilename=open( |
72 self._GetMD5FileName(), |
73 self._GetMD5FileName(), |
84 |
85 |
85 |
86 |
86 def GetLogCount(self): |
87 def GetLogCount(self): |
87 if self._GetLogCount is not None : |
88 if self._GetLogCount is not None : |
88 return int(self._GetLogCount()) |
89 return int(self._GetLogCount()) |
|
90 elif self._loading_error is not None: |
|
91 return 1; |
|
92 |
89 |
93 |
90 def GetLogMessage(self, msgid): |
94 def GetLogMessage(self, msgid): |
91 maxsz = len(self._log_read_buffer)-1 |
95 if self._GetLogMessage is not None: |
92 sz = self._GetLogMessage(msgid, self._log_read_buffer, maxsz) |
96 maxsz = len(self._log_read_buffer)-1 |
93 if sz and sz <= maxsz: |
97 sz = self._GetLogMessage(msgid, self._log_read_buffer, maxsz) |
94 self._log_read_buffer[sz] = '\x00' |
98 if sz and sz <= maxsz: |
95 return self._log_read_buffer.value |
99 self._log_read_buffer[sz] = '\x00' |
96 else : |
100 return self._log_read_buffer.value |
97 return None |
101 elif self._loading_error is not None : |
|
102 return self._loading_error |
|
103 return None |
98 |
104 |
99 def _GetMD5FileName(self): |
105 def _GetMD5FileName(self): |
100 return os.path.join(self.workingdir, "lasttransferedPLC.md5") |
106 return os.path.join(self.workingdir, "lasttransferedPLC.md5") |
101 |
107 |
102 def _GetLibFileName(self): |
108 def _GetLibFileName(self): |
173 self._log_read_buffer = ctypes.create_string_buffer(1<<14) #16K |
179 self._log_read_buffer = ctypes.create_string_buffer(1<<14) #16K |
174 self._GetLogMessage = self.PLClibraryHandle.GetLogMessage |
180 self._GetLogMessage = self.PLClibraryHandle.GetLogMessage |
175 self._GetLogMessage.restype = ctypes.c_uint32 |
181 self._GetLogMessage.restype = ctypes.c_uint32 |
176 self._GetLogMessage.argtypes = [ctypes.c_uint32, ctypes.c_char_p, ctypes.c_uint32] |
182 self._GetLogMessage.argtypes = [ctypes.c_uint32, ctypes.c_char_p, ctypes.c_uint32] |
177 |
183 |
|
184 self._loading_error = None |
178 return True |
185 return True |
179 except: |
186 except: |
180 PLCprint(traceback.format_exc()) |
187 self._loading_error = traceback.format_exc() |
|
188 PLCprint(self._loading_error) |
181 return False |
189 return False |
182 |
190 |
183 def _FreePLC(self): |
191 def _FreePLC(self): |
184 """ |
192 """ |
185 Unload PLC library. |
193 Unload PLC library. |
197 self._suspendDebug = lambda x:-1 |
205 self._suspendDebug = lambda x:-1 |
198 self._resumeDebug = lambda:None |
206 self._resumeDebug = lambda:None |
199 self._PythonIterator = lambda:"" |
207 self._PythonIterator = lambda:"" |
200 self._GetLogCount = None |
208 self._GetLogCount = None |
201 self._LogMessage = lambda m,s:PLCprint("OFF LOG :"+m) |
209 self._LogMessage = lambda m,s:PLCprint("OFF LOG :"+m) |
202 self._GetLogMessage = lambda i,b,s:None |
210 self._GetLogMessage = None |
203 self.PLClibraryHandle = None |
211 self.PLClibraryHandle = None |
204 # Unload library explicitely |
212 # Unload library explicitely |
205 if getattr(self,"_PLClibraryHandle",None) is not None: |
213 if getattr(self,"_PLClibraryHandle",None) is not None: |
206 dlclose(self._PLClibraryHandle) |
214 dlclose(self._PLClibraryHandle) |
207 self._PLClibraryHandle = None |
215 self._PLClibraryHandle = None |