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 |