The most deterministic and repeatable method of open loop ramping is to use a 10msec STI and have your routine increment or decrement by a selectable amount. Use an immediate output instruction for the output module. This is an excellent method of doing open loop ramping for non-critical motion control and does a wonderful job of eliminating hydraulic shock from a system.
So if you want a ramp of 10V/sec for example, you would decrement you output module count value the equivalent of 0.1V per STI scan (327.67 counts for a SLC module). Make sure you use compare statements to keep from ramping beyond your set points. Floating point math is nice here since you can scale your ramped values as 'volts' to make it easier to see, and then convert to DAC counts in integer format right before you output the value to the output module.
If you are clever, make the STI logic transparent to the main logic file i.e. have the main file pass the setpoint voltage to the STI, add some logic to determine polarity (forward or reverse) and magnitude (accel or decel). If the application is bi-directional, you may have to add zero crossing logic to allow for seperate accel and decel rates, depending on how fancy your system needs to be i.e. if switching from a '+' voltage to a '-' voltage, ramp down to zero first at the decel rate, and then ramp up to the accel rate. Generally, systems can tolerate higher accel rates than decel rates.
I have assumed you are using an SLC platform which does support immediate I/O instructions. If it is a PLC5 platform with 1771 I/O, immediate I/O will not help since the module uses block transfer writes. You will see some improvement in thruput if the block transfer is performed inside the STI file, and while not as deterministic as a SLC platform, still provides reasonable open loop ramping for simple systems.
BTW - check the data sheet for the amplifier that you are using for the valve driver. Some amplifiers have built-in ramp generators.