718 for connection in self.ExtractRelatedConnections(instance.connectionPointOut): |
718 for connection in self.ExtractRelatedConnections(instance.connectionPointOut): |
719 self.ConnectionTypes[connection] = var_type |
719 self.ConnectionTypes[connection] = var_type |
720 if isinstance(instance, (OutVariableClass, InOutVariableClass)): |
720 if isinstance(instance, (OutVariableClass, InOutVariableClass)): |
721 self.ConnectionTypes[instance.connectionPointIn] = var_type |
721 self.ConnectionTypes[instance.connectionPointIn] = var_type |
722 connected = self.GetConnectedConnector(instance.connectionPointIn, body) |
722 connected = self.GetConnectedConnector(instance.connectionPointIn, body) |
723 if connected and not self.ConnectionTypes.has_key(connected): |
723 if connected is not None and not self.ConnectionTypes.has_key(connected): |
724 for connection in self.ExtractRelatedConnections(connected): |
724 for related in self.ExtractRelatedConnections(connected): |
725 self.ConnectionTypes[connection] = var_type |
725 self.ConnectionTypes[related] = var_type |
726 elif isinstance(instance, (ContactClass, CoilClass)): |
726 elif isinstance(instance, (ContactClass, CoilClass)): |
727 for connection in self.ExtractRelatedConnections(instance.connectionPointOut): |
727 for connection in self.ExtractRelatedConnections(instance.connectionPointOut): |
728 self.ConnectionTypes[connection] = "BOOL" |
728 self.ConnectionTypes[connection] = "BOOL" |
729 self.ConnectionTypes[instance.connectionPointIn] = "BOOL" |
729 self.ConnectionTypes[instance.connectionPointIn] = "BOOL" |
730 connected = self.GetConnectedConnector(instance.connectionPointIn, body) |
730 for link in instance.connectionPointIn.getconnections(): |
731 if connected and not self.ConnectionTypes.has_key(connected): |
731 connected = self.GetLinkedConnector(link, body) |
732 for connection in self.ExtractRelatedConnections(connected): |
732 if connected is not None and not self.ConnectionTypes.has_key(connected): |
733 self.ConnectionTypes[connection] = "BOOL" |
733 for related in self.ExtractRelatedConnections(connected): |
|
734 self.ConnectionTypes[related] = "BOOL" |
734 elif isinstance(instance, LeftPowerRailClass): |
735 elif isinstance(instance, LeftPowerRailClass): |
735 for connection in instance.getconnectionPointOut(): |
736 for connection in instance.getconnectionPointOut(): |
736 for related in self.ExtractRelatedConnections(connection): |
737 for related in self.ExtractRelatedConnections(connection): |
737 self.ConnectionTypes[related] = "BOOL" |
738 self.ConnectionTypes[related] = "BOOL" |
738 elif isinstance(instance, RightPowerRailClass): |
739 elif isinstance(instance, RightPowerRailClass): |
739 for connection in instance.getconnectionPointIn(): |
740 for connection in instance.getconnectionPointIn(): |
740 self.ConnectionTypes[connection] = "BOOL" |
741 self.ConnectionTypes[connection] = "BOOL" |
741 connected = self.GetConnectedConnector(connection, body) |
742 for link in connection.getconnections(): |
742 if connected and not self.ConnectionTypes.has_key(connected): |
743 connected = self.GetLinkedConnector(link, body) |
743 for connection in self.ExtractRelatedConnections(connected): |
744 if connected is not None and not self.ConnectionTypes.has_key(connected): |
744 self.ConnectionTypes[connection] = "BOOL" |
745 for related in self.ExtractRelatedConnections(connected): |
|
746 self.ConnectionTypes[related] = "BOOL" |
745 elif isinstance(instance, TransitionClass): |
747 elif isinstance(instance, TransitionClass): |
746 content = instance.getconditionContent() |
748 content = instance.getconditionContent() |
747 if content["type"] == "connection": |
749 if content["type"] == "connection": |
748 connected = self.GetLinkedConnector(content["value"], body) |
750 self.ConnectionTypes[content["value"]] = "BOOL" |
749 if connected and not self.ConnectionTypes.has_key(connected): |
751 for link in content["value"].getconnections(): |
750 for connection in self.ExtractRelatedConnections(connected): |
752 connected = self.GetLinkedConnector(link, body) |
751 self.ConnectionTypes[connection] = "BOOL" |
753 if connected is not None and not self.ConnectionTypes.has_key(connected): |
|
754 for related in self.ExtractRelatedConnections(connected): |
|
755 self.ConnectionTypes[related] = "BOOL" |
752 elif isinstance(instance, ContinuationClass): |
756 elif isinstance(instance, ContinuationClass): |
753 name = instance.getname() |
757 name = instance.getname() |
754 connector = None |
758 connector = None |
755 var_type = "ANY" |
759 var_type = "ANY" |
756 for element in body.getcontentInstances(): |
760 for element in body.getcontentInstances(): |
759 raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name) |
763 raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name) |
760 connector = element |
764 connector = element |
761 if connector is not None: |
765 if connector is not None: |
762 undefined = [instance.connectionPointOut, connector.connectionPointIn] |
766 undefined = [instance.connectionPointOut, connector.connectionPointIn] |
763 connected = self.GetConnectedConnector(connector.connectionPointIn, body) |
767 connected = self.GetConnectedConnector(connector.connectionPointIn, body) |
764 if connected: |
768 if connected is not None: |
765 undefined.append(connected) |
769 undefined.append(connected) |
766 related = [] |
770 related = [] |
767 for connection in undefined: |
771 for connection in undefined: |
768 if self.ConnectionTypes.has_key(connection): |
772 if self.ConnectionTypes.has_key(connection): |
769 var_type = self.ConnectionTypes[connection] |
773 var_type = self.ConnectionTypes[connection] |
836 connected = self.GetConnectedConnector(variable.connectionPointIn, body) |
840 connected = self.GetConnectedConnector(variable.connectionPointIn, body) |
837 if itype.startswith("ANY"): |
841 if itype.startswith("ANY"): |
838 if not undefined.has_key(itype): |
842 if not undefined.has_key(itype): |
839 undefined[itype] = [] |
843 undefined[itype] = [] |
840 undefined[itype].append(variable.connectionPointIn) |
844 undefined[itype].append(variable.connectionPointIn) |
841 if connected: |
845 if connected is not None: |
842 undefined[itype].append(connected) |
846 undefined[itype].append(connected) |
843 else: |
847 else: |
844 self.ConnectionTypes[variable.connectionPointIn] = itype |
848 self.ConnectionTypes[variable.connectionPointIn] = itype |
845 if connected and not self.ConnectionTypes.has_key(connected): |
849 if connected is not None and not self.ConnectionTypes.has_key(connected): |
846 for connection in self.ExtractRelatedConnections(connected): |
850 for connection in self.ExtractRelatedConnections(connected): |
847 self.ConnectionTypes[connection] = itype |
851 self.ConnectionTypes[connection] = itype |
848 for var_type, connections in undefined.items(): |
852 for var_type, connections in undefined.items(): |
849 related = [] |
853 related = [] |
850 for connection in connections: |
854 for connection in connections: |
877 self.GenerateSFCStep(instance, pou) |
881 self.GenerateSFCStep(instance, pou) |
878 elif isinstance(instance, ActionBlockClass): |
882 elif isinstance(instance, ActionBlockClass): |
879 self.GenerateSFCStepActions(instance, pou) |
883 self.GenerateSFCStepActions(instance, pou) |
880 elif isinstance(instance, TransitionClass): |
884 elif isinstance(instance, TransitionClass): |
881 self.GenerateSFCTransition(instance, pou) |
885 self.GenerateSFCTransition(instance, pou) |
882 elif isinstance(instance, JumpClass): |
886 elif isinstance(instance, JumpStepClass): |
883 self.GenerateSFCJump(instance, pou) |
887 self.GenerateSFCJump(instance, pou) |
884 if len(self.InitialSteps) > 0 and len(self.SFCComputedBlocks) > 0: |
888 if len(self.InitialSteps) > 0 and len(self.SFCComputedBlocks) > 0: |
885 action_name = "COMPUTE_FUNCTION_BLOCKS" |
889 action_name = "COMPUTE_FUNCTION_BLOCKS" |
886 action_infos = {"qualifier" : "S", "content" : action_name} |
890 action_infos = {"qualifier" : "S", "content" : action_name} |
887 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos) |
891 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos) |
1106 self.Program += [(");\n", ())] |
1110 self.Program += [(");\n", ())] |
1107 return [("%s.Q"%name, var_info)] |
1111 return [("%s.Q"%name, var_info)] |
1108 |
1112 |
1109 def ExtractDivergenceInput(self, divergence, pou): |
1113 def ExtractDivergenceInput(self, divergence, pou): |
1110 connectionPointIn = divergence.getconnectionPointIn() |
1114 connectionPointIn = divergence.getconnectionPointIn() |
1111 if connectionPointIn: |
1115 if connectionPointIn is not None: |
1112 connections = connectionPointIn.getconnections() |
1116 connections = connectionPointIn.getconnections() |
1113 if connections is not None and len(connections) == 1: |
1117 if connections is not None and len(connections) == 1: |
1114 instanceLocalId = connections[0].getrefLocalId() |
1118 instanceLocalId = connections[0].getrefLocalId() |
1115 body = pou.getbody() |
1119 body = pou.getbody() |
1116 if isinstance(body, ListType): |
1120 if isinstance(body, ListType): |
1153 instances.append(instance) |
1157 instances.append(instance) |
1154 elif isinstance(instance, SelectionConvergenceClass): |
1158 elif isinstance(instance, SelectionConvergenceClass): |
1155 instances.extend(self.ExtractConvergenceInputs(instance, pou)) |
1159 instances.extend(self.ExtractConvergenceInputs(instance, pou)) |
1156 elif isinstance(instance, SimultaneousDivergenceClass): |
1160 elif isinstance(instance, SimultaneousDivergenceClass): |
1157 transition = self.ExtractDivergenceInput(instance, pou) |
1161 transition = self.ExtractDivergenceInput(instance, pou) |
1158 if transition: |
1162 if transition is not None: |
1159 if isinstance(transition, TransitionClass): |
1163 if isinstance(transition, TransitionClass): |
1160 instances.append(transition) |
1164 instances.append(transition) |
1161 elif isinstance(transition, SelectionConvergenceClass): |
1165 elif isinstance(transition, SelectionConvergenceClass): |
1162 instances.extend(self.ExtractConvergenceInputs(transition, pou)) |
1166 instances.extend(self.ExtractConvergenceInputs(transition, pou)) |
1163 for instance in instances: |
1167 for instance in instances: |
1166 target_info = (self.TagName, "transition", instance.getlocalId(), "to", step_infos["id"]) |
1170 target_info = (self.TagName, "transition", instance.getlocalId(), "to", step_infos["id"]) |
1167 self.SFCNetworks["Transitions"][instance]["to"].append([(step_name, target_info)]) |
1171 self.SFCNetworks["Transitions"][instance]["to"].append([(step_name, target_info)]) |
1168 |
1172 |
1169 def GenerateSFCJump(self, jump, pou): |
1173 def GenerateSFCJump(self, jump, pou): |
1170 jump_target = jump.gettargetName() |
1174 jump_target = jump.gettargetName() |
1171 if jump.connectionPointIn: |
1175 if jump.connectionPointIn is not None: |
1172 instances = [] |
1176 instances = [] |
1173 connections = jump.connectionPointIn.getconnections() |
1177 connections = jump.connectionPointIn.getconnections() |
1174 if connections is not None and len(connections) == 1: |
1178 if connections is not None and len(connections) == 1: |
1175 instanceLocalId = connections[0].getrefLocalId() |
1179 instanceLocalId = connections[0].getrefLocalId() |
1176 body = pou.getbody() |
1180 body = pou.getbody() |
1181 instances.append(instance) |
1185 instances.append(instance) |
1182 elif isinstance(instance, SelectionConvergenceClass): |
1186 elif isinstance(instance, SelectionConvergenceClass): |
1183 instances.extend(self.ExtractConvergenceInputs(instance, pou)) |
1187 instances.extend(self.ExtractConvergenceInputs(instance, pou)) |
1184 elif isinstance(instance, SimultaneousDivergenceClass): |
1188 elif isinstance(instance, SimultaneousDivergenceClass): |
1185 transition = self.ExtractDivergenceInput(instance, pou) |
1189 transition = self.ExtractDivergenceInput(instance, pou) |
1186 if transition: |
1190 if transition is not None: |
1187 if isinstance(transition, TransitionClass): |
1191 if isinstance(transition, TransitionClass): |
1188 instances.append(transition) |
1192 instances.append(transition) |
1189 elif isinstance(transition, SelectionConvergenceClass): |
1193 elif isinstance(transition, SelectionConvergenceClass): |
1190 instances.extend(self.ExtractConvergenceInputs(transition, pou)) |
1194 instances.extend(self.ExtractConvergenceInputs(transition, pou)) |
1191 for instance in instances: |
1195 for instance in instances: |
1226 self.SFCNetworks["Steps"][step_name]["actions"].append(action_infos) |
1230 self.SFCNetworks["Steps"][step_name]["actions"].append(action_infos) |
1227 |
1231 |
1228 def GenerateSFCAction(self, action_name, pou): |
1232 def GenerateSFCAction(self, action_name, pou): |
1229 if action_name not in self.SFCNetworks["Actions"].keys(): |
1233 if action_name not in self.SFCNetworks["Actions"].keys(): |
1230 actionContent = pou.getaction(action_name) |
1234 actionContent = pou.getaction(action_name) |
1231 if actionContent: |
1235 if actionContent is not None: |
1232 previous_tagname = self.TagName |
1236 previous_tagname = self.TagName |
1233 self.TagName = self.ParentGenerator.Controler.ComputePouActionName(self.Name, action_name) |
1237 self.TagName = self.ParentGenerator.Controler.ComputePouActionName(self.Name, action_name) |
1234 self.ComputeProgram(actionContent) |
1238 self.ComputeProgram(actionContent) |
1235 self.SFCNetworks["Actions"][action_name] = (self.Program, (self.TagName, "name")) |
1239 self.SFCNetworks["Actions"][action_name] = (self.Program, (self.TagName, "name")) |
1236 self.Program = [] |
1240 self.Program = [] |
1248 instance = body.getcontentInstance(instanceLocalId) |
1252 instance = body.getcontentInstance(instanceLocalId) |
1249 if isinstance(instance, StepClass): |
1253 if isinstance(instance, StepClass): |
1250 steps.append(instance) |
1254 steps.append(instance) |
1251 elif isinstance(instance, SelectionDivergenceClass): |
1255 elif isinstance(instance, SelectionDivergenceClass): |
1252 step = self.ExtractDivergenceInput(instance, pou) |
1256 step = self.ExtractDivergenceInput(instance, pou) |
1253 if step: |
1257 if step is not None: |
1254 if isinstance(step, StepClass): |
1258 if isinstance(step, StepClass): |
1255 steps.append(step) |
1259 steps.append(step) |
1256 elif isinstance(step, SimultaneousConvergenceClass): |
1260 elif isinstance(step, SimultaneousConvergenceClass): |
1257 steps.extend(self.ExtractConvergenceInputs(step, pou)) |
1261 steps.extend(self.ExtractConvergenceInputs(step, pou)) |
1258 elif isinstance(instance, SimultaneousConvergenceClass): |
1262 elif isinstance(instance, SimultaneousConvergenceClass): |
1259 steps.extend(self.ExtractConvergenceInputs(instance, pou)) |
1263 steps.extend(self.ExtractConvergenceInputs(instance, pou)) |
1260 transition_infos = {"id" : transition.getlocalId(), |
1264 transition_infos = {"id" : transition.getlocalId(), |
1261 "priority": transition.getpriority(), |
1265 "priority": transition.getpriority(), |
1262 "from": [], |
1266 "from": [], |
1263 "to" : []} |
1267 "to" : [], |
|
1268 "content": []} |
1264 self.SFCNetworks["Transitions"][transition] = transition_infos |
1269 self.SFCNetworks["Transitions"][transition] = transition_infos |
1265 transitionValues = transition.getconditionContent() |
1270 transitionValues = transition.getconditionContent() |
1266 if transitionValues["type"] == "inline": |
1271 if transitionValues["type"] == "inline": |
1267 transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ()), |
1272 transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ()), |
1268 (transitionValues["value"], (self.TagName, "transition", transition.getlocalId(), "inline")), |
1273 (transitionValues["value"], (self.TagName, "transition", transition.getlocalId(), "inline")), |
1295 self.TagName = previous_tagname |
1300 self.TagName = previous_tagname |
1296 elif transitionValues["type"] == "connection": |
1301 elif transitionValues["type"] == "connection": |
1297 body = pou.getbody() |
1302 body = pou.getbody() |
1298 if isinstance(body, ListType): |
1303 if isinstance(body, ListType): |
1299 body = body[0] |
1304 body = body[0] |
1300 connections = transition.getconnections() |
1305 connections = transitionValues["value"].getconnections() |
1301 if connections is not None: |
1306 if connections is not None: |
1302 expression = self.ComputeExpression(body, connections) |
1307 expression = self.ComputeExpression(body, connections) |
1303 if expression is not None: |
1308 if expression is not None: |
1304 transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ())] + expression + [(";\n", ())] |
1309 transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ())] + expression + [(";\n", ())] |
1305 self.SFCComputedBlocks += self.Program |
1310 self.SFCComputedBlocks += self.Program |
1349 def ComputeSFCAction(self, action_name): |
1354 def ComputeSFCAction(self, action_name): |
1350 if action_name in self.SFCNetworks["Actions"].keys(): |
1355 if action_name in self.SFCNetworks["Actions"].keys(): |
1351 action_content, action_info = self.SFCNetworks["Actions"].pop(action_name) |
1356 action_content, action_info = self.SFCNetworks["Actions"].pop(action_name) |
1352 self.Program += [("%sACTION "%self.CurrentIndent, ()), |
1357 self.Program += [("%sACTION "%self.CurrentIndent, ()), |
1353 (action_name, action_info), |
1358 (action_name, action_info), |
1354 (" :\n", ())] |
1359 (":\n", ())] |
1355 self.Program += action_content |
1360 self.Program += action_content |
1356 self.Program += [("%sEND_ACTION\n\n"%self.CurrentIndent, ())] |
1361 self.Program += [("%sEND_ACTION\n\n"%self.CurrentIndent, ())] |
1357 |
1362 |
1358 def ComputeSFCTransition(self, transition): |
1363 def ComputeSFCTransition(self, transition): |
1359 if transition in self.SFCNetworks["Transitions"].keys(): |
1364 if transition in self.SFCNetworks["Transitions"].keys(): |