Российский производитель и разработчик сертифицированного измерительного оборудования с 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,333

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