Автор Тема: задание формы и параметров сигнала в MC-110 через интерфейс IRecorder  (Прочитано 428 раз)

Оффлайн Igor V

  • Новичок
  • *
  • Сообщений: 23
Добрый день!

Имеется ранее приобретенный модуль MC-110, интересует возможность задания типа сигнала и его параметров через интерфейс IRecorder,
чтобы была возможность динамически менять настройки, не прерывая процесс измерения или записи.

Оффлайн Igor V

  • Новичок
  • *
  • Сообщений: 23
Можно ли с помощью функции LoadPlayDACData(DWORD size, WORD* data) выдавать через цап MC110, допустим два уровня сигнала с периодичностью 40мс(25гц). Что для этого нужно настроить? Частоту дискретизации и период обновления? За какой промежуток времени придет весь буфер? Что будет потом, по завершению этого? Циклически продолжит снова его выдавать?

Оффлайн BacCM

  • moderator
  • *****
  • Сообщений: 61
Модуль предполагает циклический вывод загруженной последовательности данных.С помощью функции LoadPlayDACData вы задаете набор данных, а затем запускаете, проигрывание StartPlayDACChan, там же указываете частоту
« Последнее редактирование: 02.07.2018, 15:58:49 от BacCM »

Оффлайн Igor V

  • Новичок
  • *
  • Сообщений: 23
IAnalogOutput *pDACOut;WORD data[2];
 data[0]=0;
data[1]=8095;
pDACOut->LoadPlayDACData(2,data);pDACOut->StartPlayDAC((double*)1);
Как получить доступ через интерфейс IAnalogOutput к выходу ЦАП? Есть ли у вас примеры?

Оффлайн BacCM

  • moderator
  • *****
  • Сообщений: 61
Примеров нет, но есть некоторые отдельные куски кода, которые делаю тоже самое что и в ваши примеры    WORD i;
    WORD ampl;
    WORD dac_data[8192];
    double k;
   
    k= (m_maxrange-m_minrange)/(m_maxcode-m_mincode);
    switch (type)
    {
        case 0:                                      // sin
        {
            if (m_level>0)
                ampl= m_level;
            else
                ampl= -1.0*m_level;
            for (i= 0; i<m_maxcount; i++)
            {
                dac_data[i]=(short)(m_mincode+(sin(2*PI/m_maxcount*i)*ampl-m_minrange)/k);
            }
            break;
        }
        case 1:                                     // meandr
        {
            for (i= 0; i<m_maxcount; i++)
            {
               
                if (i<m_maxcount/2)
                    dac_data[i]= (short)(m_mincode+(m_level-m_minrange)/k);
                else
                    dac_data[i]= (short)(m_mincode+(-m_level-m_minrange)/k);
            }
            break;
        }
    }
    m_result= entity->LoadPlayDACData(m_maxcount, dac_data);
    double play_dac_freq;

    play_dac_freq= m_freq*m_maxcount;
    m_result= entity->StartPlayDACEx(&play_dac_freq, m_modestart, m_param);

Оффлайн Igor V

  • Новичок
  • *
  • Сообщений: 23
Если я правильно понял, entity - это объект IAnalogOutput. Как в Вашем примере связан обьект entity с реальным выходом на цап?

Оффлайн Igor V

  • Новичок
  • *
  • Сообщений: 23
Если я правильно понял, entity - это объект IAnalogOutput. Как в Вашем примере связан обьект entity с реальным выходом на цап?
Если точнее задать вопрос - как из IModule получить ссылку на IAnalogOutput?

Оффлайн BacCM

  • moderator
  • *****
  • Сообщений: 61
Так же как и любые другие специализированные интерфейсы. В RecorderAPI используется основанный COM технологии подход.  IAnalogOutput* piAO=NULL;
  module->QueryInterface(IID_IAnalogOutput,(void**)&piAO);

Оффлайн BacCM

  • moderator
  • *****
  • Сообщений: 61
На всякий случай, рекомендую изучить базовые принципы работы с COM, IUnkown, подсчет ссылок, BSTR и т.д.

Оффлайн Igor V

  • Новичок
  • *
  • Сообщений: 23
Если я правильно понял, то интерфейс запрашивается через экземпляр тега(канала) таким образом:

class TPlugin: public IRecorderPlugin
{
private:
    IRecorder *pRecorder;
    ITag *pDAC;
    IAnalogOutput* piAO;
               
bool STDMETHODCALLTYPE TPlugin::config()
{
   unsigned long count=0;
   pDAC=pRecorder->GetTagByName("MC-302-{ 1- 9- 1}");
   piAO=NULL;
   ret_value=pDAC->QueryInterface(IID_IAnalogOutput,(void**)&piAO);
   piAO->GetPlayDACDataMaxCount(&count);//здесь возникает ошибка access vialation at

В процессе при обращении к выходу возникает ошибка, не подскажете, где могла быть допущена ошибка?
Заранее спасибо.

Оффлайн Igor V

  • Новичок
  • *
  • Сообщений: 23
у 302 модуля нет буфера для программирования, у 110 судя по функциональной схеме есть, немного измененный код с проверкой возвр.значения и ненулевого указателя:
class TPlugin: public IRecorderPlugin{
private:
    IRecorder *pRecorder;
    ITag *pDAC;
    IAnalogOutput* piAO;

bool STDMETHODCALLTYPE TPlugin::config()
{
   HRESULT ret_value;
   unsigned long count=0;
   pDAC=pRecorder->GetTagByName("MC-110V2.0-{ 1- 5- 1}");
   if(pDAC!=NULL)
        {
        piAO=NULL;
        ret_value=pDAC->QueryInterface(IID_IAnalogOutput,(void**)&piAO);
                if(ret_value==S_OK)
                {
                ret_value=piAO->GetPlayDACDataMaxCount(&count);//тут возникает сообщение (описание ниже)
                }
        }
       
Project C:\....\Recorder.exe faulted with message: 'access violation at 0x040869d7: read of address 0x00000000'.
Process Stopped. Use Step or Run to Continue.

Оффлайн Igor V

  • Новичок
  • *
  • Сообщений: 23
Добавил еще проверку - pDAC, piAO не нулевые, ошибка "access violation at 0x041169d7: read of address 0x00000000" возникает по-прежнему:

class TPlugin: public IRecorderPlugin{
private:
    IRecorder *pRecorder;
    ITag *pDAC;
    IAnalogOutput* piAO;

bool STDMETHODCALLTYPE TPlugin::config()
{
   HRESULT ret_value;
   unsigned long count=0;
   pDAC=pRecorder->GetTagByName("MC-110V2.0-{ 1- 5- 1}");
   if(pDAC!=NULL)
        {
        piAO=NULL;
        ret_value=pDAC->QueryInterface(IID_IAnalogOutput,(void**)&piAO);
                if(SUCCEEDED(ret_value) && piAO != NULL)
                {
                ret_value=piAO->GetPlayDACDataMaxCount(&count);//в режиме отладки доходит до этой строки и выдается сообщение
                }
        }

Оффлайн Ярослав2

  • Новичок
  • *
  • Сообщений: 31
У меня такой код работает

Оффлайн Igor V

  • Новичок
  • *
  • Сообщений: 23
Странно...не могу понять почему у меня тогда не работает, мой код приведен в функции Config() у плагина.

Оффлайн Igor V

  • Новичок
  • *
  • Сообщений: 23
Проблема оказалась в антивирусе....