Сглаживание в CRW-DAQ

Данный пример SMOOTH.CFG иллюстрируют возможности CRW-DAQ с точки зрения сглаживания данных в процессе измерений. Для сглаживания используются стандартные программы _MVTOPU.CFG и _MVTOTC.CFG для обработки измеряемых данных по калибровке и сглаживания. Эти программы являются заменой более простым программам _MV2PU.CFG и _MV2TC.CFG, которые уже отработали много лет, но содержат только часть возможностей, не позволяя делать задержку и историю. Эти две пары программ совместимы по сигнатуре, что позволяет легко заменять программу обработки заменой ссылок на программу (2 на to в имени файла).

В конфигурации SMOOTH.CFG присутствует программа Test, которая генерирует зашумленный генератором случайных чисел сигнал NoisySignal и слабо изменяющийся сигнал или константу ColdJunction - температуру холодного спая. Сигнал преобразуется программами _MVTOPU.CFG и _MVTOTC.CFG и записывается в 16 кривых вида P_C+S+D+H+ или T_C+S+D+H+:

Наблюдая за поведением этих 16 кривых и меняя различные параметры, можно наблюдать, как происходит обработка данных и что на нее влияет.

В качестве дополнительного примера показано, что программа _MVTOTC.CFG позволяет делать коррекцию нуля АЦП, если на основной вход подать сигнал АЦП, на дополнительный - сигнал закороченного АЦП (смещение нуля), и взять калибровку _SUBZ.CAL, у которой шкала TransformX = SubZ, TransformY = Line.

Конфигурация SMOOTH.CFG может использоваться как полигон для подбора параметров сглаживания реальных систем. Для этого надо изменить программу Test, чтобы она генерировала близкие к реальности данные, а затем подобрать параметры сглаживания, варьируя параметры конфигурации.

Программа _MVTOPU.CFG служит для одновременного перевода нескольких каналов милливольт в физические единицы по калибровке, а также сглаживания данных. Она имеет много настроек, позволяющих управлять процессом обработки. Предполагается, что к аналоговым входам AnalogInput подключены преобразуемые данные (например, милливольты АЦП), у которых по оси абсцисс X отложено время. Это означает, что абсцисса X монотонно возрастает со временем. Требование монотонности абсциссы X СТРОГО ОБЯЗАТЕЛЬНО, так как факт монотонности используется в алгоритмах анализа данных и сглаживания. Надо заметить, что к цифровым входам можно также подключать кривые - "ворота", разрешающие выполнять преобразование. При отсутствии "ворот" на входе считается, что преобразование всегда разрешено.

Программа _MVTOTC.CFG также служит для той же цели, но отличается тем, что для формирования выходного сигнала в канале n (например, температуры) используется два входных сигнала: к четному входу n*2 подключается основной сигнал (например, термоЭДС термопары), а к нечетному входу n*2+1 подключается дополнительный сигнал (например, температура холодного спая). Алгоритмы обработки очень похожи, так что мы рассмотрим далее программу _MVTOPU.CFG, а _MVTOTC.CFG - работает по аналогии.

Надо только заметить, что дополнительный сигнал предполагается достаточно гладким. Дополнительный сигнал - это обычно константа или очень слабо меняющаяся величина. Поэтому при обработке никакого анализа дополнительного сигнала не делается, он берется "как есть".

Параметры преобразования по калибровке указываются через атрибут:

		Calibration#n = f NX NY NZ SX SY L R
  
Если атрибут опущен или файл калибровки отсутствует (например, задан звездочкой), калибровочное преобразование не применяется. Детали настройки калибровок описаны в документации CRW-DAQ.

Параметры сглаживания указываются через атрибут:

		Smoothing W P K1 K2
  
Если атрибут опущен или указана нулевая полуширина окна сглаживания, то данные передаются без сглаживания.

Задержка Delay#n также влияет на результат сглаживания. Дело в том, что при сглаживании в реальном времени правая половина окна сглаживания (будущее) отсутствует, там нет точек. Из-за несимметричного расположения данных, при котором слева от точки сглаживания данные есть, а справа нет, сглаживание дает неточный результат. Если ввести задержку, то есть подождать, когда накопятся необходимые для сглаживания данные, и только потом выдать результат, то сглаживание происходит точнее, но результат выдается не сразу, а с задержкой. Задержка тут является платой за качество сглаживания данных. Во многих случаях один и тот же сигнал преобразуется дважды, для задач управления - преобразуется без задержки и сглаживания, для архивирования и отображения - с задержкой и сглаживанием.

Задержка указывается в единицах времени DAQ, заданных в переменной [DAQ] TimeUnits. Обычно задержка выбирается равной полуширине окна, то есть минимальная задержка, при которой в окне присутствуют данные, симметрично заполняющие интервал справа и слева от точки сглаживания.

Флаг истории History#n используется для управления частотой обработки данных. Она нужна, если частота поступления исходных данных выше, чем частота опроса программы обработки (или если приоритет программы обработки ниже).

При сглаживании, особенно с историей, надо позаботиться, чтобы емкость буфера FIFO была достаточной, а история исходной (сглаживаемой) кривой достаточно велика. Если история сглаживаемой кривой будет недостаточно большой, сглаживаемые данные могут оказаться удаленными раньше, чем будут востребованы.

Обработанные данные помещаются на аналоговые выходы, заданные атрибутом AnalogOutput. Запись данных идет через механизм FIFO, поэтому надо указать достаточную емкость AnalogFifo, чтобы данные не пропадали.

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

		Tolerance AbsEps RelEps
  
Если атрибут опущен или указаны нулевые параметры, округление не делается.

Конфигурация _MVTOPU.CFG выглядит примерно так:

    [DeviceList]
    &MVTOPU = device software program
    [&MVTOPU]
    Comment        = Преобразование mv в физические единицы
    InquiryPeriod  = 10
    DevicePolling  = 10, tpNormal
    ProgramSource  = ~~\Resource\DaqSite\StdLib\DaqPas\_mvtopu.pas
    AnalogFifo     = 10000
    AnalogInputs   = 2
    AnalogOutputs  = 2
    Calibrations   = 2
    Delay#n        = 0 ; Задержка по умолчанию
    History#n      = 0 ; История по умолчанию
    Benchmark      = 1 ; Тест производительности
    ;****** Канал 0
    Delay#0        = 1 ; Задержка
    History#0      = 1 ; Нужна ли полная история
    Link AnalogInput  0  with curve Signal#0 smoothing 1 2 2 2
    Link AnalogOutput 0  with curve Result#0 tolerance 0 0.005 history 100000
    Calibration#0 = ..\calibr\_HrAl.cal U(mV) T * Line _HrAl 0 10
    ;****** Канал 1
    Link AnalogInput  1  with curve Signal#1 smoothing 0 2 2 2
    Link AnalogOutput 1  with curve Result#1 tolerance 0 0 history 100000
    Calibration#1 = ..\calibr\_HrAl.cal U(mV) T * Line _HrAl 0 10
  

Конфигурация _MVTOTC.CFG выглядит примерно так же, только на входе вдвое больше кривых:

    [DeviceList]
    &TEST_MVTOTC = device software program
    [&TEST_MVTOTC]
    Comment        = Преобразование mv в градусы
    InquiryPeriod  = 10
    DevicePolling  = 10, tpNormal
    ProgramSource  = ~~\Resource\DaqSite\StdLib\daqpas\_mvtotc.pas
    AnalogFifo     = 10000
    AnalogInputs   = 2
    AnalogOutputs  = 1
    Calibrations   = 1
    Delay#n        = 0 ; Задержка по умолчанию
    History#n      = 0 ; История по умолчанию
    Benchmark      = 1 ; Тест производительности
    ;****** Канал 0
    Delay#0        = 1 ; Задержка
    History#0      = 1 ; Нужна ли полная история
    Link AnalogInput  0  with curve Thermocouple#0 smoothing 1 2 2 2
    Link AnalogInput  1  with curve ColdJunction
    Link AnalogOutput 0  with curve Temperature#0 tolerance 0 0.001 history 100000
    Calibration#0 = ..\calibr\_HrAl.cal U(mV) T Tc Line _HrAl 0 10
  
Кроме стандартных переменных, присущих всем устройствам, присутствуют следующие специфические для данных программ переменные:

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