This script will find any variable that starts with an underscore and create a property for it
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 propname = var[0][1:] proptype = var[1] print("Creating property " + propname + " with type " + proptype) fb.create_property(propname, proptype) 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") getter.textual_implementation.replace(propname + ":= _" + propname + ";") setter.textual_implementation.replace("_" + propname + ":= " + propname + ";")
Here is an updated version that works in Codesys 3.5.19.2
That old version didn't like the line
fb.create_property(propname, proptype)
defCreateAllProperties(fbname):#getcurrentprojectproject=projects.primary#findthefunctionblockfb=project.find(fbname,True)[0]#getthedeclarationtextdeclaration=fb.textual_declaration#iteratealllinesinthedeclarationforiinrange(declaration.linecount):line=declaration.get_line(i)#getthisdeclarationlinestripped=line.strip()#stripoutwhitespaceinthislineendofline=stripped.find(";")stripped=stripped[0:endofline]#discardsanythingpastthe";"(comments,etc)ifstripped.startswith("_"):var=stripped.split(":")#NOTE:thisalsoremovesinitialvaluedeclarations,orputsthemintothe[2]indexofvar,whichwecandiscardmembername=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*")
π
1
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Is there any way to extend Codesys Development System with C# or Python to add your own refactoring functions?
I would very much like to automate FB properties to automatically add a backing VAR. It is vary tedious doing that by hand.
more posts ...
Try this:
https://help.codesys.com/webapp/_cds_struct_using_scripts;product=codesys;version=3.5.17.0
This script will find any variable that starts with an underscore and create a property for it
Related
Talk.ru: 1
Talk.ru: 2
Here is an updated version that works in Codesys 3.5.19.2
That old version didn't like the line
fb.create_property(propname, proptype)
Thank you for this snippet, I took the liberty to post repost it here;
https://forge.codesys.com/tol/scripting/snippets/search/?q=status%3AUnlicense
That's fine with me
I added a comment to that snippet with an improved version that doesn't throw an exception if the property already exists
Last edit: bnewman 2023-08-10