runtime/PLCObject.py
changeset 1447 d6b878525ceb
parent 1442 ad9a7853dea2
child 1457 ff7cfce737ca
equal deleted inserted replaced
1446:4963e3816641 1447:d6b878525ceb
    54     def __init__(self, workingdir, daemon, argv, statuschange, evaluator, pyruntimevars):
    54     def __init__(self, workingdir, daemon, argv, statuschange, evaluator, pyruntimevars):
    55         pyro.ObjBase.__init__(self)
    55         pyro.ObjBase.__init__(self)
    56         self.evaluator = evaluator
    56         self.evaluator = evaluator
    57         self.argv = [workingdir] + argv # force argv[0] to be "path" to exec...
    57         self.argv = [workingdir] + argv # force argv[0] to be "path" to exec...
    58         self.workingdir = workingdir
    58         self.workingdir = workingdir
    59         self.PLCStatus = "Stopped"
    59         self.PLCStatus = "Empty"
    60         self.PLClibraryHandle = None
    60         self.PLClibraryHandle = None
    61         self.PLClibraryLock = Lock()
    61         self.PLClibraryLock = Lock()
    62         self.DummyIteratorLock = None
    62         self.DummyIteratorLock = None
    63         # Creates fake C funcs proxies
    63         # Creates fake C funcs proxies
    64         self._FreePLC()
    64         self._FreePLC()
    71         self.TraceThread = None
    71         self.TraceThread = None
    72         self.TraceLock = Lock()
    72         self.TraceLock = Lock()
    73         self.TraceWakeup = Event()
    73         self.TraceWakeup = Event()
    74         self.Traces = []
    74         self.Traces = []
    75 
    75 
       
    76     def AutoLoad(self):
    76         # Get the last transfered PLC if connector must be restart
    77         # Get the last transfered PLC if connector must be restart
    77         try:
    78         try:
    78             self.CurrentPLCFilename=open(
    79             self.CurrentPLCFilename=open(
    79                              self._GetMD5FileName(),
    80                              self._GetMD5FileName(),
    80                              "r").read().strip() + lib_ext
    81                              "r").read().strip() + lib_ext
   262     def PythonRuntimeInit(self):
   263     def PythonRuntimeInit(self):
   263         MethodNames = ["init", "start", "stop", "cleanup"]
   264         MethodNames = ["init", "start", "stop", "cleanup"]
   264         self.python_runtime_vars = globals().copy()
   265         self.python_runtime_vars = globals().copy()
   265         self.python_runtime_vars.update(self.pyruntimevars)
   266         self.python_runtime_vars.update(self.pyruntimevars)
   266 
   267 
   267         self.python_runtime_vars["WorkingDir"] = self.workingdir
       
   268         for methodname in MethodNames :
       
   269             self.python_runtime_vars["_runtime_%s"%methodname] = []
       
   270         self.python_runtime_vars["PLCObject"] = self
       
   271         self.python_runtime_vars["PLCBinary"] = self.PLClibraryHandle
       
   272         class PLCSafeGlobals:
   268         class PLCSafeGlobals:
   273             def __getattr__(_self, name):
   269             def __getattr__(_self, name):
   274                 try :
   270                 try :
   275                     t = self.python_runtime_vars["_"+name+"_ctype"]
   271                     t = self.python_runtime_vars["_"+name+"_ctype"]
   276                 except KeyError:
   272                 except KeyError:
   283                     t = self.python_runtime_vars["_"+name+"_ctype"]
   279                     t = self.python_runtime_vars["_"+name+"_ctype"]
   284                 except KeyError:
   280                 except KeyError:
   285                     raise KeyError("Try to set unknown shared global variable : %s"%name)
   281                     raise KeyError("Try to set unknown shared global variable : %s"%name)
   286                 v = self.python_runtime_vars["_"+name+"_pack"](t,value)
   282                 v = self.python_runtime_vars["_"+name+"_pack"](t,value)
   287                 self.python_runtime_vars["_PySafeSetPLCGlob_"+name](ctypes.byref(v))
   283                 self.python_runtime_vars["_PySafeSetPLCGlob_"+name](ctypes.byref(v))
   288         self.python_runtime_vars["PLCGlobals"] = PLCSafeGlobals()
   284 
       
   285         self.python_runtime_vars.update({
       
   286             "PLCGlobals" : PLCSafeGlobals(),
       
   287             "WorkingDir" : self.workingdir,
       
   288             "PLCObject"  : self,
       
   289             "PLCBinary"  : self.PLClibraryHandle,
       
   290             "PLCGlobalsDesc" : []})
       
   291 
       
   292         for methodname in MethodNames :
       
   293             self.python_runtime_vars["_runtime_%s"%methodname] = []
       
   294 
   289         try:
   295         try:
   290             for filename in os.listdir(self.workingdir):
   296             filenames = os.listdir(self.workingdir)
       
   297             filenames.sort()
       
   298             for filename in filenames:
   291                 name, ext = os.path.splitext(filename)
   299                 name, ext = os.path.splitext(filename)
   292                 if name.upper().startswith("RUNTIME") and ext.upper() == ".PY":
   300                 if name.upper().startswith("RUNTIME") and ext.upper() == ".PY":
   293                     execfile(os.path.join(self.workingdir, filename), self.python_runtime_vars)
   301                     execfile(os.path.join(self.workingdir, filename), self.python_runtime_vars)
   294                     for methodname in MethodNames:
   302                     for methodname in MethodNames:
   295                         method = self.python_runtime_vars.get("_%s_%s" % (name, methodname), None)
   303                         method = self.python_runtime_vars.get("_%s_%s" % (name, methodname), None)