Форум: Техническая поддержка

Тема: L780 - Как подключить библиотеки АЦП в Visual C++

Вы не вошли.

 Поиск | Регистрация | Вход 

Denis
26.01.2006 17:41:06
#26

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

в общем нашел я что то похожее... это пример под 6 вижуал подключения библиотеки .. некая программа /USB/E14-XXX/E14-440/Examples/MSVC6/DynLoad покапался в исходниках... я так понял согласно файлу LoadDll.cpp библиотека подключается с помощью вызова ::LoadLibrary(DllName);   
но в с# LoadLibrary нет.. и везде предлагается подключать биюлиотеку так как я описал выше через преференсес... но блин преференсес говорит что это неправильная длл... вот такая беда.. вроде по форуму я так понял  народ под с шарп пишет (некий Кирилл)... как же он это делает... и почему шарп не признает вашу длл за длл???

Denis
30.01.2006 13:33:18
#27

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

Есть три папки касающиеся 7 серии
l7xx.dpr
L7xx.vi
L7xx.tst
внутри последней..
Testdll.cpp
Test.ide
Test.exe
Test.dsw
L783.bio
L780.bio
L761.bio
Clean.bat

но это уже не суть важно, я вроде как понял (см предыдцщий пост) как оно в шестом делается... важно то что суде по форуму народ в шарпе все делает и оно работает... но как...никто не признается..

А почему же все таки седьмой вижуал не признает вашу длл за длл???

Женя
05.02.2006 23:10:56
#28

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

задал вопрос по поводу переноса интерфейса доступа к dll-ке на си шарповском форуме. Один авторитетный чел написал следующее :

1) Опишите прототип функции CreateInstance со static, extern и атрибутом DllImport
2) Опишите интерфейс IDaqLDevice, не забыв повесить на него атрибуты Guid и ComImport. Главное - не ошибиться в порядке и сигнатурах методов. И не забыть включить методы всех интерфейсов-предков (если есть), кроме IUnknown.

После этого вызывайте вашу функцию CreateInstance и работайте с вашим интерфейсом как ни в чём не бывало.

06.02.2006 06:57:25
#29

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 - Как подключить библиотеки АЦП в Visual C++

не выйдет...это не полный COM. Говорюже  скачайте последние драйвера и там WLCOMP используйте ...

06.02.2006 15:32:14
#30

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 - Как подключить библиотеки АЦП в Visual C++

Такой функции как в примере нет там...есть другие которые в h файле прописаны...

Denis
07.02.2006 11:49:37
#31

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

у меня на тот  же код выдает
Object Reference not set to an instance to object...

Подитожим:

что на данный момент имеем..

атрибут dll импорт при неправильном указании пути пишет ошибку что dll  не загружена.. по примеру с возвратом GetDllVersion убедились что он исправно работает.

Функции надо брать из h файла ifc_ldev.h (я так понял)
начинать нужно естественно с OpenLDevice, который к сожалению не подключается...
другие функции типа PlataTest тоже нехотят возвращать error и тоже пишут туже ошибку...


Вердикт..
Чего делать то??? уважаемый Poul может есть идеи?

07.02.2006 11:53:17
#32

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 - Как подключить библиотеки АЦП в Visual C++

Начинать надо с примера С++ и смотреть как вызывается, в какой последовательности.... сказал же новые дрова и WLCOMP каталоги....

Denis
07.02.2006 12:42:10
#33

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

новые дрова стоят
"WLCOMP каталоги" - что имеется ввиду dll  да взяли оттуда, h- файл ? так там нет ни одного пример C++ так там через указатель все??

07.02.2006 13:02:58
#34

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 - Как подключить библиотеки АЦП в Visual C++

WLCOMP_TST это сишный пример, вот его и смотрите..wlcomp.h это заголовки функций, описало к ним аналогично указательным функциям lcomp...

Denis
08.02.2006 15:36:22
#35

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

Вот какой код получился...
Load Dll - проходит и возвращает некое большое число с этим все ок..
но вот выдает ошибку на CallCreateInstance
почему чего то недохожу - ведь он тоже должен браться из wlcomp.dll я так понял.
ошибка таже
Object Reference not set to an instance to object

unsafe static void Main(string[] args)
        {   
            ulong hIfc;                       
            ulong hDll = 0;           
            ulong Err = 0;
            ulong NumberSlot = 0; // Номер слота где стоит плата
           
            hDll = LoadAPIDLL("lcomp.dll");
            Console.WriteLine(hDll.ToString());           
           
            hIfc = (ulong)CallCreateInstance(&hDll, NumberSlot, &Err);
            Console.WriteLine(hIfc.ToString());           
            Console.ReadLine();   

            Err = OpenLDevice(hIfc);
            Console.WriteLine(Err.ToString());           
            Console.ReadLine();                       
        }   
                   
        [DllImport("wlcomp.dll")]       
        extern static public ulong LoadAPIDLL(string dllname);
        [DllImport("wlcomp.dll")]           
        extern unsafe static public ulong CallCreateInstance(ulong *hDll, ulong slot, ulong *Err);
        [DllImport("wlcomp.dll")]           
        extern static public ulong OpenLDevice(ulong hIfc);

Denis
09.02.2006 14:26:42
#36

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

есть сдвиги следующего плана - не уверен что это правильно но....

unsafe static void Main(string[] args)
        {   
            ulong hIfc;                       
            ulong hDll = 0;           
            ulong Err = 0;
            ulong NumberSlot = 0; // Номер слота где стоит плата
           
            hDll = LoadAPIDLL("lcomp.dll");
            Console.WriteLine(hDll.ToString());           
           
            hIfc = (ulong)CallCreateInstance(&hDll);
            Console.WriteLine(hIfc.ToString());           
            Console.ReadLine();   

            Err = (ulong)OpenLDevice(&hIfc);
            Console.WriteLine(Err.ToString());           
            Console.ReadLine();                       
           
        }   
                   
        [DllImport("wlcomp.dll")]       
        extern static public ulong LoadAPIDLL(string dllname);
        [DllImport("wlcomp.dll")]           
        extern unsafe static public ulong CallCreateInstance(ulong *hDll);
        [DllImport("wlcomp.dll")]           
        extern unsafe static public ulong OpenLDevice(ulong *hIfc);

В общем все то же самое что  и раньше - но я убрал два параметра из функции CallCreateInstance, в результате возвращается большое число, но теперь при вызове OpenLDevice опять наша любимая ошибка с тем же содержанием "Object Reference not set to an instance to object " Попытка вызвать CallCreateInstance с двумя параметрами тоже привела к ошибке.. осталось разобратся почему же OpenLDevice неработает и вообщемто хорошо понять почему CallCreateInstance с одним параметром работает? (Это наверно к Poul) и еще а верную ли ссылку возвращает CallCreateInstance ????

09.02.2006 16:38:08
#37

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 - Как подключить библиотеки АЦП в Visual C++

Я тут поковырялся немного в С#... такая фигня работает :

using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.Text;

namespace testapp
{
    unsafe public struct PLATA_DESCR
    {
        public fixed byte SerNum[9];
        public fixed byte BrdName[5];
        public byte Rev;
        public fixed byte DspType[5];
        public int Quartz;
        public ushort IsDacPresent;
        public fixed ushort Reserv1[7];
        public fixed ushort KoefADC[8];
        public fixed ushort KoefDAC[4];
        public fixed ushort Custom[32];
    }

    class Program
    {
    [DllImport("wlcomp.dll")]
        public static extern uint LoadAPIDLL(string dllname);
    [DllImport("wlcomp.dll")]
        public static extern unsafe uint FreeAPIDLL(uint *hDll);
    [DllImport("wlcomp.dll")]
        public static extern unsafe uint CallCreateInstance(uint* hDll, uint Slot, uint* Err);
    [DllImport("wlcomp.dll")]
        public static extern unsafe uint OpenLDevice(uint* hObj);
    [DllImport("wlcomp.dll")]
        public static extern unsafe uint CloseLDevice(uint* hObj);
    [DllImport("wlcomp.dll")]
        public static extern unsafe uint LoadBios(uint* hObj, string BiosName);
    [DllImport("wlcomp.dll")]
        public static extern unsafe uint PlataTest(uint* hObj);
    [DllImport("wlcomp.dll")]
        public static extern unsafe uint ReadPlataDescr(uint* hObj, PLATA_DESCR* pd);

        unsafe static void Main(string[] args)
        {
            uint hDll;
            uint hObj;
            uint Err;
            PLATA_DESCR pd;
            string s = "lcomp.dll";
            Console.WriteLine("Hello World!!!");
            hDll = LoadAPIDLL(s);
            Console.WriteLine(hDll.ToString());
            hObj = CallCreateInstance(&hDll, 0, &Err);
            Console.WriteLine(hObj.ToString());
            Console.WriteLine(Err.ToString());
            OpenLDevice(&hObj);
            Err = LoadBios(&hObj, "l783"); Console.WriteLine(Err.ToString());
            Err = PlataTest(&hObj); Console.WriteLine(Err.ToString());
            Console.WriteLine("Read FLASH");
            Err = ReadPlataDescr(&hObj,&pd); Console.WriteLine(Err.ToString());

            byte[] bt = new byte[9];
            for (int i = 0; i < 9; i++)
            {
                if (pd.SerNum[i] == 0) break;
                bt[i] = pd.SerNum[i];
            }
            Encoding ascii = Encoding.ASCII;
            Console.WriteLine(ascii.GetString(bt));
            CloseLDevice(&hObj);
            FreeAPIDLL(&hDll);
        }
    }
}
Главное внимательно с размерами типов данных... ulong это 64 а int 32 а char 16  бит

Denis
10.02.2006 16:51:27
#38

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

УРААААААААААААААААААААААААААААААААААААААААА!!!!!

завелось.....!

ВЫ просто неосознаете всю глубину моей благодарности.. :-))))

Denis
10.02.2006 19:29:08
#39

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

ну .. получается так что продолжаем учится....

вышепредставленный код работает!! но не работает все что связано со структурой...
во первых у меня почему то нет

using System.Collections.Generic;

у Collections. ечть только один подкласс

Specialized

Кстати а что в этом Generic и зачем он вообще?

в хелпе про него тоже не написано...

ну и со структурой все плохо...

на тот код который у вас написан на слово fixed  - требует что здесь был тип....
попытки все это представить по другому не имели успеха...
пишет объевление масива не соответствует шарповскому public byte[] SerNum = new byte[9];
в общем чего то не победил я структуры..

интересно почему у нас результаты разные???

10.02.2006 20:45:59
#40

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 - Как подключить библиотеки АЦП в Visual C++

А шарп какой? Я пользовал халявный С# Express от Микрософта это 2.0 редакция и слово fixed там появилось...

Женя
12.02.2006 12:43:12
#41

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

оо, понеслась душа в рай !!!

Женя
15.02.2006 11:10:58
#42

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

у кого как дела ?

я уперся в функцию
[DllImport("wlcomp.dll")]
        public extern static uint GetSyncData(ref uint hIfc, uint SyncPtr, ref uint Sync);

Настраиваю плату при помощи структур, инициализирую, стартую без ошибок. Вызываю GetSyncData(ref plata.hIfc,(uint)plata.syncVarPointer.ToInt32(),ref sync1) - в Sync возвращается ноль.

plata.syncVarPointer.ToInt32() = 64815104

Еще вот такой лог у меня :

Loading lcomp.dll
hDll = 62914560
Called CallCreateInstance. Error result = 0
hIfc = 63053592
Called OpenLDevice. Result = 1004
Called LoadBios. Error result = 0
Called ReadPlataDescr. Error result = 0
Called PlataTest. Error result = 0
L783 SerNum = 7C502637
Called RequestBufferStream. Allocated memory size(word): 100352. Error result = 0
Called SetParametersStream. Error result = 0
Plata parameters :
Buffer size(word): 32768
Pages            : 32
IrqStep          : 1024
FIFO             : 1024
Rate             : 200,000000000464
Called EnableCorrection(1). Error result = 0
Called InitStartLDevice. Error result = 0
Called StartLDevice. Error result = 0

Denis
15.02.2006 11:50:48
#43

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

ЖЕня а скиньте пожалуйста свои исходник...
какая версия шарпа у вас?

Женя
15.02.2006 13:17:25
#44

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

Microsoft Visual Studio 2005 Professional Edition version 8.0.50727.42
Microsoft .Net Framework Version 2.0.50727

исходники выслал

зы : на Вы ко мне обращаться не стоит, страшно становится smile

15.02.2006 14:26:56
#45

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 - Как подключить библиотеки АЦП в Visual C++

чего в структуре параметров сбора задали? случайно синхронизацию не включили?

Denis
15.02.2006 15:23:56
#46

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

блин ну невезуха у меня вижуал 2003 твои проект не открываетсяч... ну да это ничего.. буду так разбиратся спасибо большое.. все дошло хорошо....

P.S. будем на ты... я тоже не преклонного возраста.. %-)))

Женя
15.02.2006 20:45:32
#47

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

кстати, смогу ли я реализовать такую систему функциями библиотеки, или прийдется как-то по особому извращаться ? Кажется мне не очень подходит кольцевой буфер :

С первого цифрового выхода подается сигнал на
первое устройство, передающее данные некоторый интервал времени.
Я принимаю эти данные с первого аналогово входа.

Перехожу ко второму цифровому выходу, второму устройству и второму аналоговому входу, с которыми выполняю ту же процедуру.

И так с 10-ю группами(цифровой выход, второе устройство, аналоговый вход). Затем всё сначала

Женя
17.02.2006 11:30:30
#48

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

в параметрах сбора сделал как в примере

helper.s_Type = (ushort)IOCTL.L_ADC_PARAM; // тип структуры (должен быть L_ADC_PARAM);
            helper.AutoInit = 1;    // флаг указывающий на тип сбора данных 0 - однократный 1 - циклический;
            helper.dRate = 200;     // частота опроса каналов в кадре (кГц);
            helper.dKadr = 0;       // интервал между кадрами (мс);
            helper.Scale = 0;
            helper.SynchroType = 3; // тип синхронизации;
            helper.SynchroMode = 0;
            helper.SynchroSensitivity = 0;
            helper.AdChannel = 0;
            helper.AdPorog = 0;
            helper.NCh = 4;         // количество опрашиваемых каналов ;
            helper.Chn[0] = 0x0;    // массив с номерами каналов и усилением на них; описывает порядок опроса каналов;
            helper.Chn[1] = 0x1;
            helper.Chn[2] = 0x2;
            helper.Chn[3] = 0x3;
            helper.FIFO = 1024;     // размер половины аппаратного буфера FIFO на плате;
            helper.IrqStep = 1024;  //
            helper.Pages = 32;      // произведение этих двух параметров IrqStep*Pages задает количество отсчетов,
                                    // которое соберет плата при однократном сборе, но не больше чем 128К отсчетов.
                                    // При циклическом сборе они игнорируются – буфер всегда 128К.
            helper.IrqEna = 1;      // разрешение генерации прерывания от платы (mask/0),
                                    // при этом mask - это младшие 16 бит в слове разрешающем прерывания от платы (блок АЦП);
            helper.AdcEna = 1;      // разрешение работы АЦП (1/0);

17.02.2006 12:33:57
#49

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: L780 - Как подключить библиотеки АЦП в Visual C++

я вообще боюсь что дело еще и в pragma pack(1) те в байтовой упаковке структуры...

Женя
17.02.2006 14:44:59
#50

Гость

Re: L780 - Как подключить библиотеки АЦП в Visual C++

[DllImport("wlcomp.dll")] public extern static void GetDataFromBuffer(ref uint hIfc, ref uint DataPtr, ref ushort[] DataArray, uint size);

тоже пытался вызвать.

в таком виде :

ushort[] data = new ushort[1000];
                LCardDLLHandler.GetDataFromBuffer(ref plata.hIfc, ref plata.dataStartPointer,ref data, 1000);

прога просто вылетает при вызове функции

если вместо 1000 в параметре функции указать например число больше 12, вылетает The runtime has encountered a fatal error. The address of the error was at 0x79e7c5eb, on thread 0xedc. The error code is 0xc0000005. This error may be a bug in the CLR or in the unsafe or non-verifiable portions of user code. Common sources of this bug include user marshaling errors for COM-interop or PInvoke, which may corrupt the stack.

если от 3 до 12, вылетает System.ArgumentException: Method's type signature is not Interop compatible.

а если 2 или 1, в data приходит массив размером 1 элемент, который чаще всего равен нулю. иногда числа типа 25879, 1024, 80.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25
Факс: +7 (495) 785-95-14

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск