I completely agree with adamg. That is why it is so important to have a Modbus test program. I use Modbus Tester by Omni - freeware (Oil and Gas Measurement company). You can verify that you are sending the correct information, and actually VIEW the raw bytes which are being sent between the devices. I recommend an RS485 - RS232 converter module so that you can sniff the data passed between the devices from your computer.
I am attaching a screenshot which shows the Transmit Message and the Receive Message. You can also use the Communications Log to Sniff external messages.
In this way, you can check to see if you are sending a valid request. If my photon sends my rpi Modbus simulator the message: 0B 03 00 65 00 16 D4 B1
I know that the simulator should respond, because it responds when my test program sends that exact message. Along the same lines, if I'm sniffing the messages that my photon is sending my rpi Modbus simulator, and I'm not sending the same message, then I know I have a potential problem with my photon Modbus configuration. Address offset as adamg mentions, or something else.
I hope the message poster and others don't find this condescending, it is not intended that way. I just wanted to illustrate a very clear way to verify A) Figuring out exactly what works and B) Verifying EXACTLY what you are sending the device.
I am working on my own Modbus / Other Serial Protocol library and will likely need some help with that in the future, but I know that being able to see the raw data between the two devices is imperative for working with Serial Protocols.
(Also, as a final thought, if you can't parse through raw HEX Modbus requests and responses, you might work through that. I always have to pull up the Modbus protocol spec as a refresher when I start messing with this stuff...)