Update:
By resetting the Axis.MasterEnable bit when an E-Stop occurs I can stop the motion permanently. However, that sets a fault status on the axis which I have to clear when the safety system is re-energized. It works but its a little messy if someone has a better solution.
-Scott
A small Stage program could do that - although I may be simplifying it too much (especially the "restart condition" condition).
Just do RUN MonitorESTOP in $tTopOfScan or at the top of $Main (no contact) to ensure it's ALWAYS running (it never EXITs)
PROGRAM MonitorESTOP
SG S0 // wait for ESTOP to occur - good nickname for MonitorESTOP.S0 "WaitingForESTOP"
STR ESTOP (or possibly STRN NOT_ESTOP, negate all other "positive" ESTOP bits below to NOT_ESTOP bit)
JMP S1
SG S1 // in ESTOP condition "InESTOP"
RST $Axis.MasterEnable
STRN ESTOP // out of ESTOP condition?
JMP S2
SG S2 // leaving ESTOP condition "ESTOPRestart"
STR "RestartCondition" // this is an oversimplification - it may actually be more Stages you step through before actually doing the AXRSTFAULT - possibly look at AXSCRIPT?
ANDN ESTOP // just in case someone re-engages ESTOP before restart condition occurs, make sure ESTOP is NOT engaged
AXRSTFAULT OnSuccess JMP S0 // go back to waiting for ESTOP
Then open up the Project Browser, open up the MonitorESTOP PROGRAM below the Control Logic tree, and turn status ON (cyan colored graphic in the Project Browser toolbar). If you have Nicknames and Rung Comments for these rungs, you get an EXCELLENT realtime status of what's going on with your ESTOP behavior!