I have just tested the at speed and at zero signals and they works perfectly.
There are multiple spindles waits.
1. Time based (setup in the spindle range tab)
2. RPM feedback based (spindle stabilization)
3. Signal based.
Pick one method. Not 2 or 3, but 1.
The stock (and default) default method is time based. It does not require anything but setting up the ramp times in the spindle tab. It does not require a m3.mcs script in the profile. 99% of the hobby users use this.
The signal based waiting also does NOT require a custom m3.mcs script. If you have a m3 script, it will override the default behavior of the Core and you will have to duplicate the default behavior.
For the signal based method.
1. Map and ENABLE the at speed signal. You have to map it to an I/O object. In this case, a coil from a modbus device. Enabling the signal mapping is important as it will NOT work if it is not enabled. That is how Mach know to look at the signal. Otherwise, it will use the time based wait. And if you have no times defined, the spindle will start instantly.
2. DO not check the spindle stabilization check box in the spindle settings. That is RPM feedback based. And because the VFD will hopefully tell us it is stabilized with the signal.
So I downloaded a nice little modbus simulator and configured it along with the modbus plugin configuration. I then mapped that modbus input to the spindle at speed input signal and enabled the signal. I can now control my spindle at speed signal at will with it and thus, my spindle start wait. http://www.plcsimulator.org/downloads
If you are having problems with the spindle immediately starting, I suspect that the signal is not enabled. Again, it has to be enabled and mapped. Once it is enabled and mapped, issuing a M3 should block until it times out. (approx 10 seconds). Or your m3 script is not doing the right thing. If you need a custom m3 script, have a look at the scripting manual. It has spartan example of one. It ALMOST duplicates the stock M3 behavior with the exception that it does NOT wait. Use mcSpindleSetDirectionWait() to enable waiting on the spindle.
Another thing you may need is the spindlespeed.mcs script. This is run every time a S word is issued. It is a handy way of setting a speed for a modbus controlled VFD.
There is a plethora of documentation in the Doc folder in the Mach installation directory. Scripting Manual, Mach4CoreAPI.chm, Operators Manual, G code manual, etc... They may not cover everything, but I feel like they are pretty decent. Try reading Fanuc manuals! The problem is, as with most anything like this, the only way to REALLY understand the system is to read every one of the manuals, cover to cover, and then read them all again. Sometimes several times!
And the manuals keep getting bigger. I just updated the G code manual with a whole lot of things for the newest development builds. 3784 is on the FTP site if any are interested.
Steve