- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Непонятные фокусы с float и uint32
Модераторы: Глоб.модераторы, специалисты Weintek
-
- здесь недавно
- Сообщения: 24
- Зарегистрирован: 30 окт 2019, 09:57
- Имя: Евгений
- Страна: РФ
- город/регион: Нижний Новгород
- Благодарил (а): 1 раз
Непонятные фокусы с float и uint32
Имеем следующую обстановку: поле цифрового ввода в HMI и привязанную к этому полю ячейку памяти (RW или LW) определённую как float32. Далее это значение отправляется по RS-485 на другое устройство (назовём его ДУ). В этом ДУ принят 32-х разрядный формат данных. И этот формат реализован через union (язык С):
union Data_type
{
float fl;
uint32_t u32;
uint16_t u16[2];
uint8_t u8[4];
};
В общем переслав данные из цифрового поля ввода, на другом конце читаем данные из этой структуры как float.
Заметил следующее: если поле цифрового ввода на вкладке Атрибуты/формат настроено как [000.0] т.е с дробной частью, то в ДУ прочитав данные как float я получу верные данные. А если настроить поле цифрового ввода без дробной части т.е. [000], то прочитав значение в ДУ как float получаю ерунду, но прочитав значение как uint32 получаю верное значение.
Т.е. выходит так, что если поле ввода настроено без дробной части, но сама ячейка памяти определена как float32 EBP конвертирует float в uint32. Какой то непонятный фокус...
union Data_type
{
float fl;
uint32_t u32;
uint16_t u16[2];
uint8_t u8[4];
};
В общем переслав данные из цифрового поля ввода, на другом конце читаем данные из этой структуры как float.
Заметил следующее: если поле цифрового ввода на вкладке Атрибуты/формат настроено как [000.0] т.е с дробной частью, то в ДУ прочитав данные как float я получу верные данные. А если настроить поле цифрового ввода без дробной части т.е. [000], то прочитав значение в ДУ как float получаю ерунду, но прочитав значение как uint32 получаю верное значение.
Т.е. выходит так, что если поле ввода настроено без дробной части, но сама ячейка памяти определена как float32 EBP конвертирует float в uint32. Какой то непонятный фокус...
-
- здесь недавно
- Сообщения: 67
- Зарегистрирован: 01 авг 2019, 02:24
- Имя: Вячеслав
- Благодарил (а): 9 раз
- Поблагодарили: 6 раз
Непонятные фокусы с float и uint32
Не уверен, но частенько случается вот что - "общепризнанный" формат разделителя дробной части - точка. В Си, SQL точно. И не важно как вы там в HMI пишите, важно что он в свои ячейки памяти положит. Поэтому попробуйте в региональных настройках сменить тип этого разделителя. Во всех "виндах", что я встречал, там по умолчанию запятая.
-
- специалист по WEINTEK
- Сообщения: 120
- Зарегистрирован: 05 фев 2014, 12:22
- Имя: Иван Николаевич
- Поблагодарили: 21 раз
Непонятные фокусы с float и uint32
Сама ячейка памяти тип данных не определяет, это делает как раз объект отображения числа.
Но, если в объекте настроен формат float и он передает int32, то это неправильно.
Какая версия EasyBuilder?
Но, если в объекте настроен формат float и он передает int32, то это неправильно.
Какая версия EasyBuilder?
-
- здесь недавно
- Сообщения: 67
- Зарегистрирован: 01 авг 2019, 02:24
- Имя: Вячеслав
- Благодарил (а): 9 раз
- Поблагодарили: 6 раз
Непонятные фокусы с float и uint32
Вы делали обратный инжиниринг IDE?
Вот как рассуждаю я:
HMI принимает каким то образом данные от юзера
каким то образом промежуточно хранит их
далее формирует пакет
откуда уверенность, что на каком то из последних 2х этапов, Runtime не использует инструменты API Windows или тот же .Net?
Я признаться с этой IDE не знаком, и поэтому сразу занял позицию - не уверен )
-
- освоился
- Сообщения: 233
- Зарегистрирован: 11 апр 2013, 13:22
- Имя: Вишневский Денис
- Благодарил (а): 11 раз
- Поблагодарили: 13 раз
Непонятные фокусы с float и uint32
да скорее всего из-за знака, float - может быть отрицательнымNumber17 писал(а): ↑10 фев 2020, 15:19 В общем переслав данные из цифрового поля ввода, на другом конце читаем данные из этой структуры как float.
Заметил следующее: если поле цифрового ввода на вкладке Атрибуты/формат настроено как [000.0] т.е с дробной частью, то в ДУ прочитав данные как float я получу верные данные. А если настроить поле цифрового ввода без дробной части т.е. [000], то прочитав значение в ДУ как float получаю ерунду, но прочитав значение как uint32 получаю верное значение.
Т.е. выходит так, что если поле ввода настроено без дробной части, но сама ячейка памяти определена как float32 EBP конвертирует float в uint32. Какой то непонятный фокус...
UInt32 - не может быть отрицательным.
в первом случае когда вы убираете дробь - он пытается привести его положительным целым и получает лажу, при выводе через бокс ввода вывода
во втором случае он делает обратное (из двойного целого флоат и тоже получает ерунуд), при выводе через бокс ввода вывода
и при этом он еще и пытается сделать неявное преобразование float - int при считывании в тег, которое по сути отбрасывает дробную часть.
"- Знаешь, дружище, в чем истинный смысл второго закона термодинамики?
Как ни упирайся, а бардака все больше. И чем серьезнее ты упираешься, тем страшнее неразбериха."(с)
Как ни упирайся, а бардака все больше. И чем серьезнее ты упираешься, тем страшнее неразбериха."(с)
-
- здесь недавно
- Сообщения: 24
- Зарегистрирован: 30 окт 2019, 09:57
- Имя: Евгений
- Страна: РФ
- город/регион: Нижний Новгород
- Благодарил (а): 1 раз
Непонятные фокусы с float и uint32
Да, настроен float. Ячейка определена через UserTag. uint32 вылезает когда Right of decimal Pt = 0.
Версия EBP : V6.03.01.239 build 2019.07.26
Отправлено спустя 7 минут 36 секунд:
Нет, не делал ). Данное свойство я обнаружил когда вообще писал софт для МК устройства которое работает в связке с панелью Weintek. При обработке параметров выяснилось, что почему то некоторые параметры некорректны. При более детальном анализе оказалось что дело в панели, а именно в конкретных данных которые задаются через поле ввода без десятичной точки. Это не явилось проблемой, чтение данных в МК адаптировали под эту особенность. Просто непонятно логика этого преобразования, так задумано или это баг софта для панели.
Отправлено спустя 10 минут 57 секунд:
den_vish,
Возможно всё так и есть. Остаётся просто это всё принять как есть и учитывать при дальнейшей работе.
-
- специалист по WEINTEK
- Сообщения: 120
- Зарегистрирован: 05 фев 2014, 12:22
- Имя: Иван Николаевич
- Поблагодарили: 21 раз
Непонятные фокусы с float и uint32
У меня версия 6.03.02.257. Через UserTag всё работает корректно с любым положением точки.
Возможно есть баг конкретно в драйвере устройства в Вашем проекте, я проверял с внутренними регистрами.
-
- здесь недавно
- Сообщения: 24
- Зарегистрирован: 30 окт 2019, 09:57
- Имя: Евгений
- Страна: РФ
- город/регион: Нижний Новгород
- Благодарил (а): 1 раз
Непонятные фокусы с float и uint32
Всё возможно, буду разбираться, но до момента пока не "отрезали" дробную часть никаких глюков не было.
-
- администратор
- Сообщения: 18758
- Зарегистрирован: 17 июн 2008, 16:01
- Имя: Евгений свет Брониславович
- Страна: Россия
- город/регион: Санкт-Петербург
- Благодарил (а): 973 раза
- Поблагодарили: 1854 раза
Непонятные фокусы с float и uint32
Для числового ввода Вы используете клавиатуру (экранную). Вопрос: какую? Их приложено с десяток-полтора, они отличаются не только внешним видом, но и типом возвращаемого значения. Посмотрите в эту сторону.
Вы выведите на экран то значение из LW, которое отправляется в интерфейс после ввода, и поэкспериментируйте - разница должна быть.
Мне кажется, никакой это не фокус. Нужно поменьше преобразовывать типы данных по пути их следования. Если Вы задаете формат ввода без дробной части - это ведь чистый INT. Но зачем так делать, если нужен FLOAT ?
Вы выведите на экран то значение из LW, которое отправляется в интерфейс после ввода, и поэкспериментируйте - разница должна быть.
Мне кажется, никакой это не фокус. Нужно поменьше преобразовывать типы данных по пути их следования. Если Вы задаете формат ввода без дробной части - это ведь чистый INT. Но зачем так делать, если нужен FLOAT ?
По вопросам работы Форума можно обратиться по этим контактам.
-
- знаток Eplan
- Сообщения: 1457
- Зарегистрирован: 17 окт 2012, 11:24
- Имя: Виталий
- Страна: Беларусь
- город/регион: Минск
- Благодарил (а): 61 раз
- Поблагодарили: 182 раза
Непонятные фокусы с float и uint32
А по 485 передаете по какому протоколу? Там модбас, например, допускает замены байт местами, есть разные вариации. Сколько работает, не встречал проблем при передаче и приеме данных. Передаем/принимаем 4 байта, а там уже крутим как нам нужно.
-
- администратор
- Сообщения: 18758
- Зарегистрирован: 17 июн 2008, 16:01
- Имя: Евгений свет Брониславович
- Страна: Россия
- город/регион: Санкт-Петербург
- Благодарил (а): 973 раза
- Поблагодарили: 1854 раза
Непонятные фокусы с float и uint32
Мне кажется, как раз Модбас, как и любой другой протокол - это только транспорт и ничего он сам не переворачивает, а передает данные всегда от старшего байта к младшему (МодБас), а перестановка байт местами может быть обусловлена вовсе не протоколом, а тем как они расположены в конкретном устройстве. Например, если читаем DINT и задаем стартовый адрес, то будут прочитаны байты от низшего адреса к высшему, а дальше все зависит от того, что в них сложено в устройстве. Байты придется перевернуть, если в устройстве младший адрес содержит младший, а не старший байт.
И от изменения типа данных порядок байт в посылке уж точно не изменится. Так что дело не в протоколе.
И от изменения типа данных порядок байт в посылке уж точно не изменится. Так что дело не в протоколе.
По вопросам работы Форума можно обратиться по этим контактам.
-
- здесь недавно
- Сообщения: 24
- Зарегистрирован: 30 окт 2019, 09:57
- Имя: Евгений
- Страна: РФ
- город/регион: Нижний Новгород
- Благодарил (а): 1 раз
Непонятные фокусы с float и uint32
Дело вот в чём: Нужно задать порядка 100 параметров через панель, практически все имеют тип Float и только 2 или 3 32uint. Хотелось их все передать на сторону БУ как float и уже в МК привести к нужному виду. Просто так удобнее обрабатывать данные в МК. Но из за того что панель преобразовывает данные как я описал в первом посте получалась ерунда. Проблему решили уже.
Отправлено спустя 6 минут 23 секунды:
Протокол свой, в панели работаю через FreeProtocol, формирую пакеты данных сам через код, так что всё под контролем и проверено. Похож на Modbus, но более удобный. За всё время использования ни разу не было нареканий на некорректную передачу данных.
-
- администратор
- Сообщения: 18758
- Зарегистрирован: 17 июн 2008, 16:01
- Имя: Евгений свет Брониславович
- Страна: Россия
- город/регион: Санкт-Петербург
- Благодарил (а): 973 раза
- Поблагодарили: 1854 раза
Непонятные фокусы с float и uint32
Если не секрет - можно подробностей?
Кстати, насчёт экранного ввода данных. У меня в проекте с экрана вводятся данные как float так и short. Для каждого типа в шаблоне вейнтека есть клавиатура, возвращающая нужное значение. Неудобно, поскольку клавиатуры выглядят по-разному. Получается зоопарк интерфейсов. Посмотрел эти клавиатуры. Во всех поле ввода - это ASCII, что навело на мысль не разбираясь в коде просто использовать любую понравившуюся - так и сделал, взял int-овую. Корректно работает и с float и с short.
По вопросам работы Форума можно обратиться по этим контактам.