Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2013, 12:11   #1
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию Управление устройством: проблемы с типами данных в сторонней DLL

Здравствуйте. Возникла следующая ситуация. Куплено устройство, подключается по СОМ-порту или по сети.

Для работы с устройством поставляется DLL, к ней идёт PDF-файл с документацией.
Вот пример описания функции, из документации (выделю жирным шрифтом ключевое).

BOOL HEX_qVEL (long ID, const char* szAxes, double* pdValueArray) Get Closed-Loop Velocity

Функция, возвращает скорости движения шести штанг, в массиве

Get the current value of the closed-loop velocity for szAxes.
Arguments:
ID ID of controller
szAxes string with axes, if "" or NULL all axes are queried.
pdValueArray array to be filled with the velocity settings of the axes
Returns:
TRUE if no error, FALSE otherwise


с устройством поставлялась библиотека типов (если я правильно её называю), т.е. определения процедур в pas-файле.
В файле определяется тип и процедуры, в том числе упомянутая HEX_qVEL:

Код:
unit HEX_GCS_DLL;
...
type
  ...
  TDoubleArray     = array of double;
  ...
function HEX_qVEL(ID: INTEGER;
  const szAxes: PChar;
  pdValarray:TDoubleArray): Bool cdecl{$IFDEF WIN32} stdcall{$ENDIF};
...
implementation
...
function HEX_qVEL; external'HEX_GCS_DLL.DLL';
..
end;
соответственно, при вызове я определяю массив типа TArrayOfDouble, устанавливаю ему длину 6, передаю в функцию, она мне его заполняет

всё было прекрасно, но купили новое почти такое же устройство, маркировка которого изменилась на одну букву. Новая модель.
соответственно, с ним новая dll, система команд частично поменялась, но основная проблема возникла в том, что я уже не могу работать с некоторыми процедурами, с которыми работал ранее, а именно с теми, в которые передаются массивы

для примера беру эту же процедуру, описание её в документации идёт один в один, только поменян префикс:

BOOL PI_qVEL (long ID, const char* szAxes, double* pdValueArray)

однако, в заголовочном файле она определена по другому. Никаких промежуточных типов, вроде TDoubleArray, не вводится!:

Код:
unit PI_GCS2_DLL;
...
function PI_qVEL(ID: LongInt; 
                 const szAxes: PChar; 
                 var pdValueArray: Double): Bool cdecl  {$IFDEF WIN32} stdcall {$ENDIF}; 
...
function PI_qVEL; external 'PI_GCS2_DLL.DLL';
...
end;
Как правильно передать массив в функцию?
Я делаю так:

Код:
var arr: array[0..5] of double;
begin
...
PI_qVEL(ID, szAxes, arr[0])
...
end;

пока нужные значения не получаю, и не могу разобраться, то ли проблема с типами, то ли причина в чём-то другом

Последний раз редактировалось AnTe; 29.05.2013 в 12:15.
AnTe вне форума Ответить с цитированием
Старый 29.05.2013, 12:22   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

...на те боже, что мне негоже. Где приложенная документация старая и новая, где сами библиотеки, старые и новые? Нам телепатически разбираться только на основании вырванных кусков?

Могу оказать и целевую помощь, не забесплатно конечно.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 29.05.2013, 18:29   #3
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Конечно, можно было бы выложить и весь диск, идущий в комплекте :D с парой тысяч листов документации, поставить ТЗ, которое, правда, до сих пор утвердить не могут

Для того, чтобы не грузить читателей массой ненужных подробностей, я специально выделил момент, который меня интересует, а именно, передача массива в функцию одной из динамических библиотек, в документации на которую этот тип указан как double.

Опыта работы с динамическими библиотеками, взаимодействия различных языков языками практически нет, вот и подумалось, не штатная ли это ситуация, раз практически никаких комментариев к способу передачи параметров не было, кроме того, что входная переменная - Double, в которой параметры, всего параметров шесть.

Если вариантов передачи много, зависят от способа, как была разработана ДЛЛ, и т.д. тогда буду для начала копать глубже хотя бы доки на устройство. За предложение спасибо, но это точно не на данном этапе.
AnTe вне форума Ответить с цитированием
Старый 29.05.2013, 21:33   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

На мой взгляд, именно первый вариант записи интерфейса более сомнителен.
По второму варианту записал бы первую пробу именно так, как у Вас (только аккуратно проанализировал бы возвращаемую функцией величину).
Если возвращаемая величина говорит, что функция отработала успешно, попытался бы проанализировать, что именно заполнила функция:
- во-первых, на вход подал бы массив подлиннее, предварительно заполнил его одними единицами (FFFFFFFF), и выяснил длину возвращаемых данных,
- во-вторых зависит от результата "во-первых": если возвращено 4 байта, попытался бы трактовать, как адрес (сравнил по величине с другими адресами), для разнообразия проверил бы на single и longint.
s-andriano вне форума Ответить с цитированием
Старый 29.05.2013, 21:53   #5
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Цитата:
Конечно, можно было бы выложить и весь диск, идущий в комплекте :D с парой тысяч листов документации, поставить ТЗ, которое, правда, до сих пор утвердить не могут
вот не надо про весь диск с парой тысяч листов документации. Достаточно приложить файл с документацией, и то что там тысячи листов роли для многостраничного файла не играет.

Цитата:
Для того, чтобы не грузить читателей массой ненужных подробностей...
...
Опыта работы с динамическими библиотеками, взаимодействия различных языков языками практически нет, вот и подумалось, не штатная ли это ситуация
это с вашей колокольни, а с моей колокольни большой опыт взаимодействия и реверсинга сторонних устройств и приборов, и уж позвольте мне решать, что там является ненужной информацией, а что нужной. Не видно полной картины, а с огрызками кто согласится работать, еще и бесплатно?

Нет, конечно, если информация суперсекретная и вы давали подписку о неразглашении (у STM, к примеру, такое есть при получении некоторых милитари-позиций), тогда можно понять. Но тогда и вы пишите, так мол и так, ничего больше сказать невмоготу. Даташита не дам, ибо партизан. А так, разбирайтесь сами со "сферическими конями"/
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 30.05.2013, 00:21   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
BOOL HEX_qVEL (long ID, const char* szAxes, double* pdValueArray) Get Closed-Loop Velocity

Функция, возвращает скорости движения шести штанг, в массиве

Get the current value of the closed-loop velocity for szAxes.
Arguments:
ID ID of controller
szAxes string with axes, if "" or NULL all axes are queried.
pdValueArray array to be filled with the velocity settings of the axes
Returns:
TRUE if no error, FALSE otherwise
По идее вот так:
Код:
const 
  cBaseLib = 'PI_GCS2_DLL.DLL'; //Задолбаетесь писать для каждого метода название DLL

...
{
 cdecl - для C++ характернее всего. Вообще соглашение о вызове должно быть описано в документации, оно влияет на то, каким боком пойдут данные в стэк
Если пойдут не так, то что-то крякнет. 
}
function HEX_qVEL(id:LONG; const szAxes:PChar; pdValueArray:PDouble):Boolean; cdecl; external cBaseLib name 'HEX_qVEL';

....
var
  aDouble:array[0..5] of Double;
  Str:string;
begin
   if HEX_qVEL(0,PChar(Str),@aDouble[0]) then
    ...
     else 
    ..
end;
Последним параметром наверное надо указать на первый элемент массива. Как со строкой. Надеются, на вашу серьезность что в массиве будет 6 элементов.

Последний раз редактировалось Человек_Борща; 30.05.2013 в 00:30.
Человек_Борща вне форума Ответить с цитированием
Старый 30.05.2013, 08:19   #7
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

s-andriano, Человек_Борща, спасибо большое! Про один из вариантов опробования я уже даже подумывал сначала, но забыл, а некоторые были новые перепробую все!! нужно локализовать пробелму

raxp, абсолютно ничего секретного, более того, даже оф.сайт нарыл, вот старая железка M-850 http://www.physikinstrumente.com/en/...?sortnr=700800
и новая, "replaced by the following new product", H-850 http://www.physikinstrumente.com/en/...?sortnr=700801

pdf по главной DLL я что-то не нахожу, может плохо искал, потом выложу её, и саму DLL, если понадобится или если просто кому-то понадобится )

Просто я наоборот старался не загружать участников форума излишними подробностями и конкретизировал свой вопрос парой строк из примеров, возможно, для специалистов проще когда всё под рукой

Дойду до цеха (как обычно, план расписан как попало, и железяки в сборе ), там попробую предложенные варианты. По результатам отпишусь.
AnTe вне форума Ответить с цитированием
Старый 06.06.2013, 09:18   #8
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

Наконец-то добрался, чуток разобрался. Докладываю

Во-первых, получилось так, что как раз описанные выше функции работают. Выдавали ерунду они по другой причине, я один из режимов не активировал. Если ничего не помогает - очень начинает помогать прочтение документации!

Однако, проблемы не закончились. Довольно странная штука получается: те функции, которые по логике не должны работать - работают, а те, которые определены правильно - не работают.

Я локализовал проблему, приведу для примера две функции, из документации. Местами немного повторюсь:

BOOL PI_MOV (long ID, const char* szAxes, const double* pdValueArray) - Set Target Position
..
BOOL PI_qMOV (long ID, const char* szAxes, double* pdValueArray) - Get Target Position


вот как они определены в заголовочном файле, который подсунул производитель контроллера и собственно дллки:

function PI_MOV(ID: LongInt; const szAxes: PChar; const pdValueArray: PDouble): Bool cdecl {$IFDEF WIN32} stdcall {$ENDIF};

function PI_qMOV(ID: LongInt; const szAxes: PChar; var pdValueArray:Double): Bool cdecl {$IFDEF WIN32} stdcall {$ENDIF};


Как справедливо заметил Александр, первый вариант - это правильный, а второй вариант - это какая-то лабуда. Но так сказал производитель.

Вызываю два варианта так:
Код:
var    floatarray6: array [0..5] of double;
...
   FunctRes := PI_MOV(ID,'', @floatarray6[0]);
...
функция возвращает FALSE, контроллер "пищит" ошибку, устройство не движется

Код:
var floatarray6: array [0..5] of double;
...
...заполняю массив 
...
    FunctRes := PI_qMOV(ID, '', floatarray6[0]);
...
функция возвращает True, в массиве - положение осей

т.о. второй, "неправильный" вариант, - работает!!


Теперь ещё пробую, раз в PI_MOV тип передаваемого массива всё же указатель на double - передаю значение для движухи по одной оси,

Код:
var    VarDouble: Double;
..
   VarDouble := 5;
   FunctRes := PI_MOV(ID,'X',@vardouble);
...
и вуаля! всё работает!

но мне-то нужно, чтобы перемещение шло одновременно по шести осям! А массив функция брать категорически отказывается

технически устройство готово к перемещению по всем осям, его можно запустить альтернативной функцией, на вход которой подаётся команда в виде строки. Меня беспокоит сам факт, что в библиотеке некоторые функции не хотят работать, и я хочу с этим разобраться.

я правильно понимаю, что всё делаю верно, и эти глюки говорят о криво собранной библиотеке, и являются поводом задать разработчику вопрос что за нафиг?


Пробовал в библиотеке типов убрать буковку "P" и передавать массив без указателей - в рантайме вываливается с access violation

пробую импортировать библиотеку типов средствами Delphi7 - (Project | Import Type Library) - "Ошибка при загрузке библиотеки". Быть может, я не туда лезу, эта функция для специального типа библиотек? (повторюсь, не шарю в этом совсем )

на всякий случай выкладываю(на офсайте так и не нашёл):
длл-ка http://www.multiupload.nl/W96HNJ5VMU
заголовочный файл http://www.multiupload.nl/3T32VN7J9O
описание её функций: http://www.multiupload.nl/ZG20PJY6WX

Последний раз редактировалось AnTe; 06.06.2013 в 09:34.
AnTe вне форума Ответить с цитированием
Старый 06.06.2013, 10:16   #9
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,713
По умолчанию

Т.е. вы признали, что нужна документация, сами ее изучили, а сюда вываливаете свои интерпретации. Вам самому-то не кажется это странным?

DLL-ка есть, описание функций появилось, уже что-то. Теперь хорошим тоном будет и приложить в теме документацию, которая у вас перед глазами.
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 06.06.2013, 13:20   #10
AnTe
Форумчанин
 
Регистрация: 25.09.2008
Сообщений: 209
По умолчанию

raxp, какую именно документацию Вы имеете в виду? В принципе, я могу залить весь диск, который шёл в комлекте, это 264 мегабайта

Прикрепляю папку Manuals из него
http://www.multiupload.nl/HPRDEC8Z5H

просто я и сейчас не вижу смысла даже в этой документации для поиска сути проблемы

и локализовал проблему из лучших побуждений


UPD добавил ещё папку Samples с диска
http://www.multiupload.nl/QVJ843CWW3
и GCS_Library_Setup
http://www.multiupload.nl/4BZ98ZARGA

Последний раз редактировалось AnTe; 06.06.2013 в 13:36.
AnTe вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно написать программу под WinCE управление внешним устройством kompotius Фриланс 0 16.05.2012 16:32
Получение данных из сторонней dll Memfis1992 Общие вопросы Delphi 4 21.10.2010 09:19
удаленное управление устройством! Gambler Работа с сетью в Delphi 11 29.10.2009 12:12
Управление исполнительным устройством через компьютер Scutarius Свободное общение 3 28.07.2009 15:56
Проблемы с типами данных в Delphi Paul11j Помощь студентам 4 15.05.2009 22:59