The warehouse system’s report for the night shift said 4,629 cartons sorted, 100% to the lane the order wanted, and the lane 2 pallet had 19 cartons on it that belonged in lane 3 and a picker who found them at 06:40. The sorter had no way to know. Its scanner read the label, its logic put a lane number in a queue, its divert fired, and the count the WMS was given was the count of decisions, because the only eye on the sorter was the trigger eye upstream of the diverts. A decision is not a sort. Sortation verification means an eye in each lane just past the divert that sees the carton arrive inside a window opened when the divert fired, an eye at the end of the main line that sees the cartons that were supposed to go straight, and three counters per lane – commanded, confirmed, missed – plus one for the carton that arrived in a lane when nobody sent it. Everything below is the takeaway sorter from the divert timing article: a 5069-L320ER CompactLogix, three pusher diverts on a 0.500 m/s belt with an encoder on the tail pulley, a trigger eye 1.20 m ahead of each paddle, retroreflective 42EF eyes into a 5069-IB16, and the sort logic in a 20 ms task. The verification adds four eyes, four windows and sixteen counters, and it costs nothing else.
Commanded, confirmed, missed, stray. Per lane, per shift, and the WMS gets confirmed, not commanded.
Sortation verification in four eyes, and where each one goes
Three confirm eyes and one pass-through eye, and the placement of each is the thing to get right before any rung exists.
A confirm eye sits in the lane, past the paddle’s reach, aimed across the lane so a carton entering breaks the beam with its leading edge. Past the paddle’s reach is the number: a 400 mm paddle on a 300 mm stroke sweeps a zone that ends about 350 mm from the main-belt edge, and an eye inside it sees the paddle, which confirms every divert whether a carton was there or not – the first version of this sorter had lane 1’s eye at 250 mm and reported a perfect shift with an empty lane. Put it at 450 mm, and beyond that the lane’s own rollers carry the carton, which is the reason the confirm window is a timer rather than a belt position: once the carton leaves the main belt, the encoder knows nothing about it. The pass-through eye, PE_P, sits on the main line 1.0 m past the last paddle, and it is the opposite case – the carton is still on the encoder’s belt, so its window is a position, not a time, exactly as the divert’s fire point is. That eye does two jobs. It confirms the cartons that were commanded straight, and it catches the ones that were commanded to a lane and kept going, which is the difference between a mis-sort and a jam when a lane’s confirm window closes on nothing.

The confirm eye has to be past the paddle’s sweep, or the paddle confirms itself. PE_P is on the encoder’s belt; the lane eyes are not, which decides how each window is built.
Confirm eyes past the sweep. Pass-through eye on the belt. Two different windows follow from that.
The confirm window: one timer per lane, opened by the fire
When lane 2’s divert fires, a TON with a 1500 ms preset starts, and the carton is expected to break lane 2’s confirm eye while that timer is timing.
The number comes from the trend, not from arithmetic: on this sorter the paddle touches the carton 180 ms after the output goes true, the dwell is 400 ms, and across fifty diverts per lane the leading edge crossed the confirm eye between 620 and 940 ms after the fire, so 1500 ms is the longest observed plus half again, and it is still shorter than the tightest pitch between two cartons bound for the same lane, 1.8 s at the 900 mm minimum. That last comparison is the limit of the method. If two diverts to one lane could fire closer together than the window, the second window would open while the first was timing and one eye edge could confirm either, so the window has to be shorter than the minimum same-lane pitch, and the pitch has to be enforced upstream, which is the merge’s job. The logic is four rungs per lane. An ONS on the divert output starts the timer and clears the lane’s confirmed flag. The confirm eye’s rising edge while the timer’s TT bit is on sets the flag and counts one confirmed. The timer’s DN bit with the flag still clear counts one missed. And the confirm eye’s rising edge while TT is off counts one stray, which is a carton in the lane that nobody sent there – the second carton of a pair pushed by one dwell, or a carton knocked sideways by the one ahead.

The window is a timer because the lane rollers, not the encoder, carry the carton past this eye. Its preset has to be shorter than the shortest same-lane pitch.
The counters are CTUs with a preset nobody reaches, read and cleared at the shift boundary by the standard reporting routine, and the accumulated values go to the HMI as they stand so the supervisor watches the missed count move during the shift rather than reading it at the end. The same four rungs in structured text are shorter and nobody can see them work at the panel, which is why they are ladder here.
(* per lane k, 20 ms task; Divert_Out[k] from the divert logic *)
IF Divert_Out[k] AND NOT Divert_Last[k] THEN
Win[k].PRE := 1500; Win[k].Reset := 1; Confirmed_Flag[k] := 0;
Commanded[k] := Commanded[k] + 1;
END_IF;
Divert_Last[k] := Divert_Out[k];
Win[k].TimerEnable := Divert_Out[k] OR Win[k].TT; TONR(Win[k]);
IF PE_C[k] AND NOT PE_C_Last[k] THEN
IF Win[k].TT THEN
Confirmed[k] := Confirmed[k] + 1; Confirmed_Flag[k] := 1;
ELSE
Stray[k] := Stray[k] + 1;
END_IF;
END_IF;
PE_C_Last[k] := PE_C[k];
IF Win[k].DN AND NOT Confirmed_Flag[k] AND NOT Missed_Latched[k] THEN
Missed[k] := Missed[k] + 1; Missed_Latched[k] := 1;
END_IF;
IF NOT Win[k].DN THEN Missed_Latched[k] := 0; END_IF;
The pass-through window: a position, because the belt still owns the carton
Every carton that breaks the trigger eye gets an entry in the sort queue with its lane number, and the entry now also carries the belt position at which its nose should reach PE_P: the trigger position plus 4.9 m on this line, the three paddle pitches and the last metre.
When PE_P sees a leading edge, the logic compares the current encoder position with the head of the queue, within 150 mm. If the head entry says straight and the position is inside the tolerance, that is a confirmed pass-through and the entry comes off the queue with an FFU. If the head entry says lane 2, the carton that just went past was commanded to lane 2 and did not go, and that is the mis-sort the confirm window already counted as missed – the two counts are the same event seen twice, and the pass-through eye is what tells you the carton went straight rather than jamming in the lane throat, which is a different call to a different person. If the belt runs 150 mm past the head entry’s position with no edge at PE_P and the entry said straight, the carton is lost: it is in a lane as a stray, which the lane counters show within the second, or it is stopped somewhere between the trigger eye and PE_P, which is the jam timer’s job to say. Belt position rather than time, for the same reason as the divert’s fire point: the takeaway’s speed is changed from a potentiometer and nobody tells the program.
A lane’s window is a timer. The main line’s window is a position. Mixing them up is the second most common way this logic lies.

Three cartons, three different counters. The missed carton is the one PE_P sees, which is how a mis-sort is told apart from a jam.
What one shift of counting said
The counts below are the shift after the eyes went in, with the divert timing left exactly as it had been for a year.
Lane 1 took 600 mm cases and confirmed 2,138 of 2,140 commanded, both misses in the same minute of a compressor changeover. Lane 3 took mixed cases, 1,875 of 1,877, with one stray that was the second half of a shingled pair the trigger eye had seen as one carton. Lane 2 took the 300 mm totes and confirmed 593 of 612, nineteen missed, every one of them a tote and every one of them seen at PE_P at the predicted position, which is a divert that fires late for a short product and nothing else – the length term in the fire offset, which is where the divert article ends up. Nineteen totes went straight on, round the recirculation loop, and the sort logic sent them to lane 2 again on the next pass, where the same late paddle missed about a third of them again, and the ones it caught on the second or third pass are how the WMS got its 100%. The report was not wrong about the total. It was wrong about how many passes it took, and it had no column for the totes that were finally clipped on their back corner and pushed into lane 2 sideways on pass three, sitting on the wrong pallet because the pallet had been closed by then.

Same night, same sorter. The right-hand column is what the WMS was told; the middle four are what the eyes saw. The lane 2 row is a timing offset, not a sensor.
The mis-sort rate per lane, per product, is the number that finds the cause. A rate that is high on one lane for one product length is the fire offset. A rate that is high on every lane after 14:00 is the air supply. A rate that is high on every lane after a Tuesday is somebody who changed the belt speed.
The thing everyone checks first
The scanner.
A sorter that puts cartons on the wrong pallet has its scanner realigned, its no-read rate pulled from the WMS and argued about, and its labels reprinted, and the no-read rate was 0.4% on this line and had nothing to do with the 19 totes, because a no-read goes to the recirculation lane by design and never reaches lane 2 at all. The counters answer the question in one look: a missed count on one lane says the divert on that lane, a stray count says the lane upstream of it, a lost count with no strays says a jam, and a confirmed count that matches commanded on every lane while the picker still finds wrong cartons says the decision was wrong, not the sort – the scanner, or the lane table in the WMS, and only now. Without the counters every one of those is the same complaint, and the scanner is the thing that gets touched.
Read the four counters per lane before anyone touches the scanner. They point at one machine element each.
Next step
Bolt the confirm eyes in past the paddle sweep and trend each one against its divert output for fifty cartons before choosing the window preset; take the longest edge, add half, and check it against the minimum same-lane pitch the merge upstream guarantees. Put PE_P on the belt and give every queue entry its expected position at that eye. Then run one shift with the counters on and the divert timing untouched, because the counts on that first shift are the argument for every timing change that follows, and hand the WMS the confirmed count per lane rather than the commanded one, with the missed and stray counts alongside so the report finally has a column for the carton that went round twice. The pitch the merge has to hold for the windows not to overlap is the priority rule’s job, and the carton that is lost between the trigger eye and PE_P is the jam timer’s; the FIFO pair does the queue bookkeeping in both.
Four eyes, sixteen counters, one shift. Then change the divert timing, and watch lane 2’s missed column stop moving.