Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Помогите с преобразованием типов данных [D7, WinXP]


Страницы:   1 2

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.
> pdf
> 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)^;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо