97 self.python_runtime_vars = None |
97 self.python_runtime_vars = None |
98 self.TraceThread = None |
98 self.TraceThread = None |
99 self.TraceLock = Lock() |
99 self.TraceLock = Lock() |
100 self.Traces = [] |
100 self.Traces = [] |
101 self.DebugToken = 0 |
101 self.DebugToken = 0 |
|
102 # Callbacks used by web settings extensions (e.g.: BACnet_config.py, Modbus_config.py) |
|
103 self.LoadCallbacks = {} # list of functions to call when PLC is loaded |
|
104 self.UnLoadCallbacks = {} # list of functions to call when PLC is unloaded |
102 |
105 |
103 self._init_blobs() |
106 self._init_blobs() |
104 |
107 |
105 # First task of worker -> no @RunInMain |
108 # First task of worker -> no @RunInMain |
106 def AutoLoad(self, autostart): |
109 def AutoLoad(self, autostart): |
165 return self._log_read_buffer.value, tick.value, tv_sec.value, tv_nsec.value |
168 return self._log_read_buffer.value, tick.value, tv_sec.value, tv_nsec.value |
166 elif self._loading_error is not None and level == 0: |
169 elif self._loading_error is not None and level == 0: |
167 return self._loading_error, 0, 0, 0 |
170 return self._loading_error, 0, 0, 0 |
168 return None |
171 return None |
169 |
172 |
|
173 def RegisterCallbackLoad(self, ExtensionName, ExtensionCallback): |
|
174 """ |
|
175 Register function to be called when PLC is loaded |
|
176 ExtensionName: a string with the name of the extension asking to register the callback |
|
177 ExtensionCallback: the function to be called... |
|
178 """ |
|
179 self.LoadCallbacks[ExtensionName] = ExtensionCallback |
|
180 |
|
181 def RegisterCallbackUnLoad(self, ExtensionName, ExtensionCallback): |
|
182 """ |
|
183 Register function to be called when PLC is unloaded |
|
184 ExtensionName: a string with the name of the extension asking to register the callback |
|
185 ExtensionCallback: the function to be called... |
|
186 """ |
|
187 self.UnLoadCallbacks[ExtensionName] = ExtensionCallback |
|
188 |
170 def _GetMD5FileName(self): |
189 def _GetMD5FileName(self): |
171 return os.path.join(self.workingdir, "lasttransferedPLC.md5") |
190 return os.path.join(self.workingdir, "lasttransferedPLC.md5") |
172 |
191 |
173 def _GetLibFileName(self): |
192 def _GetLibFileName(self): |
174 return os.path.join(self.workingdir, self.CurrentPLCFilename) |
193 return os.path.join(self.workingdir, self.CurrentPLCFilename) |
268 @RunInMain |
287 @RunInMain |
269 def LoadPLC(self): |
288 def LoadPLC(self): |
270 res = self._LoadPLC() |
289 res = self._LoadPLC() |
271 if res: |
290 if res: |
272 self.PythonRuntimeInit() |
291 self.PythonRuntimeInit() |
|
292 for name, callbackFunc in self.LoadCallbacks.items(): |
|
293 callbackFunc() |
273 else: |
294 else: |
274 self._FreePLC() |
295 self._FreePLC() |
275 |
296 |
276 return res |
297 return res |
277 |
298 |
278 @RunInMain |
299 @RunInMain |
279 def UnLoadPLC(self): |
300 def UnLoadPLC(self): |
280 self.PythonRuntimeCleanup() |
301 self.PythonRuntimeCleanup() |
|
302 for name, callbackFunc in self.UnLoadCallbacks.items(): |
|
303 callbackFunc() |
281 self._FreePLC() |
304 self._FreePLC() |
282 |
305 |
283 def _InitPLCStubCalls(self): |
306 def _InitPLCStubCalls(self): |
284 """ |
307 """ |
285 create dummy C func proxies |
308 create dummy C func proxies |