I’m working with a RedLion device that treats integers as signed, and they don’t provide the function needed to convert an unsigned integer into a floating point. Here is some code that will treat the 32 bit register as an unsigned integer and convert it to a double precision float.
//convert 32 bit unsigned integer to a float (returned as a string)
// Sparky Geek, LLC July 2016
// in signed integers, negative numbers are represented by the two's complement of the absolute value
// the task for this program is to undo this situation (just ignore the two's complement format)
// check to see of the MSB (AKA 'sign bit') is set
// --- if it is, mask the MSB, read as a signed number, then add 2^31
int working;
cstring result;
int mask = 2147483647; //2^31-1, or 1 zero followed by 31 ones
if (uint_in < 0 ) // check to see if MSB is set
{
working = uint_in & mask; //bitwise AND to only pay attention to the least significant 31 bits, filter out MSB
IntToR64(tmp.TagA[0],working); //have to use tag, since we can't create a local array, convert to double precision float
TextToR64("2147483648",tmp.TagB[0]); //convert 2^31 to double precision float
AddR64(tmp.TagC[0],tmp.TagB[0],tmp.TagA[0]); //add the value 2^31 back in, since this is what we masked out earlier, store as a double precision float
}
else
IntToR64(tmp.TagC[0],uint_in); // if the MSB was zero, the function will work as it
result = AsTextR64(tmp.TagC[0]); //convert to string to pass back from program
return result;



Pingback: Convert Allen Bradley Logix 5000 Time to Unix Time (Epoch) | Brian Gallimore's Blog