Terry: No matter how good you misdirect with indirect addressing, eventually you will come to a 'Go / no-go' check.
Any shutdown method will result in a symptom (ie: machine shuts down, or won't start).
It's not to hard to find out why, and make the 'go / no-go' check a 'go / go' check by adding a contact for example. Or simply finding the element that is blocking a start command, and shorting around it.
Even machine code with no documentation can be disassembled and patched if someone is determined enough.
*** Something that could work though, at least partially, would be if PLC CPU's accepted dongles, maybe even smart-button type readers, that can be set with time limits. That of course, would require that the means of locking a CPU to the Dongle be prohibitivly expensive, or require some kind of very strong licensing policy between the PLC manuf and the OEM / System designer.