173 elif paths[0]: |
176 elif paths[0]: |
174 return [variable, paths[0]] |
177 return [variable, paths[0]] |
175 else: |
178 else: |
176 return variable |
179 return variable |
177 |
180 |
|
181 def ExtractDivergenceInput(self, divergence, pou): |
|
182 connectionPointIn = divergence.getConnectionPointIn() |
|
183 if connectionPointIn: |
|
184 connections = connectionPointIn.getConnections() |
|
185 if len(connections) == 1: |
|
186 instanceLocalId = connections[0].getRefLocalId() |
|
187 return pou.body.getContentInstance(instanceLocalId) |
|
188 return None |
|
189 |
|
190 def ExtractConvergenceInputs(self, convergence, pou): |
|
191 instances = [] |
|
192 for connectionPointIn in convergence.getConnectionPointIn(): |
|
193 connections = connectionPointIn.getConnections() |
|
194 if len(connections) == 1: |
|
195 instanceLocalId = connections[0].getRefLocalId() |
|
196 instances.append(pou.body.getContentInstance(instanceLocalId)) |
|
197 return instances |
|
198 |
178 def GenerateSFCStep(self, step, pou): |
199 def GenerateSFCStep(self, step, pou): |
179 step_name = step.getName() |
200 step_name = step.getName() |
180 if step_name not in self.SFCNetworks["Steps"].keys(): |
201 if step_name not in self.SFCNetworks["Steps"].keys(): |
181 if step.getInitialStep(): |
202 if step.getInitialStep(): |
182 self.InitialSteps.append(step_name) |
203 self.InitialSteps.append(step_name) |
186 connections = step.connectionPointIn.getConnections() |
207 connections = step.connectionPointIn.getConnections() |
187 if len(connections) == 1: |
208 if len(connections) == 1: |
188 instanceLocalId = connections[0].getRefLocalId() |
209 instanceLocalId = connections[0].getRefLocalId() |
189 instance = pou.body.getContentInstance(instanceLocalId) |
210 instance = pou.body.getContentInstance(instanceLocalId) |
190 if isinstance(instance, plcopen.transition): |
211 if isinstance(instance, plcopen.transition): |
191 self.GenerateSFCTransition(instance, pou) |
|
192 instances.append(instance) |
212 instances.append(instance) |
193 elif isinstance(instance, plcopen.selectionConvergence): |
213 elif isinstance(instance, plcopen.selectionConvergence): |
194 for connectionPointIn in instance.getConnectionPointIn(): |
214 instances.extend(self.ExtractConvergenceInputs(instance, pou)) |
195 divergence_connections = connectionPointIn.getConnections() |
215 elif isinstance(instance, plcopen.simultaneousDivergence): |
196 if len(divergence_connections) == 1: |
216 transition = self.ExtractDivergenceInput(instance, pou) |
197 transitionLocalId = connections[0].getRefLocalId() |
217 if transition: |
198 transition = pou.body.getContentInstance(transitionLocalId) |
218 if isinstance(transition, plcopen.transition): |
199 self.GenerateSFCTransition(transition, pou) |
|
200 instances.append(transition) |
219 instances.append(transition) |
201 elif isinstance(instance, plcopen.simultaneousDivergence): |
220 elif isinstance(transition, plcopen.selectionConvergence): |
202 connectionPointIn = instance.getConnectionPointIn() |
221 instances.extend(self.ExtractConvergenceInputs(transition, pou)) |
203 if connectionPointIn: |
|
204 divergence_connections = connectionPointIn.getConnections() |
|
205 if len(divergence_connections) == 1: |
|
206 transitionLocalId = connections[0].getRefLocalId() |
|
207 transition = pou.body.getContentInstance(transitionLocalId) |
|
208 self.GenerateSFCTransition(transition, pou) |
|
209 instances.append(transition) |
|
210 for instance in instances: |
222 for instance in instances: |
|
223 self.GenerateSFCTransition(instance, pou) |
211 if instance in self.SFCNetworks["Transitions"].keys(): |
224 if instance in self.SFCNetworks["Transitions"].keys(): |
212 self.SFCNetworks["Transitions"][instance]["to"].append(step_name) |
225 self.SFCNetworks["Transitions"][instance]["to"].append(step_name) |
213 self.SFCNetworks["Steps"][step_name] = step_infos |
226 self.SFCNetworks["Steps"][step_name] = step_infos |
214 |
227 |
215 def GenerateSFCJump(self, jump, pou): |
228 def GenerateSFCJump(self, jump, pou): |
219 connections = jump.connectionPointIn.getConnections() |
232 connections = jump.connectionPointIn.getConnections() |
220 if len(connections) == 1: |
233 if len(connections) == 1: |
221 instanceLocalId = connections[0].getRefLocalId() |
234 instanceLocalId = connections[0].getRefLocalId() |
222 instance = pou.body.getContentInstance(instanceLocalId) |
235 instance = pou.body.getContentInstance(instanceLocalId) |
223 if isinstance(instance, plcopen.transition): |
236 if isinstance(instance, plcopen.transition): |
224 self.GenerateSFCTransition(instance, pou) |
|
225 instances.append(instance) |
237 instances.append(instance) |
226 elif isinstance(instance, plcopen.selectionConvergence): |
238 elif isinstance(instance, plcopen.selectionConvergence): |
227 for connectionPointIn in instance.getConnectionPointIn(): |
239 instances.extend(self.ExtractConvergenceInputs(instance, pou)) |
228 divergence_connections = connectionPointIn.getConnections() |
240 elif isinstance(instance, plcopen.simultaneousDivergence): |
229 if len(divergence_connections) == 1: |
241 transition = self.ExtractDivergenceInput(instance, pou) |
230 transitionLocalId = divergence_connections[0].getRefLocalId() |
242 if transition: |
231 transition = pou.body.getContentInstance(transitionLocalId) |
243 if isinstance(transition, plcopen.transition): |
232 self.GenerateSFCTransition(transition, pou) |
|
233 instances.append(transition) |
244 instances.append(transition) |
234 elif isinstance(instance, plcopen.simultaneousDivergence): |
245 elif isinstance(transition, plcopen.selectionConvergence): |
235 connectionPointIn = instance.getConnectionPointIn() |
246 instances.extend(self.ExtractConvergenceInputs(transition, pou)) |
236 if connectionPointIn: |
|
237 divergence_connections = connectionPointIn.getConnections() |
|
238 if len(divergence_connections) == 1: |
|
239 transitionLocalId = connections[0].getRefLocalId() |
|
240 transition = pou.body.getContentInstance(transitionLocalId) |
|
241 self.GenerateSFCTransition(transition, pou) |
|
242 instances.append(transition) |
|
243 for instance in instances: |
247 for instance in instances: |
|
248 self.GenerateSFCTransition(instance, pou) |
244 if instance in self.SFCNetworks["Transitions"].keys(): |
249 if instance in self.SFCNetworks["Transitions"].keys(): |
245 self.SFCNetworks["Transitions"][instance]["to"].append(jump_target) |
250 self.SFCNetworks["Transitions"][instance]["to"].append(jump_target) |
246 |
251 |
247 def GenerateSFCStepActions(self, actionBlock, pou): |
252 def GenerateSFCStepActions(self, actionBlock, pou): |
248 connections = actionBlock.connectionPointIn.getConnections() |
253 connections = actionBlock.connectionPointIn.getConnections() |
295 connections = transition.connectionPointIn.getConnections() |
300 connections = transition.connectionPointIn.getConnections() |
296 if len(connections) == 1: |
301 if len(connections) == 1: |
297 instanceLocalId = connections[0].getRefLocalId() |
302 instanceLocalId = connections[0].getRefLocalId() |
298 instance = pou.body.getContentInstance(instanceLocalId) |
303 instance = pou.body.getContentInstance(instanceLocalId) |
299 if isinstance(instance, plcopen.step): |
304 if isinstance(instance, plcopen.step): |
300 self.GenerateSFCStep(instance, pou) |
305 steps.append(instance) |
301 steps.append(instance.getName()) |
|
302 elif isinstance(instance, plcopen.selectionDivergence): |
306 elif isinstance(instance, plcopen.selectionDivergence): |
303 divergence_connections = instance.connectionPointIn.getConnections() |
307 step = self.ExtractDivergenceInput(instance, pou) |
304 if len(divergence_connections) == 1: |
308 if step: |
305 stepLocalId = divergence_connections[0].getRefLocalId() |
309 if isinstance(step, plcopen.step): |
306 divergence_instance = pou.body.getContentInstance(stepLocalId) |
310 steps.append(step) |
307 if isinstance(divergence_instance, plcopen.step): |
311 elif isinstance(step, plcopen.simultaneousConvergence): |
308 self.GenerateSFCStep(divergence_instance, pou) |
312 steps.extend(self.ExtractConvergenceInputs(step, pou)) |
309 steps.append(divergence_instance.getName()) |
313 elif isinstance(instance, plcopen.simultaneousConvergence): |
|
314 steps.extend(self.ExtractConvergenceInputs(instance, pou)) |
310 transition_infos = {"from": [], "to" : []} |
315 transition_infos = {"from": [], "to" : []} |
311 transitionValues = transition.getConditionContent() |
316 transitionValues = transition.getConditionContent() |
312 if transitionValues["type"] == "inline": |
317 if transitionValues["type"] == "inline": |
313 transition_infos["content"] = "\n := %s;\n"%transitionValues["value"] |
318 transition_infos["content"] = "\n := %s;\n"%transitionValues["value"] |
314 else: |
319 else: |
315 transitionContent = pou.getTransition(transitionValues["value"]) |
320 transitionContent = pou.getTransition(transitionValues["value"]) |
316 transitionType = transitionContent.getBodyType() |
321 transitionType = transitionContent.getBodyType() |
317 transitionBody = transitionContent.getBody() |
322 transitionBody = transitionContent.getBody() |
318 if transitionType == "IL": |
323 if transitionType == "IL": |
319 transition_infos["content"] = ":\n%s\n"%ReIndentText(transitionBody.getText(), 4) |
324 transition_infos["content"] = ":\n%s"%ReIndentText(transitionBody.getText(), 4) |
320 elif transitionType == "ST": |
325 elif transitionType == "ST": |
321 transition_infos["content"] = "\n%s\n"%ReIndentText(transitionBody.getText(), 4) |
326 transition_infos["content"] = "\n%s"%ReIndentText(transitionBody.getText(), 4) |
322 elif conditionType == "FBD": |
327 elif conditionType == "FBD": |
323 for instance in transitionBody.getContentInstances(): |
328 for instance in transitionBody.getContentInstances(): |
324 if isinstance(instance, plcopen.outVariable): |
329 if isinstance(instance, plcopen.outVariable): |
325 connections = instance.connectionPointIn.getConnections() |
330 connections = instance.connectionPointIn.getConnections() |
326 if connections and len(connections) == 1: |
331 if connections and len(connections) == 1: |
330 for instance in transitionbody.getContentInstances(): |
335 for instance in transitionbody.getContentInstances(): |
331 if isinstance(instance, plcopen.coil): |
336 if isinstance(instance, plcopen.coil): |
332 paths = self.GenerateLDPaths(instance, conditionBody) |
337 paths = self.GenerateLDPaths(instance, conditionBody) |
333 expression = self.ComputeLDExpression(paths, True) |
338 expression = self.ComputeLDExpression(paths, True) |
334 transition_infos["content"] = "\n := %s;\n"%expression |
339 transition_infos["content"] = "\n := %s;\n"%expression |
335 for step_name in steps: |
340 for step in steps: |
|
341 self.GenerateSFCStep(step, pou) |
|
342 step_name = step.getName() |
336 if step_name in self.SFCNetworks["Steps"].keys(): |
343 if step_name in self.SFCNetworks["Steps"].keys(): |
337 transition_infos["from"].append(step_name) |
344 transition_infos["from"].append(step_name) |
338 self.SFCNetworks["Steps"][step_name]["transitions"].append(transition) |
345 self.SFCNetworks["Steps"][step_name]["transitions"].append(transition) |
339 self.SFCNetworks["Transitions"][transition] = transition_infos |
346 self.SFCNetworks["Transitions"][transition] = transition_infos |
340 |
347 |