Is there a simple way to generate a random number in a global tag, so that the tag can run by itself and generate random numbers for itself?
Initial Attempt:
- Global script with function to generate random number
- Call global script in runScript in expression
In an expression tag, runScript("import random; random.randint(0, 1000)", 0)
should work.
I am using the free and latest version of Ignition.
I tried that originally, but I get an error:
Error evaluating tag: Error parsing script for runScript() expression: SyntaxError: (âno viable alternative at input â=ââ, (âexpression:runScriptâ, 1, 9, â__RESULT = import random; random.randint(0, 1000)\nâ))
Ah, yeah, looks like the single line import syntax wonât work. Make a shared script, with a single defined function:
import random
def randint(lower, upper):
return random.randint(lower, upper)
Then call it from your expression tag:
runScript("shared.agg.randint", 0, 0, 1000)
Thanks for the suggestion.
My bad that I didnât mention that was my initial attempt. I update my question above.
I was hoping for something cleaner than this.
The trouble you are experiencing is due to the fact that runScript() is prefixing the string you feed it with an assignment statement to a hidden variable. So the code that actually executes in Paulâs first suggestion looks like this:
__someVar = import random; random.randint(0, 1000)
And then the __someVar
value is fished out of the local variable table to feed to the binding. Not valid python.
If you add a real newline to your string expression, you can print dir()
to see what that variable name is. You can also assign a constant temporarily, with a newline, import, execute anything, and assign a real return value several lines later.
1 Like
I am a little lost with what you are sayingâŚcould you please give an example?
Use Paulâs second suggestion.
2 Likes