PLCControler.py
changeset 1951 bbd1e1744c91
parent 1950 752ec68da94d
child 1953 5736d25bb393
equal deleted inserted replaced
1950:752ec68da94d 1951:bbd1e1744c91
    41 from plcopen.types_enums import *
    41 from plcopen.types_enums import *
    42 from plcopen.XSLTModelQuery import  _StringValue, _BoolValue, _translate_args
    42 from plcopen.XSLTModelQuery import  _StringValue, _BoolValue, _translate_args
    43 from plcopen.InstancesPathCollector import InstancesPathCollector
    43 from plcopen.InstancesPathCollector import InstancesPathCollector
    44 from plcopen.POUVariablesCollector import POUVariablesCollector
    44 from plcopen.POUVariablesCollector import POUVariablesCollector
    45 from plcopen.InstanceTagnameCollector import InstanceTagnameCollector
    45 from plcopen.InstanceTagnameCollector import InstanceTagnameCollector
       
    46 from plcopen.VariableInfoCollector import VariableInfoCollector
    46 from graphics.GraphicCommons import *
    47 from graphics.GraphicCommons import *
    47 from PLCGenerator import *
    48 from PLCGenerator import *
    48 
    49 
    49 duration_model = re.compile("(?:([0-9]{1,2})h)?(?:([0-9]{1,2})m(?!s))?(?:([0-9]{1,2})s)?(?:([0-9]{1,3}(?:\.[0-9]*)?)ms)?")
    50 duration_model = re.compile("(?:([0-9]{1,2})h)?(?:([0-9]{1,2})m(?!s))?(?:([0-9]{1,2})s)?(?:([0-9]{1,3}(?:\.[0-9]*)?)ms)?")
    50 
    51 
    69                     lib_el.append(deepcopy(lib))
    70                     lib_el.append(deepcopy(lib))
    70             else:
    71             else:
    71                 for ctn in self.Controller.ConfNodeTypes:
    72                 for ctn in self.Controller.ConfNodeTypes:
    72                     lib_el.append(deepcopy(ctn["types"]))
    73                     lib_el.append(deepcopy(ctn["types"]))
    73             return self.resolve_string(etree.tostring(lib_el), context)
    74             return self.resolve_string(etree.tostring(lib_el), context)
    74 
       
    75 
       
    76 # -------------------------------------------------------------------------------
       
    77 #                 Helpers object for generating pou var list
       
    78 # -------------------------------------------------------------------------------
       
    79 
       
    80 
       
    81 class _VariableInfos(object):
       
    82     __slots__ = ["Name", "Class", "Option", "Location", "InitialValue",
       
    83                  "Edit", "Documentation", "Type", "Tree", "Number"]
       
    84 
       
    85     def __init__(self, *args):
       
    86         for attr, value in zip(self.__slots__, args):
       
    87             setattr(self, attr, value if value is not None else "")
       
    88 
       
    89     def copy(self):
       
    90         return _VariableInfos(*[getattr(self, attr) for attr in self.__slots__])
       
    91 
       
    92 
       
    93 class VariablesInfosFactory(object):
       
    94 
       
    95     def __init__(self, variables):
       
    96         self.Variables = variables
       
    97         self.TreeStack = []
       
    98         self.Type = None
       
    99         self.Dimensions = None
       
   100 
       
   101     def SetType(self, context, *args):
       
   102         self.Type = args[0][0]
       
   103 
       
   104     def GetType(self):
       
   105         if len(self.Dimensions) > 0:
       
   106             return ("array", self.Type, self.Dimensions)
       
   107         return self.Type
       
   108 
       
   109     def GetTree(self):
       
   110         return (self.TreeStack.pop(-1), self.Dimensions)
       
   111 
       
   112     def AddDimension(self, context, *args):
       
   113         self.Dimensions.append(tuple(
       
   114             _translate_args([_StringValue] * 2, args)))
       
   115 
       
   116     def AddTree(self, context, *args):
       
   117         self.TreeStack.append([])
       
   118         self.Dimensions = []
       
   119 
       
   120     def AddVarToTree(self, context, *args):
       
   121         var = (args[0][0], self.Type, self.GetTree())
       
   122         self.TreeStack[-1].append(var)
       
   123 
       
   124     def AddVariable(self, context, *args):
       
   125         self.Variables.append(_VariableInfos(*(
       
   126             _translate_args([_StringValue] * 5 + [_BoolValue] + [_StringValue], args) +
       
   127             [self.GetType(), self.GetTree()])))
       
   128 
    75 
   129 
    76 
   130 # -------------------------------------------------------------------------------
    77 # -------------------------------------------------------------------------------
   131 #           Helpers object for generating pou block instances list
    78 #           Helpers object for generating pou block instances list
   132 # -------------------------------------------------------------------------------
    79 # -------------------------------------------------------------------------------
   383         self.LastNewIndex = 0
   330         self.LastNewIndex = 0
   384         self.Reset()
   331         self.Reset()
   385         self.InstancesPathCollector = InstancesPathCollector(self)
   332         self.InstancesPathCollector = InstancesPathCollector(self)
   386         self.POUVariablesCollector = POUVariablesCollector(self)
   333         self.POUVariablesCollector = POUVariablesCollector(self)
   387         self.InstanceTagnameCollector = InstanceTagnameCollector(self)
   334         self.InstanceTagnameCollector = InstanceTagnameCollector(self)
       
   335         self.VariableInfoCollector = VariableInfoCollector(self)
   388 
   336 
   389     # Reset PLCControler internal variables
   337     # Reset PLCControler internal variables
   390     def Reset(self):
   338     def Reset(self):
   391         self.Project = None
   339         self.Project = None
   392         self.ProjectBufferEnabled = True
   340         self.ProjectBufferEnabled = True
  1160             current_varlist.appendvariable(tempvar)
  1108             current_varlist.appendvariable(tempvar)
  1161         return varlist_list
  1109         return varlist_list
  1162 
  1110 
  1163     def GetVariableDictionary(self, object_with_vars, tree=False, debug=False):
  1111     def GetVariableDictionary(self, object_with_vars, tree=False, debug=False):
  1164         variables = []
  1112         variables = []
  1165         factory = VariablesInfosFactory(variables)
  1113         factory = self.VariableInfoCollector.Collect(object_with_vars,
  1166 
  1114                                                      debug, variables, tree)
  1167         parser = etree.XMLParser()
       
  1168         parser.resolvers.add(LibraryResolver(self, debug))
       
  1169 
       
  1170         variables_infos_xslt_tree = etree.XSLT(
       
  1171             etree.parse(
       
  1172                 os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"),
       
  1173                 parser),
       
  1174             extensions={("var_infos_ns", name): getattr(factory, name)
       
  1175                         for name in ["SetType", "AddDimension", "AddTree",
       
  1176                                      "AddVarToTree", "AddVariable"]})
       
  1177         variables_infos_xslt_tree(
       
  1178             object_with_vars, tree=etree.XSLT.strparam(str(tree)))
       
  1179 
       
  1180         return variables
  1115         return variables
  1181 
  1116 
  1182     # Add a global var to configuration to configuration
  1117     # Add a global var to configuration to configuration
  1183     def AddConfigurationGlobalVar(self, config_name, var_type, var_name,
  1118     def AddConfigurationGlobalVar(self, config_name, var_type, var_name,
  1184                                   location="", description=""):
  1119                                   location="", description=""):
  1327         # Verify that the pou has an interface
  1262         # Verify that the pou has an interface
  1328         if pou.interface is not None:
  1263         if pou.interface is not None:
  1329             # Return the return type if there is one
  1264             # Return the return type if there is one
  1330             return_type = pou.interface.getreturnType()
  1265             return_type = pou.interface.getreturnType()
  1331             if return_type is not None:
  1266             if return_type is not None:
  1332                 factory = VariablesInfosFactory([])
  1267                 factory = self.VariableInfoCollector.Collect(return_type, 
  1333 
  1268                                                              debug, [], tree)
  1334                 parser = etree.XMLParser()
       
  1335                 parser.resolvers.add(LibraryResolver(self))
       
  1336 
       
  1337                 return_type_infos_xslt_tree = etree.XSLT(
       
  1338                     etree.parse(
       
  1339                         os.path.join(ScriptDirectory, "plcopen", "variables_infos.xslt"),
       
  1340                         parser),
       
  1341                     extensions={("var_infos_ns", name): getattr(factory, name)
       
  1342                                 for name in ["SetType", "AddDimension",
       
  1343                                              "AddTree", "AddVarToTree"]})
       
  1344                 return_type_infos_xslt_tree(
       
  1345                     return_type, tree=etree.XSLT.strparam(str(tree)))
       
  1346                 if tree:
  1269                 if tree:
  1347                     return [factory.GetType(), factory.GetTree()]
  1270                     return [factory.GetType(), factory.GetTree()]
  1348                 return factory.GetType()
  1271                 return factory.GetType()
  1349 
  1272 
  1350         if tree:
  1273         if tree: