Open any Logix project and you meet the same tree: the controller holds Tasks, tasks hold Programs, programs hold Routines. One Continuous task runs forever in the background; Periodic tasks cut in on a fixed clock; Event tasks fire on a trigger. Click through the tree and watch the scheduler run it.
The left is a real Controller Organizer for a palletizing line. Click a Task to expand it. The scheduler on the right shows the truth: MainTask (continuous) runs whenever nothing else needs the CPU, while Pack_10ms (periodic) preempts it every 10 ms โ the highlighted routine is executing right now. Continuous doesn't mean "uninterruptible," it means "fills the gaps."
Notice the yellow periodic slices land on an exact 10 ms grid โ Logix guarantees their timing by preempting the continuous task. If a periodic task can't finish before its next due time, you get a task overlap fault: the classic Logix performance trap.
Logix has no %I0.0. Every value is a named tag with a data type, and the question that matters is scope: a controller-scoped tag is global โ any program can read it. A program-scoped tag is private to its program, so two programs can both have a Step tag that never collide. Tap to compare.
Visible to every program โ use for shared things: LineSpeed, EStop_OK, produced/consumed tags, and all I/O tags. One source of truth across the whole controller.
Private to one program. Infeed.Step and Palletizer.Step are different tags โ reuse the same program twice and its locals never clash. Encapsulation, the Logix way.
This is why an Add-On Instruction (next track) is so clean: it carries its own local tags, so dropping it 50 times never pollutes the controller tag database.
You put heavy logic in a 10 ms Periodic task, but it takes 12 ms to execute. What happens?