We have Honeywell TPS System, using HPMM with Serial Interface (SI IOP). I am reading data over 485 Modbus RTU. I am trying to get floating point data, using 30000 range it shows FOR 37 mg/L a value of 19197 which has to be converted to FLOAT to show 37 mg/L which I need to display. If I use any other series i.e. 20000, 70000, 80000 I get error EX - 3.
Modbus just carries the bits from the slave to the master. It's up to the application (not Modbus) to interpret the bits. Knowing what the bits represent is the first step.
I can't tell you what 19197 represents (but it looks like a single 16 bit Modbus register integer value).
You need to do some research in the slave's Modbus documentation and find out what 19197 represents. How is the data value (a concentration value? xx mg/L) formatted? How many bits is the value (one register of 16 bits?)?
Is it a single register value, 16 bit data word that is an integer value? Does the raw integer value need to have some math factor applied, like divide-by-10 or divide-by-100 (essentially moving the decimal point to the left). Is it signed or unsigned?
Or is a count of A/D bits, say, from plus/minus 0 - 32,767 or unipolar 0 - 65,536? If an A/D count, is it from a 4-20mA signal where zero PV engineering units of 4.0mA is an A/D count of 13,107 counts for 16 bit span or 6,554 counts for a 15 bit span?
What span does the concentration cover? 0 to xxxx mg/L?
I don't know what you mean by a 30000 range? or 20000 or 70000 range? Range of what?
>The 19197 value might also be an integer representation of
>16 bits of a 32bit floating point value.
It is the representation of a 32 bit Floating point value.F or example at the moment on the DCS I am getting the two registers for Modbus address 30657 as:
The Hex representation of this is 0x42190000.
So when I convert this Hex to Float I get 38.25 which is the value I want to display.
But the problem I have is that Honeywell TPS for some reason is not converting the value to 32 bit float.
There are different modbus indexes to use i.e.
30001-39999 is READ INPUT REGISTERS for SIGNED INTEGER WORD
70001-79999 is READ HOLDING REGISTERS for IEEE FLOATING POINT (32 bit)
80002-89999 is READ HOLDING REGISTERS for IEEE FLOATING POINT ADDRESS - 1 (32 bit)
20001-29999 is READ HOLDING REGISTERS for WORD SWAPPED IEEE FLOATING POINT
I am only able to communicate to the device using address range 30001-39999, if I use any other range I get an error EX-3.
The problem is that the SI-FTA only supports conversion to IEEE floating points from data stored in Holding Registers. Your data is stored in Input Registers.
Unfortunately there isn't an easy way around this. Perhaps the easiest solution is to ask your vendor to remap the data as Input Registers. Failing that you could use a PLC, PC (or Raspberry Pi!) as protocol converter, or maybe try an AppNode with OPC Server.