To try & teach on the basis of faultfinding is a not really much good without the foundation of knowing how to write code & understand it.
A few years ago, I used to teach a number of people at a very large well known company, these were well seasoned technicians they called them, the introduction of PLC's was new to most of them as most of the original controls were not PLC based.
What I found was first of all to teach them how a PLC works, produced a number of papers on the basics, how to go on-line, monitor upload/download etc.
Then get them to write a program the best one I found was a simple pick & place basically a turntable with nests, a loading station, 6 component placing or testing stations & 2 takeoff stations i.e. good/bad parts. I did not make it that simple but fist task was to write a progam that controlled the turntable, pick & place stations along with checking stations, the P&P was just two cylinders down/up & extend/retract plus a gripper, basically boolean logic & sequencing, then introduce other things like counts (good/bad), faild to remove component (would go round three times before stopping on error) & so on. this gave them quite a broad spectrum of the functions of a PLC like bool logic, counting (words rather than bits), shift registers for tracking good/bad parts or non removal.
At that time simulators were none existent, I wrote some blocks that simulated the I/O as per real time, they could not open these blocks as they were protected, the graphics was a Siemens WF470 card on the rack the graphics were pretty low res i.e. block symbols but for that time gave quite a good representation of the machine.