124 tagname = self.Controler.ComputeDataTypeName(datatype.getname()) |
124 tagname = self.Controler.ComputeDataTypeName(datatype.getname()) |
125 datatype_def = [(" ", ()), |
125 datatype_def = [(" ", ()), |
126 (datatype.getname(), (tagname, "name")), |
126 (datatype.getname(), (tagname, "name")), |
127 (" : ", ())] |
127 (" : ", ())] |
128 basetype_content = datatype.baseType.getcontent() |
128 basetype_content = datatype.baseType.getcontent() |
129 # Data type derived directly from a string type |
129 basetype_content_type = basetype_content.getLocalTag() |
130 if basetype_content["name"] in ["string", "wstring"]: |
|
131 datatype_def += [(basetype_content["name"].upper(), (tagname, "base"))] |
|
132 # Data type derived directly from a user defined type |
130 # Data type derived directly from a user defined type |
133 elif basetype_content["name"] == "derived": |
131 if basetype_content_type == "derived": |
134 basetype_name = basetype_content["value"].getname() |
132 basetype_name = basetype_content.getname() |
135 self.GenerateDataType(basetype_name) |
133 self.GenerateDataType(basetype_name) |
136 datatype_def += [(basetype_name, (tagname, "base"))] |
134 datatype_def += [(basetype_name, (tagname, "base"))] |
137 # Data type is a subrange |
135 # Data type is a subrange |
138 elif basetype_content["name"] in ["subrangeSigned", "subrangeUnsigned"]: |
136 elif basetype_content_type in ["subrangeSigned", "subrangeUnsigned"]: |
139 base_type = basetype_content["value"].baseType.getcontent() |
137 base_type = basetype_content.baseType.getcontent() |
|
138 base_type_type = base_type.getLocalTag() |
140 # Subrange derived directly from a user defined type |
139 # Subrange derived directly from a user defined type |
141 if base_type["name"] == "derived": |
140 if base_type_type == "derived": |
142 basetype_name = base_type["value"].getname() |
141 basetype_name = base_type_type.getname() |
143 self.GenerateDataType(basetype_name) |
142 self.GenerateDataType(basetype_name) |
144 # Subrange derived directly from an elementary type |
143 # Subrange derived directly from an elementary type |
145 else: |
144 else: |
146 basetype_name = base_type["name"] |
145 basetype_name = base_type_type |
147 min_value = basetype_content["value"].range.getlower() |
146 min_value = basetype_content.range.getlower() |
148 max_value = basetype_content["value"].range.getupper() |
147 max_value = basetype_content.range.getupper() |
149 datatype_def += [(basetype_name, (tagname, "base")), |
148 datatype_def += [(basetype_name, (tagname, "base")), |
150 (" (", ()), |
149 (" (", ()), |
151 ("%s"%min_value, (tagname, "lower")), |
150 ("%s"%min_value, (tagname, "lower")), |
152 ("..", ()), |
151 ("..", ()), |
153 ("%s"%max_value, (tagname, "upper")), |
152 ("%s"%max_value, (tagname, "upper")), |
154 (")",())] |
153 (")",())] |
155 # Data type is an enumerated type |
154 # Data type is an enumerated type |
156 elif basetype_content["name"] == "enum": |
155 elif basetype_content_type == "enum": |
157 values = [[(value.getname(), (tagname, "value", i))] |
156 values = [[(value.getname(), (tagname, "value", i))] |
158 for i, value in enumerate(basetype_content["value"].values.getvalue())] |
157 for i, value in enumerate( |
|
158 basetype_content.xpath("ppx:values/ppx:value", |
|
159 namespaces=PLCOpenParser.NSMAP))] |
159 datatype_def += [("(", ())] |
160 datatype_def += [("(", ())] |
160 datatype_def += JoinList([(", ", ())], values) |
161 datatype_def += JoinList([(", ", ())], values) |
161 datatype_def += [(")", ())] |
162 datatype_def += [(")", ())] |
162 # Data type is an array |
163 # Data type is an array |
163 elif basetype_content["name"] == "array": |
164 elif basetype_content_type == "array": |
164 base_type = basetype_content["value"].baseType.getcontent() |
165 base_type = basetype_content.baseType.getcontent() |
|
166 base_type_type = base_type.getLocalTag() |
165 # Array derived directly from a user defined type |
167 # Array derived directly from a user defined type |
166 if base_type["name"] == "derived": |
168 if base_type_type == "derived": |
167 basetype_name = base_type["value"].getname() |
169 basetype_name = base_type.getname() |
168 self.GenerateDataType(basetype_name) |
170 self.GenerateDataType(basetype_name) |
169 # Array derived directly from a string type |
|
170 elif base_type["name"] in ["string", "wstring"]: |
|
171 basetype_name = base_type["name"].upper() |
|
172 # Array derived directly from an elementary type |
171 # Array derived directly from an elementary type |
173 else: |
172 else: |
174 basetype_name = base_type["name"] |
173 basetype_name = base_type_type.upper() |
175 dimensions = [[("%s"%dimension.getlower(), (tagname, "range", i, "lower")), |
174 dimensions = [[("%s"%dimension.getlower(), (tagname, "range", i, "lower")), |
176 ("..", ()), |
175 ("..", ()), |
177 ("%s"%dimension.getupper(), (tagname, "range", i, "upper"))] |
176 ("%s"%dimension.getupper(), (tagname, "range", i, "upper"))] |
178 for i, dimension in enumerate(basetype_content["value"].getdimension())] |
177 for i, dimension in enumerate(basetype_content.getdimension())] |
179 datatype_def += [("ARRAY [", ())] |
178 datatype_def += [("ARRAY [", ())] |
180 datatype_def += JoinList([(",", ())], dimensions) |
179 datatype_def += JoinList([(",", ())], dimensions) |
181 datatype_def += [("] OF " , ()), |
180 datatype_def += [("] OF " , ()), |
182 (basetype_name, (tagname, "base"))] |
181 (basetype_name, (tagname, "base"))] |
183 # Data type is a structure |
182 # Data type is a structure |
184 elif basetype_content["name"] == "struct": |
183 elif basetype_content_type == "struct": |
185 elements = [] |
184 elements = [] |
186 for i, element in enumerate(basetype_content["value"].getvariable()): |
185 for i, element in enumerate(basetype_content.getvariable()): |
187 element_type = element.type.getcontent() |
186 element_type = element.type.getcontent() |
|
187 element_type_type = element_type.getLocalTag() |
188 # Structure element derived directly from a user defined type |
188 # Structure element derived directly from a user defined type |
189 if element_type["name"] == "derived": |
189 if element_type_type == "derived": |
190 elementtype_name = element_type["value"].getname() |
190 elementtype_name = element_type.getname() |
191 self.GenerateDataType(elementtype_name) |
191 self.GenerateDataType(elementtype_name) |
192 elif element_type["name"] == "array": |
192 elif element_type_type == "array": |
193 base_type = element_type["value"].baseType.getcontent() |
193 base_type = element_type.baseType.getcontent() |
|
194 base_type_type = base_type.getLocalTag() |
194 # Array derived directly from a user defined type |
195 # Array derived directly from a user defined type |
195 if base_type["name"] == "derived": |
196 if base_type_type == "derived": |
196 basetype_name = base_type["value"].getname() |
197 basetype_name = base_type.getname() |
197 self.GenerateDataType(basetype_name) |
198 self.GenerateDataType(basetype_name) |
198 # Array derived directly from a string type |
|
199 elif base_type["name"] in ["string", "wstring"]: |
|
200 basetype_name = base_type["name"].upper() |
|
201 # Array derived directly from an elementary type |
199 # Array derived directly from an elementary type |
202 else: |
200 else: |
203 basetype_name = base_type["name"] |
201 basetype_name = base_type_type.upper() |
204 dimensions = ["%s..%s" % (dimension.getlower(), dimension.getupper()) |
202 dimensions = ["%s..%s" % (dimension.getlower(), dimension.getupper()) |
205 for dimension in element_type["value"].getdimension()] |
203 for dimension in element_type.getdimension()] |
206 elementtype_name = "ARRAY [%s] OF %s" % (",".join(dimensions), basetype_name) |
204 elementtype_name = "ARRAY [%s] OF %s" % (",".join(dimensions), basetype_name) |
207 # Structure element derived directly from a string type |
|
208 elif element_type["name"] in ["string", "wstring"]: |
|
209 elementtype_name = element_type["name"].upper() |
|
210 # Structure element derived directly from an elementary type |
205 # Structure element derived directly from an elementary type |
211 else: |
206 else: |
212 elementtype_name = element_type["name"] |
207 elementtype_name = element_type_type.upper() |
213 element_text = [("\n ", ()), |
208 element_text = [("\n ", ()), |
214 (element.getname(), (tagname, "struct", i, "name")), |
209 (element.getname(), (tagname, "struct", i, "name")), |
215 (" : ", ()), |
210 (" : ", ()), |
216 (elementtype_name, (tagname, "struct", i, "type"))] |
211 (elementtype_name, (tagname, "struct", i, "type"))] |
217 if element.initialValue is not None: |
212 if element.initialValue is not None: |
456 |
451 |
457 #------------------------------------------------------------------------------- |
452 #------------------------------------------------------------------------------- |
458 # Generator of POU programs |
453 # Generator of POU programs |
459 #------------------------------------------------------------------------------- |
454 #------------------------------------------------------------------------------- |
460 |
455 |
|
456 [ConnectorClass, ContinuationClass, ActionBlockClass] = [ |
|
457 PLCOpenParser.GetElementClass(instance_name, "commonObjects") |
|
458 for instance_name in ["connector", "continuation", "actionBlock"]] |
|
459 [InVariableClass, InOutVariableClass, OutVariableClass, BlockClass] = [ |
|
460 PLCOpenParser.GetElementClass(instance_name, "fbdObjects") |
|
461 for instance_name in ["inVariable", "inOutVariable", "outVariable", "block"]] |
|
462 [ContactClass, CoilClass, LeftPowerRailClass, RightPowerRailClass] = [ |
|
463 PLCOpenParser.GetElementClass(instance_name, "ldObjects") |
|
464 for instance_name in ["contact", "coil", "leftPowerRail", "rightPowerRail"]] |
|
465 [StepClass, TransitionClass, JumpStepClass, |
|
466 SelectionConvergenceClass, SelectionDivergenceClass, |
|
467 SimultaneousConvergenceClass, SimultaneousDivergenceClass] = [ |
|
468 PLCOpenParser.GetElementClass(instance_name, "sfcObjects") |
|
469 for instance_name in ["step", "transition", "jumpStep", |
|
470 "selectionConvergence", "selectionDivergence", |
|
471 "simultaneousConvergence", "simultaneousDivergence"]] |
|
472 TransitionObjClass = PLCOpenParser.GetElementClass("transition", "transitions") |
|
473 ActionObjClass = PLCOpenParser.GetElementClass("action", "actions") |
461 |
474 |
462 class PouProgramGenerator: |
475 class PouProgramGenerator: |
463 |
476 |
464 # Create a new POU program generator |
477 # Create a new POU program generator |
465 def __init__(self, parent, name, type, errors, warnings): |
478 def __init__(self, parent, name, type, errors, warnings): |
589 if interface is not None: |
603 if interface is not None: |
590 body = pou.getbody() |
604 body = pou.getbody() |
591 if isinstance(body, ListType): |
605 if isinstance(body, ListType): |
592 body = body[0] |
606 body = body[0] |
593 body_content = body.getcontent() |
607 body_content = body.getcontent() |
|
608 body_type = body_content.getLocalTag() |
594 if self.Type == "FUNCTION": |
609 if self.Type == "FUNCTION": |
595 returntype_content = interface.getreturnType().getcontent() |
610 returntype_content = interface.getreturnType().getcontent() |
596 if returntype_content["name"] == "derived": |
611 returntype_content_type = returntype_content.getLocalTag() |
597 self.ReturnType = returntype_content["value"].getname() |
612 if returntype_content_type == "derived": |
598 elif returntype_content["name"] in ["string", "wstring"]: |
613 self.ReturnType = returntype_content.getname() |
599 self.ReturnType = returntype_content["name"].upper() |
614 else: |
600 else: |
615 self.ReturnType = returntype_content_type.upper() |
601 self.ReturnType = returntype_content["name"] |
|
602 for varlist in interface.getcontent(): |
616 for varlist in interface.getcontent(): |
603 variables = [] |
617 variables = [] |
604 located = [] |
618 located = [] |
605 for var in varlist["value"].getvariable(): |
619 varlist_type = varlist.getLocalTag() |
|
620 for var in varlist.getvariable(): |
606 vartype_content = var.gettype().getcontent() |
621 vartype_content = var.gettype().getcontent() |
607 if vartype_content["name"] == "derived": |
622 if vartype_content.getLocalTag() == "derived": |
608 var_type = vartype_content["value"].getname() |
623 var_type = vartype_content.getname() |
609 blocktype = self.GetBlockType(var_type) |
624 blocktype = self.GetBlockType(var_type) |
610 if blocktype is not None: |
625 if blocktype is not None: |
611 self.ParentGenerator.GeneratePouProgram(var_type) |
626 self.ParentGenerator.GeneratePouProgram(var_type) |
612 if body_content["name"] in ["FBD", "LD", "SFC"]: |
627 if body_type in ["FBD", "LD", "SFC"]: |
613 block = pou.getinstanceByName(var.getname()) |
628 block = pou.getinstanceByName(var.getname()) |
614 else: |
629 else: |
615 block = None |
630 block = None |
616 for variable in blocktype["initialise"](var_type, var.getname(), block): |
631 for variable in blocktype["initialise"](var_type, var.getname(), block): |
617 if variable[2] is not None: |
632 if variable[2] is not None: |
667 def ComputeConnectionTypes(self, pou): |
682 def ComputeConnectionTypes(self, pou): |
668 body = pou.getbody() |
683 body = pou.getbody() |
669 if isinstance(body, ListType): |
684 if isinstance(body, ListType): |
670 body = body[0] |
685 body = body[0] |
671 body_content = body.getcontent() |
686 body_content = body.getcontent() |
672 body_type = body_content["name"] |
687 body_type = body_content.getLocalTag() |
673 if body_type in ["FBD", "LD", "SFC"]: |
688 if body_type in ["FBD", "LD", "SFC"]: |
674 undefined_blocks = [] |
689 undefined_blocks = [] |
675 for instance in body.getcontentInstances(): |
690 for instance in body.getcontentInstances(): |
676 if isinstance(instance, (plcopen.fbdObjects_inVariable, plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)): |
691 if isinstance(instance, (InVariableClass, OutVariableClass, |
677 expression = instance.getexpression() |
692 InOutVariableClass)): |
|
693 expression = instance.getexpression().text |
678 var_type = self.GetVariableType(expression) |
694 var_type = self.GetVariableType(expression) |
679 if isinstance(pou, plcopen.transitions_transition) and expression == pou.getname(): |
695 if (isinstance(pou, TransitionObjClass) |
|
696 and expression == pou.getname()): |
680 var_type = "BOOL" |
697 var_type = "BOOL" |
681 elif (not isinstance(pou, (plcopen.transitions_transition, plcopen.actions_action)) and |
698 elif (not isinstance(pou, (TransitionObjClass, ActionObjClass)) and |
682 pou.getpouType() == "function" and expression == pou.getname()): |
699 pou.getpouType() == "function" and expression == pou.getname()): |
683 returntype_content = pou.interface.getreturnType().getcontent() |
700 returntype_content = pou.interface.getreturnType().getcontent() |
684 if returntype_content["name"] == "derived": |
701 returntype_content_type = returntype_content.getLocalTag() |
685 var_type = returntype_content["value"].getname() |
702 if returntype_content_type == "derived": |
686 elif returntype_content["name"] in ["string", "wstring"]: |
703 var_type = returntype_content.getname() |
687 var_type = returntype_content["name"].upper() |
|
688 else: |
704 else: |
689 var_type = returntype_content["name"] |
705 var_type = returntype_content_type.upper() |
690 elif var_type is None: |
706 elif var_type is None: |
691 parts = expression.split("#") |
707 parts = expression.split("#") |
692 if len(parts) > 1: |
708 if len(parts) > 1: |
693 literal_prefix = parts[0].upper() |
709 literal_prefix = parts[0].upper() |
694 var_type = self.LITERAL_TYPES.get(literal_prefix, |
710 var_type = self.LITERAL_TYPES.get(literal_prefix, |
696 elif expression.startswith("'"): |
712 elif expression.startswith("'"): |
697 var_type = "STRING" |
713 var_type = "STRING" |
698 elif expression.startswith('"'): |
714 elif expression.startswith('"'): |
699 var_type = "WSTRING" |
715 var_type = "WSTRING" |
700 if var_type is not None: |
716 if var_type is not None: |
701 if isinstance(instance, (plcopen.fbdObjects_inVariable, plcopen.fbdObjects_inOutVariable)): |
717 if isinstance(instance, (InVariableClass, InOutVariableClass)): |
702 for connection in self.ExtractRelatedConnections(instance.connectionPointOut): |
718 for connection in self.ExtractRelatedConnections(instance.connectionPointOut): |
703 self.ConnectionTypes[connection] = var_type |
719 self.ConnectionTypes[connection] = var_type |
704 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)): |
720 if isinstance(instance, (OutVariableClass, InOutVariableClass)): |
705 self.ConnectionTypes[instance.connectionPointIn] = var_type |
721 self.ConnectionTypes[instance.connectionPointIn] = var_type |
706 connected = self.GetConnectedConnector(instance.connectionPointIn, body) |
722 connected = self.GetConnectedConnector(instance.connectionPointIn, body) |
707 if connected and not self.ConnectionTypes.has_key(connected): |
723 if connected and not self.ConnectionTypes.has_key(connected): |
708 for connection in self.ExtractRelatedConnections(connected): |
724 for connection in self.ExtractRelatedConnections(connected): |
709 self.ConnectionTypes[connection] = var_type |
725 self.ConnectionTypes[connection] = var_type |
710 elif isinstance(instance, (plcopen.ldObjects_contact, plcopen.ldObjects_coil)): |
726 elif isinstance(instance, (ContactClass, CoilClass)): |
711 for connection in self.ExtractRelatedConnections(instance.connectionPointOut): |
727 for connection in self.ExtractRelatedConnections(instance.connectionPointOut): |
712 self.ConnectionTypes[connection] = "BOOL" |
728 self.ConnectionTypes[connection] = "BOOL" |
713 self.ConnectionTypes[instance.connectionPointIn] = "BOOL" |
729 self.ConnectionTypes[instance.connectionPointIn] = "BOOL" |
714 connected = self.GetConnectedConnector(instance.connectionPointIn, body) |
730 connected = self.GetConnectedConnector(instance.connectionPointIn, body) |
715 if connected and not self.ConnectionTypes.has_key(connected): |
731 if connected and not self.ConnectionTypes.has_key(connected): |
716 for connection in self.ExtractRelatedConnections(connected): |
732 for connection in self.ExtractRelatedConnections(connected): |
717 self.ConnectionTypes[connection] = "BOOL" |
733 self.ConnectionTypes[connection] = "BOOL" |
718 elif isinstance(instance, plcopen.ldObjects_leftPowerRail): |
734 elif isinstance(instance, LeftPowerRailClass): |
719 for connection in instance.getconnectionPointOut(): |
735 for connection in instance.getconnectionPointOut(): |
720 for related in self.ExtractRelatedConnections(connection): |
736 for related in self.ExtractRelatedConnections(connection): |
721 self.ConnectionTypes[related] = "BOOL" |
737 self.ConnectionTypes[related] = "BOOL" |
722 elif isinstance(instance, plcopen.ldObjects_rightPowerRail): |
738 elif isinstance(instance, RightPowerRailClass): |
723 for connection in instance.getconnectionPointIn(): |
739 for connection in instance.getconnectionPointIn(): |
724 self.ConnectionTypes[connection] = "BOOL" |
740 self.ConnectionTypes[connection] = "BOOL" |
725 connected = self.GetConnectedConnector(connection, body) |
741 connected = self.GetConnectedConnector(connection, body) |
726 if connected and not self.ConnectionTypes.has_key(connected): |
742 if connected and not self.ConnectionTypes.has_key(connected): |
727 for connection in self.ExtractRelatedConnections(connected): |
743 for connection in self.ExtractRelatedConnections(connected): |
728 self.ConnectionTypes[connection] = "BOOL" |
744 self.ConnectionTypes[connection] = "BOOL" |
729 elif isinstance(instance, plcopen.sfcObjects_transition): |
745 elif isinstance(instance, TransitionClass): |
730 content = instance.condition.getcontent() |
746 content = instance.getconditionContent() |
731 if content["name"] == "connection" and len(content["value"]) == 1: |
747 if content["type"] == "connection": |
732 connected = self.GetLinkedConnector(content["value"][0], body) |
748 connected = self.GetLinkedConnector(content["value"], body) |
733 if connected and not self.ConnectionTypes.has_key(connected): |
749 if connected and not self.ConnectionTypes.has_key(connected): |
734 for connection in self.ExtractRelatedConnections(connected): |
750 for connection in self.ExtractRelatedConnections(connected): |
735 self.ConnectionTypes[connection] = "BOOL" |
751 self.ConnectionTypes[connection] = "BOOL" |
736 elif isinstance(instance, plcopen.commonObjects_continuation): |
752 elif isinstance(instance, ContinuationClass): |
737 name = instance.getname() |
753 name = instance.getname() |
738 connector = None |
754 connector = None |
739 var_type = "ANY" |
755 var_type = "ANY" |
740 for element in body.getcontentInstances(): |
756 for element in body.getcontentInstances(): |
741 if isinstance(element, plcopen.commonObjects_connector) and element.getname() == name: |
757 if isinstance(element, ConnectorClass) and element.getname() == name: |
742 if connector is not None: |
758 if connector is not None: |
743 raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name) |
759 raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name) |
744 connector = element |
760 connector = element |
745 if connector is not None: |
761 if connector is not None: |
746 undefined = [instance.connectionPointOut, connector.connectionPointIn] |
762 undefined = [instance.connectionPointOut, connector.connectionPointIn] |
846 def ComputeProgram(self, pou): |
862 def ComputeProgram(self, pou): |
847 body = pou.getbody() |
863 body = pou.getbody() |
848 if isinstance(body, ListType): |
864 if isinstance(body, ListType): |
849 body = body[0] |
865 body = body[0] |
850 body_content = body.getcontent() |
866 body_content = body.getcontent() |
851 body_type = body_content["name"] |
867 body_type = body_content.getLocalTag() |
852 if body_type in ["IL","ST"]: |
868 if body_type in ["IL","ST"]: |
853 text = body_content["value"].gettext() |
869 text = body_content.getanyText() |
854 self.ParentGenerator.GeneratePouProgramInText(text.upper()) |
870 self.ParentGenerator.GeneratePouProgramInText(text.upper()) |
855 self.Program = [(ReIndentText(text, len(self.CurrentIndent)), |
871 self.Program = [(ReIndentText(text, len(self.CurrentIndent)), |
856 (self.TagName, "body", len(self.CurrentIndent)))] |
872 (self.TagName, "body", len(self.CurrentIndent)))] |
857 elif body_type == "SFC": |
873 elif body_type == "SFC": |
858 self.IndentRight() |
874 self.IndentRight() |
859 for instance in body.getcontentInstances(): |
875 for instance in body.getcontentInstances(): |
860 if isinstance(instance, plcopen.sfcObjects_step): |
876 if isinstance(instance, StepClass): |
861 self.GenerateSFCStep(instance, pou) |
877 self.GenerateSFCStep(instance, pou) |
862 elif isinstance(instance, plcopen.commonObjects_actionBlock): |
878 elif isinstance(instance, ActionBlockClass): |
863 self.GenerateSFCStepActions(instance, pou) |
879 self.GenerateSFCStepActions(instance, pou) |
864 elif isinstance(instance, plcopen.sfcObjects_transition): |
880 elif isinstance(instance, TransitionClass): |
865 self.GenerateSFCTransition(instance, pou) |
881 self.GenerateSFCTransition(instance, pou) |
866 elif isinstance(instance, plcopen.sfcObjects_jumpStep): |
882 elif isinstance(instance, JumpClass): |
867 self.GenerateSFCJump(instance, pou) |
883 self.GenerateSFCJump(instance, pou) |
868 if len(self.InitialSteps) > 0 and len(self.SFCComputedBlocks) > 0: |
884 if len(self.InitialSteps) > 0 and len(self.SFCComputedBlocks) > 0: |
869 action_name = "COMPUTE_FUNCTION_BLOCKS" |
885 action_name = "COMPUTE_FUNCTION_BLOCKS" |
870 action_infos = {"qualifier" : "S", "content" : action_name} |
886 action_infos = {"qualifier" : "S", "content" : action_name} |
871 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos) |
887 self.SFCNetworks["Steps"][self.InitialSteps[0]]["actions"].append(action_infos) |
876 self.ComputeSFCStep(initialstep) |
892 self.ComputeSFCStep(initialstep) |
877 else: |
893 else: |
878 otherInstances = {"outVariables&coils" : [], "blocks" : [], "connectors" : []} |
894 otherInstances = {"outVariables&coils" : [], "blocks" : [], "connectors" : []} |
879 orderedInstances = [] |
895 orderedInstances = [] |
880 for instance in body.getcontentInstances(): |
896 for instance in body.getcontentInstances(): |
881 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable, plcopen.fbdObjects_block)): |
897 if isinstance(instance, (OutVariableClass, InOutVariableClass, BlockClass)): |
882 executionOrderId = instance.getexecutionOrderId() |
898 executionOrderId = instance.getexecutionOrderId() |
883 if executionOrderId > 0: |
899 if executionOrderId > 0: |
884 orderedInstances.append((executionOrderId, instance)) |
900 orderedInstances.append((executionOrderId, instance)) |
885 elif isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)): |
901 elif isinstance(instance, (OutVariableClass, InOutVariableClass)): |
886 otherInstances["outVariables&coils"].append(instance) |
902 otherInstances["outVariables&coils"].append(instance) |
887 elif isinstance(instance, plcopen.fbdObjects_block): |
903 elif isinstance(instance, BlockClass): |
888 otherInstances["blocks"].append(instance) |
904 otherInstances["blocks"].append(instance) |
889 elif isinstance(instance, plcopen.commonObjects_connector): |
905 elif isinstance(instance, ConnectorClass): |
890 otherInstances["connectors"].append(instance) |
906 otherInstances["connectors"].append(instance) |
891 elif isinstance(instance, plcopen.ldObjects_coil): |
907 elif isinstance(instance, CoilClass): |
892 otherInstances["outVariables&coils"].append(instance) |
908 otherInstances["outVariables&coils"].append(instance) |
893 orderedInstances.sort() |
909 orderedInstances.sort() |
894 otherInstances["outVariables&coils"].sort(SortInstances) |
910 otherInstances["outVariables&coils"].sort(SortInstances) |
895 otherInstances["blocks"].sort(SortInstances) |
911 otherInstances["blocks"].sort(SortInstances) |
896 instances = [instance for (executionOrderId, instance) in orderedInstances] |
912 instances = [instance for (executionOrderId, instance) in orderedInstances] |
897 instances.extend(otherInstances["outVariables&coils"] + otherInstances["blocks"] + otherInstances["connectors"]) |
913 instances.extend(otherInstances["outVariables&coils"] + otherInstances["blocks"] + otherInstances["connectors"]) |
898 for instance in instances: |
914 for instance in instances: |
899 if isinstance(instance, (plcopen.fbdObjects_outVariable, plcopen.fbdObjects_inOutVariable)): |
915 if isinstance(instance, (OutVariableClass, InOutVariableClass)): |
900 connections = instance.connectionPointIn.getconnections() |
916 connections = instance.connectionPointIn.getconnections() |
901 if connections is not None: |
917 if connections is not None: |
902 expression = self.ComputeExpression(body, connections) |
918 expression = self.ComputeExpression(body, connections) |
903 if expression is not None: |
919 if expression is not None: |
904 self.Program += [(self.CurrentIndent, ()), |
920 self.Program += [(self.CurrentIndent, ()), |
905 (instance.getexpression(), (self.TagName, "io_variable", instance.getlocalId(), "expression")), |
921 (instance.getexpression().text, (self.TagName, "io_variable", instance.getlocalId(), "expression")), |
906 (" := ", ())] |
922 (" := ", ())] |
907 self.Program += expression |
923 self.Program += expression |
908 self.Program += [(";\n", ())] |
924 self.Program += [(";\n", ())] |
909 elif isinstance(instance, plcopen.fbdObjects_block): |
925 elif isinstance(instance, BlockClass): |
910 block_type = instance.gettypeName() |
926 block_type = instance.gettypeName() |
911 self.ParentGenerator.GeneratePouProgram(block_type) |
927 self.ParentGenerator.GeneratePouProgram(block_type) |
912 block_infos = self.GetBlockType(block_type, tuple([self.ConnectionTypes.get(variable.connectionPointIn, "ANY") for variable in instance.inputVariables.getvariable() if variable.getformalParameter() != "EN"])) |
928 block_infos = self.GetBlockType(block_type, tuple([self.ConnectionTypes.get(variable.connectionPointIn, "ANY") for variable in instance.inputVariables.getvariable() if variable.getformalParameter() != "EN"])) |
913 if block_infos is None: |
929 if block_infos is None: |
914 block_infos = self.GetBlockType(block_type) |
930 block_infos = self.GetBlockType(block_type) |
916 raise PLCGenException, _("Undefined block type \"%s\" in \"%s\" POU")%(block_type, self.Name) |
932 raise PLCGenException, _("Undefined block type \"%s\" in \"%s\" POU")%(block_type, self.Name) |
917 try: |
933 try: |
918 block_infos["generate"](self, instance, block_infos, body, None) |
934 block_infos["generate"](self, instance, block_infos, body, None) |
919 except ValueError, e: |
935 except ValueError, e: |
920 raise PLCGenException, e.message |
936 raise PLCGenException, e.message |
921 elif isinstance(instance, plcopen.commonObjects_connector): |
937 elif isinstance(instance, ConnectorClass): |
922 connector = instance.getname() |
938 connector = instance.getname() |
923 if self.ComputedConnectors.get(connector, None): |
939 if self.ComputedConnectors.get(connector, None): |
924 continue |
940 continue |
925 expression = self.ComputeExpression(body, instance.connectionPointIn.getconnections()) |
941 expression = self.ComputeExpression(body, instance.connectionPointIn.getconnections()) |
926 if expression is not None: |
942 if expression is not None: |
927 self.ComputedConnectors[connector] = expression |
943 self.ComputedConnectors[connector] = expression |
928 elif isinstance(instance, plcopen.ldObjects_coil): |
944 elif isinstance(instance, CoilClass): |
929 connections = instance.connectionPointIn.getconnections() |
945 connections = instance.connectionPointIn.getconnections() |
930 if connections is not None: |
946 if connections is not None: |
931 coil_info = (self.TagName, "coil", instance.getlocalId()) |
947 coil_info = (self.TagName, "coil", instance.getlocalId()) |
932 expression = self.ComputeExpression(body, connections) |
948 expression = self.ComputeExpression(body, connections) |
933 if expression is not None: |
949 if expression is not None: |
934 expression = self.ExtractModifier(instance, expression, coil_info) |
950 expression = self.ExtractModifier(instance, expression, coil_info) |
935 self.Program += [(self.CurrentIndent, ())] |
951 self.Program += [(self.CurrentIndent, ())] |
936 self.Program += [(instance.getvariable(), coil_info + ("reference",))] |
952 self.Program += [(instance.getvariable().text, coil_info + ("reference",))] |
937 self.Program += [(" := ", ())] + expression + [(";\n", ())] |
953 self.Program += [(" := ", ())] + expression + [(";\n", ())] |
938 |
954 |
939 def FactorizePaths(self, paths): |
955 def FactorizePaths(self, paths): |
940 same_paths = {} |
956 same_paths = {} |
941 uncomputed_index = range(len(paths)) |
957 uncomputed_index = range(len(paths)) |
982 raise PLCGenException, _("Undefined block type \"%s\" in \"%s\" POU")%(block_type, self.Name) |
998 raise PLCGenException, _("Undefined block type \"%s\" in \"%s\" POU")%(block_type, self.Name) |
983 try: |
999 try: |
984 paths.append(str(block_infos["generate"](self, next, block_infos, body, connection, order, to_inout))) |
1000 paths.append(str(block_infos["generate"](self, next, block_infos, body, connection, order, to_inout))) |
985 except ValueError, e: |
1001 except ValueError, e: |
986 raise PLCGenException, e.message |
1002 raise PLCGenException, e.message |
987 elif isinstance(next, plcopen.commonObjects_continuation): |
1003 elif isinstance(next, ContinuationClass): |
988 name = next.getname() |
1004 name = next.getname() |
989 computed_value = self.ComputedConnectors.get(name, None) |
1005 computed_value = self.ComputedConnectors.get(name, None) |
990 if computed_value != None: |
1006 if computed_value != None: |
991 paths.append(str(computed_value)) |
1007 paths.append(str(computed_value)) |
992 else: |
1008 else: |
993 connector = None |
1009 connector = None |
994 for instance in body.getcontentInstances(): |
1010 for instance in body.getcontentInstances(): |
995 if isinstance(instance, plcopen.commonObjects_connector) and instance.getname() == name: |
1011 if isinstance(instance, ConnectorClass) and instance.getname() == name: |
996 if connector is not None: |
1012 if connector is not None: |
997 raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name) |
1013 raise PLCGenException, _("More than one connector found corresponding to \"%s\" continuation in \"%s\" POU")%(name, self.Name) |
998 connector = instance |
1014 connector = instance |
999 if connector is not None: |
1015 if connector is not None: |
1000 connections = connector.connectionPointIn.getconnections() |
1016 connections = connector.connectionPointIn.getconnections() |
1131 instanceLocalId = connections[0].getrefLocalId() |
1147 instanceLocalId = connections[0].getrefLocalId() |
1132 body = pou.getbody() |
1148 body = pou.getbody() |
1133 if isinstance(body, ListType): |
1149 if isinstance(body, ListType): |
1134 body = body[0] |
1150 body = body[0] |
1135 instance = body.getcontentInstance(instanceLocalId) |
1151 instance = body.getcontentInstance(instanceLocalId) |
1136 if isinstance(instance, plcopen.sfcObjects_transition): |
1152 if isinstance(instance, TransitionClass): |
1137 instances.append(instance) |
1153 instances.append(instance) |
1138 elif isinstance(instance, plcopen.sfcObjects_selectionConvergence): |
1154 elif isinstance(instance, SelectionConvergenceClass): |
1139 instances.extend(self.ExtractConvergenceInputs(instance, pou)) |
1155 instances.extend(self.ExtractConvergenceInputs(instance, pou)) |
1140 elif isinstance(instance, plcopen.sfcObjects_simultaneousDivergence): |
1156 elif isinstance(instance, SimultaneousDivergenceClass): |
1141 transition = self.ExtractDivergenceInput(instance, pou) |
1157 transition = self.ExtractDivergenceInput(instance, pou) |
1142 if transition: |
1158 if transition: |
1143 if isinstance(transition, plcopen.sfcObjects_transition): |
1159 if isinstance(transition, TransitionClass): |
1144 instances.append(transition) |
1160 instances.append(transition) |
1145 elif isinstance(transition, plcopen.sfcObjects_selectionConvergence): |
1161 elif isinstance(transition, SelectionConvergenceClass): |
1146 instances.extend(self.ExtractConvergenceInputs(transition, pou)) |
1162 instances.extend(self.ExtractConvergenceInputs(transition, pou)) |
1147 for instance in instances: |
1163 for instance in instances: |
1148 self.GenerateSFCTransition(instance, pou) |
1164 self.GenerateSFCTransition(instance, pou) |
1149 if instance in self.SFCNetworks["Transitions"].keys(): |
1165 if instance in self.SFCNetworks["Transitions"].keys(): |
1150 target_info = (self.TagName, "transition", instance.getlocalId(), "to", step_infos["id"]) |
1166 target_info = (self.TagName, "transition", instance.getlocalId(), "to", step_infos["id"]) |
1159 instanceLocalId = connections[0].getrefLocalId() |
1175 instanceLocalId = connections[0].getrefLocalId() |
1160 body = pou.getbody() |
1176 body = pou.getbody() |
1161 if isinstance(body, ListType): |
1177 if isinstance(body, ListType): |
1162 body = body[0] |
1178 body = body[0] |
1163 instance = body.getcontentInstance(instanceLocalId) |
1179 instance = body.getcontentInstance(instanceLocalId) |
1164 if isinstance(instance, plcopen.sfcObjects_transition): |
1180 if isinstance(instance, TransitionClass): |
1165 instances.append(instance) |
1181 instances.append(instance) |
1166 elif isinstance(instance, plcopen.sfcObjects_selectionConvergence): |
1182 elif isinstance(instance, SelectionConvergenceClass): |
1167 instances.extend(self.ExtractConvergenceInputs(instance, pou)) |
1183 instances.extend(self.ExtractConvergenceInputs(instance, pou)) |
1168 elif isinstance(instance, plcopen.sfcObjects_simultaneousDivergence): |
1184 elif isinstance(instance, SimultaneousDivergenceClass): |
1169 transition = self.ExtractDivergenceInput(instance, pou) |
1185 transition = self.ExtractDivergenceInput(instance, pou) |
1170 if transition: |
1186 if transition: |
1171 if isinstance(transition, plcopen.sfcObjects_transition): |
1187 if isinstance(transition, TransitionClass): |
1172 instances.append(transition) |
1188 instances.append(transition) |
1173 elif isinstance(transition, plcopen.sfcObjects_selectionConvergence): |
1189 elif isinstance(transition, SelectionConvergenceClass): |
1174 instances.extend(self.ExtractConvergenceInputs(transition, pou)) |
1190 instances.extend(self.ExtractConvergenceInputs(transition, pou)) |
1175 for instance in instances: |
1191 for instance in instances: |
1176 self.GenerateSFCTransition(instance, pou) |
1192 self.GenerateSFCTransition(instance, pou) |
1177 if instance in self.SFCNetworks["Transitions"].keys(): |
1193 if instance in self.SFCNetworks["Transitions"].keys(): |
1178 target_info = (self.TagName, "jump", jump.getlocalId(), "target") |
1194 target_info = (self.TagName, "jump", jump.getlocalId(), "target") |
1257 transitionBody = transitionContent.getbody() |
1273 transitionBody = transitionContent.getbody() |
1258 previous_tagname = self.TagName |
1274 previous_tagname = self.TagName |
1259 self.TagName = self.ParentGenerator.Controler.ComputePouTransitionName(self.Name, transitionValues["value"]) |
1275 self.TagName = self.ParentGenerator.Controler.ComputePouTransitionName(self.Name, transitionValues["value"]) |
1260 if transitionType == "IL": |
1276 if transitionType == "IL": |
1261 transition_infos["content"] = [(":\n", ()), |
1277 transition_infos["content"] = [(":\n", ()), |
1262 (ReIndentText(transitionBody.gettext(), len(self.CurrentIndent)), (self.TagName, "body", len(self.CurrentIndent)))] |
1278 (ReIndentText(transitionBody.getanyText(), len(self.CurrentIndent)), (self.TagName, "body", len(self.CurrentIndent)))] |
1263 elif transitionType == "ST": |
1279 elif transitionType == "ST": |
1264 transition_infos["content"] = [("\n", ()), |
1280 transition_infos["content"] = [("\n", ()), |
1265 (ReIndentText(transitionBody.gettext(), len(self.CurrentIndent)), (self.TagName, "body", len(self.CurrentIndent)))] |
1281 (ReIndentText(transitionBody.getanyText(), len(self.CurrentIndent)), (self.TagName, "body", len(self.CurrentIndent)))] |
1266 else: |
1282 else: |
1267 for instance in transitionBody.getcontentInstances(): |
1283 for instance in transitionBody.getcontentInstances(): |
1268 if isinstance(instance, plcopen.fbdObjects_outVariable) and instance.getexpression() == transitionValues["value"]\ |
1284 if isinstance(instance, OutVariableClass) and instance.getexpression().text == transitionValues["value"]\ |
1269 or isinstance(instance, plcopen.ldObjects_coil) and instance.getvariable() == transitionValues["value"]: |
1285 or isinstance(instance, CoilClass) and instance.getvariable().text == transitionValues["value"]: |
1270 connections = instance.connectionPointIn.getconnections() |
1286 connections = instance.connectionPointIn.getconnections() |
1271 if connections is not None: |
1287 if connections is not None: |
1272 expression = self.ComputeExpression(transitionBody, connections) |
1288 expression = self.ComputeExpression(transitionBody, connections) |
1273 if expression is not None: |
1289 if expression is not None: |
1274 transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ())] + expression + [(";\n", ())] |
1290 transition_infos["content"] = [("\n%s:= "%self.CurrentIndent, ())] + expression + [(";\n", ())] |