Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года


Сбои Е-440

Вы не вошли.

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

Konstantin
10.10.2005 11:15:52
#1

Гость

Сбои Е-440

Товарищи, у меня возник вопрос по поводу непрерывного сбора данных с Е440.
Итак, К плате ничего не подключено (снимаем наводки:)))
Запускаю я программу /Examples/BC5/ReadData ...
после сбора данных получаю файл test.dat


Открываю файл в PowerGraph и вижу, что синусоида в некоторых местах прерывается
(т.е. видно, что либо не успевает поток считывать, либо не успевает поток записывать на диск, либо глючит плата)
Уже игрался с размером буффера, менял приоритеты процесса считывания ... в итоге - хоть один сбой, но все-таки появится.

Рисунок такой, как при фазовой модуляции ...
Как это лечить??

По умолчанию размер буфера (1024*1024)*2 слова и данные считываются порциями по (1024*1024) слов...

10.10.2005 13:39:23
#2

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,494

Re: Сбои Е-440

Навскидку можно посоветовать следующее:
1. Если у Вас материнская плата компьютера собрана на основе не интеловского чипсета VIA, SIS и т.д., то под Windows необходимо ещё доставить драйвера от производителя чипсета. Например, для чипсета VIA они называются 'VIA 4in1'. Взять их можно либо на фирменном диске, который идёт вместе с мат.платой, либо скачать с сайта производителя.
2. На некоторых РС нужно разрешить в BIOS'е компьютера использование прерывания контроллеру USB (см. тех.описание п.1.4.1. "Кофигурирование Setup компьютера").
3. Попробовать убедиться, что сам модуль жив. Для чего нужно поработать с ним на других копьютерах (желательно на Intel).

Konstantin
11.10.2005 10:06:38
#3

Гость

Re: Сбои Е-440

Кстати, я их проверял на РС с нтеловскими чипсетами ... !
Скорее всего я нашел глюк (в readdata)... посмотрите, прав я или нет?
Я поменял сам принцип сбора данных ... и глюк исчез

Procedure ReadThreadProc(p:pointer);
begin
// теперь попробуем организовать сбобр данных с АЦП
    ReadEvent := CreateEvent(nil, FALSE , FALSE, nil);
    FillMemory(@ReadOv, sizeof(OVERLAPPED), 0);
    ReadOv.hEvent := ReadEvent;

//    TimeOut := Trunc(8.0*SemiBufferLength/ap.ChannelRate + 1000.0);

    if not cur_e440.START_ADC() then
       begin
            MessageBox(HWND(nil), 'Не могу запустить АЦП!', 'ОШИБКА!!!', MB_OK);
            cur_e440.ReleaseLDevice();
            Exit;
    end;

BytesTransferred := 0;
cur_E440.ReadData(@Buffer[0], @SemiBufferLength, @BytesTransferred, @ReadOv);
repeat

        begin
           if (GetLastError() =  ERROR_IO_PENDING) then
                           repeat
                        until  GetOverlappedResult(cur_E440.GetModuleHandle(), ReadOv, ReadBytesTransferred, FALSE);
                        BytesTransferred := 0;
                        cur_E440.ReadData(@Buffer[SemiBufferLength], @SemiBufferLength, @BytesTransferred, @ReadOv);
                        WriteFile(hFile, Buffer[0], 2*SemiBufferLength, Bytes_written, nil);
                        TotalByteWrite:=TotalByteWrite+Bytes_written;
           if (GetLastError() =  ERROR_IO_PENDING) then
                           repeat
                        until  GetOverlappedResult(cur_E440.GetModuleHandle(), ReadOv, ReadBytesTransferred, FALSE);
                       BytesTransferred := 0;
                        cur_E440.ReadData(@Buffer[0], @SemiBufferLength, @BytesTransferred, @ReadOv);
                        WriteFile(hFile, Buffer[SemiBufferLength], 2*SemiBufferLength, Bytes_written, nil);
                        TotalByteWrite:=TotalByteWrite+Bytes_written;
        end;


until (ReadThreadMust_Terminate=true);

ExitThread(0);
end;

//-- -----------------------------------------------------------------------


Я прав??? или что-то я сделал не так?

Konstantin
11.10.2005 10:22:20
#4

Гость

Re: Сбои Е-440

Алгоритм такой:

0) Даю команду читать 1 часть буфера;

1) Ждем пока соберутся данные в 1-ю часть буфера;
2) Сразу даем команду считывать 2-ю часть буфера;
3) А тем временем записыаем 1-ю часть на диск;
4) Ждем пока соберутся данные в 2-ю часть буфера;
5) Сразу даем команду считывать 1-ю часть буфера;
6) А тем временем записыаем 2-ю часть на диск;
7) goto 1;


Т.е. я даю команду чтения следующего буфера, а потом только сбрасываю предыдущий.

13.10.2005 15:18:38
#5

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,494

Re: Сбои Е-440

Выше Вы говорили про штатный пример на С++ из директории /Examples/BC5/ReadData. Насколько я понял, по сравнению с ним Вы просто перенесли запись в файл из основного потока программы в поток сбора данных ReadThreadProc. Это есть правильный шаг.
Но ещё лучше ставить запросы на сбор данных (ф. ReadData()) в очередь. Алгоритм примерно такой:

1. Старт сбора данных.
2. Запрос на сбор данных в 1-ю часть буфера;
3. Запрос на сбор данных во 2-ю часть буфера;
4. Ждем пока соберутся данные в 1-ю часть буфера;
5. Записываем 1-ю часть буфера на диск;
6. Запрос на сбор данных в 1-ю часть буфера;
7. Ждем пока соберутся данные во 2-ю часть буфера;
8. Записываем 2-ю часть буфера на диск;
9. Запрос на сбор данных во 2-ю часть буфера;
10. goto 4.

d-e-n
28.10.2005 02:37:46
#6

Гость

Re: Сбои Е-440

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

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