обоснуй?
преобразование ничего не меняет.
Последний раз редактировалось lara197a; 14.08.2014 в 20:59.
Чесно говоря думал что это очевидно. Приведу пример.
x : real := 2000; последовательность байт здесь - 00,00,FA,44
эту последовательность надо сделать FA,44,00,00. Это и есть перестановка регистров.
А если сделать d : (dword) := real_to_dword(x), то мы получим d = 16#000007D0, а из этого, как не переставляй байты, никак не получится FA,44,00,00.
Допускаю что есть редкие комбинации где срастется, но это фичи на которые лучше не рассчитывать.
любое целое <-> real всегда меняет внутреннее представление.Код:преобразование ничего не меняет
real_to_dword(dword_to_real(dw)) не всегда = dw
^, %, union
Последний раз редактировалось Валенок; 14.08.2014 в 21:31.
Вообще-то контроллер работает с бинарным форматом, а в нем все исполняется правильно.
К примеру эта же функция с пресловутыми двумя тысячами:
DWORD_TO_REAL.jpgЯ года 3 назад решал задачу получения данных с преобразователя,
где данные хранились в формате:
Мантиса в одном регистре
Экспонента в одном байте другого регистра.
Все работает, много лет.
Из данных пишется график, архив и пр...
А выглядит это так:
A1_p:=Mantisa; (*присваеваем значение регистра 108 промежуточной переменной*)
A9:=A1.15; (*Выделяем знак*)
A1_p.15:=FALSE; (*Убиваем 15 бит в промежуточной переменной*)
A3:=WORD_TO_DWORD(A1_p); (*превращаем 2 байта в 4*)
A4:=SHL(A3,8); (*Сдвигаем влево на 8 бит*)
A2_p:=WORD_TO_BYTE(Exponenta); (*выделяем младший байт с экспонентой*)
A2_2p:=BYTE_TO_DWORD(A2_p); (*превращаем 2 байта в 4*)
A2_1p:=SHL(A2_2p,23); (*Сдвигаем влево на 23 бита*)
A5:=A4+A2_1p; (*Соединяем экспоненту с мантисой*)
A5.31:=A9; (*Добавляем знак*)
pt :=ADR(A5); (*Копируем в префикс*)
A6:=pt^; (*Превращение в реал(флоат)*)
RAMP_REAL1( IN:=A6 , (*усредняем(фильтруем)*)
ASCEND:= 100,
DESCEND:=300,
TIMEBASE:=T#1s ,
RESET:= ,
OUT=>A6_1 );
A8:=REAL_TO_DWORD(A6_1); (*выделяем целую часть*)
A7:=A8/6; (*получаем расход в мин*10*)
VAR_OUT:=DWORD_TO_WORD(A7); (*Упаковываем значение в 1 регистр*)
))) Картинка ни о чем.К примеру эта же функция с пресловутыми двумя тысячами
Вы путаете ЗНАЧЕНИЕ и ПРЕДСТАВЛЕНИЕ. Для dword - они совпадают (исторически сложилось)
Но для ТС при получении данных с ai нужно переставить слова не ЗНАЧЕНИЯ (как на картинке), а в ПРЕДСТАВЛЕНИИ real. А оно на картинке - отсутствует.
Не сомневаюсь что это работает, но задачу ТС по перестановке регистров (слов) в ПРЕДСТАВЛЕНИИ можно решить не зная формата ПРЕДСТАВЛЕНИЯ. Достаточно знать что это 4 байта. Например:Все работает, много лет.
Из данных пишется график, архив и пр...
А выглядит это так:
A1_p:=Mantisa; (*присваеваем значение регистра 108 промежуточной переменной*)
..
VAR_OUT:=DWORD_TO_WORD(A7); (*Упаковываем значение в 1 регистр*)
ai:real;
p: pointer to dword; //Вы, кстати, без указателей не обошлись ))
p:=adr(ai);
p^:=rol(p^,16); //всё
Последний раз редактировалось Валенок; 15.08.2014 в 00:07.
Значит вариант предложенный lara197a извиняюсь не катит?
1. Это не картинка, а контроллер в режиме исполнения.
2. Указатель там не нужен -100%. Используйте косвенную адресацию и будет Вам счастье.
Много лет назад я имел по поводу указателей разговор с уважаемым И.Петровым,
ведущим специалистом КДС в России. Использовать их он крайне не рекомендовал....
3. С таким же успехом можно сделать без указателя. А:=ror(B,16)
4. Вообще перевод применен реал-дворд для наглядности,
первоначально в примере сдвинул влево и в право с заполнением нулями и сложил переменные.
Но потом решил, что и так все видно, что и Вам показал.
5. Спор ни о чем.
Пользуясь случаем, хочу передать привет компилятору кодесиса, который в ответ на rol(ai, 16) говорит удивительные вещи:ai:real;
p: pointer to dword; //Вы, кстати, без указателей не обошлись ))
p:=adr(ai);
p^:=rol(p^,16); //всёREAL входит в группу ANY_NUM согласно стандарта, если что. В доках же пишут, что допускаются только BYTE, WORD и DWORD. При этом компилятор молча съедает и INT, и DINT, и UDINT. Непоследовательно как-то.Type mismatch in parameter 1 of 'ROL': Cannot convert 'REAL' to 'ANY_NUM".
жаль не могу поучаствовать в придумывании кода без машины, а как в Ваших вариантах преобразуется число 0.00000000375, вроде тоже реал
В заключении хотелось бы отметить, что для избежания ошибок перевод из REAL в DWORD крайне желателен.
при этом полностью сохраняя порядок бит и размер, мы просто избавляемся от условностей типа переменной.
DWORD- ЭТО ВСЕ ЧТО УГОДНО - 4 БАЙТА.
REAL- ЭТО 32-Х БИТНАЯ ПЕРЕМЕННАЯ. В КОТОРОЙ 31,30-24, 23-0 БИТЫ ИМЕЮТ СТРОГО ОПРЕДЕЛЕННОЕ ЗНАЧЕНИЕ.
При этом гарантированно не будет ошибок компилятора и пр.