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


LTR24-1 работа с ltr24api

Вы не вошли.

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

14.08.2025 12:05:17
#1

Участник
Здесь с 29.03.2022
Сообщений: 3

LTR24-1 работа с ltr24api

Здравствуйте! Потерял всю надежду разобраться самому. Имеется программа на языке Kotlin(JVM) с использованием JNA. Не получается никак подобрать размеры полей в структуре (с модулем LTR212 всё получилось).
Исходный код https://www.lcard.ru/forums/img/members … roller.zip
Подключается без ошибок, запускает сбор данных, но выдает все нули
Правильно ли я понимаю что т.к. pack = 4, минимальный размер поля должен быть 4 байта?
Также в руководстве у некоторых полей структуры указано "не используется в LTR24-1", это значит полей нет или просто их нельзя использовать?
В ответе в поле текущей частоты выдает 5.38678236E-315 после запуска сбора, в run стоит 1, а в MODULE_INFO поле name получается сдвинуто.
Вывод структуры после начала сбора

TLTR24(auto-allocated@0x21caf555360 (2648 bytes)) {
  int size@0x0=0x0A4C
  CrateController$TLTR channel@0x4=CrateController$TLTR(allocated@0x21caf555364 (40 bytes) (shared from auto-allocated@0x21caf555360 (2648 bytes))) {
    int saddr@0x0=0x7F000001
    short sport@0x4=0x2B67
    byte csn[16]@0x6=[B@28253f3f
    short cc@0x16=0x0A
    int flags@0x18=0x0000
    int tmark@0x1C=0x0000
    byte internal[8]@0x20=[B@7a8c0246
  }
  int run@0x2C=0x0001
  int adcFreqCode@0x30=0x0000
  double adcFreq@0x38=5.38678236E-315
  int dataFmt@0x40=0x0000
  int iSrcValue@0x44=0x0000
  int testMode@0x48=0x0000
  byte reserved[64]@0x4C=[B@65cede3d
  TLTR24_CHANNEL_CONFIG channelMode[4]@0x8C=[Lru.avem.sum.communication.model.devices.crate.ltr24.TLTR24_CHANNEL_CONFIG;@1a117739
  TLTR24_MODULE_INFO moduleInfo@0x110=TLTR24_MODULE_INFO(allocated@0x21caf555470 (1248 bytes) (shared from auto-allocated@0x21caf555360 (2648 bytes))) {
    byte name[8]@0x0=[B@5f6f75e2
    byte serial[16]@0x8=[B@72acd004
    int verPld@0x18=0x0000
    int supportICP@0x1C=0x0000
    int supportedFeature@0x20=0x0000
    byte reserved[28]@0x24=[B@6180c75a
    TLTR24_CBR_COEF calibrCoef[128]@0x40=[Lru.avem.sum.communication.model.devices.crate.ltr24.TLTR24_CBR_COEF;@70b9ccec
    TLTR24_AFC_COEFS afcCoef@0x440=TLTR24_AFC_COEFS(allocated@0x21caf5558b0 (96 bytes) (shared from allocated@0x21caf555470 (1248 bytes) (shared from auto-allocated@0x21caf555360 (2648 bytes)))) {
      double AfcFreq@0x0=-2.6371966416206467E256
      double FirCoef[8]@0x8=[D@40e5b103
      TLTR24_AFC_IIR_COEF AfcIirCoef@0x48=TLTR24_AFC_IIR_COEF(allocated@0x21caf5558f8 (24 bytes) (shared from allocated@0x21caf5558b0 (96 bytes) (shared from allocated@0x21caf555470 (1248 bytes) (shared from auto-allocated@0x21caf555360 (2648 bytes))))) {
        double a0@0x0=-1.874954124382162E-121
        double a1@0x8=-1.0295114946947458E-86
        double b0@0x10=5.307217155E-315
      }
    }
    double iSrcVals[8]@0x4A0=[D@27b80452
  }
  TLTR24_CBR_COEF calibrCoef[128]@0x5F0=[Lru.avem.sum.communication.model.devices.crate.ltr24.TLTR24_CBR_COEF;@19d872e5
  TLTR24_AFC_COEFS afcCoef@0x9F0=TLTR24_AFC_COEFS(allocated@0x21caf555d50 (96 bytes) (shared from auto-allocated@0x21caf555360 (2648 bytes))) {
    double AfcFreq@0x0=-2.6371966416206467E256
    double FirCoef[8]@0x8=[D@26018025
    TLTR24_AFC_IIR_COEF AfcIirCoef@0x48=TLTR24_AFC_IIR_COEF(allocated@0x21caf555d98 (24 bytes) (shared from allocated@0x21caf555d50 (96 bytes) (shared from auto-allocated@0x21caf555360 (2648 bytes)))) {
      double a0@0x0=-1.874954124382162E-121
      double a1@0x8=-1.0489484601335526E-91
      double b0@0x10=2.67E-321
    }
  }
  Pointer internal@0xA50=null
}
В общем надеюсь на какую-либо помощь

14.08.2025 16:31:22
#2

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

Re: LTR24-1 работа с ltr24api

Здравствуйте.

Правильно ли я понимаю что т.к. pack = 4, минимальный размер поля должен быть 4 байта?

Не совсем так, правильнее каждое поле от начала структуры выравнено на минимум между своим размером и 4 (т.е. байтовое располагается подряд, WORD всегда выравнен на 2 байта от начала структуры, DWORD/INT/float/double выравнены на 4 байта)
Т.е. например несколько байтовых полей идут всегда подряд.
Если два байтовых поля, а потом двухбайтовое, они тоже будут подряд.
Если одно байтовое, а потом двухбайтовое, то будет пропуск после первого байта, чтобы выравнять второе поле на 2 байта.
Если одно байтовое, а потом 4-х байтовое, то после байтового поля будет 3 байта пропуска, чтобы выравнять второе на 4 байта.
Если одно байтовое, а потом 8-и байтовое, то будет точно также 3 байта пропуска, т.к. из-за pack(4) поля размером больше 4 тоже выравниваются на 4

Также нужно учесть, что размер BOOL 4 байта, а размер BOOLEAN - 1 байт. Размер указателя зависит от используемой разрядности компилятора/виртуальной машины (4 или 8 байт).

Если в языке есть способ узнать размер полученной структуры (по аналогии с sizeof в C), то правильность вы всегда можете проверить, сравнив размер, полученный в вашем языке аналогом sizeof, с размером, который будет в поле Size после вызова LTR24_Init

14.08.2025 17:24:58
#3

Участник
Здесь с 29.03.2022
Сообщений: 3

Re: LTR24-1 работа с ltr24api

Со структурой всё получилось, теперь другая проблема. При чтении данных получается такой набор из 4х точек АЦП и 4х преобразованных данных

[1851459842, 1851132162, 1851263234, 1851328770]
[3.4068190701345156, 3.4067121611810034, 3.4067549247624083, 3.4067763065531107]
[1851197698, 1851132162, 1851197762, 1851328770]
[3.406733542971706, 3.4067121611810034, 3.406733542971706, 3.4067763065531107]
[1851394306, 1851328770, 1851459842, 1851459842]
[3.406797688343813, 3.4067763065531107, 3.4068190701345156, 3.4068190701345156]
[1851328770, 1851001090, 1851263234, 1851132162]
[3.4067763065531107, 3.4066693975995985, 3.4067549247624083, 3.4067121611810034]
При изменении сигнала на генераторе данные не обновляются, считанные значения плавают около прошлого сигнала, в чем может быть проблема?

    fun start() {
        var size = 4
        val tmarkArr = IntArray(size)
        val startTime = System.currentTimeMillis()
        val srcArr = IntArray(size)
        val dataArr = DoubleArray(size)
        var i = 0
        val timer = System.nanoTime()
        isStart = true
        val ltrData = LTR24DATA_SRC()
        val flags = 0x00000001 or 0x00000002 or 0x00000100
        while (isStart) {
            ltr24.LTR24_Recv(tltr, srcArr, null, size, 2000).toULong()
            println(srcArr.toList())
            ltr24.LTR24_ProcessData(tltr, srcArr, dataArr, IntArray(1) {size}, flags, null)
            println(dataArr.toList())
            sleep(200)
        }
    }

        fun LTR24_Recv(handler: TLTR24, src: IntArray, tmark: IntArray?, size: Int, timeout: Int): Long

        fun LTR24_ProcessData(
            handle: TLTR24,
            src: IntArray,
            data: DoubleArray,
            size: IntArray,
            flags: Int,
            value: Int?
        ): Long
Еще непонятно почему с src: Int, вылетает ошибка Invalid Memory Access, получается только с size: IntArray

18.08.2025 15:56:42
#4

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

Re: LTR24-1 работа с ltr24api

Чтобы ответить про данные нужен код настройки параметров работы модуля (т.е. все что идет с момента open и до start), а также знать, на какие контакты какой сигнал подаете.

Еще непонятно почему с src: Int, вылетает ошибка Invalid Memory Access, получается только с size: IntArray

Не совсем понял, src это исходный массив данных, он в любом случае массив. Если имелся ввиду параметр size в LTR24_ProcessData, то так как функция меняет его значение (на входе размер данных src, на выход после вызова - размер действительных данных в data), то он передается в C по указателю, а не значению, что технически в C выполняется аналогично передачи массива размером 1, но с разным смыслом. В JNA вроде для этого есть IntByReference.

Также в руководстве у некоторых полей структуры указано "не используется в LTR24-1", это значит полей нет или просто их нельзя использовать?

Забыл ответить из первого поста, эти поля есть, тип структуры всегда одинаковый, просто их не нужно менять, т.к. задающиеся ими режимы есть только в LTR24-2