# HG changeset patch # User lbessard # Date 1190215395 -7200 # Node ID 2b18a72dcaf07a5f45caa9712c3c74414e3cd478 # Parent ec5d7af033d8efe2ae22de31ba7208319c3fff4f Added support for standard functions type compatibility check diff -r ec5d7af033d8 -r 2b18a72dcaf0 PLCControler.py --- a/PLCControler.py Wed Sep 19 15:20:59 2007 +0200 +++ b/PLCControler.py Wed Sep 19 17:23:15 2007 +0200 @@ -903,7 +903,6 @@ if self.CurrentElementEditing != None: if self.Project: current_name = self.ElementsOpened[self.CurrentElementEditing] - print current_name words = current_name.split("::") if len(words) == 1: name = current_name diff -r ec5d7af033d8 -r 2b18a72dcaf0 graphics/FBD_Objects.py --- a/graphics/FBD_Objects.py Wed Sep 19 15:20:59 2007 +0200 +++ b/graphics/FBD_Objects.py Wed Sep 19 17:23:15 2007 +0200 @@ -26,7 +26,7 @@ from GraphicCommons import * from plcopen.structures import * - +from plcopen.structures import IsOfType #------------------------------------------------------------------------------- # Function Block Diagram Block @@ -138,6 +138,22 @@ def GetInputTypes(self): return tuple([input.GetType() for input in self.Inputs]) + def GetConnectionResultType(self, connector): + resulttype = None + for input in self.Inputs: + name = input.GetName() + if input != connector and (name.startswith("IN") or name in ["MN", "MX"]): + inputtype = input.GetConnectedType() + if resulttype is None or inputtype is not None and IsOfType(inputtype, resulttype): + resulttype = inputtype + for output in self.Outputs: + name = output.GetName() + if output != connector and name == "OUT": + outputtype = output.GetConnectedType() + if resulttype is None or outputtype is not None and IsOfType(outputtype, resulttype): + resulttype = outputtype + return resulttype + # Returns all the block connectors def GetConnectors(self): return {"inputs" : self.Inputs, "outputs" : self.Outputs} diff -r ec5d7af033d8 -r 2b18a72dcaf0 graphics/GraphicCommons.py --- a/graphics/GraphicCommons.py Wed Sep 19 15:20:59 2007 +0200 +++ b/graphics/GraphicCommons.py Wed Sep 19 17:23:15 2007 +0200 @@ -24,7 +24,7 @@ import wx from math import * -from plcopen.structures import IsOfType +from plcopen.structures import IsOfType, IsEndType #------------------------------------------------------------------------------- # Common constants @@ -703,13 +703,25 @@ def GetParentBlock(self): return self.ParentBlock - # Returns the connector name + # Returns the connector type def GetType(self): + if IsEndType(self.Type): + return self.Type + else: + return self.ParentBlock.GetConnectionResultType(self) + + # Returns the connector type + def GetConnectedType(self): + if IsEndType(self.Type): + return self.Type + elif len(self.Wires) == 1: + return self.Wires[0][0].GetOtherConnectedType(self.Wires[0][1]) return self.Type # Returns if connector type is compatible with type given def IsCompatible(self, type): - return IsOfType(type, self.Type) or IsOfType(self.Type, type) + reference = self.GetType() + return IsOfType(type, reference) or IsOfType(reference, type) # Changes the connector name def SetType(self, type): @@ -988,6 +1000,12 @@ return self.EndConnected.GetType() return None + def GetOtherConnectedType(self, handle): + if handle == 0: + return self.GetEndConnectedType() + else: + return self.GetStartConnectedType() + def IsConnectedCompatible(self): if self.StartConnected: return self.StartConnected.IsCompatible(self.GetEndConnectedType()) diff -r ec5d7af033d8 -r 2b18a72dcaf0 plcopen/structures.py --- a/plcopen/structures.py Wed Sep 19 15:20:59 2007 +0200 +++ b/plcopen/structures.py Wed Sep 19 17:23:15 2007 +0200 @@ -270,6 +270,12 @@ test = TypeHierarchy[test] return False +def IsEndType(reference): + if reference is not None: + return len([typename for typename, parenttype in TypeHierarchy_list if parenttype == reference]) == 0 + else: + return True + """ returns list of all types that correspont to the ANY* meta type """