Перейти к содержимому

Фото
- - - - -

Помогите с Delphi


  • Вы не можете создать новую тему
  • Please log in to reply
7 ответов в этой теме

#1 ossesion

ossesion

    Покормите тролля!!!Will work for food...

  • Постоялец
  • 7 810 сообщений
  • Откуда:США, Хьюстон

Отправлено 16 Февраль 2012 - 20:35

const
MAX_PUMPS = 32; // One side of a pump
MAX_NOZ_PUMP = 4; // Nozzles per pump


function getData(pump:integer; nozzle:integer):string;
var
rcv:string;
loc,byte:integer;
begin
loc := (pump-1)*MAX_NOZ_PUMP+nozzle; // Location of nozzle
byte := loc div 100; // Hi byte
result := chr((byte div 10)*16+(byte mod 10));
byte := loc mod 100; // Lo byte
result := result + chr((byte div 10)*16+(byte mod 10));
tcp.Write(#$22 + #$02 + result); // Communicate with VSU

end;

честно говоря уже все волосы на жопе изодрал. не имел дело с Дельфи, поэтому прошу вас помочь.
Программа передают данные при помощи tcp сокета.
Вопросы вот такие:
1)#$22 - что означает два символа перед значением?
2)Чему будет равен конечным result при pump равный единице в младшем байте или единице в старшем?(на сколько я понимаю pump в данном случае является integer и может иметь значение либо в младшем либо в старшем байте(не знаю как реализовал программист)
меня интересует, что будет в конечном result?
3)result := result + chr((byte div 10)*16+(byte mod 10)); - как это работает и главное зачем? Зачем складывать два chr( )???

p.s. по последнему. Смысл в том что мы делаем запрос. 22 - это код запроса. 2 это сколько байт после этой цифры идем с данными. Смысл в том что в result должно быть число номера требуемой ячейки. Есть 32 станции, на каждой по 4 пистолета. Вот каким то макаром надо находить требуемую ячейку...

Сообщение изменено: ossesion (16 Февраль 2012 - 20:54 )

  • 0

#2 shb

shb

    New life, much more options

  • Постоялец
  • 5 253 сообщений
  • Откуда:Таллинн

Отправлено 16 Февраль 2012 - 21:51

ossesion, я Дельфи вижу тоже первый раз, да и в задачи не знаю, но подсказать могу, наверное =)

а) loc := (pump-1)*MAX_NOZ_PUMP+nozzle;
находит числовое значение ячейки, например на 11 пумпе и 2ом нозле ячейка будет 10 * 4 + 2 = 42. Сорок второй нозл по счету, начиная отсчет с первого пумпа и первого нозла.

Почему для того, чтобы получить верхний байт нужно эту ячейку разделить на сто - неясно. Когда это поймешь - будет ясно, нафига перед преобразованием в char делать дополнительные выичсления. Программа правильно работает? Выглядит как-то стремно и неправильно )

б) chr() делает из числа символ (char, размером 1 байт), chr() + chr() это строка размером два байта, соответственно первый байт - высший, второй - низший.

Соответственно на выходе - 22 (номер команды) + 2 (кол-во байтов) + строка из двух байтов
  • 0
Мыслящий человек просто обязан время от времени поднимать себя за волосы © Тот самый Мюнгхаузен

Joga Bonito!

#3 ossesion

ossesion

    Покормите тролля!!!Will work for food...

  • Постоялец
  • 7 810 сообщений
  • Откуда:США, Хьюстон

Отправлено 16 Февраль 2012 - 22:05

shb,

Программа правильно работает? Выглядит как-то стремно и неправильно )

к сожалению да ))))
Самый прикол, руководство выслали по запросам по TCP на сервер. Проковырялся на Си и хрен, не получаю ответа.
В руководстве сказано:
22 2 "старший бай" "младший байт" . и типо отправляй запрос.
Байты высчитываются для 5 pump 3 nozzle -> 5*4 + 3 = 23. Типо все пишется в первом байте. Оба эти байта в BCD формате. Я перепробовал все что можно, завтро буду все 65к вариантов циклом просматривать, ибо я хз )))
Код писали евреи )))
  • 0

#4 xp4uk

xp4uk
  • Пользователь
  • 353 сообщений

Отправлено 16 Февраль 2012 - 22:19

Вопросы вот такие:
1)#$22 - что означает два символа перед значением?


Конкретней, что тебя интересует?

П,С, Допускается использование записи символа путем указания его внутреннего кода:
символ # (код 35)
символ $ (код 36)
Пуск - Программы - Стандартные - Служебные - Таблица символов

$ означает что следующее за ним число задано в 16-ричной системе

Сообщение изменено: xp4uk (16 Февраль 2012 - 22:37 )

  • 0
И преисподняя раскрыла пасть свою...

#5 shb

shb

    New life, much more options

  • Постоялец
  • 5 253 сообщений
  • Откуда:Таллинн

Отправлено 16 Февраль 2012 - 23:18

ossesion,

Оба эти байта в BCD формате

Ну вот и ответ =) Ща обьясню наверное )

Показываю на примере

В BCD число 126 = 0000 0001 0010 0110 (четверки дают соответственно 0 1 2 6)

Допустим на входе у нас pump = 32 (для красоты) и nozzle = 2

1) тогда loc = (32 - 1)*4 + 2 = 126 (единицу надо отнимать для того, чтобы на первом пумпе нозлы считались-таки с единицы)
2) делим текущее положение на сто, для того, чтобы получить число, соответствующее двум четверкам старшего байта. 126 / 100 = 1
3) (byte div 10)*16 - тут мы делим старший байт на 10, для того, чтобы получить старшую четверку старшего байта. 1 / 10 = 0 (или 0000). Умножением на 16 мы сдвигаем полученный результат на 4 разряда (аналогично << 4 в си, обычный побитовый сдвиг).
4) (byte mod 10) - берем остаток от деления на 10 для того, чтобы получить младшую четверку старшего байта. 1 % 10 = 1 (или 0001).

5) loc mod 100; - берем младший байт нашего местоположения.
6) повторяем операции со старшей четверкой младшего байта и младшей четверкой младшего байта 26 / 10 = 2 (или 0010). сдвигаем - 2 * 16 = 32 (или 0010 0000). Плюс 26 % 10 = 6 (или 0110). 32 + 6 = 38 (или 0010 0110)

Складываем (concatenate) полученный старший байт и младший байт - 0000 0001 0010 0110 и высылаем это получателю в char, потому что они сохранят наши бесполезные нолики

для pump = 17 и nozzle = 3 на выходе будет 0000 0000 0110 0111
для pump = 4 и nozzle = 1 на выходе будет 0000 0000 0001 0011

попробуй сам посчитать )

Сообщение изменено: shb (16 Февраль 2012 - 23:08 )

  • 1
Мыслящий человек просто обязан время от времени поднимать себя за волосы © Тот самый Мюнгхаузен

Joga Bonito!

#6 ossesion

ossesion

    Покормите тролля!!!Will work for food...

  • Постоялец
  • 7 810 сообщений
  • Откуда:США, Хьюстон

Отправлено 17 Февраль 2012 - 11:35

shb,

Спасибо за помощь, но ответ оказался такой )))
ппц... получилось только просмотрев всевозможные ответы.
sendbuf[2] = 0xff; // /ff /ff /ff /ff...ff
sendbuf[3] = 0xd9; // /0d /0e /0f /16...d9

Сообщение изменено: ossesion (17 Февраль 2012 - 11:35 )

  • 0

#7 shb

shb

    New life, much more options

  • Постоялец
  • 5 253 сообщений
  • Откуда:Таллинн

Отправлено 17 Февраль 2012 - 11:53

ossesion, ответ на какой вопрос оказался таким? =)
  • 0
Мыслящий человек просто обязан время от времени поднимать себя за волосы © Тот самый Мюнгхаузен

Joga Bonito!

#8 ossesion

ossesion

    Покормите тролля!!!Will work for food...

  • Постоялец
  • 7 810 сообщений
  • Откуда:США, Хьюстон

Отправлено 17 Февраль 2012 - 14:01

shb,

ossesion, ответ на какой вопрос оказался таким? =)

каждый pump(32 штуки) поддерживает по 4 nozzle = 128 ячеек.
Опрос с первой по последнюю ячейку:
1 Байт FF...FF
2 Байт 0d(первая)...0е(вторая)...0а(третья)....16(четвертая)...1f(ну и т.д. начинается десяток с х6 заканчивается на хF)...26...2f......d9(самая последняя)
Почему так считается.. я хз.
Размещенное изображение

Сообщение изменено: ossesion (17 Февраль 2012 - 14:06 )

  • 0