I have a problem on my MODBUS network.
At the moment I just have an ARRAY AR1520U Modbus master to connect the network with my PC and one slave a Siemens RDF302 HVAC panel. I use MODScan32 to monitor.
My problem is that I can not read back the right value from the HVAC panel.
I choose an easy parameter. It is the value of the embedded thermo element which measure the room temperature. It is also visible on the panel screen. At this moment this value is 25.0 Celsius. The register which refers to contain the actual temp. value is 31003 register. When I monitor this register it shows the next --> 31003 <1240>.
I can realise this value as 12.40 Celsius, but it is just half of the original ones. How could it happen?
Thank you in advance.
You're probably reading the wrong register.
From http://www.datanab.com/docs/MBus_IO/MBus_IoFlash/help/index.html (what appears to be the documentation for the programming for unit)
"Modbus Register Addresses
The modbus registers use a 16 bit signed integer data format by default, which can be read using Modbus function code 3 (read Holding registers) . . "
Function Code 03 reads from Holding Register in the (4)xxxx memory area. A temperature value at 31003 would be an Input Register, read by Modbus Function Code 04. Now it could be that the this device internally maps to both Input and Holding Registers. But if it doesn't, then try reading 41003 (Modscan will use FC 03) to get a value from a (4)xxxxx holding register.
From my quick scan of the software, it appears that the user programs which variables reside in which Modbus registers by assigning Register numbers.
"Modbus addresses 1 to 19 are reserved for internal use. We recommend starting at register 100 or higher . . "
41003 is at Holding register (4)1003 decimal, way above the recommended (4)0100 starting register. Does that addressing agree with your understanding of the slave's register mapping? What Modbus register did you assign the Tint value?
Whoops, my mistake. You are reading from the correct default register. I finally found the regular manual with the default slave register map and the internal temperature is indeed at 31003
The key is that the register value is an integer that is 50 times the display value, which is probably rounded to whole number, as you can see in the column "Special Process" where the value is x50 (see the slave map table at the link below)
Divide the integer 1250 by 50 and voila, you get 24.8 Deg C.
I think that modbus address that you monitor are 32 bit floating point but by default Modscan monitor in 16 bit Integer. You should go to Setup -> Display Options -> Floating Pt to display address in 32 bit floating point.
I sorry for did wrong.I check manual that as David_2 said Room Temperatrue are multiply with 50 to correct value.
Thank you for the fast feedback. Yes you must be right it is multiplied with 50. So it means if I want to visualize or use this value in a control algorithm I must divided with 50 in the PLC, am I right?
Is it happen very often in Modbus communication that the transferred data is manipulated like this?
If you look in the manual for the temperature device, you will find that it has a range of 0-5000 counts = 0-100 C or a range that is in the same ratio.
This gives a reasonable resolution to the temperature measurement but means that the HMI, PLC or DCS reading this value needs to apply a range to convert from counts or integer value to actual units of temperature.
> is transferred data manipulated like this?
Yes. The precision of a measurement or calculation can be lost if a that value has to be represented merely as a whole number, so scaling factors are very commonly used to provide greater precision in the interpretation of the data. It is not uncommon to find an integer value with a prescribed fixed decimal point like * 10^-1, * 10^-2 or * 10^-3. Or, as in this case, a "divide by 50" factor.
Floating point format deals with precision to the right of the decimal point, but is not always used.