This is topic Сохранение в Базу Данных дробных чисел in forum Работа с приложениями (ODBC-SQL/OPC/DDE) at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/41/t/000116.html

Posted by Gennady (Участник № / Member № 6305) on :
 
Доброго дня!

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

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

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

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

Мне нужна запись дробных чисел в БД с точность до 5 знаков после запятой.
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
Какой релиз TRACE MODE Вы используете?

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

В актуальном релизе (6.10.2) данная проблема устранена.
 
Posted by Gennady (Участник № / Member № 6305) on :
 
У меня используется старая версия 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
 
Posted by Nico (Участник № / Member № 5342) on :
 
формат плавающего числа установить нужный
как в БД так и в TM
 
Posted by Gennady (Участник № / Member № 6305) on :
 
Nico подскажите пожалуйста где в Тrace Мode это можно сделать?
 
Posted by Nico (Участник № / Member № 5342) on :
 
вообще-то мантисса плавающих числ 23 бита
 
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
 
У чисел с плавающей точкой есть мантисса (целое число фиксированной длины). Для 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.
 
Posted by Gennady (Участник № / Member № 6305) on :
 
Спасибо за разъяснение

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

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

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

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

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

Или нужно между программой и БД применить промежуточный канал double_float?
 
Posted by АдАстра. Техподдержка (Участник № / Member № 4) on :
 
Верно.
Канал вызова шаблона Программы (аргумент OUT, без привязки) - канал DFloat (привязка к атрибуту канала вызова шаблона Программы, начиная со 140) - Канал Call.SQLQuery (привязка к Реальному значению канала DFloat)

В канале DFloat в артибут 246,VFRMT подать число от 1 до 7, для изменения формата отображения.
 
Posted by Gennady (Участник № / Member № 6305) on :
 
Тогда скажите пожалуйста где в этой цепочке Связь с СУБД ? ( с её аргументами и запросом)

Мне ведь нужно в базу данных сохранить
 
Posted by АдАстра. Техподдержка (Участник № / Member № 4) on :
 
Канал Call с типом вызова SQLQuery.
Он создается автоматически, как только Вы перенесете шаблон связи с СУБД в Узел.
 
Posted by Gennady (Участник № / Member № 6305) on :
 
Добрый день техподдержка!

Сделал как вы написали а именно:
1) Создал канал DFloat.
2) На вход канала DFloat привязал к атрибут программы 140 (ARG00)
3) ARG00 канала Call.SQLQuery привязал к реальному значению канала DFloat

Сейчас да в БД пишет числа с точностью Double Float. Но только ОДИН! аргумент.

У меня в программе несколько десятков аргументов нужно передать для записи в разные БД по 16 аргументов на каждую БД с точностью Double Float.

Вопрос: Мне что нужно для каждого аргумента создавать отдельный канал DFloat?

Разве нельзя как то группой или списком все аргументы передать через один канал DFloat?
 
Posted by АдАстра. Техподдержка (Участник № / Member № 4) on :
 
quote:
Отправитель / Originally posted by Gennady:

Вопрос: Мне нужно для каждого аргумента создавать отдельный канал DFloat?

Верно
 


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



Powered by Infopop Corporation
UBB.classic™ 6.7.2