PLCControler.py
branchpython3
changeset 3750 f62625418bff
parent 3704 c17fac18c663
child 3752 9f6f46dbe3ae
equal deleted inserted replaced
3749:fda6c1a37662 3750:f62625418bff
    22 # You should have received a copy of the GNU General Public License
    22 # You should have received a copy of the GNU General Public License
    23 # along with this program; if not, write to the Free Software
    23 # along with this program; if not, write to the Free Software
    24 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
    24 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
    25 
    25 
    26 
    26 
    27 from __future__ import absolute_import
    27 
    28 from __future__ import division
    28 
    29 from copy import deepcopy
    29 from copy import deepcopy
    30 import os
    30 import os
    31 import re
    31 import re
    32 import datetime
    32 import datetime
    33 from time import localtime
    33 from time import localtime
    72         if currentstate:
    72         if currentstate:
    73             self.CurrentIndex = 0
    73             self.CurrentIndex = 0
    74             self.MinIndex = 0
    74             self.MinIndex = 0
    75             self.MaxIndex = 0
    75             self.MaxIndex = 0
    76         # Initialising buffer with currentstate at the first place
    76         # Initialising buffer with currentstate at the first place
    77         for i in xrange(UNDO_BUFFER_LENGTH):
    77         for i in range(UNDO_BUFFER_LENGTH):
    78             if i == 0:
    78             if i == 0:
    79                 self.Buffer.append(currentstate)
    79                 self.Buffer.append(currentstate)
    80             else:
    80             else:
    81                 self.Buffer.append(None)
    81                 self.Buffer.append(None)
    82         # Initialising index of state saved
    82         # Initialising index of state saved
  1182     def GetBlockType(self, typename, inputs=None, debug=False):
  1182     def GetBlockType(self, typename, inputs=None, debug=False):
  1183         result_blocktype = {}
  1183         result_blocktype = {}
  1184         for _sectioname, blocktype in self.TotalTypesDict.get(typename, []):
  1184         for _sectioname, blocktype in self.TotalTypesDict.get(typename, []):
  1185             if inputs is not None and inputs != "undefined":
  1185             if inputs is not None and inputs != "undefined":
  1186                 block_inputs = tuple([var_type for _name, var_type, _modifier in blocktype["inputs"]])
  1186                 block_inputs = tuple([var_type for _name, var_type, _modifier in blocktype["inputs"]])
  1187                 if reduce(lambda x, y: x and y, map(lambda x: x[0] == "ANY" or self.IsOfType(*x), zip(inputs, block_inputs)), True):
  1187                 if reduce(lambda x, y: x and y, [x[0] == "ANY" or self.IsOfType(*x) for x in zip(inputs, block_inputs)], True):
  1188                     return blocktype
  1188                     return blocktype
  1189             else:
  1189             else:
  1190                 if result_blocktype:
  1190                 if result_blocktype:
  1191                     if inputs == "undefined":
  1191                     if inputs == "undefined":
  1192                         return None
  1192                         return None
  1245         words = tagname.split("::")
  1245         words = tagname.split("::")
  1246         name = None
  1246         name = None
  1247         if project is not None and words[0] in ["P", "T", "A"]:
  1247         if project is not None and words[0] in ["P", "T", "A"]:
  1248             name = words[1]
  1248             name = words[1]
  1249         blocktypes = []
  1249         blocktypes = []
  1250         for blocks in self.TotalTypesDict.itervalues():
  1250         for blocks in self.TotalTypesDict.values():
  1251             for _sectioname, block in blocks:
  1251             for _sectioname, block in blocks:
  1252                 if block["type"] == "functionBlock":
  1252                 if block["type"] == "functionBlock":
  1253                     blocktypes.append(block["name"])
  1253                     blocktypes.append(block["name"])
  1254         if project is not None:
  1254         if project is not None:
  1255             blocktypes.extend([
  1255             blocktypes.extend([
  1300         project = self.GetProject(debug)
  1300         project = self.GetProject(debug)
  1301         if project is not None:
  1301         if project is not None:
  1302             result = project.getpou(typename)
  1302             result = project.getpou(typename)
  1303             if result is not None:
  1303             if result is not None:
  1304                 return result
  1304                 return result
  1305         for standardlibrary in StdBlckLibs.values():
  1305         for standardlibrary in list(StdBlckLibs.values()):
  1306             result = standardlibrary.getpou(typename)
  1306             result = standardlibrary.getpou(typename)
  1307             if result is not None:
  1307             if result is not None:
  1308                 return result
  1308                 return result
  1309         for confnodetype in self.ConfNodeTypes:
  1309         for confnodetype in self.ConfNodeTypes:
  1310             result = confnodetype["types"].getpou(typename)
  1310             result = confnodetype["types"].getpou(typename)
  1453                 return self.GetDataTypeRange(basetype_content.getname(), debug)
  1453                 return self.GetDataTypeRange(basetype_content.getname(), debug)
  1454         return None
  1454         return None
  1455 
  1455 
  1456     # Return Subrange types
  1456     # Return Subrange types
  1457     def GetSubrangeBaseTypes(self, exclude, debug=False):
  1457     def GetSubrangeBaseTypes(self, exclude, debug=False):
  1458         subrange_basetypes = DataTypeRange.keys()
  1458         subrange_basetypes = list(DataTypeRange.keys())
  1459         project = self.GetProject(debug)
  1459         project = self.GetProject(debug)
  1460         if project is not None:
  1460         if project is not None:
  1461             subrange_basetypes.extend(
  1461             subrange_basetypes.extend(
  1462                 [datatype.getname() for datatype in project.getdataTypes()
  1462                 [datatype.getname() for datatype in project.getdataTypes()
  1463                  if self.IsSubrangeType(datatype.getname(), exclude, debug)])
  1463                  if self.IsSubrangeType(datatype.getname(), exclude, debug)])
  1968             x, y, width, height = bbox.bounding_box()
  1968             x, y, width, height = bbox.bounding_box()
  1969             if middle:
  1969             if middle:
  1970                 new_pos[0] -= width // 2
  1970                 new_pos[0] -= width // 2
  1971                 new_pos[1] -= height // 2
  1971                 new_pos[1] -= height // 2
  1972             else:
  1972             else:
  1973                 new_pos = map(lambda x: x + 30, new_pos)
  1973                 new_pos = [x + 30 for x in new_pos]
  1974             if scaling[0] != 0 and scaling[1] != 0:
  1974             if scaling[0] != 0 and scaling[1] != 0:
  1975                 min_pos = map(lambda x: 30 / x, scaling)
  1975                 min_pos = [30 / x for x in scaling]
  1976                 minx = round(min_pos[0])
  1976                 minx = round(min_pos[0])
  1977                 if int(min_pos[0]) == round(min_pos[0]):
  1977                 if int(min_pos[0]) == round(min_pos[0]):
  1978                     minx += 1
  1978                     minx += 1
  1979                 miny = round(min_pos[1])
  1979                 miny = round(min_pos[1])
  1980                 if int(min_pos[1]) == round(min_pos[1]):
  1980                 if int(min_pos[1]) == round(min_pos[1]):
  2116                         self.AddEditedElementPouVar(tagname, new_type, new_name)
  2116                         self.AddEditedElementPouVar(tagname, new_type, new_name)
  2117                 elif new_typeinfos["type"] != "function":
  2117                 elif new_typeinfos["type"] != "function":
  2118                     self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name)
  2118                     self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name)
  2119             elif new_name != old_name:
  2119             elif new_name != old_name:
  2120                 self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name)
  2120                 self.ChangeEditedElementPouVar(tagname, old_type, old_name, new_type, new_name)
  2121             for param, value in infos.items():
  2121             for param, value in list(infos.items()):
  2122                 if param == "name":
  2122                 if param == "name":
  2123                     if value != "":
  2123                     if value != "":
  2124                         block.setinstanceName(value)
  2124                         block.setinstanceName(value)
  2125                     else:
  2125                     else:
  2126                         block.attrib.pop("instanceName", None)
  2126                         block.attrib.pop("instanceName", None)
  2177         element = self.GetEditedElement(tagname)
  2177         element = self.GetEditedElement(tagname)
  2178         if element is not None:
  2178         if element is not None:
  2179             variable = element.getinstance(id)
  2179             variable = element.getinstance(id)
  2180             if variable is None:
  2180             if variable is None:
  2181                 return
  2181                 return
  2182             for param, value in infos.items():
  2182             for param, value in list(infos.items()):
  2183                 if param == "name":
  2183                 if param == "name":
  2184                     variable.setexpression(value)
  2184                     variable.setexpression(value)
  2185                 elif param == "executionOrder" and variable.getexecutionOrderId() != value:
  2185                 elif param == "executionOrder" and variable.getexecutionOrderId() != value:
  2186                     element.setelementExecutionOrder(variable, value)
  2186                     element.setelementExecutionOrder(variable, value)
  2187                 elif param == "height":
  2187                 elif param == "height":
  2230         element = self.GetEditedElement(tagname)
  2230         element = self.GetEditedElement(tagname)
  2231         if element is not None:
  2231         if element is not None:
  2232             connection = element.getinstance(id)
  2232             connection = element.getinstance(id)
  2233             if connection is None:
  2233             if connection is None:
  2234                 return
  2234                 return
  2235             for param, value in infos.items():
  2235             for param, value in list(infos.items()):
  2236                 if param == "name":
  2236                 if param == "name":
  2237                     connection.setname(value)
  2237                     connection.setname(value)
  2238                 elif param == "height":
  2238                 elif param == "height":
  2239                     connection.setheight(value)
  2239                     connection.setheight(value)
  2240                 elif param == "width":
  2240                 elif param == "width":
  2262 
  2262 
  2263     def SetEditedElementCommentInfos(self, tagname, id, infos):
  2263     def SetEditedElementCommentInfos(self, tagname, id, infos):
  2264         element = self.GetEditedElement(tagname)
  2264         element = self.GetEditedElement(tagname)
  2265         if element is not None:
  2265         if element is not None:
  2266             comment = element.getinstance(id)
  2266             comment = element.getinstance(id)
  2267             for param, value in infos.items():
  2267             for param, value in list(infos.items()):
  2268                 if param == "content":
  2268                 if param == "content":
  2269                     comment.setcontentText(value)
  2269                     comment.setcontentText(value)
  2270                 elif param == "height":
  2270                 elif param == "height":
  2271                     comment.setheight(value)
  2271                     comment.setheight(value)
  2272                 elif param == "width":
  2272                 elif param == "width":
  2289         element = self.GetEditedElement(tagname)
  2289         element = self.GetEditedElement(tagname)
  2290         if element is not None:
  2290         if element is not None:
  2291             powerrail = element.getinstance(id)
  2291             powerrail = element.getinstance(id)
  2292             if powerrail is None:
  2292             if powerrail is None:
  2293                 return
  2293                 return
  2294             for param, value in infos.items():
  2294             for param, value in list(infos.items()):
  2295                 if param == "height":
  2295                 if param == "height":
  2296                     powerrail.setheight(value)
  2296                     powerrail.setheight(value)
  2297                 elif param == "width":
  2297                 elif param == "width":
  2298                     powerrail.setwidth(value)
  2298                     powerrail.setwidth(value)
  2299                 elif param == "x":
  2299                 elif param == "x":
  2328         element = self.GetEditedElement(tagname)
  2328         element = self.GetEditedElement(tagname)
  2329         if element is not None:
  2329         if element is not None:
  2330             contact = element.getinstance(id)
  2330             contact = element.getinstance(id)
  2331             if contact is None:
  2331             if contact is None:
  2332                 return
  2332                 return
  2333             for param, value in infos.items():
  2333             for param, value in list(infos.items()):
  2334                 if param == "name":
  2334                 if param == "name":
  2335                     contact.setvariable(value)
  2335                     contact.setvariable(value)
  2336                 elif param == "type":
  2336                 elif param == "type":
  2337                     negated, edge = {
  2337                     negated, edge = {
  2338                         CONTACT_NORMAL: (False, "none"),
  2338                         CONTACT_NORMAL: (False, "none"),
  2371         element = self.GetEditedElement(tagname)
  2371         element = self.GetEditedElement(tagname)
  2372         if element is not None:
  2372         if element is not None:
  2373             coil = element.getinstance(id)
  2373             coil = element.getinstance(id)
  2374             if coil is None:
  2374             if coil is None:
  2375                 return
  2375                 return
  2376             for param, value in infos.items():
  2376             for param, value in list(infos.items()):
  2377                 if param == "name":
  2377                 if param == "name":
  2378                     coil.setvariable(value)
  2378                     coil.setvariable(value)
  2379                 elif param == "type":
  2379                 elif param == "type":
  2380                     negated, storage, edge = {
  2380                     negated, storage, edge = {
  2381                         COIL_NORMAL: (False, "none", "none"),
  2381                         COIL_NORMAL: (False, "none", "none"),
  2417         element = self.GetEditedElement(tagname)
  2417         element = self.GetEditedElement(tagname)
  2418         if element is not None:
  2418         if element is not None:
  2419             step = element.getinstance(id)
  2419             step = element.getinstance(id)
  2420             if step is None:
  2420             if step is None:
  2421                 return
  2421                 return
  2422             for param, value in infos.items():
  2422             for param, value in list(infos.items()):
  2423                 if param == "name":
  2423                 if param == "name":
  2424                     step.setname(value)
  2424                     step.setname(value)
  2425                 elif param == "initial":
  2425                 elif param == "initial":
  2426                     step.setinitialStep(value)
  2426                     step.setinitialStep(value)
  2427                 elif param == "height":
  2427                 elif param == "height":
  2467         element = self.GetEditedElement(tagname)
  2467         element = self.GetEditedElement(tagname)
  2468         if element is not None:
  2468         if element is not None:
  2469             transition = element.getinstance(id)
  2469             transition = element.getinstance(id)
  2470             if transition is None:
  2470             if transition is None:
  2471                 return
  2471                 return
  2472             for param, value in infos.items():
  2472             for param, value in list(infos.items()):
  2473                 if param == "type" and value != "connection":
  2473                 if param == "type" and value != "connection":
  2474                     transition.setconditionContent(value, infos["condition"])
  2474                     transition.setconditionContent(value, infos["condition"])
  2475                 elif param == "height":
  2475                 elif param == "height":
  2476                     transition.setheight(value)
  2476                     transition.setheight(value)
  2477                 elif param == "width":
  2477                 elif param == "width":
  2527         element = self.GetEditedElement(tagname)
  2527         element = self.GetEditedElement(tagname)
  2528         if element is not None:
  2528         if element is not None:
  2529             divergence = element.getinstance(id)
  2529             divergence = element.getinstance(id)
  2530             if divergence is None:
  2530             if divergence is None:
  2531                 return
  2531                 return
  2532             for param, value in infos.items():
  2532             for param, value in list(infos.items()):
  2533                 if param == "height":
  2533                 if param == "height":
  2534                     divergence.setheight(value)
  2534                     divergence.setheight(value)
  2535                 elif param == "width":
  2535                 elif param == "width":
  2536                     divergence.setwidth(value)
  2536                     divergence.setwidth(value)
  2537                 elif param == "x":
  2537                 elif param == "x":
  2578         element = self.GetEditedElement(tagname)
  2578         element = self.GetEditedElement(tagname)
  2579         if element is not None:
  2579         if element is not None:
  2580             jump = element.getinstance(id)
  2580             jump = element.getinstance(id)
  2581             if jump is None:
  2581             if jump is None:
  2582                 return
  2582                 return
  2583             for param, value in infos.items():
  2583             for param, value in list(infos.items()):
  2584                 if param == "target":
  2584                 if param == "target":
  2585                     jump.settargetName(value)
  2585                     jump.settargetName(value)
  2586                 elif param == "height":
  2586                 elif param == "height":
  2587                     jump.setheight(value)
  2587                     jump.setheight(value)
  2588                 elif param == "width":
  2588                 elif param == "width":
  2608         element = self.GetEditedElement(tagname)
  2608         element = self.GetEditedElement(tagname)
  2609         if element is not None:
  2609         if element is not None:
  2610             actionBlock = element.getinstance(id)
  2610             actionBlock = element.getinstance(id)
  2611             if actionBlock is None:
  2611             if actionBlock is None:
  2612                 return
  2612                 return
  2613             for param, value in infos.items():
  2613             for param, value in list(infos.items()):
  2614                 if param == "actions":
  2614                 if param == "actions":
  2615                     actionBlock.setactions(value)
  2615                     actionBlock.setactions(value)
  2616                 elif param == "height":
  2616                 elif param == "height":
  2617                     actionBlock.setheight(value)
  2617                     actionBlock.setheight(value)
  2618                 elif param == "width":
  2618                 elif param == "width":