FANUC .LS
Vision pickup
DI/DO handshakes
Retry-safe CNC load
Timeout routing
FLEX_PART_HANDLER_2025
A label-driven robot handler that demonstrates vision-guided offset pickup, sensor-confirmed gripper/chuck handshakes, retry logic, optional finishing, indexed dropoff, and safe timeout exits — rewritten for public learning and portfolio review.
What this demonstrates (experience framing)
- Cell thinking: sequencing, interlocks, and “verify before motion” discipline.
- Reliability patterns: timeouts, retries, and safe termination pathways.
- Integration mindset: vision offsets → approach strategy → tool actions → confirmations.
Tip: You can describe this on your résumé as “FANUC label-state-machine automation logic (vision pickup, CNC load/unload, DI/DO handshakes, fail-safe timeouts)”
without claiming you wrote the proprietary production version verbatim.
Program highlights
- Label-based state machine with clear entry/exit points
- Vision-driven pickup with offset injection and approach Z-lift
- Sensor-confirmed tool actions (
DI/DOhandshakes) - CNC load retry loop with bounded attempts
- Optional finishing branch controlled by a mode register
- Indexed dropoff using register-driven offsets
- Dedicated timeout handlers route to a safe end state
LBL[10] Vision pickup (offset + grip confirm)
Scroll horizontally on mobile • Use Copy to grab this label
101LBL[10:INBOUND]
102 UTOOL_NUM=1
103 UFRAME_NUM=2
104 MESSAGE[START VISION PICKUP]
105 $WAITTMOUT=R[41:VISION TIME]
106 RUN VISION: FLEX_AI_2025
107 WAIT (F[21:VISION FOUND]=ON) TIMEOUT,LBL[55]
108 PR[2:VISION OFFSET]=[X:23.0, Y:-5.2, Z:0.0, W:0, P:0, R:0]
109 PR[3:APPROACH]=PR[2:VISION OFFSET]
110 PR[3,3]=100
111 P[10:PICK]=500mm/sec CNT100 Offset,PR[3]
112 DO[10:GRIPPER CLOSE CMD]=PULSE,0.2sec
113 WAIT (DI[10:GRIPPER CLOSED]=ON) TIMEOUT,LBL[998]
114 MESSAGE[GRIPPER CONFIRMED CLOSED]
115 MESSAGE[PAYLOAD SET TO MATCH TOOL]
116 JMP LBL[20]
LBL[20] CNC load (bounded retry loop)
Pattern: wait-for-ready → actuate → confirm → proceed
201LBL[20:LOAD CNC]
202 UTOOL_NUM=2
203 UFRAME_NUM=3
204 MESSAGE[LOADING CNC INTERFACE]
205 R[80]=0
206LBL[21:RETRY LOAD]
207 P[20:CNC APPROACH]=750mm/sec CNT50
208 WAIT (DI[110:CHUCK READY]=ON) TIMEOUT,LBL[901]
209 DO[105:OPEN CHUCK]=PULSE,0.2sec
210 WAIT (DI[108:CHUCK OPEN CONFIRM]=ON) TIMEOUT,LBL[901]
211 P[21:CNC INSERT]=250mm/sec FINE
212 DO[11:GRIPPER OPEN CMD]=PULSE,0.2sec
213 WAIT (DI[11:GRIPPER OPEN]=ON) TIMEOUT,LBL[997]
214 MESSAGE[GRIPPER CONFIRMED OPEN]
215 WAIT .2(sec)
216 DO[106:CLOSE CHUCK]=PULSE,0.2sec
217 WAIT (DI[109:CHUCK CLOSED CONFIRM]=ON) TIMEOUT,LBL[901]
218 JMP LBL[30]
LBL[30] Finish pass (optional branch)
Branch via mode register: skip finish if needed
300LBL[30:FINISH]
301 IF (R[90]=2), JMP LBL[40]
302 UTOOL_NUM=3
303 UFRAME_NUM=5
304 MESSAGE[STARTING FINISH TOOL]
305 DO[110:TOOL SPIN]=ON
306 P[30:FINISH START]=100mm/sec CNT50
307 WAIT .5(sec)
308 P[31:FINISH SWEEP]=350mm/sec CNT100
309 WAIT .5(sec)
310 DO[110]=OFF
311 JMP LBL[40]
LBL[40] CNC unload (re-secure part)
Unload mirrors load: open → confirm → move → grip → confirm
271LBL[40:UNLOAD CNC]
272 UTOOL_NUM=2
273 UFRAME_NUM=3
274 MESSAGE[UNLOADING CNC]
275 DO[105:OPEN CHUCK]=PULSE,0.2sec
276 WAIT (DI[108:CHUCK OPEN CONFIRM]=ON) TIMEOUT,LBL[902]
277 P[22:UNLOAD POS]=250mm/sec FINE
278 DO[10:GRIPPER CLOSE CMD]=PULSE,0.2sec
279 WAIT (DI[10:GRIPPER CLOSED]=ON) TIMEOUT,LBL[998]
280 MESSAGE[GRIPPER CONFIRMED CLOSED]
281 JMP LBL[50]
LBL[50] Regrip (orientation change)
Optional: show you can design mid-cycle regrip fixtures
290LBL[50:REGRIP]
291 UTOOL_NUM=4
292 UFRAME_NUM=6
293 MESSAGE[REGRIP INITIATED]
294 P[40:REGRIP DROP]=500mm/sec CNT50
295 DO[120:REGRIP OPEN]=ON
296 WAIT (DI[121:REGRIP OPEN SENSE]=ON)
297 DO[11:GRIPPER OPEN CMD]=PULSE,0.2sec
298 WAIT (DI[11:GRIPPER OPEN]=ON) TIMEOUT,LBL[997]
299 MESSAGE[GRIPPER CONFIRMED OPEN]
300 WAIT .2(sec)
301 P[41:REGRIP PICK]=250mm/sec FINE
302 DO[10:GRIPPER CLOSE CMD]=PULSE,0.2sec
303 WAIT (DI[10:GRIPPER CLOSED]=ON) TIMEOUT,LBL[998]
304 MESSAGE[GRIPPER CONFIRMED CLOSED]
305 DO[120:REGRIP OPEN]=OFF
LBL[60] Dropoff (indexed offsets)
Register math → PR offset → repeatable placement
310LBL[60:DROP]
311 UTOOL_NUM=2
312 UFRAME_NUM=4
313 R[6]=R[5]*(-150)
314 PR[4:OFFSET]=PR[3:NULL]
315 PR[4,2]=R[6]
316 PR[4,3]=100
317 P[50:DROPOFF]=500mm/sec CNT25 Offset,PR[4]
318 DO[11:GRIPPER OPEN CMD]=PULSE,0.2sec
319 WAIT (DI[11:GRIPPER OPEN]=ON) TIMEOUT,LBL[997]
320 MESSAGE[GRIPPER CONFIRMED OPEN]
321 WAIT .25(sec)
322 R[5]=R[5]+1
323 IF (R[5]>=R[28:MAX DROPS]), R[5]=0
LBL[70] Cycle summary (counter + loop)
Lightweight “operator visibility” pattern
330LBL[70:SUMMARY]
331 MESSAGE[=== CYCLE COMPLETE ===]
332 MESSAGE[PART COUNT: R[1]]
333 R[1]=R[1]+1
334 JMP LBL[10]
LBL[997–998] Timeout handlers
Fail-safe: alarm → route to END
340LBL[997]
341 MESSAGE[ERROR: GRIPPER OPEN TIMEOUT]
342 UALM[7]
343 JMP LBL[999]
345LBL[998]
346 MESSAGE[ERROR: GRIPPER CLOSE TIMEOUT]
347 UALM[8]
348 JMP LBL[999]
LBL[999] END (safe home + status)
Exit state: safe home + “done” output
360LBL[999:END]
361 PR[1:HOME]=P[1:SAFE HOME]
362 PR[1:HOME]=100% FINE
363 MESSAGE[PROGRAM COMPLETE]
364 DO[100:STATUS_END]=ON
Code summary (optional)
This program reads like a state machine: pickup → load → (optional) finish → unload → (optional) regrip → drop → summary → loop. Every tool action is guarded by a confirmation input; failures route into dedicated timeout labels.