Gtl.ranges var: различия между версиями

Материал из GTL-wiki
Перейти к навигации Перейти к поиску
Нет описания правки
 
(не показано 8 промежуточных версий этого же участника)
Строка 1: Строка 1:
== Уствновка пользовательских диапазонов воспроизведения сигнала по триггеру ==
== Выбор диапазонов воспроизведения сигнала по триггеру ==
<pre>
<pre>
"use strict";
"use strict";
let options = gtl.options;
let point = gtl.options.point;
let record = gtl.options.record;
let signals = gtl.options.record.signalsModel;
let src = gtl.analog_inputs[0]; //источник сигнала
let src = gtl.analog_inputs[0]; //источник сигнала
let time = 20; //время записи для анализа
let time = 20; //полное время записи для анализа: gtl.options.record.playerTime
let time_window = 0.02 //временное окно наблюдения
let time_window = 0.02 //временное окно наблюдения
let time_impulse = 0.5 //временное окно для анализа импульса (не менее времени построения спектра)
let time_impulse = 0.5 //временное окно для анализа импульса (например не менее времени построения его спектра)  
let time_pre = time_window / 2; //время предыстории
let time_pre = time_window / 2; //время предыстории для анализа импульса
let ranges = []; //массив диапазонов для импульсов
let ranges = []; //массив диапазонов для импульсов (массив объектов)
let arrays = []; //двумерный массив для записи в .csv
let tries = 0; //циклы диагностки
let tries = 0; //циклы диагностки
let is_ranges = false; //состояние готовности диапазонов
let is_ranges = false; //состояние готовности диапазонов


// Скользящая амплитуда для создания "огибающей" импульса
let __max = gtl.create_moving_max({
let __max = gtl.create_moving_max({
    src: src,
  src: src, //источник сигнала
    name: "max",
  name: "max", //наименование
    time: time_window
  time: time_window //рассчетное окно
}); //скользящая амплитуда для создания "огибающей" импульса
});
__max.history = 2; //история сохраненных данных сигнала
__max.history = 2; //история сохраненных данных сигнала


// Триггера
let __thresh = gtl.create_moving_thresh({
let __thresh = gtl.create_moving_thresh({
    src: __max,
  src: __max, //источник сигнала
    name: "thresh",
  name: "thresh", //наименование
    time: time_window,
  time: time_window, //временное окно наблюдения
    level: 315
  level: 315 //уровень срабатывания триггера
}); //порог
});
__thresh.history = 2; //история сохраненных данных сигнала
__thresh.history = 2; //история сохраненных данных сигнала


__thresh.triggered.connect(thresh_triggered_event); //подключаем функцию
__thresh.triggered.connect(thresh_triggered_event); //подключаем асинхронную функцию
 
// Функция обработки события по срабатыванию триггера
function thresh_triggered_event(flag, sample) {
function thresh_triggered_event(flag, sample) {
    if (is_ranges) return;
  if (is_ranges) return;
    if (flag) {
  if (flag) {
        let start = (sample / __thresh.rate) - time_pre; //время срабатывания триггера
    let start = (sample / __thresh.rate) - time_pre; //время срабатывания триггера, сек
        gtl.log.info("trigger on time", start);
    gtl.log.info("trigger on time", start); //выводим информацию в лог


        let range = {
    // Формируем объект с результатом работы триггера
            min: start,
    let range = {
            max: start + time_impulse
      min: start,
        };
      max: start + time_impulse
        ranges.push(range); //добавляем диапазон в массив
     };
     };
    let array = [start, start + time_impulse]; //массив начало-конец
    ranges.push(range); //добавляем диапазон в массив
    arrays.push(array); //добавляем массив с общий массив
  };
};
};


Строка 56: Строка 60:
gtl.diagnostic.interval = time; //интервал запуска функции диагностики
gtl.diagnostic.interval = time; //интервал запуска функции диагностики
let plot = gtl.plots.add("Impulses"); //создаем координатную плоскость
let plot = gtl.plots.add("Impulses"); //создаем координатную плоскость
// Основная функция диагностики
function diagnose() {
function diagnose() {
    if (!is_ranges) {
  if (tries >= ranges.length) gtl.diagnostic.stop();
        gtl.player.custom_ranges = ranges; // добавляем пользовательские диапазоны в плеер
  if (!is_ranges) {
        gtl.results = { ranges: ranges }; // добавляем диапазоны в результат
    gtl.player.custom_ranges = ranges; //добавляем пользовательские диапазоны в плеер
        gtl.log.info('creating ranges', true);
    gtl.results = { ranges: ranges }; //выводим диапазоны в результат
        gtl.log.info('ranges', JSON.stringify(ranges));
 
        is_ranges = true; // пользовательские диапазоны готовы
    gtl.log.info('creating ranges', true);
        gtl.diagnostic.interval = time_impulse; // задаем время запуска функции диагностики, равное длине импульса
    gtl.log.info('ranges', JSON.stringify(ranges));
    is_ranges = true; //пользовательские диапазоны готовы


        gtl.log.info("Количество диапазонов в плеере", ranges.length);
    // Рисуем "огибающую" на координатной плоскости
        gtl.log.info("Установленный интервал запуска диагностики", time_impulse);
    plot.add({
        gtl.log.info("acq_time", gtl.acq_time);
      color: 0x0000ff, //цвет графика
      name: "max", //наименование графика
      x: 1 / __max.rate, //частотное разрешение
      y: __max.getHistoryArray() //значения амплитуд
    });


        plot.add({
    // Рисуем сигнал триггера на координатной плоскости
            color: 0x0000ff, //цвет графика
    plot.add({
            name: "max", //наименование графика
      color: 0xff00ff, //цвет графика
            x: 1 / __max.rate, //частотное разрешение
      name: "thresh", //наименование графика
            y: __max.getHistoryArray() //значения амплитуд
      x: 1 / __thresh.rate, //частотное разрешение
        }); //рисуем сигнал для контроля
      y: __thresh.getHistoryArray() //значения амплитуд
    });


        plot.add({
    // Записываем данные в формате .csv на диск
            color: 0xff00ff, //цвет графика
    const __path = "D:/trigger.csv";
            name: "thresh", //наименование графика
    let res = gtl.io.to_csv({
            x: 1 / __thresh.rate, //частотное разрешение
      path: __path, //путь для сохранения файла
            y: __thresh.getHistoryArray() //значения амплитуд
      values: arrays, //данные для записи в файл
        }); //рисуем сигнал для контроля
      sep: "\t" //разделитель данных
    }
    });


     if (tries > 0) {
     gtl.log.info('saving file', __path);
        gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`)
  }


        /*
  gtl.diagnostic.interval = time_impulse; //задаем время запуска функции диагностики, равное длине импульса
          Математика обработки сигнала
  if (tries == 0) { gtl.log.info("Установленный интервал запуска диагностики", time_impulse) }
        */
  else {
     }
     gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`)


     tries++;
     /*
    if (tries > ranges.length) gtl.diagnostic.stop(); // останавливаем диагностику после окончания диапазонов
      Математика обработки сигнала
    */
  }
  tries++;
}
}
</pre>
</pre>

Текущая версия от 07:04, 18 сентября 2026

Выбор диапазонов воспроизведения сигнала по триггеру

"use strict";
let src = gtl.analog_inputs[0]; //источник сигнала
let time = 20; //полное время записи для анализа: gtl.options.record.playerTime
let time_window = 0.02 //временное окно наблюдения
let time_impulse = 0.5 //временное окно для анализа импульса (например не менее времени построения его спектра) 
let time_pre = time_window / 2; //время предыстории для анализа импульса 
let ranges = []; //массив диапазонов для импульсов (массив объектов)
let arrays = []; //двумерный массив для записи в .csv
let tries = 0; //циклы диагностки
let is_ranges = false; //состояние готовности диапазонов

// Скользящая амплитуда для создания "огибающей" импульса
let __max = gtl.create_moving_max({
  src: src, //источник сигнала
  name: "max", //наименование
  time: time_window //рассчетное окно
});
__max.history = 2; //история сохраненных данных сигнала

// Триггера
let __thresh = gtl.create_moving_thresh({
  src: __max, //источник сигнала
  name: "thresh", //наименование
  time: time_window, //временное окно наблюдения
  level: 315 //уровень срабатывания триггера
});
__thresh.history = 2; //история сохраненных данных сигнала

__thresh.triggered.connect(thresh_triggered_event); //подключаем асинхронную функцию

// Функция обработки события по срабатыванию триггера
function thresh_triggered_event(flag, sample) {
  if (is_ranges) return;
  if (flag) {
    let start = (sample / __thresh.rate) - time_pre; //время срабатывания триггера, сек
    gtl.log.info("trigger on time", start); //выводим информацию в лог

    // Формируем объект с результатом работы триггера
    let range = {
      min: start,
      max: start + time_impulse
    };
    let array = [start, start + time_impulse]; //массив начало-конец

    ranges.push(range); //добавляем диапазон в массив
    arrays.push(array); //добавляем массив с общий массив
  };
};

// Функция диагностики. 
/*
  Первый запуск функции диагностики происходит после проигрывания всего сигнала и определения массива диапазонов по срабатыванию триггера
  После этого происходит добавление массива пользовательских диапазонов в плеер, отрисовка (при необходимости) сигнала триггера
  Затем устанавливается интервал запуска функции диагностики, равный временному окну для анализа импульса и запускается отсчет циклов (попыток) диагностики
  Как только количество циклов (попыток) сравнивается с количеством установленных пользовательских диапазонов, диагностика останавливается
*/

gtl.diagnostic.interval = time; //интервал запуска функции диагностики
let plot = gtl.plots.add("Impulses"); //создаем координатную плоскость

// Основная функция диагностики
function diagnose() {
  if (tries >= ranges.length) gtl.diagnostic.stop();
  if (!is_ranges) {
    gtl.player.custom_ranges = ranges; //добавляем пользовательские диапазоны в плеер
    gtl.results = { ranges: ranges }; //выводим диапазоны в результат

    gtl.log.info('creating ranges', true);
    gtl.log.info('ranges', JSON.stringify(ranges));
    is_ranges = true; //пользовательские диапазоны готовы

    // Рисуем "огибающую" на координатной плоскости
    plot.add({
      color: 0x0000ff, //цвет графика
      name: "max", //наименование графика
      x: 1 / __max.rate, //частотное разрешение
      y: __max.getHistoryArray() //значения амплитуд
    });

    // Рисуем сигнал триггера на координатной плоскости
    plot.add({
      color: 0xff00ff, //цвет графика
      name: "thresh", //наименование графика
      x: 1 / __thresh.rate, //частотное разрешение
      y: __thresh.getHistoryArray() //значения амплитуд
    });

    // Записываем данные в формате .csv на диск
    const __path = "D:/trigger.csv";
    let res = gtl.io.to_csv({
      path: __path, //путь для сохранения файла
      values: arrays, //данные для записи в файл
      sep: "\t" //разделитель данных
    });

    gtl.log.info('saving file', __path);
  }

  gtl.diagnostic.interval = time_impulse; //задаем время запуска функции диагностики, равное длине импульса
  if (tries == 0) { gtl.log.info("Установленный интервал запуска диагностики", time_impulse) }
  else {
    gtl.log.info('diagnostic', `Цикл диагностики ${tries} - ${true}`)

    /*
      Математика обработки сигнала
    */
  }
  tries++;
}