128 self.GenerateSFCStepActions(instance, pou) |
129 self.GenerateSFCStepActions(instance, pou) |
129 elif isinstance(instance, plcopen.transition): |
130 elif isinstance(instance, plcopen.transition): |
130 self.GenerateSFCTransition(instance, pou) |
131 self.GenerateSFCTransition(instance, pou) |
131 elif isinstance(instance, plcopen.jumpStep): |
132 elif isinstance(instance, plcopen.jumpStep): |
132 self.GenerateSFCJump(instance, pou) |
133 self.GenerateSFCJump(instance, pou) |
133 if len(self.InitialSteps) > 0: |
134 if len(self.InitialSteps) > 0 and self.ComputedBlocks != "": |
134 action_name = "COMPUTE_FUNCTION_BLOCKS" |
135 action_name = "COMPUTE_FUNCTION_BLOCKS" |
135 action_infos = {"qualifier" : "S", "content" : action_name} |
136 action_infos = {"qualifier" : "S", "content" : action_name} |
136 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos) |
137 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos) |
137 self.SFCNetworks["Actions"][action_name] = ReIndentText(self.Program, 4) |
138 self.SFCNetworks["Actions"][action_name] = ReIndentText(self.ComputedBlocks, 4) |
138 self.Program = "" |
139 self.Program = "" |
139 else: |
140 else: |
140 raise Exception |
141 raise Exception |
141 for initialstep in self.InitialSteps: |
142 for initialstep in self.InitialSteps: |
142 self.ComputeSFCStep(initialstep) |
143 self.ComputeSFCStep(initialstep) |
203 localId = connection.getRefLocalId() |
204 localId = connection.getRefLocalId() |
204 next = body.getContentInstance(localId) |
205 next = body.getContentInstance(localId) |
205 if isinstance(next, plcopen.leftPowerRail) or isinstance(next, plcopen.contact): |
206 if isinstance(next, plcopen.leftPowerRail) or isinstance(next, plcopen.contact): |
206 return "LD" |
207 return "LD" |
207 elif isinstance(next, plcopen.block): |
208 elif isinstance(next, plcopen.block): |
208 for variable in instance.inputVariables.getVariable(): |
209 for variable in next.inputVariables.getVariable(): |
209 result = self.GetNetworkType(variable.connectionPointIn.getConnections(), body) |
210 result = self.GetNetworkType(variable.connectionPointIn.getConnections(), body) |
210 if result != "FBD": |
211 if result != "FBD": |
211 return result |
212 return result |
212 elif isinstance(next, plcopen.inVariable): |
213 elif isinstance(next, plcopen.inVariable): |
213 return "FBD" |
214 return "FBD" |
324 if isinstance(instance, plcopen.outVariable): |
325 if isinstance(instance, plcopen.outVariable): |
325 var = instance.getExpression() |
326 var = instance.getExpression() |
326 connections = instance.connectionPointIn.getConnections() |
327 connections = instance.connectionPointIn.getConnections() |
327 if connections and len(connections) == 1: |
328 if connections and len(connections) == 1: |
328 expression = self.ComputeFBDExpression(actionBody, connections[0]) |
329 expression = self.ComputeFBDExpression(actionBody, connections[0]) |
329 self.SFCNetworks["Actions"][action_name] = self.Program + " %s := %s;\n"%(var, expression) |
330 action_content = self.Program + " %s := %s;\n"%(var, expression) |
330 self.Program = "" |
331 self.Program = "" |
|
332 self.SFCNetworks["Actions"][action_name] = ReIndentText(action_content, 4) |
331 elif actionType == "LD": |
333 elif actionType == "LD": |
332 for instance in actionbody.getContentInstances(): |
334 for instance in actionbody.getContentInstances(): |
333 if isinstance(instance, plcopen.coil): |
335 if isinstance(instance, plcopen.coil): |
334 paths = self.GenerateLDPaths(instance.connectionPointIn.getConnections(), actionBody) |
336 paths = self.GenerateLDPaths(instance.connectionPointIn.getConnections(), actionBody) |
335 variable = self.ExtractModifier(instance, instance.getVariable()) |
337 variable = self.ExtractModifier(instance, instance.getVariable()) |
336 expression = self.ComputeLDExpression(paths, True) |
338 expression = self.ComputeLDExpression(paths, True) |
337 self.SFCNetworks["Actions"][action_name] = self.Program + " %s := %s;\n"%(variable, expression) |
339 action_content = self.Program + " %s := %s;\n"%(variable, expression) |
338 self.Program = "" |
340 self.Program = "" |
|
341 self.SFCNetworks["Actions"][action_name] = ReIndentText(action_content, 4) |
339 |
342 |
340 def GenerateSFCTransition(self, transition, pou): |
343 def GenerateSFCTransition(self, transition, pou): |
341 if transition not in self.SFCNetworks["Transitions"].keys(): |
344 if transition not in self.SFCNetworks["Transitions"].keys(): |
342 steps = [] |
345 steps = [] |
343 connections = transition.connectionPointIn.getConnections() |
346 connections = transition.connectionPointIn.getConnections() |
372 if isinstance(instance, plcopen.outVariable): |
375 if isinstance(instance, plcopen.outVariable): |
373 connections = instance.connectionPointIn.getConnections() |
376 connections = instance.connectionPointIn.getConnections() |
374 if connections and len(connections) == 1: |
377 if connections and len(connections) == 1: |
375 expression = self.ComputeFBDExpression(transitionBody, connections[0]) |
378 expression = self.ComputeFBDExpression(transitionBody, connections[0]) |
376 transition_infos["content"] = "\n := %s;\n"%expression |
379 transition_infos["content"] = "\n := %s;\n"%expression |
|
380 self.ComputedBlocks += self.Program |
|
381 self.Program = "" |
377 elif transitionType == "LD": |
382 elif transitionType == "LD": |
378 for instance in transitionBody.getContentInstances(): |
383 for instance in transitionBody.getContentInstances(): |
379 if isinstance(instance, plcopen.coil): |
384 if isinstance(instance, plcopen.coil): |
380 paths = self.GenerateLDPaths(instance.connectionPointIn.getConnections(), transitionBody) |
385 paths = self.GenerateLDPaths(instance.connectionPointIn.getConnections(), transitionBody) |
381 expression = self.ComputeLDExpression(paths, True) |
386 expression = self.ComputeLDExpression(paths, True) |
382 transition_infos["content"] = "\n := %s;\n"%expression |
387 transition_infos["content"] = "\n := %s;\n"%expression |
|
388 self.ComputedBlocks += self.Program |
|
389 self.Program = "" |
383 elif transitionValues["type"] == "connection": |
390 elif transitionValues["type"] == "connection": |
384 body = pou.getBody() |
391 body = pou.getBody() |
385 connections = transition.getConnections() |
392 connections = transition.getConnections() |
386 network_type = self.GetNetworkType(connections, body) |
393 network_type = self.GetNetworkType(connections, body) |
387 if network_type == None: |
394 if network_type == None: |
388 raise Exception |
395 raise Exception |
389 if len(connections) > 1 or network_type == "LD": |
396 if len(connections) > 1 or network_type == "LD": |
390 paths = self.GenerateLDPaths(connections, body) |
397 paths = self.GenerateLDPaths(connections, body) |
391 expression = self.ComputeLDExpression(paths, True) |
398 expression = self.ComputeLDExpression(paths, True) |
392 transition_infos["content"] = "\n := %s;\n"%expression |
399 transition_infos["content"] = "\n := %s;\n"%expression |
|
400 self.ComputedBlocks += self.Program |
|
401 self.Program = "" |
393 else: |
402 else: |
394 expression = self.ComputeFBDExpression(body, connections[0]) |
403 expression = self.ComputeFBDExpression(body, connections[0]) |
395 transition_infos["content"] = "\n := %s;\n"%expression |
404 transition_infos["content"] = "\n := %s;\n"%expression |
|
405 self.ComputedBlocks += self.Program |
|
406 self.Program = "" |
396 for step in steps: |
407 for step in steps: |
397 self.GenerateSFCStep(step, pou) |
408 self.GenerateSFCStep(step, pou) |
398 step_name = step.getName() |
409 step_name = step.getName() |
399 if step_name in self.SFCNetworks["Steps"].keys(): |
410 if step_name in self.SFCNetworks["Steps"].keys(): |
400 transition_infos["from"].append(step_name) |
411 transition_infos["from"].append(step_name) |