![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с преобразованием типов данных [D7, WinXP]
vodvorezlaya © (2006-09-01 16:32:00)ДОБРОГО ВРЕМЕНИ СУТОК.
Есть данные 8-байт. Все 4 переменные типа word содержат в себе одно значение с плавающей точкой; (4byte*2=8byte)
Я знаю что формат этих данных float или real.
Как присвоить их одной переменной это понятно
допустим b4 самое старшее слово(2 байта).
b4*$ffffff+b3*$ffff+b2*$ff+b1=8 байт данных в формате LongWord
Ув. мастера вопрос:
Как перевести эти 8 бит данных в формат float или real но с плавающей запятой?
Есть догадки что через указатели.
Заранее спасибо.
Elen (2006-09-05 08:18:00) [1]
> vodvorezlaya
Сочувствую. Мне с ICPcon попроще. и стоит он дешевле
vodvorezlaya (2006-09-05 08:17:00) [2]
> это уже перегрев на работе
Так и есть.
> А ты когда нибудь контроллерами занимался или новичок в
> этом деле?
Каждый день симатик глаза мозолит, немного шарю в Step7.
han_malign (2006-09-04 14:26:00) [3]
> У меня там другой протокол, но похоже у меня RK-512
- да по барабану какой протокол, кодирование потока редко менятся. Но тут есть два варианта, либо они целиком 8 байт double переворачивают, либо пословно(из описания непонятно)...
function ntod(pw: PWord; fFullSwap: boolean): double;
var __pw: array[0..sizeof(Result)div 2 - 1]of word absolute Result;
i: integer;
begin
if(fFullSwap)then begin
for i:= Low(__pw) to High(__pw) do begin
__pw[High(__pw)-i]:= Swap(pw^);
inc(pw);
end;
end else begin
for i:= Low(__pw) to High(__pw) do begin
__pw[i]:= Swap(pw^);
inc(pw);
end;
end;
end;
- но это если предполагать что там гарантированно стандартный double...
Elen (2006-09-04 14:25:00) [4]
> vodvorezlaya
А ты когда нибудь контроллерами занимался или новичок в этом деле?
(заодно Делфи подучи inttostr(Edit1.Text)это уже перегрев на работе)
Elen (2006-09-04 14:23:00) [5]
> inttostr(Edit1.Text)
StrToInt(Edit1.text)
Сергей М. (2006-09-04 14:17:00) [6]
> := inttostr(Edit1.Text); не проходит, ошибку какую - то
> лепис
мда ...
Начали за здравие, закончили заупокой)
vodvorezlaya (2006-09-04 14:08:00) [7]
> Будь
Будь :)
Слушай,
> Elen
как решить проблему := inttostr(Edit1.Text); не проходит, ошибку какую - то лепис
Elen (2006-09-04 13:46:00) [8]
> 2 дня заняло написание полноценного модуля
Будь у тебя нормальный OPC ты бы такими вопросами не задавался
vodvorezlaya (2006-09-04 13:42:00) [9]
> http://www.runmode.com/usefulstuff.html
> :
> Notes on Simatic data storage
> * Whenever you need to read or store values on Siemens
> PLCs, you must be aware that SIMATIC systems adopted the
> Big Endian byte order, see a brief description here: http:
> //www.cs.umass.edu/~verts/cs32/endian.html
> там же ссылки на протокол:
> http://www.runmode.com/usefulstuff_files/AS511protocol_description.
> http://www.runmode.com/usefulstuff_files/0141_as511_komponente.
> zip
У меня там другой протокол, но похоже
у меня RK-512
vodvorezlaya (2006-09-04 13:36:00) [10]
> ИМХО Самому писать протоколы (тем более к Семену) геморрой.
2 дня заняло написание полноценного модуля (не драйвера)
han_malign (2006-09-04 13:28:00) [11]компонент правда на немецком, но это мелочи...
han_malign (2006-09-04 13:25:00) [12]http://www.runmode.com/usefulstuff.html
:
Notes on Simatic data storage
* Whenever you need to read or store values on Siemens PLCs, you must be aware that SIMATIC systems adopted the Big Endianbyte order, see a brief description here: http://www.cs.umass.edu/~verts/cs32/endian.html
там же ссылки на протокол:
http://www.runmode.com/usefulstuff_files/AS511protocol_description.pdf
http://www.runmode.com/usefulstuff_files/0141_as511_komponente.zip
Elen (2006-09-04 13:18:00) [13]
> vodvorezlaya
Для работы с контроллерами я всегда использую OPC сервер. Как правило с ним поставляется диск с дровами и OPC сервером, через который моя прога коннектиттся к устройству.Это программа-прослойка. Этот сервер сам преобразует данные получаемые с контроллера по нужному протоколу. я правда не знаю поставляет ли Сиеменс такие веши. Wago, ICPCon и подобные поставляют. ИМХО Самому писать протоколы (тем более к Семену) геморрой.
vodvorezlaya (2006-09-04 13:01:00) [14]
> А ты что не знаеш протокола передачи? Ты используеш OPC
> сервер?
Нет, я написал сам модуль который по ком порту (через токовый преобразователь) передаёт данные к S5, могу код привести
:)
А что такое ОРС сервер?
Там что, дрова на Симатик есть?
Elen (2006-09-04 12:50:00) [15]
> передача с контроллера Siemens Simatic S5
А ты что не знаеш протокола передачи? Ты используеш OPC сервер?
Сергей М. (2006-09-04 12:41:00) [16]
> vodvorezlaya (04.09.06 12:38) [12]
> Слушай han_malign, он шарит?
Шарит-шарит)
vodvorezlaya (2006-09-04 12:38:00) [17]
> 1:
> var
> pw: array[0..3]of word;
> _pf_pw: array[0..1]of single absolute pw;
> _pd_pw: array[0..0]of double absolute pw;
А эти способы разные?
Потому что первый не сработал.
han_malign какую литературу ты читал?
Там у меня вообще передача с контроллера Siemens Simatic S5 там какой то свой формат.
Как попробовать разными способами кодирования big-endian и little-endian.
> Ерунда какая-то)
Слушай han_malign, он шарит?
han_malign (2006-09-04 12:06:00) [18]
> Я понял, ты шаришь. А можна с небольшим комментарием.
> А где младший и где старший розряды?
- а вот это уже зависит от способа кодирования битового потока, big-endian(встречается, так же, как - network order, для значений выровненных на размер октета), или little-endian("обычное" представление для семейства x86 процессоров). В случае little-endian, если данные выровненны на размер октета - никаких дополнительных действий для разбора потока делать не надо - достаточно прямого приведения.
Что находится в самом битовом потоке - целиком и полностью на совести разработчика - если известно, что это стандартный double - нам не важно где у него мантисса, а где знак, нам важно заполнить 64-бита переменной типа double - 64-мя битами из потока, в соответсвии с правилами кодирования битового потока.
Выше, я, как раз, привел четыре способа прямого отбражения little-endian значений на разные типы данных.
Desdechado (2006-09-04 11:27:00) [19]> переменные типа word содержат в себе одно значение с плавающей точкой
Тип Word не может содержать дробные числа.
Машинное представление дробных чисел базируется на мантиссе, порядке и основании. Ищи эти слова в гугле.
Сергей М. (2006-09-04 09:19:00) [20]
> В шестнадцатеричных кодах нет знака запятой, она содержится
> в первых розрядах типа данных Real
Ерунда какая-то)
type
PExtended = ^Extended;
..
var
MyArray: array[0..3] of Word;
MyFloatValue: Extended;
..
MyFloatValue := PExtended(@MyArray)^;