py_ext/PythonFileCTNMixin.py
changeset 1449 5f09fa31d7b0
parent 1448 20ff66dcc31d
child 1452 7a2b344de8cf
equal deleted inserted replaced
1448:20ff66dcc31d 1449:5f09fa31d7b0
    73 
    73 
    74         pyextname = self.CTNName()
    74         pyextname = self.CTNName()
    75         varinfos = map(lambda variable : {
    75         varinfos = map(lambda variable : {
    76                     "name": variable.getname(),
    76                     "name": variable.getname(),
    77                     "desc" : repr(variable.getdesc()),   
    77                     "desc" : repr(variable.getdesc()),   
    78                     "onchange" : '"'+variable.getonchange()+"('"+variable.getname()+"')\"" \
    78                     "onchangecode" : '"'+variable.getonchange()+\
    79                                  if variable.getonchange() else "",
    79                                          "('"+variable.getname()+"')\"" \
       
    80                                      if variable.getonchange() else '""',
       
    81                     "onchange" : repr(variable.getonchange()) \
       
    82                                  if variable.getonchange() else None,
    80                     "opts" : repr(variable.getopts()),
    83                     "opts" : repr(variable.getopts()),
    81                     "configname" : configname.upper(),
    84                     "configname" : configname.upper(),
    82                     "uppername" : variable.getname().upper(),
    85                     "uppername" : variable.getname().upper(),
    83                     "IECtype" : variable.gettype(),
    86                     "IECtype" : variable.gettype(),
    84                     "pyextname" :pyextname},
    87                     "pyextname" :pyextname},
    95 _PySafeSetPLCGlob_%(name)s.argtypes = [ctypes.POINTER(_%(name)s_ctype)]
    98 _PySafeSetPLCGlob_%(name)s.argtypes = [ctypes.POINTER(_%(name)s_ctype)]
    96 _%(pyextname)sGlobalsDesc.append((
    99 _%(pyextname)sGlobalsDesc.append((
    97     "%(name)s",
   100     "%(name)s",
    98     "%(IECtype)s",
   101     "%(IECtype)s",
    99     %(desc)s,
   102     %(desc)s,
       
   103     %(onchange)s,
   100     %(opts)s))
   104     %(opts)s))
   101 """ % varinfo for varinfo in varinfos])
   105 """ % varinfo 
       
   106       for varinfo in varinfos])
   102 
   107 
   103         # Runtime calls (start, stop, init, and cleanup)
   108         # Runtime calls (start, stop, init, and cleanup)
   104         rtcalls = ""
   109         rtcalls = ""
   105         for section in self.SECTIONS_NAMES:
   110         for section in self.SECTIONS_NAMES:
   106             if section != "globals":
   111             if section != "globals":
   122 
   127 
   123 ## Code for PLC global variable access
   128 ## Code for PLC global variable access
   124 from targets.typemapping import TypeTranslator
   129 from targets.typemapping import TypeTranslator
   125 import ctypes
   130 import ctypes
   126 _%(pyextname)sGlobalsDesc = []
   131 _%(pyextname)sGlobalsDesc = []
       
   132 __ext_name__ = "%(pyextname)s"
   127 PLCGlobalsDesc.append(( "_%(pyextname)s" , _%(pyextname)sGlobalsDesc ))
   133 PLCGlobalsDesc.append(( "_%(pyextname)s" , _%(pyextname)sGlobalsDesc ))
   128 %(globalstubs)s
   134 %(globalstubs)s
   129 
   135 
   130 ## User code in "global" scope
   136 ## User code in "global" scope
   131 %(globalsection)s
   137 %(globalsection)s
   132 
   138 
   133 ## Beremiz python runtime calls
   139 ## Beremiz python runtime calls
   134 %(rtcalls)s
   140 %(rtcalls)s
       
   141 
       
   142 del __ext_name__
   135 
   143 
   136 """ % locals()
   144 """ % locals()
   137 
   145 
   138         # write generated content to python file
   146         # write generated content to python file
   139         runtimefile_path = os.path.join(buildpath,
   147         runtimefile_path = os.path.join(buildpath,
   196     }
   204     }
   197 """
   205 """
   198         varinitonchangefmt = """\
   206         varinitonchangefmt = """\
   199     __%(name)s_notifier = __GET_GLOBAL_ON%(uppername)sCHANGE();
   207     __%(name)s_notifier = __GET_GLOBAL_ON%(uppername)sCHANGE();
   200     __SET_VAR(__%(name)s_notifier->,TRIG,,__BOOL_LITERAL(TRUE));
   208     __SET_VAR(__%(name)s_notifier->,TRIG,,__BOOL_LITERAL(TRUE));
   201     __SET_VAR(__%(name)s_notifier->,CODE,,__STRING_LITERAL(%(onchangelen)d,%(onchange)s));
   209     __SET_VAR(__%(name)s_notifier->,CODE,,__STRING_LITERAL(%(onchangelen)d,%(onchangecode)s));
   202 """
   210 """
   203         vardec = "\n".join([(vardecfmt + vardeconchangefmt 
   211         vardec = "\n".join([(vardecfmt + vardeconchangefmt 
   204                              if varinfo["onchange"] else vardecfmt)% varinfo 
   212                              if varinfo["onchange"] else vardecfmt)% varinfo 
   205                             for varinfo in varinfos])
   213                             for varinfo in varinfos])
   206         varret = "\n".join([varretfmt % varinfo for varinfo in varinfos])
   214         varret = "\n".join([varretfmt % varinfo for varinfo in varinfos])
   207         varpub = "\n".join([(varpubonchangefmt if varinfo["onchange"] else
   215         varpub = "\n".join([(varpubonchangefmt if varinfo["onchange"] else
   208                              varpubfmt) % varinfo
   216                              varpubfmt) % varinfo
   209                             for varinfo in varinfos])
   217                             for varinfo in varinfos])
   210         varinit = "\n".join([varinitonchangefmt % dict(
   218         varinit = "\n".join([varinitonchangefmt % dict(
   211                                 onchangelen = len(varinfo["onchange"]),**varinfo)
   219                                 onchangelen = len(varinfo["onchangecode"]),**varinfo)
   212                             for varinfo in varinfos if varinfo["onchange"]])
   220                             for varinfo in varinfos if varinfo["onchange"]])
   213 
   221 
   214         PyCFileContent = """\
   222         PyCFileContent = """\
   215 /*
   223 /*
   216  * Code generated by Beremiz py_ext confnode
   224  * Code generated by Beremiz py_ext confnode