There are several ways to run the schedules, but the above is by far the most simple.
I found that if you break down a route into sections in the schedule library, you can make schedules from the schedules, if I make myself clear.
For example. You have one route of four stations, a,b,c,d where a and d are the end routes of one line and another route x,b,c and y, where x and y are the termini and use b and c as intermediate stops. You can make part-schedules of a to b, b to c, c to d, that might involve stopping at each of those stations, and schedules x to b and c to y, but b to c is already there. So if you were to make a full schedule of a to d or x to y, you can include those parts of the already created schedules in the new schedule.
You can create express non-stopping schedules like a to d seperate from the stopping services.
It means careful use of a naming protocol for the schedules, such as giving part-schedules different names from a full schedule. I use route numbers for full schedules, as they appear at the top of the list in "copy coomands from" and therefore are easy to call.
You can then call the schedules "by copy command - insert" after the "wait until hour" or "wait until minute" in the driver panel. So trains can run to your own timetable. Have fun with it. I have 20 or more trains in a session, any more it gets complicated and boring. The code sequencing slows down eventually if there are too many.