| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
sozon Новичок


Зарегистрирован: Jun 28, 2006 Сообщения: 8 Рейтинг: +0/-0
|
Добавлено: Ср 04 Авг, 2010 8:32:48 Заголовок сообщения: RSView32 порезал float |
|
|
Из SLC в RSView32 прописан тег Floating point типа.
Так вот, при значении тега в SLC 1026411,1 во вьюхе имеем 1026410,0
Причем, при значениях до мильена(6 знаков в целочисленной части) все отображается верно(в SCL ххххх.х и во вьюхе ххххх.х).
При мониторинге тега выдалось значение 1.02641E+006.
Может потому что тут после запятой 5 знаков всего, то остальные знаки слетели в ноли после шести знаков?
Помогите побороть сие.
настройки тега в Tag DB
min 0.0
max 1.e+038
scale 1.0
offset 0.0
тип floating point |
|
| Вернуться к началу |
|
 |
maxim Эксперт


Зарегистрирован: Feb 16, 2007 Сообщения: 123 Рейтинг: +7/-0 Откуда: Енакиево
|
Добавлено: Ср 04 Авг, 2010 10:22:25 Заголовок сообщения: |
|
|
| Здравствуйте, попробуйте ограничить количество знаков после запятой. Если у вас требуемая точность одна десятая - зачем требовать точность пять знаков после запятой? Попробуйте например в Numeric Display в Decimal Places поставить 1. Получиться ли у вас точно отобразить тег? Удачи. |
|
| Вернуться к началу |
|
 |
sozon Новичок


Зарегистрирован: Jun 28, 2006 Сообщения: 8 Рейтинг: +0/-0
|
Добавлено: Ср 04 Авг, 2010 10:38:36 Заголовок сообщения: |
|
|
Здравствуйте.
Я не требую точности 5 знаков после запятой.
Numeric display (про который я и не упоминал) у меня с параметрами: 8 разрядов, 1 знак после запятой, Floating Point, с экспонентой.
Но и в нем (дисплее) значение тега не 1026411,1 а 1026410,
Ноль после запятой не влез, при 9 разрядах влазит - 1026410,0, но все равно не тот результат.
Вопрос вот в чем: можно ли донести более 6 разрядов в числе из SLC до вьюхи?
Отсюда -можно ли замониторить значение тега (float) с большим количеством используемых разрядов, т.е. если макс - 1.e+038, могу ли я замониторить тег равный например: 123456789,1234 в таком виде, а не в сокращенном? |
|
| Вернуться к началу |
|
 |
ITop Частый гость


Зарегистрирован: Apr 19, 2010 Сообщения: 15 Рейтинг: +1/-0
|
Добавлено: Ср 04 Авг, 2010 11:24:15 Заголовок сообщения: |
|
|
Проблема тут видится в ограничении чисел типа float, 32-битных.
У них на мантиссу всего 23 бита (и ещё оди н на знак). 23 бита - это всего 7-8 десятичных цифр (в зависимости от числа). Все остальные числа после запято могут появиться только как результат преобразования двоичного числа с плавающей точкой в десятичное с символьным (строковым) представлением.
Кроме того, столько будет, если число нормализованно. После какой нить математической операции оно станет ненормализованным и младший разряд мантиссы может отрезать или в нём будет наблюдаться ошибка.
Тут ещё всё зависит от того, сколько и каких преобразований делается над числом перед его выводом на цифровой дисплей.
Я бы вообще на вашем месте не заморачивался с значениями в младшем (8-м) десятичном разряде. Числа Float одинарной точности вообще не очень подходят для точных рассчётов. |
|
| Вернуться к началу |
|
 |
sozon Новичок


Зарегистрирован: Jun 28, 2006 Сообщения: 8 Рейтинг: +0/-0
|
Добавлено: Ср 04 Авг, 2010 11:53:53 Заголовок сообщения: |
|
|
Непонятно.
Переформулирую вопрос.
Дано: есть значение тега в SLC 1026411,1.
Какого типа создать тег в RSView32 чтобы работать со значением 1026411,1, а не 1026410,0 и не 1.02641E+006? |
|
| Вернуться к началу |
|
 |
ITop Частый гость


Зарегистрирован: Apr 19, 2010 Сообщения: 15 Рейтинг: +1/-0
|
Добавлено: Ср 04 Авг, 2010 12:39:55 Заголовок сообщения: |
|
|
Можно попробовать исходный тег умножить на 10 затем положить в тег типа LongInt и выводить его без запятых, а запятую затем дорисовывать.
Сначала надо выяснить на каком этапе теряются младшие разряды. Если непостредственно при выводе float в поле, то вариант выше может сработать. |
|
| Вернуться к началу |
|
 |
ITop Частый гость


Зарегистрирован: Apr 19, 2010 Сообщения: 15 Рейтинг: +1/-0
|
Добавлено: Ср 04 Авг, 2010 12:47:05 Заголовок сообщения: |
|
|
Ну и для лучшего понимания чисел с плавающей точкой:
Число 1026411,1 вообще невозможно записать в таком формате. Ближайшие приближённые числа 1026411,125 и 1026411,0625.
Это RSLogix500 при выводе на экран округляет по десятичным разрядам. |
|
| Вернуться к началу |
|
 |
sozon Новичок


Зарегистрирован: Jun 28, 2006 Сообщения: 8 Рейтинг: +0/-0
|
Добавлено: Чт 05 Авг, 2010 3:16:34 Заголовок сообщения: |
|
|
| ITop писал(а): | Ну и для лучшего понимания чисел с плавающей точкой:
Число 1026411,1 вообще невозможно записать в таком формате. Ближайшие приближённые числа 1026411,125 и 1026411,0625.
Это RSLogix500 при выводе на экран округляет по десятичным разрядам. |
Обоснуйте. |
|
| Вернуться к началу |
|
 |
ITop Частый гость


Зарегистрирован: Apr 19, 2010 Сообщения: 15 Рейтинг: +1/-0
|
|
| Вернуться к началу |
|
 |
oldDad Site Admin


Зарегистрирован: May 05, 2005 Сообщения: 2773 Рейтинг: +89/-5
|
Добавлено: Сб 07 Авг, 2010 13:46:56 Заголовок сообщения: |
|
|
| ITop писал(а): | | положить в тег типа LongInt |
В SLC нет ни тэгов, ни формата Long Integer.
Я бы умножил на 10, разместил во float, а запятую нарисовал.
2 sozon
Вообще, разница между 1026411,1 и 1026410,0 составляет примерно 0,0001%. Что Вы такое считаете с такой точностью? Может быть, Вашу задачу можно (и нужно) решить с другого конца? _________________ Обращайтесь к профессионалам. |
|
| Вернуться к началу |
|
 |
ITop Частый гость


Зарегистрирован: Apr 19, 2010 Сообщения: 15 Рейтинг: +1/-0
|
Добавлено: Пн 09 Авг, 2010 6:14:49 Заголовок сообщения: |
|
|
| Цитата: | | В SLC нет ни тэгов, ни формата Long Integer |
Речь была про RSView32, в котором скорей всего и проблема. |
|
| Вернуться к началу |
|
 |
|