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 what actually runs: MainTask (continuous) runs whenever nothing else needs the CPU, while Pack_10ms (periodic) preempts it every 10 ms, and the highlighted routine is the one executing right now. Continuous doesn't mean "uninterruptible"; it means "fills the gaps."
Notice that the yellow periodic slices land on an exact 10 ms grid, because 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 to settle for each one is its scope. A controller-scoped tag is global, so any program can read it. A program-scoped tag is private to its program, so two programs can both have a Step tag and the two never collide. Tap to compare.
Visible to every program. Use it for shared data such as LineSpeed, EStop_OK, produced/consumed tags and all I/O tags, so the whole controller has one source of truth.
Private to one program. Infeed.Step and Palletizer.Step are different tags, so you can reuse the same program twice and its locals never clash. That is how Logix does encapsulation.
This is also why an Add-On Instruction (Track 03) stays so tidy: it carries its own local tags, so dropping it in 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?