I'm using Mach3, which seems to run the axis towards the switch until it triggers, then slowly backs off until the switch drops out. I haven't actually seen this behaviour described but it's the way it appears to work. Not like LinuxCNC where you have some control over how the homing works, but in principle it's a reasonable method of homing. In my case, the Z axis (actually, all three axes) overshoots on approach to the switch, which is fine, but particularly for Z, when the axis backs off until the switch trips again, the on/off switch points are not distinct. So, axis backs off, switch trips, home position is established, no problem. Mach3 now considers the switch to be a limit switch rather than home switch. Because the slightest movement will cause the switch to come on again, this is now seen as a limit event. During homing, this is OK but when rapid jogging, the tiny movement (vibration?) in Z trips this limit. I suspect that a better quality proximity switch with on/off hysteresis would avoid all this - and according to everything that I have read, they all have some small amount of hysteresis. Mine don't, though...

I'm still fairly new to Mach3; I haven't found a way to set the limit switch position to be, say, +1mm and then automatically jog down to 0 after homing. I have been playing with the "Ref All Axes" script behind the button - so I can home X and Y simultaneously, for example - but I was thinking that I might modify the script to drop Z 1mm after homing and before homing X and Y. I've done things like set SafeZ and tool change position to Z=-1, so generally I can work around the problem as long as I remember to drop Z a tiny amount after homing.

It is noticeable that as I wind an axis by hand and watch the switch's built-in LED indicator, there is a significant distance over which the LED changes brightness. There is no absolutely unambiguous switching point. I notice this particularly because I use master/slave X motors via a CSMIO IP/M which does not support independent master/slave homing. I ref all axes, then kill the motors so that they are free to turn, and wind the slave axis by hand until the LED indicator trips. The switching ambiguity is probably no more than a full step (you can feel the motor cogging) which is 25micron max and I'm reasonably happy to accept that degree of error at the end of a 1m gantry! Motors back on and I'm ready for a machining session - I generally only do the master-slave thing at the start of a session.