Incorrect Floating point values with Delta PLC over Modbus

Hi all,
I'm having problems with reading floating point values from a Delta DVP12SE PLC over modbus. The integral part of the floating point (that means the number before the "." sign) is correct. But the fractional part (that means the number after the "." sign) is wrong. For example;
PLC = 12.1 ---------> Ignition OPC UA Server Reads = 12.062
PLC = 12.5 ---------> Ignition OPC UA Server Reads = 12.5
PLC = 12.8 ---------> Ignition OPC UA Server Reads = 12.75
PLC = 298.73 -------> Ignition OPC UA Server Reads = 298

In my Modbus device configuration in Ignition, I have disabled the Reverse Word Order and I have enabled the Span Gaps.

Highly appreciate if anyone can guide me on how to solve this issue.
Thanks

1 Like

The fact that they are close suggests that the DeltaPLC isn't supporting IEEE754 properly. You would need a wireshark capture to be sure.

Hi Pturmel,

Thanks for the suggestion, I will try this out. BTW, the accuracy of the fractional part of the floating point numbers are extremely crucial because I'm trying to monitor the servo motor position coordinates inside the PLC.


Hi Pturmel,
I just found out that the Delta PLC follows the IEEE754 standard. So I should be able to get the correct values

Show us the addresses you’re using in Ignition and the Wireshark capture.

Hi Kevin,

Please see the attached photos of wireshark capture and the registers that I'm reading. This is when the PLC D3 register value is 298.73
wireshark capture 2
wireshark capture

Thanks

This capture clearly shows 298.0.

jshell> Float.intBitsToFloat(0x43950000)
$3 ==> 298.0

Maybe you are off by one in your addressing? Or the software you're using as a reference is applying dead band or number formatting? Both of these I've seen as mistakes in the past.

2 Likes

Hi Kevin,

According to the wireshark capture, since the ignition is getting 298.0 as the data passed over the network, I did the following thing to test if there are anything wrong with the Modbus registers which I'm reading.

  1. Moved into another register called D10 in the PLC and assigned the value 900.70 to it.
    By doing this I realized that there are actually more problems that I'm facing. Please see the attached photos. I have described what I have found in the photos.


Do you think, that this issue with the addressing is causing the issue with the floating point numbers? and any reason for this addressing to behave like this?

I think you are just making things more confusing and allowing the possibility of a bug in the address mapping to distract from the underlying issue.

The Wireshark capture you got was clear, and does not leave room for any problem with the address map.

It's probably best to not use the address map at all. Create OPC tags manually and use the Modbus address syntax described in the user manual in the OPC Item Path.

In this case, the addresses would be something like: [DVP12SE]1.HRF4106 etc...

https://docs.inductiveautomation.com/display/DOC81/Modbus+Addressing#ModbusAddressing-ModbusSpecificAddressing

Thanks, I will look into this documentation..

Hi Kevin,

I created the OPC tag manually for my floating point number following the document you have provided. But still I'm getting the same problem. As you can see when I assign 60.9 to the D3 register in the PLC, Ignition is reading the value as 60.75


manual OPC UA tag 2

Sorry, I didn't really expect that to fix the floating point issue, just to avoid introducing others.

You're going to have to take the Wireshark capture to the vendor of that PLC for support. It clearly shows that when we read the two registers that need to be combined to create a 32-bit float, the PLC is returning one of them as 0, which is where your missing precision is going to.

In the original capture screenshot, the PLC returns 0x4395 for register 4100 and 0x0000 for register 4101. This makes for 298.0. In order for the value to be 298.73 the value of 4101 needs to be 0x5d71.

I'm assuming your capture shows similar behavior for all the floating point register pairs but you only shared a screenshot so I'm just assuming.

edit: and again, there's still the possibility that you are just off by one on your register addressing, and that the missing precision is in 4099 and you need "Swap Words" enabled.

4 Likes

Hi Kevin,

Sure, I will try reading 4099 register with swap words enabled as well. And if that is not successful, I will try to get the support from the PLC manufacturer end

Hi Kevin,

Yes, you are 100% correct. I found the root cause for my issue. The issue was that my Modbus addressing is actually off by one and also I had to enable the "swap Words" option in the Ignition. And now, Everything is working fine... Thank you very much for the guidance. Really appreciate your support.
Find the attached screen shots of the resolved issue;




1 Like

Sounds like you should have left one-based addressing enabled (i.e. not enabled zero-based addressing).

Actually the "Zero based addressing" was enabled from the begining, but I haven't enabled the "Swap Words" option. I think I faced this issue as a result of not enabling the "swap word" option and also the issue with my Modbus addressing, both.

Yes, I can tell from the posts it was enabled this whole time.

What I'm getting at is that if you turned it back off then you won't have to manually offset your addresses by 1 to correct them.

3 Likes

Ohhhh, got it. Thanks Kevin