Closing the loop with step/dir interface and stepper motors would be very unoptimal and about useless.
You will probably ask why?
Because steppermotors have inverse speed/torque graph and if the motor looses step is usually because it has an extra unwanted torque on it's shaft and what a PID loop would do in case the position error is growing? It would higher the control signal commanding the motor to run faster. What would then happen? Ofcourse the motor could not run faster, because of the inverse speed/torque graph. A stepper motor should be slowed down in this scenario.
And even if you somehow trick this issue out then still you would have to synronise all the axes loops otherwise this slowdown of one axis would create a large temporarily error between the axes. So, again not good.
How closed loop would be useful is with servos with speed control loops, because servos speed/torque graph is not inverse.
And it is simpler to even syncronise the speed loops together. And so ofcourse this is how it is done in industrial controllers.
In newer ones it is done not with analog command signals, but via etherCAT or CAN etc. bus packets, but the analogy is the same, speed loops inside the position loop, but for that you need servos...
And syncronising the position loop with the speed loops would be impossible with our system, because Windows is not realtime and the motion commands are in a communication buffer and so it is not possible to instantly intervene into the position loop on the computer side since there is a buffer in between the motion controller and the PC.
So, closing the loop in the step/dir line with open loop stepper drives would be about useless in my opinion and how it should be done with a system like that is impossible with our current controllers.