1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Непонятные фокусы с float и uint32

Модераторы: Глоб.модераторы, специалисты Weintek

Ответить

Автор темы
Number17
здесь недавно
здесь недавно
Сообщения: 24
Зарегистрирован: 30 окт 2019, 09:57
Имя: Евгений
Страна: РФ
город/регион: Нижний Новгород
Благодарил (а): 1 раз

Непонятные фокусы с float и uint32

Сообщение Number17 »

Имеем следующую обстановку: поле цифрового ввода в 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. Какой то непонятный фокус...

asuprog
здесь недавно
здесь недавно
Сообщения: 67
Зарегистрирован: 01 авг 2019, 02:24
Имя: Вячеслав
Благодарил (а): 9 раз
Поблагодарили: 6 раз

Непонятные фокусы с float и uint32

Сообщение asuprog »

Не уверен, но частенько случается вот что - "общепризнанный" формат разделителя дробной части - точка. В Си, SQL точно. И не важно как вы там в HMI пишите, важно что он в свои ячейки памяти положит. Поэтому попробуйте в региональных настройках сменить тип этого разделителя. Во всех "виндах", что я встречал, там по умолчанию запятая.

VanMo
специалист по WEINTEK
специалист по WEINTEK
Сообщения: 120
Зарегистрирован: 05 фев 2014, 12:22
Имя: Иван Николаевич
Поблагодарили: 21 раз

Непонятные фокусы с float и uint32

Сообщение VanMo »

Сама ячейка памяти тип данных не определяет, это делает как раз объект отображения числа.
Но, если в объекте настроен формат float и он передает int32, то это неправильно.
Какая версия EasyBuilder?

asuprog
здесь недавно
здесь недавно
Сообщения: 67
Зарегистрирован: 01 авг 2019, 02:24
Имя: Вячеслав
Благодарил (а): 9 раз
Поблагодарили: 6 раз

Непонятные фокусы с float и uint32

Сообщение asuprog »

VanMo писал(а): 10 фев 2020, 17:42 Сама ячейка памяти тип данных не определяет, это делает как раз объект отображения числа.
Но, если в объекте настроен формат float и он передает int32, то это неправильно.
Какая версия EasyBuilder?
Вы делали обратный инжиниринг IDE?
Вот как рассуждаю я:
HMI принимает каким то образом данные от юзера
каким то образом промежуточно хранит их
далее формирует пакет
откуда уверенность, что на каком то из последних 2х этапов, Runtime не использует инструменты API Windows или тот же .Net?

Я признаться с этой IDE не знаком, и поэтому сразу занял позицию - не уверен )
Аватара пользователя

den_vish
освоился
освоился
Сообщения: 233
Зарегистрирован: 11 апр 2013, 13:22
Имя: Вишневский Денис
Благодарил (а): 11 раз
Поблагодарили: 13 раз

Непонятные фокусы с float и uint32

Сообщение den_vish »

Number17 писал(а): 10 фев 2020, 15:19 В общем переслав данные из цифрового поля ввода, на другом конце читаем данные из этой структуры как float.
Заметил следующее: если поле цифрового ввода на вкладке Атрибуты/формат настроено как [000.0] т.е с дробной частью, то в ДУ прочитав данные как float я получу верные данные. А если настроить поле цифрового ввода без дробной части т.е. [000], то прочитав значение в ДУ как float получаю ерунду, но прочитав значение как uint32 получаю верное значение.
Т.е. выходит так, что если поле ввода настроено без дробной части, но сама ячейка памяти определена как float32 EBP конвертирует float в uint32. Какой то непонятный фокус...
да скорее всего из-за знака, float - может быть отрицательным
UInt32 - не может быть отрицательным.

в первом случае когда вы убираете дробь - он пытается привести его положительным целым и получает лажу, при выводе через бокс ввода вывода
во втором случае он делает обратное (из двойного целого флоат и тоже получает ерунуд), при выводе через бокс ввода вывода
и при этом он еще и пытается сделать неявное преобразование float - int при считывании в тег, которое по сути отбрасывает дробную часть.
"- Знаешь, дружище, в чем истинный смысл второго закона термодинамики?
Как ни упирайся, а бардака все больше. И чем серьезнее ты упираешься, тем страшнее неразбериха."(с)

Автор темы
Number17
здесь недавно
здесь недавно
Сообщения: 24
Зарегистрирован: 30 окт 2019, 09:57
Имя: Евгений
Страна: РФ
город/регион: Нижний Новгород
Благодарил (а): 1 раз

Непонятные фокусы с float и uint32

Сообщение Number17 »

VanMo писал(а): 10 фев 2020, 17:42 Но, если в объекте настроен формат float и он передает int32, то это неправильно.
Какая версия EasyBuilder?
Да, настроен float. Ячейка определена через UserTag. uint32 вылезает когда Right of decimal Pt = 0.
Версия EBP : V6.03.01.239 build 2019.07.26

Отправлено спустя 7 минут 36 секунд:
asuprog писал(а): 11 фев 2020, 04:38 Вы делали обратный инжиниринг IDE?
Нет, не делал ). Данное свойство я обнаружил когда вообще писал софт для МК устройства которое работает в связке с панелью Weintek. При обработке параметров выяснилось, что почему то некоторые параметры некорректны. При более детальном анализе оказалось что дело в панели, а именно в конкретных данных которые задаются через поле ввода без десятичной точки. Это не явилось проблемой, чтение данных в МК адаптировали под эту особенность. Просто непонятно логика этого преобразования, так задумано или это баг софта для панели.

Отправлено спустя 10 минут 57 секунд:
den_vish,
Возможно всё так и есть. Остаётся просто это всё принять как есть и учитывать при дальнейшей работе.

VanMo
специалист по WEINTEK
специалист по WEINTEK
Сообщения: 120
Зарегистрирован: 05 фев 2014, 12:22
Имя: Иван Николаевич
Поблагодарили: 21 раз

Непонятные фокусы с float и uint32

Сообщение VanMo »

Number17 писал(а): 11 фев 2020, 07:58
Версия EBP : V6.03.01.239 build 2019.07.26
У меня версия 6.03.02.257. Через UserTag всё работает корректно с любым положением точки.
Возможно есть баг конкретно в драйвере устройства в Вашем проекте, я проверял с внутренними регистрами.

Автор темы
Number17
здесь недавно
здесь недавно
Сообщения: 24
Зарегистрирован: 30 окт 2019, 09:57
Имя: Евгений
Страна: РФ
город/регион: Нижний Новгород
Благодарил (а): 1 раз

Непонятные фокусы с float и uint32

Сообщение Number17 »

VanMo писал(а): 11 фев 2020, 09:51 Возможно есть баг конкретно в драйвере устройства в Вашем проекте, я проверял с внутренними регистрами.
Всё возможно, буду разбираться, но до момента пока не "отрезали" дробную часть никаких глюков не было.
Аватара пользователя

Jackson
администратор
администратор
Сообщения: 18758
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 973 раза
Поблагодарили: 1854 раза

Непонятные фокусы с float и uint32

Сообщение Jackson »

Для числового ввода Вы используете клавиатуру (экранную). Вопрос: какую? Их приложено с десяток-полтора, они отличаются не только внешним видом, но и типом возвращаемого значения. Посмотрите в эту сторону.

Вы выведите на экран то значение из LW, которое отправляется в интерфейс после ввода, и поэкспериментируйте - разница должна быть.

Мне кажется, никакой это не фокус. Нужно поменьше преобразовывать типы данных по пути их следования. Если Вы задаете формат ввода без дробной части - это ведь чистый INT. Но зачем так делать, если нужен FLOAT ?
По вопросам работы Форума можно обратиться по этим контактам.

Madwolf
знаток Eplan
знаток Eplan
Сообщения: 1457
Зарегистрирован: 17 окт 2012, 11:24
Имя: Виталий
Страна: Беларусь
город/регион: Минск
Благодарил (а): 61 раз
Поблагодарили: 182 раза

Непонятные фокусы с float и uint32

Сообщение Madwolf »

А по 485 передаете по какому протоколу? Там модбас, например, допускает замены байт местами, есть разные вариации. Сколько работает, не встречал проблем при передаче и приеме данных. Передаем/принимаем 4 байта, а там уже крутим как нам нужно.
Аватара пользователя

Jackson
администратор
администратор
Сообщения: 18758
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 973 раза
Поблагодарили: 1854 раза

Непонятные фокусы с float и uint32

Сообщение Jackson »

Мне кажется, как раз Модбас, как и любой другой протокол - это только транспорт и ничего он сам не переворачивает, а передает данные всегда от старшего байта к младшему (МодБас), а перестановка байт местами может быть обусловлена вовсе не протоколом, а тем как они расположены в конкретном устройстве. Например, если читаем DINT и задаем стартовый адрес, то будут прочитаны байты от низшего адреса к высшему, а дальше все зависит от того, что в них сложено в устройстве. Байты придется перевернуть, если в устройстве младший адрес содержит младший, а не старший байт.

И от изменения типа данных порядок байт в посылке уж точно не изменится. Так что дело не в протоколе.
По вопросам работы Форума можно обратиться по этим контактам.

Автор темы
Number17
здесь недавно
здесь недавно
Сообщения: 24
Зарегистрирован: 30 окт 2019, 09:57
Имя: Евгений
Страна: РФ
город/регион: Нижний Новгород
Благодарил (а): 1 раз

Непонятные фокусы с float и uint32

Сообщение Number17 »

Jackson писал(а): 11 фев 2020, 22:36 Но зачем так делать, если нужен FLOAT ?
Дело вот в чём: Нужно задать порядка 100 параметров через панель, практически все имеют тип Float и только 2 или 3 32uint. Хотелось их все передать на сторону БУ как float и уже в МК привести к нужному виду. Просто так удобнее обрабатывать данные в МК. Но из за того что панель преобразовывает данные как я описал в первом посте получалась ерунда. Проблему решили уже.

Отправлено спустя 6 минут 23 секунды:
Madwolf писал(а): 18 фев 2020, 17:07 А по 485 передаете по какому протоколу?
Протокол свой, в панели работаю через FreeProtocol, формирую пакеты данных сам через код, так что всё под контролем и проверено. Похож на Modbus, но более удобный. За всё время использования ни разу не было нареканий на некорректную передачу данных.
Аватара пользователя

Jackson
администратор
администратор
Сообщения: 18758
Зарегистрирован: 17 июн 2008, 16:01
Имя: Евгений свет Брониславович
Страна: Россия
город/регион: Санкт-Петербург
Благодарил (а): 973 раза
Поблагодарили: 1854 раза

Непонятные фокусы с float и uint32

Сообщение Jackson »

Number17 писал(а): 03 мар 2020, 18:59 Похож на Modbus, но более удобный
Если не секрет - можно подробностей?

Кстати, насчёт экранного ввода данных. У меня в проекте с экрана вводятся данные как float так и short. Для каждого типа в шаблоне вейнтека есть клавиатура, возвращающая нужное значение. Неудобно, поскольку клавиатуры выглядят по-разному. Получается зоопарк интерфейсов. Посмотрел эти клавиатуры. Во всех поле ввода - это ASCII, что навело на мысль не разбираясь в коде просто использовать любую понравившуюся - так и сделал, взял int-овую. Корректно работает и с float и с short.
По вопросам работы Форума можно обратиться по этим контактам.
Ответить

Вернуться в «WEINTEK (операторские панели)»