This script will find any variable that starts with an underscore and create a property for it
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,whichwecandiscardpropname=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+";")
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
Here is an updated version that works in Codesys 3.5.19.2
That old version didn't like the line
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