Daniel Gould Modbus to Modicon


Thread Starter

Manos Economou

when we want to collect one Floating value (32bit) from a Flow-Computer, we send a query for two registers (each one 16 bit) and the Flow-Computer, Modbus Modicon standard, answer back two registers (each one 16 bit), where is stored the Floating Value. At this point the RTU40 and RTU20, elaborate the two registers and put available the floating value, in the specific area, for the Hosts.

When we are connected with a Daniel Flow-Computer and we try to query one Floating value, asking two 16 bit registers, the Daniel answer ever with two registers, but each one 32 bit long. So, the answer to our query is 8 bytes (two Floating value), instead of 4 bytes (one Floating value). The result is "checksum error".

The similar behaviour we noted asking four 16 bit registers (64 bit value) for one Double Floating value storted in the Daniel. The response of the Daniel is 32 bytes long.

If inside the Daniel are configured same Integer 16 bit data type, we can collect them using the standard Modicon Function Codes. In this case, infact, the Daniel answer back one 16 bit register, if the Function Code asks one register.

Is there a driver or a device splitting the 32bit register of the Daniel into two 16bit registers?

Thanks in advance!

Frank O'Gorman

At least 5 ways of handling 32-bit and 64-bit numbers have been used in Modbus devices - I consider the method used by Daniel's devices to be the best, and that used by Modicon devices (numbers split into 16-bit registers and sent litle-endian) to be the worst. But whichever is best, the methods are all incompatible. There's a fuller discussion at:


Converting from the Daniel 32-bit and 64-bit registers to 16-bit registers would require a total re-mapping of register addresses (each Daniel address would need 2 or 4 corresponding 16-bit addresses), and I don't know of any device or driver that will do this.

However, we do write custom software... :)

Wingpath Limited
Software development in Java and C/C++ for Linux

Lynn at Alist

I am not sure about Daniels, but some of the others (like OmniFlow) include an option to convert responses to 16-bit regs. I think in Omni it's an option called "Modicon Compatibility Mode" or something like that. Once enabled, a request for 2 x 16-regs for a single float returns the 32-bits expected, not 2 x 32-bit regs.

Otherwise you'll need to buy a device to sit in the middle and convert these for you.

- Lynn
I had this problem with an opc server from kepware last year. They initially had the same problems you describe but they changed the driver and added specific support for the Daniels and for the OmniFlow we were using. Since then they have added other features specific to the Omni, some of them were driven by us. Their driver now seems to support most of the Omni data types directly. I think they may be adding support for all the omni text reports as well.

One of the guys over there said they get a kick out of the many interpetations of Modbus, but they go with the flow. I think a pun was intended.

I don't think you're using an opc server but this one seems to work.

Jerry Miille

The MARC Omnii-Comm can do this. Get additional details at
http://www.miille.com/PCds.htm. There are several models of Omnii-Comm.

If you have additional questions you can contact me at [email protected]

Jerry Miille
Miille Applied Research Co., Inc.
1730 South Richey
Pasadena, Texas 77502

713-472-6272 (voice)
713-472-0318 (fax)
The answer depends upon how well conversant you are with configurations of the Daniel Spectra 600 flow computer.
The DS600 does support 2x16 bit floating point values over standard Modbus, but requires some level of configuration in the Modbus editor. For people who have undergone a training on this, it should be easy.

Just set the field Addr/Item against the parameter in the Modbus editor to 2 if you want to use 2 registers for single precision floating point and to 4 if you want to use Double precision float. This will configure the DS 600. And ensure that you do not get overlapping addresses between two parameters else the information received would be totally invalid. Of course, you will have to download the new config to the unit before this would work.

Hope this helps.

Alok Khatlawala

The Spectra 600 does support true Modbus representation for single as well as double precision floating points. For configuring this, you need to know how to work on the Config 600 programs available through Daniel.

I assume that you are in the Modbus Config package.
Select the variable which is required to be made as 2x16 bit so as to represent a single precision floating point number. Right click to get the properties and select Format. and click on FLOAT (if not done already) and in ADDR/ITEM, enter a value 2 in place of the existing 1.
This will assign 2 registers to depict one single precision floating point variable.

Similar for Double precision floating point.

Remember however, that when you do this, do not let the addresses of one variable overlap with another, else whatever you would get would be only junk data. e.g. if Register 7000 and 7001 are for one variable, do not assign 7001 and 7002 to the next variable. This variable has to be e.g. 7002 and 7003.

Hope this helps
clarifation in my oppinion:

The 'Daniel' (and Omni)7001 registers are all 32 bit floating point numbers. Daniel 5001 are long intergers (32 bit), To get the result, you only need to ask for function code (03) adress(7001) range (+1) and you will be rewarded with a single 32 bit floating point number (in ieee format I think). For example 7002 would hold the next floating pint number, NOT the rest of 7001.

This Daniel modbus format is actually not compatible with the Gould Modicon Modbus format.
They are quite different. there is a possibilty that they are more compatible in 8 or 16 bit mode, I dont know though.

To get the floating point (or a long interger 32 bit) number using modicon you need to get the data from two consequtive holding registers using (for example) the 40001 format, you would have to ask for two addresses ( for example 40001 +2) to get the 32 bit number. In some systems this may be entered as function code (03) register (001) range (1).

In addition, the floating point format between modicon and daniel are different orders, in some cases. In fact the byte order between modicon floats (lsb first)and long integers(msb first) is different I beleive.