308 setattr(cls, "RefreshCustomBlockTypes", RefreshCustomBlockTypes) |
308 setattr(cls, "RefreshCustomBlockTypes", RefreshCustomBlockTypes) |
309 |
309 |
310 def AddCustomBlockType(self, pou): |
310 def AddCustomBlockType(self, pou): |
311 pou_name = pou.getname() |
311 pou_name = pou.getname() |
312 pou_type = pou.getpouType() |
312 pou_type = pou.getpouType() |
313 if pou_type != "program": |
313 block_infos = {"name" : pou_name, "type" : pou_type, "extensible" : False, |
314 block_infos = {"name" : pou_name, "type" : pou_type, "extensible" : False, |
314 "inputs" : [], "outputs" : [], "comment" : "", |
315 "inputs" : [], "outputs" : [], "comment" : "", |
315 "generate" : generate_block, "initialise" : initialise_block} |
316 "generate" : generate_block, "initialise" : initialise_block} |
316 if pou.getinterface(): |
317 if pou.getinterface(): |
317 return_type = pou.interface.getreturnType() |
318 return_type = pou.interface.getreturnType() |
318 if return_type: |
319 if return_type: |
319 var_type = return_type.getcontent() |
320 var_type = return_type.getcontent() |
320 if var_type["name"] == "derived": |
321 if var_type["name"] == "derived": |
321 block_infos["outputs"].append(("", var_type["value"].getname(), "none")) |
322 block_infos["outputs"].append(("", var_type["value"].getname(), "none")) |
322 elif var_type["name"] in ["string", "wstring"]: |
323 elif var_type["name"] in ["string", "wstring"]: |
323 block_infos["outputs"].append(("", var_type["name"].upper(), "none")) |
324 block_infos["outputs"].append(("", var_type["name"].upper(), "none")) |
324 else: |
325 else: |
325 block_infos["outputs"].append(("", var_type["name"], "none")) |
326 block_infos["outputs"].append(("", var_type["name"], "none")) |
326 for type, varlist in pou.getvars(): |
327 for type, varlist in pou.getvars(): |
327 if type == "InOut": |
328 if type == "InOut": |
328 for var in varlist.getvariable(): |
329 for var in varlist.getvariable(): |
329 var_type = var.type.getcontent() |
330 var_type = var.type.getcontent() |
330 if var_type["name"] == "derived": |
331 if var_type["name"] == "derived": |
331 block_infos["inputs"].append((var.getname(), var_type["value"].getname(), "none")) |
332 block_infos["inputs"].append((var.getname(), var_type["value"].getname(), "none")) |
332 block_infos["outputs"].append((var.getname(), var_type["value"].getname(), "none")) |
333 block_infos["outputs"].append((var.getname(), var_type["value"].getname(), "none")) |
333 elif var_type["name"] in ["string", "wstring"]: |
334 elif var_type["name"] in ["string", "wstring"]: |
334 block_infos["inputs"].append((var.getname(), var_type["name"].upper(), "none")) |
335 block_infos["inputs"].append((var.getname(), var_type["name"].upper(), "none")) |
335 block_infos["outputs"].append((var.getname(), var_type["name"].upper(), "none")) |
336 block_infos["outputs"].append((var.getname(), var_type["name"].upper(), "none")) |
336 else: |
337 else: |
337 block_infos["inputs"].append((var.getname(), var_type["name"], "none")) |
338 block_infos["inputs"].append((var.getname(), var_type["name"], "none")) |
338 block_infos["outputs"].append((var.getname(), var_type["name"], "none")) |
339 block_infos["outputs"].append((var.getname(), var_type["name"], "none")) |
339 elif type == "Input": |
340 elif type == "Input": |
340 for var in varlist.getvariable(): |
341 for var in varlist.getvariable(): |
341 var_type = var.type.getcontent() |
342 var_type = var.type.getcontent() |
342 if var_type["name"] == "derived": |
343 if var_type["name"] == "derived": |
343 block_infos["inputs"].append((var.getname(), var_type["value"].getname(), "none")) |
344 block_infos["inputs"].append((var.getname(), var_type["value"].getname(), "none")) |
344 elif var_type["name"] in ["string", "wstring"]: |
345 elif var_type["name"] in ["string", "wstring"]: |
345 block_infos["inputs"].append((var.getname(), var_type["name"].upper(), "none")) |
346 block_infos["inputs"].append((var.getname(), var_type["name"].upper(), "none")) |
346 else: |
347 else: |
347 block_infos["inputs"].append((var.getname(), var_type["name"], "none")) |
348 block_infos["inputs"].append((var.getname(), var_type["name"], "none")) |
348 elif type == "Output": |
349 elif type == "Output": |
349 for var in varlist.getvariable(): |
350 for var in varlist.getvariable(): |
350 var_type = var.type.getcontent() |
351 var_type = var.type.getcontent() |
351 if var_type["name"] == "derived": |
352 if var_type["name"] == "derived": |
352 block_infos["outputs"].append((var.getname(), var_type["value"].getname(), "none")) |
353 block_infos["outputs"].append((var.getname(), var_type["value"].getname(), "none")) |
353 elif var_type["name"] in ["string", "wstring"]: |
354 elif var_type["name"] in ["string", "wstring"]: |
354 block_infos["outputs"].append((var.getname(), var_type["name"].upper(), "none")) |
355 block_infos["outputs"].append((var.getname(), var_type["name"].upper(), "none")) |
355 else: |
356 else: |
356 block_infos["outputs"].append((var.getname(), var_type["name"], "none")) |
357 block_infos["outputs"].append((var.getname(), var_type["name"], "none")) |
357 if pou.getbodyType() in ["FBD","LD","SFC"]: |
358 if pou.getbodyType() in ["FBD","LD","SFC"]: |
358 for instance in pou.getinstances(): |
359 for instance in pou.getinstances(): |
359 if isinstance(instance, PLCOpenClasses.get("commonObjects_comment", None)): |
360 if isinstance(instance, PLCOpenClasses.get("commonObjects_comment", None)): |
360 block_infos["comment"] = instance.getcontentText() |
361 block_infos["comment"] = instance.getcontentText() |
361 self.CustomBlockTypes.append(block_infos) |
362 self.CustomBlockTypes.append(block_infos) |
|
363 setattr(cls, "AddCustomBlockType", AddCustomBlockType) |
362 setattr(cls, "AddCustomBlockType", AddCustomBlockType) |
364 |
363 |
365 def RefreshElementUsingTree(self): |
364 def RefreshElementUsingTree(self): |
366 # Reset the tree of user-defined element cross-use |
365 # Reset the tree of user-defined element cross-use |
367 self.ElementUsingTree = {} |
366 self.ElementUsingTree = {} |
499 pou = self.getpou(exclude) |
498 pou = self.getpou(exclude) |
500 if pou is not None: |
499 if pou is not None: |
501 type = pou.getpouType() |
500 type = pou.getpouType() |
502 customblocktypes = [] |
501 customblocktypes = [] |
503 for customblocktype in self.CustomBlockTypes: |
502 for customblocktype in self.CustomBlockTypes: |
504 if customblocktype["name"] != exclude and not self.ElementIsUsedBy(exclude, customblocktype["name"]) and not (onlyfunctions and customblocktype["type"] != "function"): |
503 if customblocktype["type"] != "program" and customblocktype["name"] != exclude and not self.ElementIsUsedBy(exclude, customblocktype["name"]) and not (onlyfunctions and customblocktype["type"] != "function"): |
505 customblocktypes.append(customblocktype) |
504 customblocktypes.append(customblocktype) |
506 return customblocktypes |
505 return customblocktypes |
507 setattr(cls, "GetCustomBlockTypes", GetCustomBlockTypes) |
506 setattr(cls, "GetCustomBlockTypes", GetCustomBlockTypes) |
508 |
507 |
509 # Return Function Block types checking for recursion |
508 # Return Function Block types checking for recursion |
510 def GetCustomFunctionBlockTypes(self, exclude = ""): |
509 def GetCustomFunctionBlockTypes(self, exclude = ""): |
511 customblocktypes = [] |
510 customblocktypes = [] |
512 for customblocktype in self.CustomBlockTypes: |
511 for customblocktype in self.CustomBlockTypes: |
513 if customblocktype["name"] != exclude and not self.ElementIsUsedBy(exclude, customblocktype["name"]): |
512 if customblocktype["type"] == "functionBlock" and customblocktype["name"] != exclude and not self.ElementIsUsedBy(exclude, customblocktype["name"]): |
514 customblocktypes.append(customblocktype["name"]) |
513 customblocktypes.append(customblocktype["name"]) |
515 return customblocktypes |
514 return customblocktypes |
516 setattr(cls, "GetCustomFunctionBlockTypes", GetCustomFunctionBlockTypes) |
515 setattr(cls, "GetCustomFunctionBlockTypes", GetCustomFunctionBlockTypes) |
517 |
516 |
518 # Return Block types checking for recursion |
517 # Return Block types checking for recursion |