Most PLC people do not need to know the bits on the wire. For example, what is the Do-more address at the protocol level for T19.Acc? Unless you are implementing the protocol, you just program your HMI for T19.Acc - you don't even look at what's on the wire.
Modbus is the same. You want to read Modbus Holding Register 40001. Nowhere will you see the value 40001 in the bytes at the protocol level (not should you care, as a user). It is actually sent as a Function Code "Read Holding Register", which eliminates the "4" part of the address. You are left with the offset, which is the first offset, which is 1. Modicon registers/coils/etc. start at 1, at the user level. HOWEVER, at the protocol level (which users don't need to know), Modicon offsets start at 0, hence, you subtract 1 from the "Application Layer" address (i.e. 1), and at the packet leve, it ends up being 0.
That is the "official, specified" way of doing it. There are many vendors (I don't want to name any) who don't do it based off the spec. They push the low level offset up to the user level, and their addresses start at 0 (not 1). Imagine specifying T19.Acc as 0x1234 (or whatever it is). You'd be pulling your hair out.
There are even some Modbus devices out there that use the FULL 40001 address as the "offset". Yes, they literally implemented their first Holding Register at protocol offset 40001 (possibly 40000

). So, technically, their application layer holding register address is 440001, where the first 4 is the type, and the 40001 is the offset. Doh!