#23 CreateProperties from variable declaration in FB

Unlicense
2023-08-09
2023-08-09
hermsen
No

See original posting at: https://forge.codesys.com/forge/talk/Engineering/thread/678b24f53f/#d16e
By CODESYS and Ben Newman

def CreateAllProperties(fbname):
# get current project
project = projects.primary
# find the function block
fb = project.find(fbname, True)[0]

# get the declaration text
declaration = fb.textual_declaration
# iterate all lines in the declaration
for i in range(declaration.linecount):
    line = declaration.get_line(i)  # get this declaration line
    stripped = line.strip() # strip out white space in this line
    endofline = stripped.find(";")
    stripped = stripped[0:endofline] # discards anything past the ";" (comments, etc)
    if stripped.startswith("_"):
        var = stripped.split(":")   #NOTE: this also removes initial value declarations, or puts them into the [2] index of var, which we can discard
        membername = var[0].strip(" ")
        propname = membername.lstrip("_");
        proptype = var[1].strip(" ");
        print("Creating property \"" + propname + "\" with type " + proptype)
        fb.create_property(propname, return_type=proptype, language=None)
        print("property " + propname + " with type " + proptype + "was created!")

        newprop = fb.find(propname)[0]
        getter = newprop.find("Get")[0]
        setter = newprop.find("Set")[0]            
        #newprop.textual_declaration.insert(0,0,"{attribute 'monitoring':='call'}\r\n")
        print("Inserting to getter")
        getter.textual_implementation.replace(propname + ":= " + membername + ";")
        print("Inserting to setter")
        setter.textual_implementation.replace(membername + ":= " + propname + ";")

CreateAllProperties("NameOfFunctionBlock")

Discussion

  • hermsen

    hermsen - 2023-08-09
    def CreateAllProperties(fbname):
        # get current project
        project = projects.primary 
        # find the function block
        fb = project.find(fbname, True)[0]
    
        # get the declaration text
        declaration = fb.textual_declaration
        # iterate all lines in the declaration
        for i in range(declaration.linecount):
            line = declaration.get_line(i)  # get this declaration line
            stripped = line.strip() # strip out white space in this line
            endofline = stripped.find(";")
            stripped = stripped[0:endofline] # discards anything past the ";" (comments, etc)
            if stripped.startswith("_"):
                var = stripped.split(":")   #NOTE: this also removes initial value declarations, or puts them into the [2] index of var, which we can discard
                membername = var[0].strip(" ")
                propname = membername.lstrip("_");
                proptype = var[1].strip(" ");
                print("Creating property \"" + propname + "\" with type " + proptype)
                fb.create_property(propname, return_type=proptype, language=None)
                print("property " + propname + " with type " + proptype + "was created!")
    
                newprop = fb.find(propname)[0]
                getter = newprop.find("Get")[0]
                setter = newprop.find("Set")[0]            
                #newprop.textual_declaration.insert(0,0,"{attribute 'monitoring':='call'}\r\n")
                print("Inserting to getter")
                getter.textual_implementation.replace(propname + ":= " + membername + ";")
                print("Inserting to setter")
                setter.textual_implementation.replace(membername + ":= " + propname + ";")
    
    CreateAllProperties("*NameOfFunctionBlock*")
    
     
  • bnewman - 2023-08-09

    this is an improved version that doesn't throw an exception if the property already exists

    def CreateAllProperties(fbname, shouldAddMonitor = False):
        # get current project
        project = projects.primary 
        # find the function block
        fb = project.find(fbname, True)[0]
    
        # get the declaration text
        declaration = fb.textual_declaration
        # iterate all lines in the declaration
        for i in range(declaration.linecount):
            line = declaration.get_line(i)  # get this declaration line
            stripped = line.strip() # strip out white space in this line
            endofline = stripped.find(";")
            stripped = stripped[0:endofline] # discards anything past the ";" (comments, etc)
            if stripped.startswith("_"):
                var = stripped.split(":")   #NOTE: this also removes initial value declarations, or puts them into the [2] index of var, which we can discard
                membername = var[0].strip(" ")
                propname = membername.lstrip("_");
                proptype = var[1].strip(" ");
                if not fb.find(propname):
                    print("Creating property \"" + propname + "\" with type " + proptype)
                    fb.create_property(propname, return_type=proptype, language=None)
    
                    newprop = fb.find(propname)[0]
                    getter = newprop.find("Get")[0]
                    setter = newprop.find("Set")[0]  
    
                    if shouldAddMonitor:
                        newprop.textual_declaration.insert(0,0,"{attribute 'monitoring':='call'}\r\n")
    
                    getter.textual_implementation.replace(propname + ":= " + membername + ";")
                    setter.textual_implementation.replace(membername + ":= " + propname + ";")
                    print("Property " + propname + " with type " + proptype + "was created!")
                    print("Property " + propname + " Get and Set were implemented")
                else:
                    print("Property \'" + propname + "\' already exists. Skipping");
    
    CreateAllProperties("*NameOfFunctionBlock*")
    
     

Log in to post a comment.