I don’t think the documentation for the **Real to Int** and **Int to Real** blocks in Unitronics UniLogic is very clear, so here’s my explanation:

## Real to Int

- r2i_REAL_in (Data type: REAL):
- The real number to convert.
- r2i_Precision_in (Data Types: UINT8, UINT16, UINT32):
- Number of decimal places to add to the fractional part.
- r2i_INT_out (Data Types: INT8, INT16, INT32):
- this is the integer part of
**r2i_REAL_in**, no matter what the value of**r2i_Precision_in**is. - r2i_frac_out: (Data Types: INT8, INT16, INT32):
- This is the fractional part of r2i_REAL_in, rounded to the specified number of decimal places, multiplied by 10^( r2i_Precision_in ).

There’s a special case when **r2i_Precision_in** is 0 (ie. round to the nearest integer): when the magnitude of th fractional part is less than 0.5, it will be 0, otherwise it will be 1 or -1, (the same sign as **r2i_REAL_in**). To get the correctly rounded number, you need to add **r2i_frac_out** to **r2i_INT_out**

The behaviour when the number is too big to fit into either of the integers seems to be inconsistent. If r2i_INT_out is an INT32, then it will 2 147 483 647 if **r2i_REAL_in** is bigger than that, or -2147483648 if **r2i_REAL_in** is smaller than that. INT16s and INT8s sometimes overflow instead. (i.e. 128 becomes -128 if **r2i_INT_out** is an INT8), but it doesn’t do this for all values). I’d avoid using this function in this situation if at all possible.

Examples:

r2i_REAL_in | r2i_Precision_in | r2i_INT_out | r2i_frac_out |

123.456 | 3 | 123 | 456 |

123.500 | 1 | 123 | 5 |

123.500 | 0 | 123 | 1 |

-0.03 | 2 | 0 | -3 |

-12.75 | 3 | -12 | -750 |

-12.75 | 0 | -12 | -1 |

## Int to Real

- i2r_INT_in (Data Types: INT8, INT16, INT32):
- Integer part of value. Not actually necessary, because you can do everything without it.
- i2r_FRAC_in (Data Types: INT8, INT16, INT32):
- This is the only way to populate it the fractional part of the output, but it will also contribute to the fractional part.
- i2r_DECPOS_in (Data Types: UINT8, UINT16, UINT32):
- This controls how
**i2r_FRAC_in**is intepreted. Values above 7 result in the fractional part being ignored. - i2r_REAL_out (Data type: REAL):
- The Real output value. This is calculated as:
**i2r_INT_in**+**i2r_FRAC_in**/ 10 ^ (**i2r_DECPOS_in**)

Examples

i2r_INT_in | i2r_FRAC_in | i2r_DECPOS_in | i2r_REAL_out |

156 | 456 | 3 | 156.456000 |

0 | 456 | 2 | 4.560000 |

13 | 214 | 2 | 15.140000 |

0 | 2147483647 | 7 | 214.748400 |

0 | 2147483647 | 8 | 0 |