For those who find this thread and wonder what happened here, I have written out the how first three floating point values were read incorrectly and incorrectly. The problem was reading one word (16bits) from one floating point value and the 2nd word (16 bits) from another floating point value.
The issue is that this could happen to anyone who wasn't sure what the exact value should be because all the values are 'close enough', but 'close' isn't Modbus.
Typically the word and byte swap that are used results in values that are so bizarre that it's an instant flag that something's wrong. But given the range of values, the results here are so 'close' it's scary.
I know if I thought that the flow rate was about 7100 lpm and got 7070, I 'd figure that the flow rate had changed, not that I was reading the wrong registers and making a fake value.
Unfortunately these Modscan screen shot with correct values shows integers in each register, not a floating point that skips each alternate register. So this explanation starts with the FP words as integers, converts to Hex and shows the FP when different registers are combined.
This screen shot shows the intended, correct values:
This screen shot shows the incorrect floating point values:
This screen shot shows the integer values for each register, which I've used to show how reading one word from one FP value and the other word from the next FP value can create his situation:
By reading from (4)2561, the correct values are read:
(4)2560 0 = 0000(h) No read
(4)2561 18026 = 466A(h) 466A 6000h = 15000.0 decimal
(4)2562 24576 = 6000(h)
(4)2563 17696 = 4520(h) 4520 4000h = 2564.0 decimal
(4)2564 16384 = 4000(h)
(4)2565 17999 = 464F(h) 464F 0800h = 13250 decimal
(4)2566 2048 = 0800(h)
When read from (4)2560 (word swapped) the incorrect values are read because one word comes from one FP, the other word comes from the next FP:
(4)2560 0 = 0000(h)
(4)2561 18026 = 466A(h) 466A 0000h = 14976 decimal (incorrect, should be 15000)
(4)2562 24576 = 6000(h)
(4)2563 17696 = 4520(h) 4520 6000h = 2566 decimal (incorrect, should be 2564)
(4)2564 16384 = 4000(h)
(4)2565 17999 = 464F(h) 464F 4000h = 13264.0 decimal(incorrect, should be 13250)
(4)2566 2048 = 0800(h)
(4)2567 17885 = 45DD(h) 45DD 0800h = 7073.0 decimal (incorrect, should be 7100)
Reading this data stream with Wireshark would not reveal a problem because the problem is interpretation of the received data. There was nothing wrong with the received data, the problem is its interpretation. The interpretation of the same, identical data set produces different values depending on the word order and starting register.