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

Форум

Вы не вошли.

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

#1 Re: Техническая поддержка » Astra Linux » 01.08.2022 20:13:47

Алексей L Card пишет:

Что-то несколько не до конца понял, Вы пишите, что LTR Manager может подключаться, а из приложения нет. Но на скрине как раз LTR Manager не может подключиться к крейту, список крейтов пуст. В этом случае как раз логична ошибка, что крейт не найден, т.к. LTR Manager не смог с ним соединиться.
Если действительно проблема в том, что к самому крейту LTR Manager не может подключится по Ethernet, но может по USB, то проверьте при подключившись по USB версию прошивки крейта (выводится в информации о крейте при его выделении в LTR Manager), если версия 2.0.0.0, то в ней возможна проблема, что если с крейтом соединение закрыто некорректно (это не относится к вызову функций работы с модулями, а например если физически кабель был отключен или  если комп например был выключен нештатным образом), то крейт не давал установить новое соединение. В этом случае Вы можете подключить крейт по USB и обновить прошивку модуля через LTR Manager (по Ethernet обновление не работает к сожалению). Арихив с прошивками - https://www.lcard.ru/download/ltreu-fw-3.0.0.13.zip. Для духместного (вроде он у Вас был до этого на скринах) нужен файл, начинающийся с ltr031 (ltr030 - для 8/16 местного). Для обновления достаточно подключить крейт по USB и нажать на него правой кнопкой мыши и выбрать обновить прошивку крейта и указать файл, после чего пересбросить весь крейт.

Добрый вечер!
Я обновила прошивку до 3.0.0.13. Проверила, работу своего ПО с одного ПК (ПО подключается к крейтам без ошибок, считываются данные).
Затем то же ПО запустила на другом ПК и в результате ошибки при выполнении команды LTR22Open "Указанный крейт не найден", при этом LTR Manager подключается без ошибок.
Помогает только команда "Сброс крейта" через LTR Manager (но требует подключения через USB), но в дальнейшем я не смогу так подключаться, а работать только по сети.
Программным способом нашла команды сброса только модулей, а не крейта.
Как я могу поочередно работать с крейтом с разных ПК?

#2 Re: Техническая поддержка » Astra Linux » 19.07.2022 20:26:45

TaPan пишет:

Даже LTRManager не может подключиться.

Еще раз проверила - LTRManager может подключаться, а из моего приложения нет, на команду LTR22_Open ответ: Указанный крейт не найден. Сбросить крейт по сети не получается.

#3 Re: Техническая поддержка » Astra Linux » 17.07.2022 23:53:10

Добрый вечер!
Возникает необходимость с одного ПК поочередно подключаться к разным модулям. Вроде отключаюсь всегда корректно

LTR22_Close(module1);
LTR22_Close(module2);
LTR_Close(hcrate);

Но при попытке соединится с новым модулем (с которым уже были соединения ранее) возникают ошибки:

LTR22Open = Указанный крейт не найден

Даже LTRManager не может подключиться.
Screenshot_20220717_233712.png
Помогает только подключиться к модулю через провод и выполнить в LTRManager сброс крейта. Но данный способ мне не подходит.

Пытаюсь выполнить  LTR_ResetModule, но возникает ошибка при выполнении данной команды: -14 (Указанный крейт не найден)

hcrate = new TLTR();
int rez_crate = LTR_Init(hcrate);
if(rez_crate != 0)
cout << "!!!  ERROR crate LTR_Init = " << LTR22_GetErrorString(rez_crate) << endl;

int resopen = LTR_OpenSvcControl(hcrate, 0x7f000001, 11111);
cout << "LTR_OpenSvcControl = " << resopen << endl;

int rezcrate = LTR_ResetModule(hcrate, LTR_CRATE_IFACE_TCPIP, "", 1, 0);
cout << "LTR_ResetModule 1 = " << rezcrate << endl;
rezcrate = LTR_ResetModule(hcrate, LTR_CRATE_IFACE_TCPIP, "", 2, 0);
cout << "LTR_ResetModule 2 = " << rezcrate << endl;

вывод:

LTR_OpenSvcControl = 0
LTR_ResetModule 1 = -14
LTR_ResetModule 2 = -14

Как можно сбросить крейт по сети?

#4 Re: Техническая поддержка » Astra Linux » 14.05.2022 23:18:11

Спасибо вам, сотрудники поддержки LCard!
Вы быстро и подробно отвечаете на вопросы!
Обняла smile

#5 Re: Техническая поддержка » Astra Linux » 28.04.2022 23:33:35

Алексей L Card пишет:

У Вас i = recvd; похоже должно быть на уровень выше по скобкам, т.е. сейчас он у Вас к циклу относится и по сути Вы всегда выходите из цикла при i = 0.
Т.е. как только выполнится if (last_tstmp[module_num]  != (tstmp[recvd-1] & 0xFFFF)) вы заходите в цикл и сразу выходите, не сбросив flag_out и ничего не обработав,  т.е. Вы пропускаете данные от реальной метки до конца блока приема и сохраняете только следующий блок, отчего и идет пропажа начала сигнала.

Я бы вообще явно сделал выход из цикла по флагу:
for (int i = 0; (i < recvd) && flag_out; ++i)
без всяких i = recvd

а BLOCK_RX_CH_WORDS_CNT у Вас равно 32000?

Да, Вы правы!
Пока нет возможности протестировать с источником данных, но похоже в том и закралась ошибка. Спасибо!!!
Да, BLOCK_RX_CH_WORDS_CNT  равно 32000.

У меня еще вопрос. Как посчитать сколько мне сохранять точек, если, допустим, мне нужны данные только за первую секунду? Есть какой-то параметр наподобие "Частота опроса", зная который я могу рассчитать требуемое число точек?

#6 Re: Техническая поддержка » Astra Linux » 27.04.2022 23:20:11

В LGraph2 настроен старт записи так же по спаду DIGIN1.
Оказывается импульс поступает на плату и она имитирует вот такой сигнал:
IMG_3361.jpg
Задержка между ожидаемым началом данных и реальным 400 - 800 мс, задержка плавающая.
Мое ПО считывает только участок спада.

#7 Re: Техническая поддержка » Astra Linux » 26.04.2022 21:43:32

Спасибо, за подробный ответ smile
Наконец-то получилось протестировать ПО с источником данных (генератор импульсов).IMG_3310.jpg
В LGraph2 фиксируется сигнал с быстрым ростом значения от 0 до 5, а затем медленный спад до 0.
Мое ПО фиксирует только кусок сигнала (медленный спад).
Т.е. данные, которые фиксируются сразу после  "Спад сигнала на разъёме SYNC" я не могу получить.
В какую сторону смотреть? smile

        hcrate = new TLTR();
        module1 = new TLTR22(); // создаем структуру в памяти
        //memset(module1,0,sizeof(TLTR22));
        LTR22_Init(module1);
        module2 = new TLTR22(); // создаем структуру в памяти
        //memset(module2,0,sizeof(TLTR22));
        LTR22_Init(module2);

        module1->Channel.saddr = 0x7f000001; //127.0.0.1
        module1->Channel.sport = 11111;

        module1->Channel.csn[0] = '6';
        module1->Channel.csn[1] = 'T';
        module1->Channel.csn[2] = '7';
        module1->Channel.csn[3] = '6';
        module1->Channel.csn[4] = '9';
        module1->Channel.csn[5] = '6';
        module1->Channel.csn[6] = '5';
        module1->Channel.csn[7] = '1';
        module1->Channel.cc = 1;


        module2->Channel.saddr = 0x7f000001; //127.0.0.1
        module2->Channel.sport = 11111;

        module2->Channel.csn[0] = '6';
        module2->Channel.csn[1] = 'T';
        module2->Channel.csn[2] = '7';
        module2->Channel.csn[3] = '6';
        module2->Channel.csn[4] = '9';
        module2->Channel.csn[5] = '6';
        module2->Channel.csn[6] = '5';
        module2->Channel.csn[7] = '1';
        module2->Channel.cc = 2;

        DataModul1 = new double[32000*4];
        DataModul2 = new double[32000];

    int rez1=LTR22_Close(module1);
    int rez2=LTR22_Close(module2);
    rez1=LTR22_Open(module1, module1->Channel.saddr, module1->Channel.sport, module1->Channel.csn, module1->Channel.cc);
    rez2=LTR22_Open(module2, module2->Channel.saddr, module2->Channel.sport, module2->Channel.csn, module2->Channel.cc);

 //modul1

    rez1 = LTR22_SwitchMeasureADCZero(module1, false);
    rez1 = LTR22_SwitchACDCState(module1, true);
    rez1 = LTR22_SetADCChannel(module1,0,true);
    rez1 = LTR22_SetADCChannel(module1,1,true);
    rez1 = LTR22_SetADCChannel(module1,2,true);
    rez1 = LTR22_SetADCChannel(module1,3,true);
    rez1 = LTR22_SetFreq(module1,true, 2);
    rez1=LTR22_SetADCRange(module1, 0, 4); //  +-10B
    rez1=LTR22_SetADCRange(module1, 1, 4);
    rez1=LTR22_SetADCRange(module1, 2, 4);
    rez1=LTR22_SetADCRange(module1, 3, 4);
    rez1=LTR22_GetConfig(module1);

 //modul2
    rez2 = LTR22_SwitchMeasureADCZero(module2, false);
    rez2 = LTR22_SwitchACDCState(module2, true);
    rez2 = LTR22_SetADCChannel(module2,0,true);
    rez2 = LTR22_SetADCChannel(module2,1,false);
    rez2 = LTR22_SetADCChannel(module2,2,false);
    rez2 = LTR22_SetADCChannel(module2,3,false);

    rez2 = LTR22_SetFreq(module2,true, 2);
    rez2=LTR22_SetADCRange(module2, 0, 4);
    rez2=LTR22_GetConfig(module2);

//crate
    rez_crate = LTR_Init(hcrate);
    rez_crate = LTR_OpenCrate(hcrate, 0x7f000001, 11111, 2, "");

// старт сбора данных
    rez = LTR22_StartADC(module1, false);
    rez = LTR22_StartADC(module2, false);
    rez_crate = LTR_StartSecondMark(hcrate, LTR_MARK_EXT_DIGIN1_FALL);//по спаду DIGIN1

//в отдельном потоке для каждого модуля   
    
    // старт сбора данных
    bool flag_out = true;
    int module_en_ch_cnt = 4; /* кол-во разрешенных каналов в модуле */
    int module_num = 0;/* номер модуля, 0 или 1 */
    DWORD rbuf[4*BLOCK_RX_CH_WORDS_CNT];
    DWORD tstmp[4*BLOCK_RX_CH_WORDS_CNT];
    double *proc_buf = new double[4*BLOCK_RX_CH_WORDS_CNT];
    DWORD last_tstmp[2]; /* сохранение tstmp для отслеживания изменения по каждому модулю. Нужно сохранять, т.к. может изменится на границе блоков! */
    bool last_tstmp_valid[2] = {false, false}; /* признак, что инициализировали значение last_tstmp */
    double pt;
    //byte OverflowFlags[4];
    byte *OverflowFlags = new byte[4];
    
    while (flag_out)
    {
        //возвращает количество полученных данных
        int recvd = LTR22_Recv(dev_ConnectLcard->module1, rbuf, tstmp, module_en_ch_cnt * BLOCK_RX_CH_WORDS_CNT, 2000);
       cout << "количество полученных данных MODUL 1 = " << recvd << endl;
        if (recvd > 0)
        {
            /* если еще значение метки не инициализировано, то иницизируем первым принятым значением */
            if (!last_tstmp_valid[module_num])
            {
                cout << " init metka " << endl;
                last_tstmp[module_num] = tstmp[0] & 0xFFFF; /* используем только младшие 16 бит - метку СЕКУНДА без учета метки СТАРТ */
                last_tstmp_valid[module_num] = true;
            }

            /* обработка данных */
            rez = LTR22_ProcessData(dev_ConnectLcard->module1, rbuf, proc_buf, recvd, true, true, OverflowFlags);
            if(rez != 0) cout << "!!!  ERROR MODUL 1 LTR22_ProcessData = " << LTR22_GetErrorString(rez) << endl;

            /* быстрая проверка, изменилась ли метка, сравнивая метку на конец блока с последней действительной. */
             if (last_tstmp[module_num]  != (tstmp[recvd-1] & 0xFFFF))
            {
                /* ищем момент изменения метки - для простоты примера просто проходим по всем элементам без каких-то ускоренных поисков */
                for (int i = 0; i < recvd; ++i)
                {
                    if (last_tstmp[module_num]  != (tstmp[i] & 0xFFFF))
                    {
                         flag_out = false;
                      
                        cout << "количество полученных данных MODUL 1 = " << recvd << endl;

                        last_tstmp[module_num] = tstmp[i] & 0xFFFF;
                        /* обновляем последнее значение метки */
                        /* метка изменилась на i-ом элементе */
                        /* полчаем позицию в массиве на канал после обработки */
                        int proc_ch_pos = (i / module_en_ch_cnt);
                        cout << "!!!!!!!   proc_ch_pos = " << proc_ch_pos << endl;
                        for (int ch_num = 0; ch_num < module_en_ch_cnt; ++ch_num)
                        {
                            /* для каждого канала получаем точку за изменением метки времени.
                                если нужно более одной точки то можем пройтись по позиции с  proc_ch_pos до proc_ch_pos + N,
                                но должны учитывать, что следующие точки могут выйти за границу блока,
                                принятого в этот раз. Тогда нужно ставить флаг для модуля, что обработать еще сколько-то
                                точек из следующего блока */
                            for(int point = 0; point<32000-proc_ch_pos; point++)
                            {
                                pt = proc_buf[recvd/module_en_ch_cnt * ch_num + proc_ch_pos + point];
                                /* сохраняем полученную точку или обрабатываем другим требуемым образом */
                                dev_ConnectLcard->DataModul1[32000*ch_num + point] = pt;
                                
                            }
                        }
                    }
                    i = recvd;
                }
            }
        }
    }
    
//в основном потоке
    rez = LTR_StopSecondMark(hcrate); /* останов меток (может быть и после останова модулей) */
    rez = LTR22_StopADC(module1);         /* останов сбора*/
    rez = LTR22_ClearBuffer(module1,true); /* очистка буфера */
    rez = LTR22_StopADC(module2);         // останов сбора
    rez = LTR22_ClearBuffer(module2,true); // очистка буфера
        
    rez1=LTR22_Close(module1);
    rez2=LTR22_Close(module2);
    rez_crate = LTR_Close(hcrate);

#8 Re: Техническая поддержка » Astra Linux » 14.04.2022 23:17:49

Доброй ночи!
Продолжаю задавать вопросы smile
Подскажите, сколько максимум значений можно считать в функции LTR22_Recv ?

#9 Re: Техническая поддержка » Astra Linux » 12.04.2022 20:40:47

Убрала memset, добавила LTR22_Init. Теперь при  ProcessData (... true, true...) выводятся не нулевые значения, а уже обработанные  smile

Но все равно сохраняется ситуация:
LTR22_SetADCRange(module1, 1, 4) // +-10В
результат:  -0.3562

LTR22_SetADCRange(module1, 1, 0) // +-1В
результат:  -0.035219

LTR22_SetADCRange(module1, 1, 5) // +-3В
результат:  -0.1211

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

#10 Re: Техническая поддержка » Astra Linux » 12.04.2022 19:30:42

Алексей L Card пишет:

По ProcessData, Вы нигде к целому числу значение не приводите, что оно становится явно 0 вместо -0,35? Ну и на всякий случай, не изменяете значения в ADCCalibration[][].UserCalibScale ?

На самом деле значение равно 0.0 , т.е. не целое.
ADCCalibration[][].UserCalibScale не использую

#11 Re: Техническая поддержка » Astra Linux » 12.04.2022 19:25:50

Алексей L Card пишет:

А от какого канала это данные в качестве результата?  Номер канала в LTR22_SetADCRange идет от 0, т.е. LTR22_SetADCRange(module1, 1, 4) устанавливает диапазон для 2-го канала.

Да, все верно, для второго канала

#12 Re: Техническая поддержка » Astra Linux » 11.04.2022 19:14:31

Что-то у меня не сходится...
Во-первых, если я в ProcessData передаю true, true, то на выходе всегда нулевые значения.
Во-вторых, пробую подставлять разные значения в функцию LTR22_SetADCRange, и выходит не соответствие:

LTR22_SetADCRange(module1, 1, 4) // +-10В
результат: -1167.16                   -1167.16*10/32767 = -0.3562

LTR22_SetADCRange(module1, 1, 0) // +-1В
результат: -1154.02                  -1154.02*1/32767 = -0.035219

LTR22_SetADCRange(module1, 1, 5) // +-3В
результат: -1322.89                   -1167.16*3/32767 = -0.1211

По идее значения должны быть одинаковыми...

#13 Re: Техническая поддержка » Astra Linux » 07.04.2022 22:26:07

Добрый вечер!
Правильно ли я поняла:

если мы ожидаем значения +-10В, то
LTR22_SetADCRange(module1, 1, 4);
...
Обрабатываем данные
LTR22_ProcessData(dev_ConnectLcard->module1, rbuf, proc_buf, recvd, true, false, NULL);
...
определяем нужную точку и получаем значение в Вольтах, как pt*10/32767

#14 Re: Техническая поддержка » Astra Linux » 30.03.2022 21:41:46

Спасибо за скорый и столь подробный ответ!
Буду тестировать.

#15 Re: Техническая поддержка » Astra Linux » 30.03.2022 00:01:22

Добрый вечер!
Задача такая:
При наступлении события "Спад сигнала на разъёме SYNC" фиксировать на 4х каналах модуля 1 и 1ом канале модуля 2 значения напряжений.
Т.е. мне подходит "Механизм синхронизации данных по меткам".

Правильно ли я поняла механизм действий?
после всех инициализаций выполняю

LTR_StartSecondMark(hcrate, LTR_MARK_EXT_DIGIN1_FALL);//по спаду DIGIN1
LTR22_Recv(module1, rbuf1, tstamp, 1000, 5000); //получаю данные
LTR22_Recv(module2, rbuf2, tstamp, 1000, 5000); //разделить на два потока???
LTR_StopSecondMark(hcrate);

Событие "Спад сигнала на разъёме SYNC" должен быть на этапе выполнения функций LTR22_Recv?

#16 Re: Техническая поддержка » Astra Linux » 24.03.2022 23:22:37

Добрый вечер!
Собран следующий макет:
    - к четырем каналам модуля 1 подключен генератор с импульсами амплитудой 4В и длительностью основания 3 секунды
    - каналу 1 модуля 2 подключено постоянное напряжение 4В
    - в качестве синхросигнала подается импульс от генератора ипульса с длительностью 10 мс с периодом раз в 3 секунды
    - на крейте установлен режим генерации метки "Старт" по спаду сигнала  DIGIN1 (LTR_MakeStartMark(hcrate, 2)).

В LTR Manager видно, что увеличивается количество метки "Старт" так же с периодом раз в 3 секунды.

При попытке провести фазировку модулей с периодом ожидания 10 секунд (LTR22_SyncPhaze(module, 10000)) выдается ошибка "Нет ответа на переданную команду".

Так же при попытке считать данные. Выполняю TR22_StartADC(module,true), жду 10 секунд, пытаюсь считать данные LTR22_Recv(module, rbuf1, NULL, 1000, 500),  ответ равен 0, т.е. данные не получены.

Оба модуля работают в режиме Slave.
Код прилагаю. Для чистоты кода убрала все проверки, все команды отрабатывают без ошибок. В чем может быть причина? Что упускаю?

        
        TLTR * hcrate;
        TLTR22 * module1;
        TLTR22 * module2;

        hcrate = new TLTR();

        module1 = new TLTR22();
        memset(module1,0,sizeof(TLTR22));

        module2 = new TLTR22();
        memset(module2,0,sizeof(TLTR22));

        module1->Channel.saddr = 0x7f000001; //127.0.0.1
        module1->Channel.sport = 11111;

        module1->Channel.csn[0] = '6';
        module1->Channel.csn[1] = 'T';
        module1->Channel.csn[2] = '7';
        module1->Channel.csn[3] = '6';
        module1->Channel.csn[4] = '9';
        module1->Channel.csn[5] = '6';
        module1->Channel.csn[6] = '5';
        module1->Channel.csn[7] = '1';
        module1->Channel.cc = 1;


        module2->Channel.saddr = 0x7f000001; //127.0.0.1
        module2->Channel.sport = 11111;

        module2->Channel.csn[0] = '6';
        module2->Channel.csn[1] = 'T';
        module2->Channel.csn[2] = '7';
        module2->Channel.csn[3] = '6';
        module2->Channel.csn[4] = '9';
        module2->Channel.csn[5] = '6';
        module2->Channel.csn[6] = '5';
        module2->Channel.csn[7] = '1';
        module2->Channel.cc = 2;
//блок 1 начало
        LTR_Init(hcrate);
        LTR_OpenCrate(hcrate, 0x7f000001, 11111, 2, "");
        LTR_MakeStartMark(hcrate, 2);// LTR_MARK_EXIT_DIGIN1_FALL);


        LTR22_Open(module1, module1->Channel.saddr, module1->Channel.sport, module1->Channel.csn, module1->Channel.cc);
        LTR22_Open(module2, module2->Channel.saddr, module2->Channel.sport, module2->Channel.csn, module2->Channel.cc);

        LTR22_SwitchACDCState(module1, true);
        LTR22_SetADCChannel(module1,0,true);
        LTR22_SetADCChannel(module1,1,true);
        LTR22_SetADCChannel(module1,2,true);
        LTR22_SetADCChannel(module1,3,true);
        LTR22_SetFreq(module1,false, 1); // тестировали в этими значениями, но потом посчитали что должны быть "true, 2"
        LTR22_SetADCRange(module1, 0, 4);
        LTR22_SetADCRange(module1, 1, 4);
        LTR22_SetADCRange(module1, 2, 4);
        LTR22_SetADCRange(module1, 3, 4);
        LTR22_GetConfig(module1);

        LTR22_SwitchACDCState(module2, true);
        LTR22_SetADCChannel(module2,0,true);
        LTR22_SetADCChannel(module2,1,false);
        LTR22_SetADCChannel(module2,2,false);
        LTR22_SetADCChannel(module2,3,false);
        LTR22_SetFreq(module2,false, 1);  // тестировали в этими значениями, но потом посчитали что должны быть "true, 2"
        LTR22_SetADCRange(module2, 0, 4);
        LTR22_GetConfig(module2);
//блок 1 конец


        //по команде оператора одновременно создаются 2 потока для фазировки модулей
        //поток 1
        LTR22_SetSyncPriority(dev_ConnectLcard->module1, false); //- режим slave
        rez = LTR22_SyncPhaze(dev_ConnectLcard->module1, 10000);
        cout << "!!!  ERROR 1 LTR22_SyncPhaze = " << LTR22_GetErrorString(rez) << endl;
        //ответ через 10 секунд "Нет ответа на переданную команду"
        //поток 2
        LTR22_SetSyncPriority(dev_ConnectLcard->module2, false); //- режим slave
        rez = LTR22_SyncPhaze(dev_ConnectLcard->module2, 10000);
        cout << "!!!  ERROR 2 LTR22_SyncPhaze = " << LTR22_GetErrorString(rez) << endl;
        //ответ через 10 секунд "Нет ответа на переданную команду"

        //после завершения потоков 1 и 2:
        LTR22_Close(module1);
        LTR22_Close(module2);
        LTR_Close(hcrate);


        //по команде оператора запускается сбор данных
        //повторяется блок 1
        LTR22_SetSyncPriority(dev_ConnectLcard->module1, false); //- режим slave
        LTR22_SetSyncPriority(dev_ConnectLcard->module2, false); //- режим slave
        LTR22_StartADC(dev_ConnectLcard->module1,true);
        LTR22_StartADC(dev_ConnectLcard->module2,true);
        usleep(10000000);

        DWORD rbuf1[1000];
        double *rbuf1_ = new double[4000];
        DWORD rbuf2[1000];
        double *rbuf2_ = new double[1000];
        number_values_1 = LTR22_Recv(dev_ConnectLcard->module1, rbuf1, NULL, 1000, 500);
        cout << "rez 1 LTR22_Recv   Количество полученных значений = " << number_values_1 << endl;
        //ответ  Количество полученных значений = 0
        number_values_2 = LTR22_Recv(dev_ConnectLcard->module2, rbuf2, NULL, 1000, 500);
        cout << "rez 2 LTR22_Recv   Количество полученных значений = " << number_values_2 << endl;
        //ответ  Количество полученных значений = 0

        LTR22_StopADC(dev_ConnectLcard->module1);
        LTR22_StopADC(dev_ConnectLcard->module2);
        LTR22_ClearBuffer(dev_ConnectLcard->module1,true); //true/false - ожиданте отклика
        LTR22_ClearBuffer(dev_ConnectLcard->module2,true); //true/false - ожиданте отклика

        if(number_values_1 == 1000 && number_values_2 == 1000)
        {
            LTR22_ProcessData(dev_ConnectLcard->module1, rbuf1, rbuf1_, 1000, false, false, NULL);
            LTR22_ProcessData(dev_ConnectLcard->module2, rbuf2, rbuf2_, 1000, false, false, NULL);
        }
        delete[] rbuf1_;
        delete[] rbuf2_;
        
        LTR22_Close(module1);
        LTR22_Close(module2);
        LTR_Close(hcrate);


        delete module1;
        delete module2;
        delete hcrate;

#17 Re: Техническая поддержка » Astra Linux » 14.03.2022 20:47:44

Подскажите, пожалуйста, как часто нужно выполнять команду LTR22_SyncPhaze ?
Перед каждым синхроимпульсом старта или достаточно после выключения/включения питания?

#18 Re: Техническая поддержка » Astra Linux » 27.02.2022 18:37:20

Скриншот был из Windows. Компьютер один.
Отключилась в Windows, запустила в Linux LTR Manager, настроила, отключила/включила питание модуля и все заработало - спасибо smile

#20 Re: Техническая поддержка » Astra Linux » 27.02.2022 01:39:06

На AstraLinux я адрес 192.168.1.2  прописываю в файле /etc/ltrd/congig.xml:

config.xml конечно же

Картинка не вставилась...

#21 Re: Техническая поддержка » Astra Linux » 27.02.2022 01:36:29

Спасибо, библиотеки прописала - код скомпилился.
Но результат функции LTR22_Open = -14 (LTR_ERROR_INVALID_CRATE - Указанный крейт не найден)

В Windows LTR Manager видит подключение модуля с IP-192.168.1.2 с двумя крейтами.
[img]file:///home/Lcard/1.jpg[/img]


На AstraLinux я адрес 192.168.1.2  прописываю в файле /etc/ltrd/congig.xml:

<ltrsrv_config>
<log>
<level> 3 </level>
</log>
<crate_ip_entries>
<ip autocon="1"> 192.168.1.2 </ip>
</crate_ip_entries>
<intf_eth_params>
<intf_check_time> 1000 </intf_check_time>
<crate_poll_time> 15000 </crate_poll_time>
<crate_conection_timeout> 5000 </crate_conection_timeout>
<crate_ctlcmd_timeout> 5000 </crate_ctlcmd_timeout>
</intf_eth_params>
</ltrsrv_config>

Код программы:
       

        TLTR22* module = new TLTR22(); 
        memset(module,0,sizeof(TLTR22));
        int res=0;

        module->Channel.saddr = 0x7f000001; //127.0.0.1  сетевой адрес сервера
        module->Channel.sport = 11111;
        module->Channel.csn[0] = '6';
        module->Channel.csn[1] = 'T';
        module->Channel.csn[2] = '7';
        module->Channel.csn[3] = '6';
        module->Channel.csn[4] = '9';
        module->Channel.csn[5] = '6';
        module->Channel.csn[6] = '5';
        module->Channel.csn[7] = '1';
        module->Channel.cc = 1;

        res=LTR22_Open(module, module->Channel.saddr, module->Channel.sport, module->Channel.csn, module->Channel.cc);

       
Результат -14
При этом узел 192.168.1.2 пингуется

#22 Re: Техническая поддержка » Astra Linux » 20.02.2022 22:23:51

Спасибо.
Установлены все пакеты из http://download.opensuse.org/repositori … _10/amd64/
Написан мини код.

#include <ltr22api.h>
TLTR22 * module = new TLTR22();
int rez = LTR22_Init(module);


При компиляции возникает ошибка:
undefined reference to `LTR22_Init'

В Makefail указанна ссылка на каталог с файлом ltr22api.h
INC_DIR_USER= -I . \
                -I /usr/local/include/modbus \
                -I /usr/include/ltr/include

В чем может быть проблема?

Если в коде оставить только строку:
TLTR22 * module = new TLTR22();
то компилиться.

#23 Техническая поддержка » Astra Linux » 12.02.2022 16:12:03

TaPan
Ответов: 40

Добрый день!
В перечне возможных ОС для работы с Lcard указана Astra Linux. Но переходя по ссылке с дистрибутивами http://download.opensuse.org/repositories/home:/l-card/ раздел с данной ОС не нахожу. Прошу помощи smile
Если важно:    LTR-EU-2-5         LTR22

Контакты

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

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

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

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