When a train has crossed over another line on a diamond crossing, the point leading to that crossing needs to be put back to the "straight ahead" position. This is because power to the crossing is fed by the position of the point and it needs to be ready for a train running on the "straight" path through the crossing. The power arrangement looks something like this; we can't simply use an autoreverser because the tracks belong to different occupancy detectors in different PM42 power zones:
This method makes Traincontroller reset the point when a route through the crossing is unreserved. As a double check, it adds the point into a route running through the "straight" path of the crossing. This way, Traincontroller deliberately activates the point for both "straight" and "crossing" paths through the diamond crossing.
The first thing to do: on all routes that run diagonally through the crossing, add an operation to the route when it is unreserved. Edit the route; select the "operations" tab; then choose the "unreserved" operating state (the darker icon). Add the turnout, and select its position to straight ahead. In my case I have 6 routes (2 possible start points, 3 possible end points): make sure you do them all.
That should mean that when the train reaches the destination block, the route is unreserved and the point goes back to straight.
As a fallback, I've also added the relevant point (turnout) as an operation of the route that goes through the crossing in the "straight ahead" direction. If you tick "protection" that point can't then be operated from a switchboard when the route is reserved.
This method seems to work reliably. The previous method we'd used relied on the speed of traffic, and there was always something that went faster or slower than allowed for.