Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Преобразование: DWord в Single  (Прочитано 479 раз)

Серега

  • Старожил
  • ****
  • Сообщений: 254
    • Просмотр профиля
Преобразование: DWord в Single
« : 09 Октября 2024, 11:43:50 »
Добрый день!
В принципе из темы https://simple-scada.com/forum/index.php?topic=261.msg2602;topicseen#msg2602 понятно как собрать из 2 word`ов 1 dword.
Но вот дальше как бы вопрос в названии. Что то в голову вообще не лезет решение как это сделать.
На вопрос "Зачем?" могу сразу ответить "потому что". :)
Может кто что подскажет?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1306
    • Просмотр профиля
Re: Преобразование: DWord в Single
« Ответ #1 : 09 Октября 2024, 13:05:35 »
Здравствуйте.

Обсуждение, на которое Вы ссылаетесь очень старое. Сейчас для этого имеются готовые функции - подробнее см. по ссылке. Если требуется объединить два Word, то можно использовать функцию MakeInt.

Вы можете записать значение переменной DWord в переменную Single. Что именно не получается?

Серега

  • Старожил
  • ****
  • Сообщений: 254
    • Просмотр профиля
Re: Преобразование: DWord в Single
« Ответ #2 : 09 Октября 2024, 14:14:48 »
По порядку.
1. Функции пытался использовать. Но MakeInt(w1, w2) выдает integer, а нужно получать dword, так как присылают dword.
Как результат (по крайней мере у меня) при w1= 65535 и w2= 65535 MakeInt выдает -1, что  в принципе верно. Но нужно то 4294967295.
2. Преобразование из темы работает и результат выдает 4294967295.
3. Дальше как бы в ПЛК было преобразование REAL_TO_DWORD и на скаде надо было бы сделать обратную операцию. Но есть более "древний" способ. Деление на 10, 100 и т.д.
Так что вопрос про преобразование отпал. Ну или в настройках сдвиг запятой.
4. Из старой темы выделилось преобразование LongWord() как бы это не документированная возможность, но с отсылкой на Object Pascal (операция явного приведения типов)
5. Разные эксперименты показали интересный результат. Если использовать явное приведение к типу Single, то  значение отличается на 1 и равно 4294967296.
В общем то наверное тему можно закрывать. Но если прокомментируете, думаю будет полезно для пользователей.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3160
    • Просмотр профиля
    • Simple-Scada
Re: Преобразование: DWord в Single
« Ответ #3 : 20 Октября 2024, 12:15:17 »
Цитировать
Но MakeInt(w1, w2) выдает integer, а нужно получать dword, так как присылают dword.
Как результат (по крайней мере у меня) при w1= 65535 и w2= 65535 MakeInt выдает -1, что  в принципе верно. Но нужно то 4294967295.
MakeInt просто объединяет два слова в целое число. Отображаемое значение зависит от типа данных. См. пример ниже:
Код: (delphi)
var
  I: Integer;
  L: LongWord;
begin
  I := MakeInt(65535, 65535); // I теперь равно -1
  L := MakeInt(65535, 65535); // L теперь равно 4294967295
end.

Если тип не задан явно, то MakeInt вернёт Integer, но при необходимости можно привести к нужному типу. Например:
Код: (delphi)
begin
  Text1.Text := IntToStr(MakeInt(65535, 65535));           // в Text1 будет выведено значение -1
  Text2.Text := IntToStr(LongWord(MakeInt(65535, 65535))); // в Text2 будет выведено значение 4294967295
end.