215 if self.website is not None: |
215 if self.website is not None: |
216 self.website.PLCStopped() |
216 self.website.PLCStopped() |
217 self.python_threads_vars = None |
217 self.python_threads_vars = None |
218 |
218 |
219 def PythonThreadProc(self): |
219 def PythonThreadProc(self): |
220 c_argv = ctypes.c_char_p * len(self.argv) |
220 self.PLCStatus = "Started" |
221 error = None |
221 self.StatusChange() |
222 if self._LoadNewPLC(): |
222 self.StartSem.release() |
223 if self._startPLC(len(self.argv),c_argv(*self.argv)) == 0: |
223 self.evaluator(self.PrepareRuntimePy) |
224 self.PLCStatus = "Started" |
224 res,cmd = "None","None" |
225 self.StatusChange() |
225 while True: |
226 self.StartSem.release() |
226 #print "_PythonIterator(", res, ")", |
227 self.evaluator(self.PrepareRuntimePy) |
227 cmd = self._PythonIterator(res) |
228 res,cmd = "None","None" |
228 #print " -> ", cmd |
229 while True: |
229 if cmd is None: |
230 #print "_PythonIterator(", res, ")", |
230 break |
231 cmd = self._PythonIterator(res) |
231 try : |
232 #print " -> ", cmd |
232 res = str(self.evaluator(eval,cmd,self.python_threads_vars)) |
233 if cmd is None: |
233 except Exception,e: |
234 break |
234 res = "#EXCEPTION : "+str(e) |
235 try : |
235 PLCprint(res) |
236 res = str(self.evaluator(eval,cmd,self.python_threads_vars)) |
236 self.PLCStatus = "Stopped" |
237 except Exception,e: |
237 self.StatusChange() |
238 res = "#EXCEPTION : "+str(e) |
238 self.evaluator(self.FinishRuntimePy) |
239 PLCprint(res) |
|
240 self.PLCStatus = "Stopped" |
|
241 self.StatusChange() |
|
242 self.evaluator(self.FinishRuntimePy) |
|
243 else: |
|
244 error = "starting" |
|
245 else: |
|
246 error = "loading" |
|
247 if error is not None: |
|
248 PLCprint("Problem %s PLC"%error) |
|
249 self.PLCStatus = "Broken" |
|
250 self.StatusChange() |
|
251 self.StartSem.release() |
|
252 self._FreePLC() |
|
253 |
239 |
254 def StartPLC(self): |
240 def StartPLC(self): |
255 PLCprint("StartPLC") |
241 PLCprint("StartPLC") |
256 if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped": |
242 if self.CurrentPLCFilename is not None and self.PLCStatus == "Stopped": |
257 self.StartSem=Semaphore(0) |
243 c_argv = ctypes.c_char_p * len(self.argv) |
258 self.PythonThread = Thread(target=self.PythonThreadProc) |
244 error = None |
259 self.PythonThread.start() |
245 if self._LoadNewPLC(): |
260 self.StartSem.acquire() |
246 if self._startPLC(len(self.argv),c_argv(*self.argv)) == 0: |
|
247 self.StartSem=Semaphore(0) |
|
248 self.PythonThread = Thread(target=self.PythonThreadProc) |
|
249 self.PythonThread.start() |
|
250 self.StartSem.acquire() |
|
251 else: |
|
252 error = "starting" |
|
253 else: |
|
254 error = "loading" |
|
255 if error is not None: |
|
256 PLCprint("Problem %s PLC"%error) |
|
257 self.PLCStatus = "Broken" |
|
258 self.StatusChange() |
|
259 self._FreePLC() |
261 |
260 |
262 def StopPLC(self): |
261 def StopPLC(self): |
263 PLCprint("StopPLC") |
262 PLCprint("StopPLC") |
264 if self.PLCStatus == "Started": |
263 if self.PLCStatus == "Started": |
265 self.PLCStatus = "Stopped" |
|
266 self._stopPLC() |
264 self._stopPLC() |
|
265 self.PythonThread.join() |
|
266 self._FreePLC() |
267 return True |
267 return True |
268 return False |
268 return False |
269 |
269 |
270 def _Reload(self): |
270 def _Reload(self): |
271 self.daemon.shutdown(True) |
271 self.daemon.shutdown(True) |