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")
this is an improved version that doesn't throw an exception if the property already exists