XIC vs XIO is the only beginner mistake I know of that can leave a machine running normally for a year and then hurt somebody. It never throws a fault. The rung looks right on screen, the motor starts, the motor stops, everybody signs off. Then a terminal backs out in the field and the stop button quietly does nothing.
Here is what the two instructions actually examine, and why the stop button on a start/stop rung is an XIC even though the button itself is wired normally closed.
What XIC and XIO actually examine
Rockwell's own wording is almost aggressively boring. In the Logix 5000 general instructions reference, publication 1756-RM003, the Examine if Closed instruction "examines the data bit to set or clear the rung condition." Examine If Open gets the same sentence, word for word. One bit in, one rung condition out.
Notice what is missing. No contact, no field device, no wiring. Neither instruction can see any of that, because by the time your rung runs the input card has already collapsed everything happening out in the plant down to a 1 or a 0 in the input image. So the entire XIC vs XIO difference is what each one does with that bit.
|
Rung-condition-in |
Data bit |
XIC rung-condition-out |
XIO rung-condition-out |
|
false |
0 or 1 |
false |
false |
|
true |
1 (on) |
true |
false |
|
true |
0 (off) |
false |
true |
XIC vs XIO execution, adapted from Rockwell publication 1756-RM003.
A false rung-condition-in passes straight through both, so if something upstream already broke the rung, neither instruction gets a vote. Past that, the trick is simple: XIC hands the bit on as it found it, XIO hands it over flipped.

XIC vs XIO on the same bit: the instruction decides whether the rung sees it straight or inverted.
One detail that rarely comes up: 1756-RM003 lists Ladder Diagram as the only available language for both instructions. There is no XIC vs XIO in structured text or function block. Move that rung to ST and it becomes IF Stop_PB THEN, symbols and argument gone together.
XIC vs XIO is not the same question as NO vs NC
Normally open and normally closed describe hardware sitting on a shelf with nothing hooked to it. Mechanical fact, printed on the contact block, never changes for the life of the part. XIC and XIO ask something else: what is this bit, right now, this scan.
The input card is where the two ideas come apart. It has no idea what kind of contact is out there, it sees voltage on a terminal or it sees nothing. A normally closed contact at rest and a normally open contact somebody is holding down look identical to that card. Both put 24V on the point, both produce a 1, both make an XIC true.
Say you land both contact blocks of one pushbutton, an NO and an NC, on the same input card. At rest the NC point reads 1 and the NO point reads 0. Press the button and they trade places. Same button, same instant, two opposite bits.
So I quit framing it as XIC vs XIO and started asking what the bit reads when I want the rung to pass.
The start/stop rung, one line at a time
This is the case that trips everybody, so let's take it apart properly.
Field side. Start pushbutton is a normally open contact, stop pushbutton is normally closed, which is how it belongs and is not up for debate. Both land on 24V DC inputs. At rest Start_PB reads 0, since that NO contact is open. Stop_PB sits at 1 all day long, because its NC contact is closed and there is 24V on the terminal whether anyone is in the building or not.
Program side. The rung is a plain seal-in: XIC Start_PB, in parallel with XIC Motor_Run, then XIC Stop_PB, then OTE Motor_Run. Both field contacts are XIC. That is the piece that reads wrong to anyone who came up on relay panels, where the stop contact gets drawn closed.

Both are correct at once: the field side and the program side are answering two different questions.
Walk it through. At rest the XIC on Stop_PB is already true, so the rung sits waiting on a start. Hit start and Start_PB goes to 1 for as long as the finger is down, the rung goes true, OTE sets Motor_Run, and the parallel XIC on Motor_Run seals it in. Hit stop and the NC contact opens, Stop_PB drops to 0, its XIC goes false, and OTE clears Motor_Run along with the seal.
Now the part that matters. Break the wire between the stop button and the input card, blow its fuse, back out one terminal screw. The point reads 0, exactly what happens when somebody presses stop, and the machine stops on its own. That is the whole reason for the NC contact, and the XIC is the half of it living in the program.
Put an XIO on Stop_PB instead and the rung will not start at all, because the bit is 1 at rest. Here is where people talk themselves into trouble: instead of changing the instruction they move the field wire over to the NO block on the same button. Bit reads 0 at rest now, XIO is true, machine runs beautifully.
Right up until a conductor breaks. Then the point is stuck at 0, the XIO stays true forever, and the stop button is decoration. Pressing stop does nothing.
|
Stop button wiring |
Instruction |
At rest |
Button pressed |
Wire breaks |
|
NC contact |
XIC Stop_PB |
rung passes, ready to run |
rung breaks, motor stops |
rung breaks, motor stops |
|
NO contact |
XIO Stop_PB |
rung passes, ready to run |
rung breaks, motor stops |
rung stays passed, stop button dead |
Both versions pass a bench test. Only the XIC vs XIO row on top survives a broken conductor.

The XIC vs XIO choice on a stop button is not a matter of taste: one wire break, and only one version notices.
None of this turns a PLC input into a safety function. A real E-stop is hardwired and does not ask the processor for permission. But a stop button that dies silently on a broken conductor is still a bad day, and getting it right costs nothing.
The rule I use instead of memorizing it
Forget the contact and ask one question about the bit: when the machine is allowed to run, does it read 1 or 0? Reads 1 when you want the rung to pass, that is an XIC. Reads 0, that is an XIO.
Works the same on a field input, a timer done bit or a fault word. Most of my XIO instructions are not field devices at all. They are internal: an alarm bit that has to be clear before anything moves, a mode bit I want a rung to skip.
XIC vs XIO on an SLC 500 versus a Logix controller
Both generations behave the same. The SLC 500 instruction set reference, publication 1747-RM001, describes XIC as checking whether a bit is on and XIO as checking whether it is off. Same behavior 1756-RM003 spells out with different vocabulary.
Addressing is what changes, and that is where anybody running both generations gets bitten. On an SLC you read I:1/0 or B3:12/4, and the address tells you where the bit physically lives. Rack, slot, point, spelled out. On a Logix controller you read a BOOL tag and the name tells you nothing. Local:1:I.Data.0 is honest about itself. An alias called Stop_PB is not, so an XIC pointed at the wrong alias looks perfectly correct on screen. Rung fine, logic fine, bit coming from the wrong point. When a rung that should obviously work does not, I check the alias before the rung.

XIC vs XIO behaves identically on an SLC 5/04 like this 1747-L542. Only the addressing changes.
XIC vs XIO questions I get asked
What is the difference between XIC and XIO?
XIC passes the rung when the data bit is 1. XIO passes it when the bit is 0. Both examine one BOOL, and neither knows how the field device is wired.
What does XIO mean in a PLC?
Examine If Open. The name describes the contact symbol on screen, not the device in the field, which is most of why the XIC vs XIO naming trips people. Read it as "true when the bit is off" and it stops being confusing.
What is the difference between XIC and OTE?
XIC reads a bit, OTE writes one. Per 1756-RM003 the Output Energize instruction "sets or clears the data bit based on rung condition," so it pushes whatever the rung handed it into the bit every scan. XIC and XIO are conditions on the left of the rung, OTE is the result on the right. OTE also follows the rung both directions: rung goes false, bit clears. To hold a bit set you need OTL and OTU.
Is XIC the same thing as a normally open contact?
It is drawn like one, and that is the trap. Normally open describes a device with no power on it, XIC describes a bit this scan. A normally closed field contact at rest produces a 1, and a 1 makes an XIC true.
Can I use XIC vs XIO in structured text?
No. 1756-RM003 lists Ladder Diagram as the only available language for either one. In structured text you write the condition directly, so the whole XIC vs XIO distinction collapses into whether there is a NOT in front of the tag.
Where the older gear still needs XIC vs XIO done right
Most of the XIC vs XIO grief I have run into came from a rung somebody inherited, not one they wrote, and inherited rungs tend to come attached to controllers a couple of generations past their prime. If you are keeping an SLC 500 line alive, or standing a CompactLogix up next to it, we keep both on the shelf at iqelectro.com/collections/programmable-logic-controllers.