259
ICC
11.12.2.2.3 Coil & Discrete Input Mappings
The Modbus RTU slave driver provides read/write support for coils (0X
references) and read-only support for discrete inputs (1X references). These will
collectively be referred to from here on out as simply “discretes”. Accessing
discretes does not reference any new physical data: discretes are simply indexes
into various bits of existing registers. What this means is that when a discrete is
accessed, that discrete is resolved by the gateway into a specific register, and a
specific bit within that register. The pattern of discrete-to-register/bit relationships
can be described as follows:
Discrete 1...16 map to register #1, bit0...bit15 (bit0=LSB, bit15=MSB)
Discrete 17...32 map to register #2, bit0...bit15, and so on.
Arithmetically, the discrete-to-register/bit relationship can be described as follows:
For any given discrete, the register in which that discrete resides can be
determined by Equation 11:
+
=
16
15
discrete
register
Equation 11
Where the bracket symbols “
” indicate the “floor” function, which means that
any fractional result (or “remainder”) is to be discarded, with only the integer
value being retained.
Also, for any given discrete, the targeted bit in the register in which that discrete
resides can be determined by Equation 12:
16
1
discrete
bit
%
)
(
−
=
Equation 12
Where “discrete”
∈
[1…65535], “bit”
∈
[0…15], and “%” is the modulus operator,
which means that any fractional result (or “remainder”) is to be retained, with the
integer value being discarded (i.e. it is the opposite of the “floor” function).
Conversely, for any bit in a register, the targeted discrete corresponding to that
bit can be calculated by Equation 13:
(
)
1
1
16
+
+
−
×
=
bit
register
discrete
Equation 13
For clarity, let’s use Equation 11 and Equation 12 in a calculation example. Say,
for instance, that we are going to read coil #34. Using Equation 11, we can
determine that coil #34 resides in register #3, as
3.0625
=
3 r1
= 3. Then,
using Equation 12, we can determine that the bit within register #3 that coil #34
targets is (34-1)%16 = 1, as 33%16 = mod(2 r1) = 1. Therefore, reading coil #34
will return the value of register #3, bit #1.
Note that discretes are mapped to registers, not database addresses. The
location of a given register in the database determines what physical address the
discrete will access. Because of this, it is possible to indirectly remap discretes
using register remap objects. If a register has been remapped to an alternate
database address, then the discretes that map to that register will also be
remapped to that alternate address.