# HG changeset patch # User Edouard Tisserant # Date 1424165037 -3600 # Node ID d6b878525ceb6bccb2f29cd7d3b364ed73e197be # Parent 4963e3816641b1bb27715d188be500f4489b1d35 Fixed systematically loading PLC binary at startup even without -a parameter. Extended py_ext extensions instances variable description (PLCGlobalsDesc). Now contains list of variables organizd by extension, with extension name diff -r 4963e3816641 -r d6b878525ceb Beremiz_service.py --- a/Beremiz_service.py Mon Feb 16 16:23:51 2015 +0100 +++ b/Beremiz_service.py Tue Feb 17 10:23:57 2015 +0100 @@ -401,8 +401,10 @@ self.servicepublisher = ServicePublisher.ServicePublisher() self.servicepublisher.RegisterService(self.servicename, self.ip_addr, self.port) - if self.autostart and self.plcobj.GetPLCstatus()[0] != "Empty": - self.plcobj.StartPLC() + if self.autostart : + self.plcobj.AutoLoad() + if self.plcobj.GetPLCstatus()[0] != "Empty": + self.plcobj.StartPLC() sys.stdout.flush() diff -r 4963e3816641 -r d6b878525ceb py_ext/PythonFileCTNMixin.py --- a/py_ext/PythonFileCTNMixin.py Mon Feb 16 16:23:51 2015 +0100 +++ b/py_ext/PythonFileCTNMixin.py Tue Feb 17 10:23:57 2015 +0100 @@ -72,6 +72,7 @@ self.GetCurrentLocation())) configname = self.GetCTRoot().GetProjectConfigNames()[0] + pyextname = self.CTNName() # python side PLC global variables access stub globalstubs = "\n".join(["""\ @@ -83,11 +84,12 @@ _PySafeSetPLCGlob_%(name)s = PLCBinary.__SafeSetPLCGlob_%(name)s _PySafeSetPLCGlob_%(name)s.restype = None _PySafeSetPLCGlob_%(name)s.argtypes = [ctypes.POINTER(_%(name)s_ctype)] -_PySafePLCGlobals.append(("%(name)s","%(IECtype)s")) +_%(pyextname)sGlobalsDesc.append(("%(name)s","%(IECtype)s")) """ % { "name": variable.getname(), "configname": configname.upper(), "uppername": variable.getname().upper(), - "IECtype": variable.gettype()} + "IECtype": variable.gettype(), + "pyextname":pyextname} for variable in self.CodeFile.variables.variable]) # Runtime calls (start, stop, init, and cleanup) @@ -104,8 +106,6 @@ globalsection = self.GetSection("globals") - pyextname = self.CTNName() - PyFileContent = """\ #!/usr/bin/env python # -*- coding: utf-8 -*- @@ -115,8 +115,8 @@ ## Code for PLC global variable access from targets.typemapping import TypeTranslator import ctypes -_PyExtName = "%(pyextname)s" -_PySafePLCGlobals = [] +_%(pyextname)sGlobalsDesc = [] +PLCGlobalsDesc.append(( "_%(pyextname)s" , _%(pyextname)sGlobalsDesc )) %(globalstubs)s ## User code in "global" scope diff -r 4963e3816641 -r d6b878525ceb runtime/PLCObject.py --- a/runtime/PLCObject.py Mon Feb 16 16:23:51 2015 +0100 +++ b/runtime/PLCObject.py Tue Feb 17 10:23:57 2015 +0100 @@ -56,7 +56,7 @@ self.evaluator = evaluator self.argv = [workingdir] + argv # force argv[0] to be "path" to exec... self.workingdir = workingdir - self.PLCStatus = "Stopped" + self.PLCStatus = "Empty" self.PLClibraryHandle = None self.PLClibraryLock = Lock() self.DummyIteratorLock = None @@ -73,6 +73,7 @@ self.TraceWakeup = Event() self.Traces = [] + def AutoLoad(self): # Get the last transfered PLC if connector must be restart try: self.CurrentPLCFilename=open( @@ -264,11 +265,6 @@ self.python_runtime_vars = globals().copy() self.python_runtime_vars.update(self.pyruntimevars) - self.python_runtime_vars["WorkingDir"] = self.workingdir - for methodname in MethodNames : - self.python_runtime_vars["_runtime_%s"%methodname] = [] - self.python_runtime_vars["PLCObject"] = self - self.python_runtime_vars["PLCBinary"] = self.PLClibraryHandle class PLCSafeGlobals: def __getattr__(_self, name): try : @@ -285,9 +281,21 @@ raise KeyError("Try to set unknown shared global variable : %s"%name) v = self.python_runtime_vars["_"+name+"_pack"](t,value) self.python_runtime_vars["_PySafeSetPLCGlob_"+name](ctypes.byref(v)) - self.python_runtime_vars["PLCGlobals"] = PLCSafeGlobals() + + self.python_runtime_vars.update({ + "PLCGlobals" : PLCSafeGlobals(), + "WorkingDir" : self.workingdir, + "PLCObject" : self, + "PLCBinary" : self.PLClibraryHandle, + "PLCGlobalsDesc" : []}) + + for methodname in MethodNames : + self.python_runtime_vars["_runtime_%s"%methodname] = [] + try: - for filename in os.listdir(self.workingdir): + filenames = os.listdir(self.workingdir) + filenames.sort() + for filename in filenames: name, ext = os.path.splitext(filename) if name.upper().startswith("RUNTIME") and ext.upper() == ".PY": execfile(os.path.join(self.workingdir, filename), self.python_runtime_vars)