This is very good question.
There are 2 ways in Simulink to force a variable-time step solver to take a step at a specific time.
The most common one is zero crossing. In that case, the solver detect that some signal passed a certain threshold and goes back and forth in time t find the exact time when it happened.
I recommend looking at this doc section:
or a at demos like the one titled "Accurate Zero-Crossing Detection"
The other method is variable sample time. this is what the pulse generator block does. Every time it runs, the Pulse Generator block knows when it should run next. For example if you set it to a period of 10sec and a pulse width of 20%, it will run at 0,2,10,12,20,22,...
This doc page should help with that:
Typically, you need to write an s-function for that. This is a bit more complex to implement, but can be more efficient since you do not need to go back and forth in time to bracket the event like with zero-crossing.
If you are interested, I have a blog post where I use a variable sample time s-function here:
In your case, this will probably be simpler than the example in this post.
I think I will write another post on this topic soon.