I don't use Arduino, but I'm sure you can make a counter to handle this instead of using inputs.
On the current machine I'm working on, this is what I'm doing. I start the tool change sequence in Mach4, I move the Z Up to the tool change position and make sure the spindle and coolant are off as well as any other task that Mach4 can take care of; then I send a register # over to the PLC via Modbus; this register # is the requested tool; in the M6 Macro, I now wait for the PLC to finish rotating my carousel. You can use the following API Call to wait for an input to become true before continuing, or if it times out, then you can do something else.
rc = mc.mcSignalWait(inst, mc.ISIG_INPUT21, 1, 5) --Wait 5 seconds for input 21 to become active
if (rc~= 0) then --Check our return call
mc.mcCntlSetLastError(inst, "There was an error")
end
My carousel has an index switch, so it counts the number of rotations and stores that inside a register in the PLC. So as it rotates, it counts up or down until the current carousel position counter equals the requested tool number sent over from Mach4. Once it reaches that position, it turns on an output inside the PLC which is read as an input in Mach4, this input correlates with my mc.mcSignalWait call and it can continue with the macro.
Then again, you can do exactly as you suggest, have a bunch of inputs you can use for the arduino. I have an old hurco that has a lot of proximity switches that tell me what current tool position I am on in the carousel; It has a 20 tool position carousel, so 20 inputs telling my PLC what to do. I have my PLC look for the correct sequence of inputs that tells my register that it is a certain number and I do the same thing as stated above, once the current carousel position and the requested tool registers equal, then it sends a signal to mach4 to continue the m6 macro.