Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 17.12.2009, 22:17
userlife userlife вне форума
Прохожий
 
Регистрация: 17.12.2009
Сообщения: 10
Репутация: 10
Вопрос Крутой девайс

Здравствуйте всем.
Случилось у меня,что приобрел я однажды некий крутой девайс АЦП-ЦАП.Теперь не могу к нему программно доступиться,хотя документация есть.Проблемма в том,что примеры даны на языке С,в котором я ... ну ничего не...
Здесь я подаю материалы,как они поданы в примере документации.Может кто-нить поможет мне перевести эти команды в делфовский вид и запустить таки этот мудреный девайс?
В исходнике прилагается некая DLL библиотека IsaBox.dll

-------------------------------------------------------------
Пример сборки шины и доступа к портам

В данном примере подключим устройство на COM2.
Скорость обмена по COM-порту 115200 кбит/с, адрес контроллера 0x05.

Код:
#define COM2  1
#define LOCAL_PORT  5100
void main(void)
{
unsigned long ComInterface, ComController;
unsigned short PortValue;

// 1. Очистка реестров интерфейсов и контроллеров
ibcClearControllerList();// это функции библиотеки IsaBox.dll
ibcClearInterfaceList();

// 2. Регистрация интерфейса
ComInterface = ibcOpenInterface(COM2, 115200, NULL);// это функции библиотеки IsaBox.dll

// 3. Регистрация контроллеров
ComController = ibcOpenController(ComInterface,0x05,0x300,0x309);
// 0x300,0x309 - адреса портов ввода-вывода сего девайса

  }
------------------------------------------------------------------
Вот что попробовал сделать я.Ввиду моего малого опыта программирования,я решил библиотеку IsaBox.dll подключить статически.
------------------------------------------------------------------
Код:
...
var OpenInterf:cardinal;

implementation

{$R *.dfm}
{N+,E+} // так содрал с руководства Фараонова

Procedure ibcClearControllerList; Far; External 'Isabox.dll';
Procedure ibcClearInterfaceList;  Far; External 'Isabox.dll';

Function ibcOpenInterface(Com:byte;baud:longint;p:pointer):cardinal; Far; External 'Isabox.dll';
Function ibcOpenController(handle:longint;adr:longint;adr0:longint;adr1:longint):cardinal; Far; External 'Isabox.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
 ibcClearControllerList();
 ibcClearInterfaceList();
 OpenInterf:=ibcOpenInterface(COM2,115200,nil);// на этом загвоздка.Выдает error

end;

lmikle: пользуем теги!!!

Вот и все.При пошаговой отладке две первые команды проходят,а третья выдает ошибку.В чем дело не знаю.Может я типы неправильно назвал или записал не так?
Может кто из опытных ребят поможет привести модуль в рабочий вид?
Заранее всем спасибо.

userlife
Ответить с цитированием
  #2  
Старый 17.12.2009, 22:33
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. Не факт, что ты правильно импортировал функции библиотеки. Для первых функций, кторые без параметров, модель вызова не важна. А вот для третьей - очень даже важна. Попробуй пометить импортируемые функции как stdcall;
2. Не уверен, что типы параметров у тебя указаны правильно. Надо смотреть точное поисание заголовка фуниций в документации и уже тогда выбирать типы соотв. параметров. Например, там, где указано unsigned short лучше использовать WORD;

По имени библиотеки можно найьт описание функций.
Например:
Код:
unsigned long ibcOpenInterface(unsigned char ComPort, 
                               unsigned long Baudrate, 
                               HANDLE OpenPortHandle); 

я бы оттранслировал бы так:

Код:
function ibcOpenInterface(ComPort : Byte; Baudrate : DWORD; OpenPortHandle : THandle) : DWORD; stdcall; external 'IsaBox.dll';
Ответить с цитированием
  #3  
Старый 18.12.2009, 15:53
userlife userlife вне форума
Прохожий
 
Регистрация: 17.12.2009
Сообщения: 10
Репутация: 10
Вопрос Что-то оживилось

Спасибо,товарищ Модератор.
Сделал так как Вы рекомендовал и отладчик плеваться эррорами перестал.Пришлось методом программного втыка добавить выключение-включение девайса (о чем в руководстве почему-то не сказано),потом он перестал виснуть на запросах портов.Пишет ли он в них что-то (например управляющие слова) пока неизвестно,но вычитать оттуда моей
программой еще ничего не удалось.Не читаются пока порты.Сидел полдня,тыкал-тыкал,типы данных менял и увы - ничего.

Кстати,за подобный вопрос в Королевстве Делфи на меня надулись и посмотрели очень злобно.Я наверное задаю дурные вопросы? Не проффесионал ведь.Хобби только.А вам спасибо за человечность.Все ж когда-то были начинающими.Не так ли?
Ответить с цитированием
  #4  
Старый 18.12.2009, 16:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну, вообще, на будущее запомни, что сишные библиотеки обчно надо импортировать, указывая соглашение о передачи параметров именно как stdcall. А нет ли для этой штуки COM-интерфейса. С ним бы было тебе гораздо проще, т.к. импорт производится автоматически, да и работать чуть удобнее, хотя, в общем, работает и чуть медленнее.
Ответить с цитированием
  #5  
Старый 18.12.2009, 17:05
userlife userlife вне форума
Прохожий
 
Регистрация: 17.12.2009
Сообщения: 10
Репутация: 10
Вопрос Чудо-девайс

Вся эта штуковина в черном длинном корпусе разработана под шину ISA.
Но поскольку у меня ноутбук и ничего в него уже не сунешь,ребята в этом самом ящике сделали прототип этой самой шины и подцепили его к USB.Так что прежде всего я установил USB драйвер,потом зарегистрировал в Виндовсе IsaBox.dll.
В устройствах после инсталляции появляется новый COM порт,который можно выбрать из свободных с номерами от COM1 аж по COM16.
Далее там прилагается готовая программа IsaBox Administrator.Так через нее этот девайс виден и даже работает,но для моих целей требуется собственное программирование.То,что есть в прилагаемой документации,пока реализовать не удалось.Сейчас снова буду рыться в науке.Поробую заводить в порты и выводить из них вручную этим самим Администратором.
Результаты сообщу как только что-нибудь получится.
Ответить с цитированием
  #6  
Старый 18.12.2009, 17:25
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

COM, который я имел в виду - это Component Object Model, а не COM-порт
Ответить с цитированием
  #7  
Старый 18.12.2009, 22:39
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

userlife
Немного непойму - Вы тему закончили или нет?
Те несколько функций, которые Вы привели, Вам подсказали как переводить на Delphi.
Правда на следующих страницах "ТЕХНИЧЕСКОГО ОПИСАНИЯ"
( которое занимает 19 страниц - из них 10 описание API Isabox.dll ) есть еще функции управления через эту dll.
Правда я не понял - у Вас ЦАП, АЦП или "
ISA-BOX - выносные модификации плат ввода-вывода" ?
Если есть на диске файл *.h то когда то находил программки преобразования h2pas.
( они хоть не идеальны но основное переводят ).
Вы только не обижайтесь, но для помощи нужна информация, а не черная коробочка и несколько функций ( если помощь нужна ).
Цитата:
1 функции регистрации и сборки

ibcSetLocalPort
ibcGetLocalPort
ibcOpenInterface
ibcOpenLanInterface
ibcOpenController
ibcClearControllerList
ibcClearInterfaceList
ibcControl

2 Сервисные функции

ibcGetControllerProfile
ibcGetObjectList
ibcFirstObject
ibcNextObject
ibcEofObject
ibcGetOncObject
ibcSetRsCfg
ibcGetRsCfg
ibcSetLanCfg
ibcGetLanCfg
ibcSaveToFlash
ibcRestoreFromFlash

3 Функции доступа к портам шины ISA

ibcReadPort
ibcWritePort
ibcReadPortW
ibcWritePortW
ibcExReadPort
ibcExWritePort
ibcExReadPortW
ibcExWritePortW
Это заголовок функций.
Ответить с цитированием
  #8  
Старый 19.12.2009, 03:25
userlife userlife вне форума
Прохожий
 
Регистрация: 17.12.2009
Сообщения: 10
Репутация: 10
Вопрос Вот что есть

Спасибо за замечания.А чего обижаться-то? Вы человек сведущий,я - начинающий.Естественно есть и будет разница в подходах к решению проблемы.Главное не ссориться,а то на Королевство Делфи я и заходить боюсь.Такое впечатление,что за твою неопытность там готовы на тебя спустить кибер-пса (

Намучался я целый вечер,а порты так и остались недоступны.

Вот описание функций их руководства,которые я задействовал:
------------------------------------------------------------------------------------------------------------
Из прикладной программы перед началом сборки шины нужно вызвать функции ibcClearInterfaceList и ibcClearControllerList для очистки реестра интерфейсов и контроллеров.
Для регистрации интерфейсов вызываются функция ibcOpenInterface. Функция вызывается при регистрации COM-порта. Контроллеры с USB интерфейсом создают при подключении виртуальный СОМ-порт, поэтому эта функция вызывается по тем же правилам.Функция при успешном выполнении возвращает ИДЕНТИФИКАТОР ИНТЕРФЕЙСА. Этот идентификатор используется при регистрации контроллеров.
Для регистрации контроллеров вызывается функция ibcOpenController. При регистрации контроллера нужно указать ИДЕНТИФИКАТОР ИНТЕРФЕЙСА, к которому подключен контроллер, АДРЕС КОНТРОЛЛЕРА и ДИАПАЗОН АДРЕСОВ ШИНЫ ISA, которые он будет обслуживать.

После этих манипуляций вызывается функция ibcControl, которая производит подключение к COM-портам.Теперь шина ISA собрана и готова к использованию.
Ответить с цитированием
  #9  
Старый 19.12.2009, 03:26
userlife userlife вне форума
Прохожий
 
Регистрация: 17.12.2009
Сообщения: 10
Репутация: 10
Вопрос Пролоджение

2.1. Очистка реестра интерфейсов и контроллеров

void ibcClearControllerList(void);
void ibcClearInterfaceList(void);

Параметры: отсутствуют;

2.2.Регистрация COM-порта

unsigned long ibcOpenInterface(unsigned char ComPort,
unsigned long Baudrate,
HANDLE OpenPortHandle);

Параметры:
1. ComPort – номер COM-порта; (0 - COM1, 1 - COM2 и т.д.);
2. Baudrate – скорость обмена; (1200 – 115200);
3. OpenPortHandle – если есть необходимость подключить к одному порту различные устройства (на RS-485), то этот порт нужно открыть до его регистрации в библиотеке и хендл открытого порта передать третьим параметром. Если такой надобности нет, то прировнять его к NULL.

Возвращаемый параметр: идентификатор интерфейса. Используется при регистрации контроллеров. (См. ниже)

2.3.Регистрация контроллера

unsigned long ibcOpenController(unsigned long InterfaceHandle,
unsigned long Address,
unsigned short StartAddress,
unsigned short StopAddress);

Параметры:
1. InterfaceHandle – идентификатор интерфейса возвращаемый функциями регистрации интерфейсов;
2. Address – адрес контроллера; ( 1 – 255 для RS, 0 – широковещательный)
3. StartAddress, StopAddress – диапазон адресов шины ISA которые будет обслуживать контроллер.

Возвращаемый параметр: идентификатор контроллера. Используется при вызове сервисных функций для получения дополнительной информации о контроллере. (См. ниже)

2.4.Включение/выключение шины

bool ibcControl(bool status);

Параметры:
1. status – (true/false);

Возвращаемый параметр: в случае успешного подключения к зарегистрированным COM-портам и создания сокетов функция возвращает true.
В противном случае – false.


2.5.Побайтный и пословный доступ к одному порту

bool ibcReadPort(unsigned short address, unsigned char *value);
bool ibcWritePort(unsigned short address, unsigned char value);
bool ibcReadPortW(unsigned short address, unsigned short *value);
bool ibcWritePortW(unsigned short address, unsigned short value);

Параметры:
1. address – адрес порта шины ISA;
2. value – значение, записываемое в порт или считываемое с порта.

Возвращаемый параметр: в случае успешного выполнения функция возвращает true. В противном случае – false. Причиной не успешного вызова может стать либо не правильно зарегистрированный интерфейс и/или контроллер либо плохая линия связи с контроллером.

================================================
Это документация.А вот что сделал я на Делфи
================================================
Ответить с цитированием
  #10  
Старый 19.12.2009, 03:28
userlife userlife вне форума
Прохожий
 
Регистрация: 17.12.2009
Сообщения: 10
Репутация: 10
Вопрос Продолжение

2.6. Библиотеку IsaBox.dll со всем этим добром я поместил в папке проекта
Код:
var
  Form1: TForm1;
  OpenInterf,OpenContr:DWORD;//будут использоваться для открытия и регистрации
  Vkluc:boolean=false;// я проверю как сработала функция
  S:string;// то для моих сообщений
  r:word;// для чтения из порта
  N:byte;// для цикла запросов на вызов функции доступа к порту (ам)

implementation

{$R *.dfm} //это поставило само.не знаю зачем

Procedure ibcClearControllerList; stdcall; External 'Isabox.dll';
Procedure ibcClearInterfaceList;  stdcall; External 'Isabox.dll';
Admin: Пользуемся тегами!

Последний раз редактировалось Admin, 19.12.2009 в 11:21.
Ответить с цитированием
  #11  
Старый 19.12.2009, 03:29
userlife userlife вне форума
Прохожий
 
Регистрация: 17.12.2009
Сообщения: 10
Репутация: 10
Вопрос Продолжение

Код:
Function ibcOpenInterface(ComPort:Byte;Baudrate:DWORD;OpenPortHandle:THandle): DWORD; stdcall; External 'IsaBox.dll';
Function ibcOpenController(OpInt:DWORD;adr0:DWORD;adr1:WORD;adr2:WORD):DWORD; stdcall; External 'Isabox.dll';
Function ibcControl(a:boolean):boolean; stdcall; External 'Isabox.dll';

Function ibcReadPort(adr:word;value:byte):boolean; stdcall; External 'Isabox.dll';
Function ibcWritePort(adr:WORD;value:byte):boolean; stdcall; External 'Isabox.dll';
Function ibcReadPortW(adr:word;value:word):boolean; stdcall; External 'Isabox.dll';
Function ibcWritePortW(adr:word;value:word):boolean; stdcall; External 'Isabox.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
 ibcClearControllerList();
 ibcClearInterfaceList();
 OpenInterf:=ibcOpenInterface(0,115200,0);// девайс я посадил на COM0,а вместо рекомендованого NULL просто поставил ноль.
 OpenContr:=ibcOpenController(OpenInterf,$1,$300,$30F);// адрес устройства $1 взял из сообщений IsaBox администратора,а адреса $300-300F штатные,к которым привязан контроллер.
 ibcControl(false);// в руководстве этого трюка нет,но если я его не введу,все зависнет при первом же доступе к портам
 ibcControl(true);// собираю шину,как советует руководство

 for N:=0 to 10 do // и пробую,авось на каком-то разу все-таки "пробьет"...
 begin
  Vkluc:=ibcWritePort($307,$80);// пробую записать в порт управляющее слово
  if Vkluc=true then S:='True' else S:='False';
  memo1.Lines.Add(S);
  sleep(500);
// на экране в форме выводит False  False false ...
 end;

 end;

end.
Admin: Предупреждение! Пользуемся тегами!

Кажется запас моих знаний для решения проблемы исчерпан.
Что дальше? Кто поможет разобраться?
Спасибо заранее.

Последний раз редактировалось Admin, 19.12.2009 в 11:25.
Ответить с цитированием
  #12  
Старый 19.12.2009, 11:41
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Пока у меня есть немного свободного времени немного помогу.
Для начала предлагаю вынести функции dll в отдельный модуль.
скачайте Isabox_h.zip, распакуйте файл Isabox_h.pas в папку проекта, а в форме удалите описания функций и запишите
Код:
implementation

uses Isabox_h;
Кстати там были ошибки, там где звездочки правильно писать
Код:
Function ibcReadPort(address: WORD; var value: Byte):ByteBool; stdcall; External 'Isabox.dll';
или использовать указатели.
bool записал как ByteBool на всякий случай.
В MSDN про bool написано что в Visual C++ 4.2 занимает 4 байта в Visual C++ 5.0 и выше - 1 байт.

Скачал ТО на WAD-DAC16-16( у вас это устройство или другое? ).

Попробуйте так
Код:
var
  Form1: TForm1;

  OpenInterf, OpenContr: DWORD; //будут использоваться для открытия и регистрации
  Vkluc: ByteBool = false; // я проверю как сработала функция
  S: string; // то для моих сообщений
  r: word; // для чтения из порта

implementation

uses Isabox_h;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  ibcClearControllerList();
  ibcClearInterfaceList();
  OpenInterf := ibcOpenInterface(0, 115200, 0); // девайс на COM0,а NULL = 0.
  memo1.Lines.Add('OpenInterf := ' + IntToStr(OpenInterf)); // проверим подключение

  OpenContr := ibcOpenController(OpenInterf, $1, $300, $30F); // адрес устройства $1 из сообщений IsaBox администратора,а адреса $300-300F штатные,к которым привязан контроллер.
  memo1.Lines.Add('OpenContr := ' + IntToStr(OpenContr)); // проверим подключение, надеюсь джамперы выставленны именно для адресов $300-300F

  ibcControl(false); // периодически пробуйте без этого ( может sleep(200); ниже был необходим
  ibcControl(true); // собираю шину,как советует руководство

  sleep(200); // в примерах на турбо паскале вроде здесь должно быть

  for i := 0 to 10 do // и пробую,авось на каком-то разу все-таки "пробьет"...
  begin
    Vkluc := ibcWritePort($307, $80); // пробую записать в порт управляющее слово
    if Vkluc = true then
      S := 'True'
    else
      S := 'False';
    memo1.Lines.Add(S);
    sleep(500);
    // на экране в форме выводит False False false ...
  end;

end;
Я там добавил пару сообщений в memo1, покажите, что получилось, а я пока еще подумаю, почитаю руководство.

Ответить с цитированием
  #13  
Старый 19.12.2009, 15:08
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Полистал ТО.
Откуда Вы взяли $307 ?
Или я не то руководство скачал, или читайте первую часть.
Там сказано:
Цитата:
1. Включить аналоговое питание. Сделать задержку 100-200 мс.
2. Включить режим записи.
3. Установить номер программируемого канала (номер бан-
ка) и число точек в периоде.
4. Произвести запись информации в банк данных путем
последовательной записи 16-ти разрядных данных.
5. Если необходимо использовать другие каналы (банки
данных), повторить П.3 и П.4
6. Установить номер программируемого канала нулевым (если
режим чтения должен начаться с нулевого канала) или дру-
гим, если этот канал должен обновлятся первым - сделать
программирование номера канала необходимо для сброса
счетчика адреса ОЗУ).
8. Включить режим чтения ОЗУ.
И приведен пример на турбопаскале для ISO

Т.е. делается примерно так:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  // очищаем
  ibcClearControllerList();
  ibcClearInterfaceList();

  OpenInterf := ibcOpenInterface(0, 115200, 0); // открываем интерфейс
  memo1.Lines.Add('OpenInterf := ' + IntToStr(OpenInterf)); // проверим подключение

  OpenContr := ibcOpenController(OpenInterf, $1, $300, $30F); // открчваем контроллер
  memo1.Lines.Add('OpenContr := ' + IntToStr(OpenContr)); // проверим подключение

  ibcControl(true); // включаем шину

  sleep(200); // задержка

  Vkluc := ibcWritePort($301, $01); // подаем питание и включаем запись

  sleep(200); // задержка

  Vkluc := ibcWritePort($303, $10); //  выбираем адр. канала и кол-во точек в периоде

  Vkluc := ibcWritePortW($304, $0000); // запись в ОЗУ
  Vkluc := ibcWritePortW($304, $1000); // запись в ОЗУ
  Vkluc := ibcWritePortW($304, $2000); // запись в ОЗУ
  Vkluc := ibcWritePortW($304, $3000); // запись в ОЗУ
  Vkluc := ibcWritePortW($304, $4000); // запись в ОЗУ
  Vkluc := ibcWritePortW($304, $5000); // запись в ОЗУ

  Vkluc := ibcWritePort($301, $01); // включаем запись
  Vkluc := ibcWritePort($303, $10); //  выбираем адр. канала и кол-во точек в периоде
  Vkluc := ibcWritePort($301, $03); // включаем чтение

  // отключаем шину
  ibcControl(false); // это не обязательно сдесь
end;
После каждой строчки можете написать лог
типа
Код:
if Vkluc then
  memo1.Lines.Add('...')
 else
  memo1.Lines.Add('...');
Сообщите что из этого получилось - мне проверить негде
Ответить с цитированием
  #14  
Старый 19.12.2009, 17:45
userlife userlife вне форума
Прохожий
 
Регистрация: 17.12.2009
Сообщения: 10
Репутация: 10
Вопрос Попробую

Спасибо s0Creator за помощь.только что прилез из города.Снег метет как в Сибири...
Отдохну и попробую.Результаты сообщу обязательно.
У меня тот самый WAD только 32-й.Там еще есть отдельное царство-государство - КР580ВВ55 - порт параллельного ввода-вывода.
А адрес 307 это просто порт ее управляющего слова.На адресах ниже сидят ее порты А,В,С.Самое интересное,что из IsaBox Administrator'а все видно и все работает,а вот программно - ну никак... Уперлось

Админу.Простите,пожалуйста.Я просто тегами здесь пользоваться не умею.Потому и получается у меня после команд везде где двоеточия торчат смайлики.Аж самому неудобно...
Ответить с цитированием
  #15  
Старый 19.12.2009, 18:52
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Значит описание не то посмотрел.
Пробуй согласно своего. Я понял что не просто запись управляющего слова но и серия команд должна быть.
для вставки тега выделяешь код и жмешь сверху #
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:28.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025