If you're unsure of when to put scripts in a script module vs. writing the script directly in an event handler, follow this simple rule: If you ever find yourself copying a script from one event handler to another, stop and refactor the script into a global script module! Then simply call your new module from the event handler. This rule will help prevent code duplication across your project, a major maintenance liability.
To add a script module, simply right click the Script Library [project] package and click the New Script option. Each module is a python script that may define many functions. You may also organize modules in subpackages if you'd like. Lets suppose you added a script module named
myfuncs, whose body was:
def callMe(message): system.gui.messageBox(message)
Now, anywhere in your project you can call this function:
Frequently in Ignition, your scripts get
system library (the built-in library package in Ignition) and shared and project libraries imported for you automatically. However,
Subsequent versions of Ignition beyond version 7 no longer need import system every time you create a new scope. However versions prior to version 7 still require an import system every time a system associated function is called inside a function. Ignition versions prior to version 7 still need the import system when system functions are called inside functions. Regardless, typing
import system in any version of Ignition will result in the system library being available for use inside the function.
Consider the following function that would calculate OEE:
def caclulateOEE(lineNum): paths = ["[default]Metrics/Line_%f/Quality" % lineNum, "[default]Metrics/Line_%f/Availability" % lineNum, "[default]Metrics/Line_%f/Performance" % lineNum] values = system.tag.readAll(paths) #Get your Q, A, and P quality = values.value availability = values.value performance = values.value #calculate OEE oee = quality * availability * performance #Write back to our OEE tag. system.tag.write("[default]Metrics/Line_%f/OEE" % lineNum, oee)
This could be defined as a Shared Script:
This could then be called from a script by calling shared.LibraryName.FuncitonName():