Форум TRACE MODE: техническая поддержка Послать новую тему / Post New Topic  Послать ответ / Post A Reply
мой профиль / my profile авторизация / login | регистрация / register | поиск / search | часто задаваемые вопросы / faq | начало / forum home

  Следующая старая тема / next oldest topic   Следующая новая тема / next newest topic
» Форум TRACE MODE: техническая поддержка » ТЕХНИЧЕСКАЯ ПОДДЕРЖКА / TECHNICAL SUPPORT TRACE MODE 6 » Работа с приложениями (ODBC-SQL/OPC/DDE) » Сохранение в Базу Данных дробных чисел

   
Автор / Author Тема / Topic: Сохранение в Базу Данных дробных чисел
Gennady
Junior Member / Новичок
Участник № / Member № 6305


Icon 4 отправлено / posted      Профиль для / Profile for Gennady           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
Доброго дня!

Уважаемая поддержка, я столкнулся со странной проблемой не точного сохранения в БД дробных значений. Не могу понять почему так происходит.
Если в среде разработки IDE TM6 в настройках связи с СУБД я к аргументам устанавливаю значения по умолчанию дробное число с точностью до 5 знаков после запятой. Нажимаю кнопку RUN для запроса. То в БД записывает всё точно и правильно.

Но если к выходным аргументам программы установлю константы, также дробные числа до 5 знаков после запятой. Запускаю профайлер или RTM. Делаю запрос на запись через кнопку которая шлёт номер запроса на входное значение БД.
То по непонятной мне причине в БД записывает только целую часть значения!

Тип данных везде LREAL. И обычная привязка выходных аргументов с входными аргументами БД.

Вопрос: Почему так происходит и как это можно исправить?

Мне нужна запись дробных чисел в БД с точность до 5 знаков после запятой.

Сообщения / Posts 16 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Moderator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
Какой релиз TRACE MODE Вы используете?

Вы описали проблему, которая похожа на несогласованность разделителей целой части от дробной (в одних системах "запятая", а в других "точка").

В актуальном релизе (6.10.2) данная проблема устранена.

Сообщения / Posts 15902 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Gennady
Junior Member / Новичок
Участник № / Member № 6305


Icon 1 отправлено / posted      Профиль для / Profile for Gennady           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
У меня используется старая версия 6.09. Постараюсь потестить в версии 6.10.2

Но я заметил закономерность что значения между каналами, экранами, программами передаются через привязки корректно а в БД сохраняет только 6 разрядов значений. Пример:

Если в аргументе значение: 1.12345
То в БД запишет: 1.12345 т. е. всё правильно!

Но если в аргументе: 12.12345
БД запишет:12.12350 т.е. 4й разряд после точки округлиться а 5й станет 0

Если в аргументе:123.12345
То в БД запишет:123.12300

Аргумент:1234.12345
В БД:1234.12000

Аргумент:12345.12345
В БД:12345.10000

Аргумент:123456.12345
В БД:123456.00000

Т. е. проблемы с точками и запятыми никакой нет.
В БД записывает только 6 первых разрядов.
Хотя через IDE TM6 в настройках связи с СУБД если к аргументам установить значения по умолчанию и нажать человечка
Аргумент:123456.12345
В БД так же запишет:123456.12345

Сообщения / Posts 16 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342


Icon 1 отправлено / posted      Профиль для / Profile for Nico           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
формат плавающего числа установить нужный
как в БД так и в TM

Сообщения / Posts 686 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Gennady
Junior Member / Новичок
Участник № / Member № 6305


Icon 1 отправлено / posted      Профиль для / Profile for Gennady           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
Nico подскажите пожалуйста где в Тrace Мode это можно сделать?
Сообщения / Posts 16 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Nico
Forum Professor / Завсегдатай форума
Участник № / Member № 5342


Icon 1 отправлено / posted      Профиль для / Profile for Nico           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
вообще-то мантисса плавающих числ 23 бита
Сообщения / Posts 686 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Moderator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
У чисел с плавающей точкой есть мантисса (целое число фиксированной длины). Для Float (4 байта) мантисса имеет длину 23 бита.
Максимально возможное значение мантиссы 2^23 = 8 388 608
Семь значащих символов.

В Вашем примере 12.12345 - семь значащих знаков.
Если Вы "увеличиваете" целую часть на 1 знак, то "уменьшится" количество значащих знаков после разделителя на 1. Если формат указан как "отображать 5 знаков после запятой", то допишутся нули.
123.12340 - 7 значащих
1234.12300 - 7 значащих
12345.12000 - 7 значащих

Таким образом, при работе с float (4 байта) получить больше 7 значащих чисел нельзя.

Воспользуйтесь double_float.

Сообщения / Posts 15902 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Gennady
Junior Member / Новичок
Участник № / Member № 6305


Icon 1 отправлено / posted      Профиль для / Profile for Gennady           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
Спасибо за разъяснение

Тогда подскажите пожалуйста как в цепочке:

Программа ST|аргумент OUT тип LREAL
Привязка
Связь с СУБД|аргумент IN тип LREAL

использовать точность double_float?

Насколько я понимаю тип LREAL это и есть double_float.

Но на данный момент даже с применением аргументов типа LREAL всё работает как float т. е. так как вы описали.

Или нужно между программой и БД применить промежуточный канал double_float?

Сообщения / Posts 16 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Moderator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
Верно.
Канал вызова шаблона Программы (аргумент OUT, без привязки) - канал DFloat (привязка к атрибуту канала вызова шаблона Программы, начиная со 140) - Канал Call.SQLQuery (привязка к Реальному значению канала DFloat)

В канале DFloat в артибут 246,VFRMT подать число от 1 до 7, для изменения формата отображения.

Сообщения / Posts 15902 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
Gennady
Junior Member / Новичок
Участник № / Member № 6305


Icon 1 отправлено / posted      Профиль для / Profile for Gennady           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
Тогда скажите пожалуйста где в этой цепочке Связь с СУБД ? ( с её аргументами и запросом)

Мне ведь нужно в базу данных сохранить

Сообщения / Posts 16 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
АдАстра. Техподдержка
Moderator
Участник № / Member № 4


Icon 1 отправлено / posted      Профиль для / Profile for АдАстра. Техподдержка           Редактировать/удалить сообщение / Edit/Delete Post   Вставить в ответ текст исходного сообщения  / Reply With Quote 
Канал Call с типом вызова SQLQuery.
Он создается автоматически, как только Вы перенесете шаблон связи с СУБД в Узел.

Сообщения / Posts 15902 | Из / From: Россия  |  IP / IP: IP адрес / IP address | Report this post to a Moderator
   

Quick Reply
Сообщение / Message:

HTML код не разрешен. / HTML is not enabled.
UBB код разрешен. / UBB Code is enabled.

Значки Graemlins / Instant Graemlins
   


Послать новую тему / Post New Topic  Послать ответ / Post A Reply Закрыть тему / Close Topic   Feature Topic   Переместить топик / Move Topic   Удалить топик / Delete Topic Следующая старая тема / next oldest topic   Следующая новая тема / next newest topic
 - Printer-friendly view of this topic
Перейти к / Hop To


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us

Rambler's Top100 Rambler's Top100



Powered by Infopop Corporation
UBB.classic™ 6.7.2