You might investigate how Mach does its Torch Height Control (THC). THC is generally considered a realtime feedback process however Mach has done it
using software alone and achieving bandwidths of about 10Hz. It seems to use PMC which is a much faster method of communication/output control.
Would 10Hz bandwidth be enough for your axis?
Craig
As usual, Craig has a nose for what is needed.

First you need an device that has analog outputs and has a Mach 4 plugin. Most will implement the analog output as a register which means that you can used the API functions having to do with registers to control the output value.
local hReg, rc
hReg, rc = mcRegGetHandle(inst, "device/reg/path")
rc = mcRegSetValue(hReg, 4095) -- full scale + on a unipolar 12 bit DAC.
Or you can do some more configuring in the analog tab of the configuration dialog and use the analog API functions. All these functions do is a transformation so that you can operate on analog outputs in terms of voltages instead of raw values. You accomplish this by mapping a analog register to an analog object. On the Analog Output tab of the config dialog, set the device, the analog register, the numerator, denominator and the offset. To set these values, you will have to know a bit about the DAC you are using, like how many bits of resolution and its voltage range.
For instance, say the DAC you are dealing with is -10v to +10v with 12 bit resolution. Set
numerator = 20 (total voltage swing)
denominator = 4095 (12 bit max value)
offset = 2047 (basically, the zero volt value)
Now you can set the analog output in terms of voltage. Say 5 volts. The calculation is (volts / (numerator / denominator)) + offset.
(5 / (20 / 4096)) + 2047 = 3070.75 or the integer value of 3071.
so
rc = mc.mcAnalogOutputWrite(inst, 0, 5) -- Set analog object 0 to +5v
writes 3071 to the actual analog register.
The next thing required would be some position reference like an encoder register
Then you would read the encoder feedback and and implement a PID loop in the PLC script to control the analog voltage driving the servo. The PID loop with PID values that you tune will make it work even though it is not real time and will compensate for the horrible time resolution. It will not be fastest and it will not be real time coordinated with some other axis or event (impossible), but it will hit the numbers. This is exactly how we do torch height control. The only difference is we are using an arc voltage as a target instead of a position.
People will say "But torch height control needs to be realtime" and I will say "Show me a motor or any motion system that can react instantly to any voltage change magnitude." It doesn't have to be real time to be close enough to do the THC job.
Now, I don't have time to write all of this for you, unfortunately. My post is simply to sate that this can be done.
Steve