Much has been made of how ControlLogix input tables are updated asynchonous to scan. It's funny, but it really doesn't play much of a roll.
The question that you must be able to answer is: How much of a delay will there be between two events, a "cause" and "effect" signal, as to determining which one caused shutdown.
If it's less than an average CLX scan time, then you can do it simply, using something like the following logic:
+--- EQU --+ EVENT_1 Trip_ID.0
---| Trip_ID |------| |---------(L)
| 0 |
+----------+
+--- EQU --+ EVENT_2 Trip_ID.1
---| Trip_ID |------| |---------(L)
| 0 |
+----------+
(etc.)
Trip_ID is a DInt. The above code sets one bit in Trip_ID only if no other bit in it is set. If you need more than 32 alarms trapped, just use multiple DINTs with multiple EQUs.
Now, if the two events happen pretty close to simultaneously, then you need to tell the PLC which one you want to log when that happens. That modification would look something like this:
+--- EQU --+ EVENT_1 EVENT_2 Trip_ID.0
---| Trip_ID |------| |---------|/|-------(L)
| 0 |
+----------+
+--- EQU --+ EVENT_2 Trip_ID.1
---| Trip_ID |------| |---------(L)
| 0 |
+----------+
(etc.)
In this case, it's assumed that if Event 1 and Event 2 happen on the same scan, then the PLC will log the trip as having a root cause of Event 2.
But if Event 1 occurs even one scan ahead of Event 2, the PLC will erroneously log the problem of having been caused by Event 1.
But the problem isn't really traceable to the asynchrounous scan stuff. While it's possible that the status of Event 2 could change from the first rung to the next, that's not what gave the erroneous result. The fact is that Event 1 was set in the PLC before Event 2 was.
But there's not much you can do about it. And it's really no different than a PLC-5 or SLC (or most other PLC) might have, where the circuitry of the input module took one scan more time to detect the threshhold voltage at the pont between two "simultaneously" triggered inputs.