По ОРС принимаю из контроллера число в формате UDINT, все разряды значащие, младшие разряды потерять нельзя, т.е. real не подходит. В любом другом варианте не могу получить правильное отображение значения. Показательный пример: 7F FF FF FF (+2147483647) отображается как -2147483648. При этом младшие разряды явно теряются: при изменении входного значения в младшем разряде, все равно отображается -2147483648. Пробовал использовать каналы HEX32, DF не помогает, пробовал всячески преобразовывать - безрезультатно. Данные принимаются правильно - значение канала HEX32 в формате "по умолчанию" отображается правильно. Проверял в профайлерах 6.06, 6.07, 6.08.
[ 14.08.2012, 12:45: Сообщение отредактировал / Message edited by AdAstra Technical Support ]
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
Для отображения значения канала HEX32 на экране в формате UDINT достаточно задать именно такой тип аргумента и задать формат отображения в ГЭ "Текст"
Generic %u (см."Приложениея/Форматы/Формат Си вывода чисел"). Проверено в 6.08.
Posted by Сергей Морозов (Участник № / Member № 2076) on :
Извините, неправильно сформулировал основную проблему, вопрос по отображении возник в процессе. Изначальная проблема - не могу корректно передать в базу данных число UDINT, полученное от контроллера. Без проблем передается диапазон от 0 до 9, дальше или не передается вовсе или искажается. Без проблем можно передать в текстовое поле в формате HEX, но желательно получить в базе целое десятичное число.
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
В отличие от остальных передач в аргументы запроса SQL передаются строковые выражения. Канал HEX32 имеет только 2 формата: - по умолчанию - HEX, - при установленном флажке DEC - DINT. Необходимо осуществить преобразование форматов. При привязке к экрану по указанной выше методике преобразование осуществляет экран. Вам придется организовать пересылку значения канала HEX32 (по умолчанию) в аргумент SQL-запроса в формате UDINT. Это можно выполнить либо программно, либо с помощью канала CALL.MOVE.
Posted by Сергей Морозов (Участник № / Member № 2076) on :
Создаю канал HEX32, привязываю его к источнику; создаю канал CALL.MOVE с аргументами IN и OUT, оба UDINT; IN канала CALL.MOVE привязываю к реальному значению канала HEX32; в базе данных создаю поле типа длинное целое, с плавающей точкой двойной точности или текстовое; создаю запрос, привязываю поле базы к аргументу OUT канала CALL.MOVE. В результате: в версии 6.06 числа с единицей в старшем разряде в базу данных пишутся как отрицательные (для любого типа поля базы данных); в версии 6.08 все пишется правильно (кроме поля базы "длинное целое"), но мне очень желательно добиться результата в версии 6.06. Можно как то решить проблему?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
"В версии 6.08 все пишется правильно (кроме поля базы "длинное целое")"
При передаче значений в базу данных по описанной схеме в релизе 6.08 проблем быть не должно. Проконтролировать значение, отправляемое Trace Mode можно, включив трассировку ODBC.
Необходимо обновить релиз до 6.08.
Posted by Сергей Морозов (Участник № / Member № 2076) on :
Спасибо, в 6.08 "длинное целое" заработало после удаления-повторного создания CALL.MOVE.