I have found many times that the Modbus addresses given by the manufacturer are one greater than the actual addresses you must send to the device to request that particular register. For example, the CLICK PLC Tag Browser lists DS1 as Modbus address 400001, but to read this register you must request address "0".
I think the problem a lot of people get into and don't fully understand, and documentation doesn't help, is that in Modbus, you have both a register and an address. In the old days, you dealt directly with Addresses, and in computer world, everything is 0 based. Registers are usually 1 based. Because of this, and the slight difference in definition, this has caused confusion. Just be aware of the issue, and you should be fine figuring out any issues you encounter, but be sure to test consecutive registers to ensure you are getting what you expect.
As an aside, while many people just "add 1" to the address, better practice would be to see if your software will automatically adjust the values for you. Typically, there is a setting for 1 vs 0 based addressing somewhere. It is better to keep the values the same on your side and the PLC/device side so people don't get confused.
One other point to make. Modbus will support 16 and 32-bit values, but not 64-bit natively. If you run into a situation where you have a 64-bit value (double precision float, a long INT, or something like that), just remember you need to tell modbus to scan 4 words (16-bit x 4) and then figure out how to "put it back together" to get what you want. I ran into a situation like this where we were scanning a 64-bit accumulator and had to piece it together so we could actually read it. Likewise, if you are doing STRINGS, this is also just consecutive registers, with 2 characters per word (each character is 1 byte, or 8-bits), you just need to read multiple registers to get the full string, which typically what I have found, defaults to 16 characters, or 8 words normally (you can make them longer or shorter, but you need to define it that way). If you have control over the end device, this is a great way to ensure you have all of your 0 vs 1 addressing, byte and word swapping correct.