"that would not be correct "
The concept is there, I just read it as 2 decimal places instead of 3.
Please re-read your example.
You said FOUR registers make up a single DINT.
A DINT is 32 bits.
32 bits divided by 4 equals 8bits.
Therefore your registers would be bytes.
You then define
A,B,C,D all as 2 digit integers, all within the range of a byte (2^8 = 256)
You then show all of those representing a continguous number.
In your second post, you then define all the registers as 4 digit integers.
Therefore A,B,C,D are now integers instead of bytes.
In this sense the original post was ambiguous.
---------------------------------------------------------------------------------
Now, getting back to the actual problem.
Lets assume that your registers are copied into an array of 4 16bit integers.
Lets name it ModWord, so you have ModWord[0], ModWord[1], ModWord[2], ModWord[3]
You can copy them in in any fashion you wish with the MSG block.
Let's make one "REAL" and call it "Answer"
All you need is one single CPT Function Block.
Set Destination as {Answer}
Set Expression as {0.001*ModWord[0]+10.0*ModWord[1]+100000.0*ModWord[2]+1000000000.0*ModWord[3]}
It will work in all cases.
One network.
One Function Block.
If instead you are working with Two DINTs instead, you would then have ModDint[0], and ModDint[1]
Set Expression as {0.001*ModDint[0]+100000.0*ModDint[1]}
Even simpler than before.
------------------------------------------------------------------------------
Now think about the ASCII solution.
Basically the controller has to convert your numerical characters to ASCII.
To do this it has to take each one of the digits, add 30hex to it, and make an array of contiguous bytes to store the characters.
Now it has to Move all those smaller groups of bytes into one large group of contiguous bytes.
Now it has to Convert it back into a number.
So your using an ASCII to INT instruction.
What does the ASCII to INT instruction do?
It has to subtract 30hex from each and every character to convert them back to numbers.
Then what does it have to do?
1*n0+10*n1+100*n2+1,000*n3+10,000*n4+100,000*n5+1,000,000*n6+10,000,000*n7+100,000,000*n8+1,000,000,000+10,000,000,000*n9+ ............ for all 16 digits. (I ran out of gas trying to type them all)
This should look familiar, because in large part it right back where we started from.
The only difference is the controller has to do a lot more work to get the same answer.
But now your still not even done, because you still have to divde that last number by 1000 to get your decimal places.
I can't image you would be able to find a simpler solution than below.