I use two floats to control ATO and automatic NSW exchange. I don't trust two pumps to always operate at the same flow rate, so i will not use time to control a 2-pump process. A third float serves as an emergency high water trigger .
During most of the day one of the two floats acts as the ATO control. To prevent rapid opening and closing, I use a Defer statement of 10 minutes or so. During a specific time period (about 90 minutes) 3 days a week, the ATO is disabled and the system starts an NSW exchange. NSW is pumped in from a remote tank until the second float opens (normally closed). That triggers the first pump to turn off and it turns on a second pump that removes OSW to a drain until the first float closes (it's OPEN while underwater after the NSW addition). When that first float closes after enough OSW is drained, the second pump turns off. I could at that point re-enable the first float as the ATO control and be done with the water exchange, but since the CLOSED state of the first float is also the activation state for the ATO, the post-NSW exchange state is also a low water level state and the system would want to add RO/DI. After enough NSW exchanges, my salinity would drop. Instead of letting the system add RO/DI, I have the system pump in a bit more NSW to the OPEN position of the first float. This returns the tank to the exact water level I had before the NSW exchange began. Then I enable the first float as the ATO control.
This has worked like a dream without fail for over a year with virtually no drift in salinity.