Формат файлов CRW-DAQ

  • Формат файлов *.CRW
  • Формат файлов *.DAQ
  • Формат файлов *.CFG
  • Формат файлов *.CRC
  • Формат файлов *.CAL
  • Формат файлов *.HLP
  • Формат файлов *.DAT
  • Формат файлов *.SPD
  • Формат файлов *.PIK
  • Формат файлов *.REP

  • Формат файлов *.CRW

    Формат *.CRW является внутренним двоичным файлом для хранения данных, полученных и обработанных в пакете CRW32. Формат основан на структуре RIFF – файлов, аналогичной структуре файлов *.WAV и *.AVI. Основной хранимой в CRW-файлах единицей является окно, которое в зависимости от типа содержит разного рода данные (кривые, поверхности, текст и т.д.)

    Обшее описание формата RIFF и работы с ним

    Введение

    Формат файлов RIFF - Resource Interchange File Format - это, скорее, не конкретный формат файлов, а принцип построения двоичных файлов со сложной структурой, достаточно свободно расширяемой по мере надобности и, в отличие от более сложных форматов потоковой модели объектов, как в Delphi, и допускающий простое формальное описание, а следовательно, более простую переносимость. Основой RIFF служит блочная (chunk) структура. Блок состоит из заголовка фиксированной структуры и данных, структура которых определяется заголовком. Заголовок содержит всего два поля:

    Данные, в общем случае неопределенной структуры, в зависимости от заголовка, могут включать в себя другие блоки, что позволяет строить сложные вложенные (рекурсивные) структуры. Сигнатура блока, собственно, определяет, как надо интерпретировать данные, которые содержит этот блок. Поле Size позволяет перейти к следующему блоку. За счет этого те блоки, которые не распознаются программой, можно просто пропускать. Это позволяет легко расширять формат за счет добавления новых блоков без потери совместимости со старыми программами.

    Простые блоки и формы

    Можно выделить два вида блоков:

    Таким образом, блоки идентифицируются своей сигнатурой, а формы - сигнатурой и идентификатором формы. Например, WAVE - файлы содержат форму RIFF WAVE, которая содержит блоки fmt, data и т.д. Отметим также, что интерпретация блока зависит от контеста, то есть от того, в какой форме он встретился (какова его родительская форма). Можно отображать структуру блоков в виде древовидной структуры, в которой смещение служит для обозначения вложенности блока. Тогда структура WAVE-файла выглядит как:
       RIFF WAVE
       fmt
       data
       fact
       ...
      

    Форма RIFF

    Каждый файл RIFF обязан содержать форму с сигнатурой RIFF, которая служит родительской формой для всех остальных форм и блоков. Это, в частности, означает, что поле Size формы RIFF должно содержать число (размер файла-8). Говоря по-простому, RIFF-файл - это просто одна RIFF-форма, которая содержит в себе все все остальное. Для AVI файлов это не так (не знаю почему), но в данной библиотеке считается, что неверное значение означает повреждение файла. На этом основан метод RiffFiler.Validate, который отрезает конец файла по границе формы RIFF, так что последняя неудачная запись данных в конец файла аннулируется.

    Идентификатор формы RIFF фактически определяет тип файла RIFF. Например, для WAV - файлов это WAVE, для AVI - AVI и т.д. Программа чтения распознает корректность формата по признаку наличия сигнатуры RIFF, нужного идентификатора формы и правильного размера RIFF-формы.

    Правила именования блоков

    Сигнатуры и идентификаторы форм обычно содержат 4-байтные числа, получаемые из читабельных мнемоник, облегчающих их интерпретацию. Для генерации сигнатур можно взять утилиту CRW_DAQ\Tools\Magic\Magic.Exe. Судя по всему, сигнатуры форм идентифицируются сигнатурами из заглавных букв, а сигнатуры простых блоков - прописными буквами. У меня нет информации, является это правило частью спецификации RIFF или это просто удобная практика. Однако я придерживаюсь этой практики. Это позволяет, например, делать листинг структуры файла без вникания в подробности.

    Чтение RIFF-файла

    Основано на процедуре ForEach. Надо написать процедуру, которая что-то делает для каждого блока в зависимости от его сигнатуры и вызвать ForEach. При вызове процедуры файл позиционирован на начало данных блока, так что можно сразу читать данные. Вот пример чтения списка форм файла:

      procedure ListItem(Filer:TRiffFiler; const Chunk:TRiffChunk; var Terminate:Boolean; Custom:Pointer);
      begin
       writeln(Chunk.dwSign, Chunk.dwFormID);
      end;
      begin
       Filer:=NewRiffFiler(..);
       Filer.ForEach(ListItem,Filer.RootForm,nil);
       Kill(Filer);
      end.
      
    Процедура ForEach может вызываться рекурсивно для чтения форм внутри других форм.

    Запись в RIFF-файл

    Типичная процедура записи в файл новой формы имеет такой вид:

      Filer:=NewRiffFiler(..);               // create filer
      Filer.SeekChunkNext(Filer.RootForm);   // seek to end of file
       Form:=Filer.CreateForm(..)            // start writing form
        Chunk:=Filer.CreateChunk(..)         // start writing chunk inside form
         Filer.Write(..)                     // write chunk data
        Filer.FlusChunk(Chunk)               // stop writing chunk, update chunk header
        SubForm:=Filer.CreateForm(..)        // start writing subform inside form
         ...                                 // do the same inside subform
        Filer.FlushChunk(SubForm)            // stop writing subform inside form
         ...                                 // write another chunks and subforms inside form
       Filer.FlushChunk(Form)                // update form header
      Filer.Flush;                           // stop writing, update root RIFF form header
      Kill(Filer);                           // destroy filer
      
    В любом случае операция записи блока помещается в "скобки" из вызовов Create...Flush. Это главное правило, которое должно соблюдаться неукоснительно.

    Описание формата CRW

    Файл CRW содержит родительскую форму RIFF CRWF, включающую в себя все остальные блоки и формы. Правило Size=(размер файла-8) считается обязательным и служит для восстановления данных после неудачной записи. Форма RIFF CRW содержит в себе список форм ITEM XXXX, где XXXX - тип объекта. Формы ITEM XXXX могут содержать внутренние формы ITEM YYYY и так далее. Родительская форма определяет контекст интерпретации блоков, например, блок name может означать имя окна или имя кривой в окне. Объекты основной формы RIFF CRWF - это окна:

    и т.д. Окна могут содержать другие формы ITEM, например, форма ITEM CRVW содержит список форм ITEM CURV, которые соответствуют кривым этого окна. Можно условно отобразить формат CRW в виде такой структуры:
      RIFF CRWF    : Form main  
       ITEM CRVW   : Form curve window  
        name       : Chunk window name as String 
        time       : Chunk save time in msec from Xmas as Double 
        vers       : Chunk window program version as LongInt 
        ltwh       : Chunk window left,top,width,height as LongInt * 4 
        titl       : Chunk window title as String 
        lgnd       : Chunk window legend as String 
        text       : Chunk window comment text as String 
        clrp       : Chunk window color palette as Longint * 8 
        roi        : Chunk window ROI markers as Double * 4 
        wrld       : Chunk window world (limits) as Double * 4
        tbtu       : Chunk window time base and time units (ms) as Double * 2
        ITEM CURV  : Form curve (subform of ITEM CRVW)  
         name      : Chunk curve name as String 
         clrp      : Chunk curve color as LongInt 
         styl      : Chunk curve style as LongInt 
         step      : Chunk curve step as LongInt 
         data      : Chunk array of curve points as Double (x,y) points array 
         text      : Chunk curve comment text  as String 
      defc         : Chunk window default curve index as LongInt 
       ITEM SUFW   : Form surface window  
        name       : Chunk window name as String 
        time       : Chunk save time in msec from Xmas as Double 
        vers       : Chunk window program version as LongInt 
        ltwh       : Chunk window left,top,width,height as LongInt * 4 
        titl       : Chunk window title as String 
        lgnd       : Chunk window legend as String 
        text       : Chunk window comment text as String 
        clrp       : Chunk window color palette  as Longint * 7 
        lims       : Chunk window limits  as Double * 4 
        clip       : Chunk window clipping as Double * 4 
        data       : Chunk Z-matrix as LongInt Rows,Columns, Double Rows*Columns Z[i,j] 
        view       : Chunk window view params as double * 5 + longint 
      
    Блоки окон name, time, vers, ltwh являются обязательными, по ним строится список объектов архива. см. также _crwsave.pas - утилита сохранения данных в *.crw.

    Оглавление


    Формат файлов *.DAQ

    Файлы *.DAQ являются специальной разновидностью файлов CRW и применяется для резервного сохранения данных в системе CRW-DAQ. Они имеют точно такую же структуру, как CRW, но содержат всегда только одно окно с именем “DAQ DATA WINDOW”. Это окно содержит в себе все кривые CRW-DAQ, а также текст конфигурации в комментарии к окну.

    Оглавление


    Формат файлов *.CFG

    Это конфигурационные файлы : текстовые файлы с секционной структурой, похожие на *.ini файлы DOS или Windows. Конфигурационные файлы служат для задания параметров в системе CRW-DAQ, а также для хранения таблиц и калибровок.

    Оглавление


    Формат файлов *.CRC

    Окна мнемосхем служат для наглядного отображения логических и цифровых данных в виде пиктограмм (растровых изображений) или числовых величин, а также для размещения элементов управления (например, кнопок). Как указано, в разделе [Windows], секция описания окна мнемосхемы содержит ссылку на *.crc - файл описания мнемосхемы и список связей (или ассоциаций) сенсоров с устройствами, кривыми и тегами CRW-DAQ. С точки зрения пользователя эти связи сенсора обеспечивают: Файлы формата *.crc предназначены для описания мнемосхем. Мнемосхема содержит в себе основное поле – растровое изображение и список сенсоров (чувствительных областей изображения). Каждый сенсор перекрывает собой определенную прямоугольную область на основном изображении и содержит список изображений, одно из которых считается текущим и отображается в этой области. Сенсор также может служить для отображения текущих численных значений. Файлы *.crc описания мнемосхем могут создаваться автономно (независимо от файла конфигурации *.cfg), однако для правильной работы имена сенсоров и таблицы тегов должны быть согласованы с основной конфигурацией.

    Формат *.crc-файла текстовый, с разбиением на секции.

    В секции [Circuit] содержится описание основного поля изображения:

    В секции [SensorList] содержится список сенсоров. Список содержит набор строк вида:

      Sensor = Sensor#1, Sensor#2, …
      
    где Секция может содержать несколько таких строк, а каждая строка – несколько имен сенсоров. Например:
      [SensorList]
      Sensor = Start, Stop, Clear
      Sensor = Integral, Diff
      
    Секция [SensorList] может также отсутствовать, в этом случае действует список сенсоров “по умолчанию” вида:
      [SensorList]
      Sensor = Sensor#1, Sensor#2, …, Sensor#n
      
    где n - число сенсоров. При этом номера сенсоров должны идти непрерывно (без пропусков). Явный список сенсоров, однако, удобнее тем, что не требуется перенумерация сенсоров при добавлении новых сенсоров или удалении старых.

    Каноническим следует считать такой способ описания (пример):

        [SensorList]
        Sensor = START
        [START]
        Pos = 248, 10
        Tag = 0
        LED = 0, 0, 0
        Tag#1 = 0, ..\BITMAPS\ST_UP.BMP
        Tag#2 = 1, ..\BITMAPS\ST_DN.BMP
        Hint = Button to start process
        []
        
        [SensorList]
        Sensor = EditStateBit0
        [EditStateBit0]
        Pos = 255 85
        Tag = 0
        TagEval(v) = isbit(v,0)
        Tag#1 = 0, ~~\Resource\DaqSite\StdLib\Bitmaps\_smallcheck0.BMP
        Tag#2 = 1, ~~\Resource\DaqSite\StdLib\Bitmaps\_smallcheck1.BMP
        
        [SensorList]
        Sensor = AMPL
        [AMPL]
        Pos = 227, 85
        Tag = 0
        LED = 7, 3, 0, %7.3g
        Tag#1 = 0, ..\BITMAPS\LED12025.BMP
        Hint = Input amplidute
        []
      
    Как можно видеть, каждый сенсор объявляется в секции [SensorList] и тут же описывается. Это удобно, так как при этом каждый сенсор можно добавлять/менять/удалять независимо от других. Кроме того, имя секции рекомендуется использовать как имя сенсора, то есть опускать параметр Name=....

    После задания списка сенсоров описание каждого сенсора помещается в отдельную секцию, имя которой соответствует имени сенсора в секции [SensorList]. Каждый сенсор занимает секцию [Sensor#n], где Sensor#n – имя сенсора. В секции [Sensor#n] содержится описание сенсора через такие переменные:

    Пример файла описания мнемосхемы:

        ;***
        ;*** Основное поле мнемосхемы:
        ;*** Задается основное изображение GeneralMap, текст "подсказки" Hint, высота панели команд ToolBar
        ;***
        [Circuit]
        GeneralMap = ..\BITMAPS\SINWAVE.BMP
        Hint = Демонстрационный пример
        ToolBarHeight = 1
        []
        
        
        ;***
        ;*** Кнопка на панели команд ToolBar:
        ;*** Pos задан за пределами экрана, ToolBarKey соответствует нажатию левой кнопки мыши
        ;***
        [SensorList]
        Sensor = TOOL_START
        [TOOL_START]
        Pos = 10000, 10000
        Tag#1 = 0, ..\BITMAPS\TOOL_START.BMP
        Hint = Кнопка СТАРТ на панели команд ToolBar
        ToolBarKey = 1
        []
        
        ;***
        ;*** Кнопка с двумя состояниями и с надписями "Make Start"/"Make Stop":
        ;***
        [SensorList]
        Sensor = START
        [START]
        Pos = 248, 10
        Tag = 0
        LED = 0, 0, 0
        Tag#1 = 0, ..\BITMAPS\ST_UP.BMP, Make+Start
        Tag#2 = 1, ..\BITMAPS\ST_DN.BMP, Make+Stop
        []
        
        ;***
        ;*** Числовое поле в формате с фиксированной точкой:
        ;***
        [SensorList]
        Sensor = OMEGA
        [OMEGA]
        Pos = 229, 47
        Tag = 0
        LED = 7, 3, 0, %7.3f
        Tag#1 = 0, ..\BITMAPS\LED12025.BMP
        []
        
        ;***
        ;*** Числовое поле в свободном формате:
        ;***
        [SensorList]
        Sensor = AMPL
        [AMPL]
        Pos = 227, 85
        Tag = 0
        LED = 7, 3, 0, %7.3g
        Tag#1 = 0, ..\BITMAPS\LED12025.BMP
        []
        
        ;***
        ;*** Числовое поле в научном формате, с указанием фонта:
        ;***
        [SensorList]
        Sensor = NOISE
        [NOISE]
        Pos = 227, 124
        Tag = 0
        LED = 7, 3, 0, %7.3e, [LedFont]
        Tag#1 = 0, ..\BITMAPS\LED12025.BMP
        []
        
        ;***
        ;*** Числовое поле в формате "по умолчанию", с указанием фонта:
        ;***
        [SensorList]
        Sensor = VALUE
        [VALUE]
        Pos = 228, 160
        Tag = 0
        LED = 7, 3, 0, *, [LedFont]
        Tag#1 = 0, ..\BITMAPS\LED12025.BMP
        []
        
        ;***
        ;*** Описание используемого фонта:
        ;***
        [LedFont]             ; описание фонта
        CharSet = 204         ; кодировка фонта RUSSIAN_CHARSET=204
        Color   = $000000     ; цвет фонта, RGB
        Height  = -18         ; высота фонта
        Name    = Courier New ; название фонта
        Pitch   = Fixed       ; ширина символов фонта Default/Fixed/Variable
        Style   = [Bold]      ; [Bold, Italic, Underline, StrikeOut]
        []
      

    Оглавление


    Примечание: Параметры в URL кодировке или в кавычках

    При описании параметров мнемосхем Hint, GeneralMap, Tag используется
    либо URL кодировка - старый стиль,
    либо двойные кавычки (") - новый стиль.

    Правила разбора параметров такие: Указанный алгоритм позволяет описывать параметры, содержащие символы-разделители (пробел, табуляция, перевод строки). В обычных случаях рекомендуется использовать кавычки, т.к. это наиболее простой и читабельный метод. В особых случаях (например, если строка содержит перевод строки) допускается использовать URL кодировку, но в этом случае кавычек быть не должно.

    Например:
    [Circuit]
    Hint = Frequency of Wave simulation, Hz.                            - Строка в URL кодировке с пробелами
    Hint = Frequency+of+Wave+simulation,+Hz.                            - Строка в URL кодировке без пробелов
    Hint = "Frequency of Wave simulation, Hz."                          - Строка в кавычках
    Tag#1 = 0, ..\Bitmaps\barbmp_149_20_24_silver.bmp Wave+Noise        - Параметр в URL кодировке
    Tag#1 = 0, ..\Bitmaps\barbmp_149_20_24_silver.bmp "Wave Noise"      - Параметр в кавычках
      


    Оглавление

    Формат файлов *.CAL

    Практически каждая измерительная задача связана с калибровками каналов, то есть с преобразованием измеряемых величин из условных единиц, например, милливольт АЦП термопары, в физические единицы, например, температуру. Система CRW-DAQ имеет развитый аппарат для описания разнообразных калибровок.
    В типичной ситуации калибровка канала должна описывать закон y=Y(x,z), который преобразует аргумент х в физическую величину y при данном параметре z (зависимость от z может отсутствовать). Например, при измерении температуры термопарой
      аргумент х – термоЭДС термопары,
      физическая величина y -температура,
      параметр z -температура датчика холодного спая.
    Предполагается, что зависимость от x определяется аппаратурой и подлежит определению, а зависимость от параметра z точно известна. Предполагается также, что известна пара взаимно - обратных (назовем их ‘линеаризующими’) преобразований:
      x'=fx(x,z),   x=f-1x(x',z)
    y'=fy(y,z), y=f-1y(y',z)
    обладающих тем свойством, что в 'линеаризованных' переменных {x’,y’} величина y’ не зависит от параметра z, а зависимость y'(x') является гладкой функцией, и следовательно, может быть достаточно точно описана полиномом y'=p(x'), где p(x)= a+bx+cx2+… ‘Линеаризующие’ функции заданы аналитически и зависят от типа калибруемых данных, а коэффициенты полинома подгоняются по МНК (методу наименьших квадратов) с весовыми множителями w. Это значит, что коэффициенты {a,b,c…} полинома y’=p(x’) минимизируют взвешенную сумму квадратов отклонений измеренных значений y’i от теоретических p(x’i), полученных в калибровочном измерении. В качестве веса wi i-го измерения берется, например, обратная дисперсия измерения. Поиск коэффициентов полинома – стандартная задача МНК, решение которой не представляет проблемы и описано в учебниках по статистике.

    Таким образом, в общем случае зависимость имеет вид
    y= f-1y(p(fx(x,z)),z),
    а подгонка полинома p(x) идет в линеаризованных переменных x',y' с весами w. Конечно, зависимость от параметра z, а также ‘линеаризующее’ преобразование необязательны. Проиллюстрируем сказанное тремя примерами.

    Файл калибровки *.cal определяет зависимость y(x,z), которая ищется на основании калибровочных измерений, в ходе которых для известных (измеренных) значений xi, zi независимым методом измеряются величины yi. В файлах калибровок хранятся только массивы точек калибровки xi,yi,zi, а коэффициенты полинома p(x) вычисляются автоматически при загрузке файла. Этот подход имеет то достоинство, что, сделав калибровку один раз, легко менять параметры описания искомой зависимости, не производя новую калибровку, но без потери точности.

    Файлы калибровок измерительных систем CRW-DAQ имеют структуру конфигурационных текстовых файлов с секционной структурой. Загрузка калибровки всегда делается по ссылке из файла конфигурации, поэтому важно правильно построить эту ссылку. Калибровка всегда является атрибутом устройства CRW-DAQ, поэтому ссылка на калибровку делается в секции описания устройства CRW-DAQ.

    Каждое устройство CRW-DAQ может иметь массив калибровок. Число калибровок задается переменной Calibrations в секции описания устройства. Калибровки идентифицируются по номеру, который меняется от 0 до Calibrations-1. Для задания калибровки в секции описания устройства должна присутствовать строка следующего формата:
      Calibration#n = file xname yname zname xscale yscale a b
    где Отметим, что обязательными являются параметры file, xname, yname, а остальные параметры можно опустить. Если же какой-то параметр из набора file, xname, yname, zname, xscale, yscale не задан, то вместо него надо поставить “*”, тогда ему будет присвоено значение по умолчанию.

    Таблица

    Тип шкалыКомментарий.
    Источник данных, стандарт.
    “Линеаризующие” преобразования x'=fx(x,z), x=f-1x(x',z)
    Lineлинейная шкалаx’=x, x=x’
    Lgлогарифмическая шкалаx’=log(x), x=exp(x’)
    HrAlтермопара хромель-алюмель, тип K ГОСТ Р 50431-92 (МЭК 584-1-77)x'=F(x)-F(z), x=F-1(x'+F(z)), F(x)-термопарная таблица, z-температура холодного спая
    HrCpтермопара хромель-копель, тип ? ГОСТ Р 50431-92 (МЭК 584-1-77)x'=F(x)-F(z), x=F-1(x'+F(z)), F(x)-термопарная таблица, z-температура холодного спая
    HrCnтермопара хромель-константан, тип E ГОСТ Р 50431-92 (МЭК 584-1-77)x'=F(x)-F(z), x=F-1(x'+F(z)), F(x)-термопарная таблица, z-температура холодного спая
    RhPt13термопара платина-родий(13%), тип R ГОСТ Р 50431-92 (МЭК 584-1-77)x'=F(x)-F(z), x=F-1(x'+F(z)), F(x)-термопарная таблица, z-температура холодного спая
    RhPt10термопара платина-родий(10%), тип S ГОСТ Р 50431-92 (МЭК 584-1-77)x'=F(x)-F(z), x=F-1(x'+F(z)), F(x)-термопарная таблица, z-температура холодного спая
    RhPt30термопара платина-родий(30%), тип B ГОСТ Р 50431-92 (МЭК 584-1-77)x'=F(x)-F(z), x=F-1(x'+F(z)), F(x)-термопарная таблица, z-температура холодного спая
    WReA1термопара вольфрам-рений, тип A1 ГОСТ Р 50431-92 (МЭК 584-1-77)x'=F(x)-F(z), x=F-1(x'+F(z)), F(x)-термопарная таблица, z-температура холодного спая
    WReA2термопара вольфрам-рений, тип A2 ГОСТ Р 50431-92 (МЭК 584-1-77)x'=F(x)-F(z), x=F-1(x'+F(z)), F(x)-термопарная таблица, z-температура холодного спая
    WReA3термопара вольфрам-рений, тип A3 ГОСТ Р 50431-92 (МЭК 584-1-77)x'=F(x)-F(z), x=F-1(x'+F(z)), F(x)-термопарная таблица, z-температура холодного спая
    NiSiтермопара никель-кремний, тип N? ГОСТ Р 50431-92 (МЭК 584-1-77)x'=F(x)-F(z), x=F-1(x'+F(z)), F(x)-термопарная таблица, z-температура холодного спая
    CuCnтермопара медь-константан, тип T ГОСТ Р 50431-92 (МЭК 584-1-77)x'=F(x)-F(z), x=F-1(x'+F(z)), F(x)-термопарная таблица, z-температура холодного спая
    FeCnтермопара железо-константан, тип J ГОСТ Р 50431-92 (МЭК 584-1-77)x'=F(x)-F(z), x=F-1(x'+F(z)), F(x)-термопарная таблица, z-температура холодного спая
    RelHrAlтермопарная таблицаx'=F(x), x=F-1(x'), F(x)-термопарная таблица
    RelHrCpтермопарная таблицаx'=F(x), x=F-1(x'), F(x)-термопарная таблица
    RelHrCnтермопарная таблицаx'=F(x), x=F-1(x'), F(x)-термопарная таблица
    RelPt100температурный датчик сопротивления платина 100 ом, DIN43760x'=F(x), x=F-1(x'), F(x)-таблица сопротивление-температура
    SiDiodeDкремниевый термодиод, тип D данные фирмы-изготовителяx'=F(x), x=F-1(x'), F(x)-таблица напряжение-температура
    Описание формата *.cal – файла можно привести в виде такого шаблона - примера, в котором жирным курсивом выделены зарезервированные слова (которые не меняются).

    [xname-yname calibration]     Секция калибровки зависит от xname,yname
    FitMethod                 Метод аппроксимации зависимости y’(x’).
                              В настоящей версии допустим только Polynom.
    TransformX                Тип шкалы аргумента X
    TransformY                Тип шкалы значения Y
    Power                Cтепень полинома
                         где
    Center               Центр d полинома p(l)
    Scale                Масштаб s полинома p(l)
    Bounds               Пределы (а,b) аргумента калибровки для графика
    Fixed                0 = полином МНК, 1 = полином с фиксированными коэффициентами
    Coeff[n]             коэффициент полинома при степени n
    DataxnameynameWeightzname Заголовок данных зависит от xname,yname,zname
    -6.458  -270  10
    0 0 10
    54.875  1372  10
    End Data                       Маркер конца таблицы данных
    Notice Text                    Маркер начала комментария
    Текст комментария к калибровке.
    Другая дополнительная информация.
    End Notice Text                Маркер конца комментария

    Примечания:
  • Веса (обратные дисперсии) точек помещаются в столбце Weight.
  • Столбец z может отсутствовать, если нет зависимости от z и в ссылке на калибровку указано zname=”*”.
  • Порядок столбцов в таблице данных может меняться, но должен быть согласован с заголовком таблицы, то есть столбцы должны идти в том же порядке, что имена xname,yname,zname,Weight.
  • Переменные TransformX, TransformY переопределяют тип шкалы, заданный при создании калибровки значениями xscale, yscale.
  • Переменные Center=d, Scale=s и замена переменных делаются для повышения точности и устойчивости решения МНК-полинома, так как при плохом выборе масштаба и центра полинома МНК-система может быть плохо обусловлена.


  • Пример файла конфигурации и калибровки:

    Файл конфигурации c:\daq\example\config\test.cfg:
    [DeviceList]
    &ThermoCouples = device software program
    [&ThermoCouples]
    Comment = Термопарные преобразования
    AnalogInputs = 2
    AnalogOutputs = 1
    Calibrations = 1
    ProgramSource = ..\daqpas\_mv2tc
    Link AnalogInput 0 with curve ThermoElectricity
    Link AnalogInput 1 with curve ColdJunctionTemperature
    Link AnalogOutput 0 with curve Temperature
    Calibration#0 = ..\calibr\_hral.cal U(mV) T Tc Line HrCp 0 10

    Файл калибровки c:\daq\example\calibr\_cral.calg:
    [U(mV)-T calibration]
    FitMethod = Polynom
    TransformX = Line
    TransformY = HRAL
    Power = 1
    Center = 0
    Scale = 1
    Bounds = -7 55
    Data U(mV)  T    Weight Tc
         -6.458 -270 1      0
         0      0    1      0
         54.875 1372 1      0
    End Data
    Notice Text
    Стандартная калибровка хромель-алюмель
    ГОСТ Р 50431-92 (МЭК 584-1-77)
    End Notice Text

    Оглавление


    Формат файлов *.HLP

    Справочные файлы измерительных систем CRW-DAQ имеют структуру конфигурационных текстовых файлов с секционной структурой. Не надо путать их с HELP-файлами Windows. Данный формат был выбран из-за своей простоты, так как справка по измерительным системам в длительных экспериментах часто пишется или модифицируется прямо во время измерений.

    В секции с именем [HelpTopicList] должны быть перечислены справочные разделы в формате:
    HelpTopic = Имя справочного раздела
    В секциях типа [HelpTopic "Имя справочного раздела"] размещается собственно текст справочной информации по разделу "Имя справочного раздела".

    Пример справочного файла:

      [HelpTopicList]
      HelpTopic = Справка 1
      HelpTopic = Справка 2
      HelpTopic = Справка 3
      …
      [HelpTopic "Справка 1"]
      Содержание справочного раздела 1.
      …
      [HelpTopic "Справка 2"]
      Содержание справочного раздела 2.
      …
      [HelpTopic "Справка 3"]
      Содержание справочного раздела 3.
      …
      

    Оглавление


    Формат файлов *.DAT

    Файлы формата *.dat используются в пакете CRW-DAQ для записи данных в процессе длительных измерений. Это текстовые файлы с определенными именами, заголовком и таблицей Файлы не рекомендуется переименовывать, так как в имени файла зашифрована дата его создания. На каждые сутки заводится свой файл, при анализе данных за длительный срок данные из разных файлов сшиваются.

    Файлы имеют имя

      PPYYYYMMDD.DAT
      
      Например: DATA_20061225.DAT
                DATA_ - префикс
                2006  - год
                12    - месяц
                25    - число
      
    где В начале файла помещается заголовок - секция [CRW-DAQ DATA FILE]. В этой секции перечисляются кривые, сохраненные в файле. Далее вперемежку идут порции данных из кривых, помещенные в секции с именем кривой. В начале каждой порции указан формат @Format=.. из набора XY:ASCII, XY:HEX, XY:BASE64.

    Пример *.dat файла:

      [CRW-DAQ DATA FILE]
      CurveList=QMS_CH0,QMS_CH1,QMS_CH2,QMS_CH3,QMS_CH4,QMS_CH5,QMS_CH6,QMS_CH7
      [QMS_CH0]
      @Format=XY:BASE64
      gDOUBnbEzEKfphr7KLOOP4BMlAZ2xMxCpLsTBPK2jj+AZZQGdsTMQrbXzpW6uo4/
      gMmUBnbEzEJuQ94w2MmOP4DilAZ2xMxC9rnOa57Njj+A+5QGdsTMQmUNeS5k0Y4/
      gBPGBnbEzELjJz5IzY6SPw==
      [QMS_CH1]
      @Format=XY:BASE64
      gMmUBnbEzEJnZmZmZmaeP4DilAZ2xMxCNDMzMzMznz+AKpoGdsTMQjQzMzMzM58/
      AIKuBnbEzELNzMzMzMygPwCbrgZ2xMxCmpmZmZmZoT8AtrsGdsTMQpqZmZmZmaE/
      AM3OBnbEzEI0MzMzMzOjPw==
      [QMS_CH2]
      @Format=XY:BASE64
      AEmZBnbEzEI0MzMzMzOnPwBimQZ2xMxCAAAAAAAAqD8An6AGdsTMQgAAAAAAAKg/
      AJCwBnbEzEKamZmZmZmpPwCpsAZ2xMxCZ2ZmZmZmqj8AXbkGdsTMQmdmZmZmZqo/
      ...
      
    При вводе *.dat файлов через утилиту надо выделить в диалоге выбора файла нужные *.dat – файлы, выбрать единицы времени, время начала отсчета и отметить список кривых для ввода.
    Записанные *.dat файлы переименовывать надо осторожно, не нарушая даты в имени файла.

    См. также _datsave.pas - утилита сохранения в *.dat.

    Оглавление


    Формат файлов *.SPD

    Файлы *.spd используются для хранения спектрометрических данных. В простейшем случае файл *.spd содержит просто таблицу данных вида “канал энергия”. При этом калибровки полуширины и энергии берутся из файла конфигурации DAQ.
    В общем случае файл *.spd содержит таблицу данных вида “канал энергия”, помещенную в секцию [SpectrData], текст комментария в секции [SpectrNote], калибровку энергии в секции [Chan-En calibration], калибровку полуширины в секции [Chan-Hw calibration]. Все секции, кроме таблицы данных, необязательны. При чтении данных сначала делается попытка прочитать таблицу в секции [SpectrData]. Если такой секции в файле нет, то файл читается как простая таблица.

    Пример 1, простая таблица:
    00
    15
    27
    320
    ...
    1021100
    102296
    102381
    Пример 2, таблица с комментариями и калибровками:
    [SpectrData]
    00
    15
    27
    320
    ...
    1021100
    102296
    102381
    [SpectrNote]
    User information located there.
    [Chan-En calibration]
    FitMethod = Polynom
    TransformX = Line
    TransformY = Line
    Power = 1
    Center = 0
    Scale = 1
    Bounds = 0, 1024
    DataChanEnWeight
    001
    1024101
    End Data
    Notice Text
    Тестовая калибровка энергии
    End Notice Text
    [Chan-Hw calibration]
    FitMethod = Polynom
    TransformX = Line
    TransformY = Line
    Power = 1
    Center = 0
    Scale = 1
    Bounds = 0, 1024
    DataChanHwWeight
    041
    102451
    End Data
    Notice Text
    Тестовая калибровка полуширины
    End Notice Text

    Оглавление


    Формат файлов *.PIK

    Файлы формата *.pik используются для сохранения списка пиков при обработке спектров РФА. Эти файлы являются выходным форматом для процедур поиска и подгонки пиков и входным форматом для рентгеновского флюоресцентного анализа спектров.
    Это простой текстовый формат в виде таблицы с заголовком. Заголовок должен располагаться в первой строке файла и содержать следующие поля:
    Channel - канал, в котором находится пик
    Energy - энергия в КэВ, соответствующая каналу
    Amplitude - амплитуда пика
    FWHM - ширина на полувысоте в каналах (перевод в КэВ производится автоматически)
    Area - площадь пика
    Ground - фон под пиком
    LeftBound - левая граница
    LeftGround - фон на левой границе
    RightBound - правая граница
    RightGround - фон на правой границе
    В следующих строках находится текстовая таблица, в столбцах которой расположены перечисленные в заголовке параметры пиков.
    Channel Energy Amplitude FWHM   Area    Ground LeftBound LeftGround RightBound RightGround 
    151.0603.32031.1846.274208.24853.804142.00061.176-163.60745.184
    168.3243.69277.8498.296687.45842.422-151.73353.295-184.91634.778
    ...
    795.42017.19664.74613.272914.72446.117-768.87535.756843.00072.471

    Оглавление


    Формат файлов *.REP

    Файлы этого формата – текстовые файлы, содержимое которых является текстом отчета, который генерирует программа РФА (рентгенофлюоресцентный анализ) при элементном анализе спектров.

    Пример файла *.rep:

    Решение задачи определения концентраций 2002.04.13-00:06:26
    Источник: C:\Paslib\Crw32\Projects\#CRW32\DATA\3U2101.PIK
    Время вычислений: 0.08 секунд
    Реперный элемент: отсутствует.
    Концентрации определены в относительных единицах.
    Решение существует но не единственное!
    Их количество определяется выпуклой оболочкой 3 решений:
    Следующие элементы могут варьироваться.
    Ar0.000000.000003336.56625
    K242.65727242.657270.00000
    Ca565.21123565.21123586.73075
    Sc65.0430265.0430262.78278
    Ti66.7738566.7738567.00639
    Mn32.916010.000000.00000
    Fe1070.959201074.593051074.59305
    Co1.994721.572641.57264
    Gd0.0000067.2393867.23938
    Следующие элементы определяются однозначно:
    Cu20.15533
    Zn90.27911
    Ge9.64634
    As14.59289
    Kr8.49382
    Rb57.67352
    Zr7.59404
    Nb20.59925
    Mo26.94766
    Следующие элементы оказались нулевыми:
    Ga
    Pd
    Ag
    Cd
    In
    Sn
    Sb
    Te
    I
    Xe
    Ba
    La
    Eu
    Tb
    Dy
    Er
    Tm
    Hf
    Ta
    Re
    Ir
    Pt
    Au
    Pb
    U
    Следующие элементы не анализировались из-за отсутствия ненулевых линий:
    Ra
    Ac
    Pa

    А теперь сравнение пиков и решения по площади.
    Распределение площадей, решение 1 :
    NПикРешениеПроценты
    1208.2480208.2480100.0000
    2687.4580687.4580100.0000
    3182.1130182.1130100.0000
    4138.5030138.5030100.0000
    5125.6510125.6510100.0000
    65163.07705163.0770100.0000
    7726.4600726.4600100.0000
    8165.3500165.3500100.0000
    9879.8290879.8290100.0000
    10244.6950244.6950100.0000
    11205.5690205.5690100.0000
    12165.3390165.3390100.0000
    131250.26301250.2630100.0000
    14220.1120220.1120100.0000
    15651.6410651.6410100.0000
    16914.7240914.7240100.0000
    Общая площадь:
    11929.032011929.0320100.0000
    Распределение площадей, решение 2 :
    NПикРешениеПроценты
    1208.2480208.2480100.0000
    2687.4580687.4580100.0000
    3182.1130182.1130100.0000
    4138.5030138.5030100.0000
    5125.6510125.6510100.0000
    65163.07705163.0770100.0000
    7726.4600726.4600100.0000
    8165.3500165.3500100.0000
    9879.8290879.8290100.0000
    10244.6950244.6950100.0000
    11205.5690205.5690100.0000
    12165.3390165.3390100.0000
    131250.26301250.2630100.0000
    14220.1120220.1120100.0000
    15651.6410651.6410100.0000
    16914.7240914.7240100.0000
    Общая площадь:
    11929.032011929.0320100.0000
    Распределение площадей, решение 3 :
    NПикРешениеПроценты
    1208.2480208.2480100.0000
    2687.4580687.4580100.0000
    3182.1130182.1130100.0000
    4138.5030138.5030100.0000
    5125.6510125.6510100.0000
    65163.07705163.0770100.0000
    7726.4600726.4600100.0000
    8165.3500165.3500100.0000
    9879.8290879.8290100.0000
    10244.6950244.6950100.0000
    11205.5690205.5690100.0000
    12165.3390165.3390100.0000
    131250.26301250.2630100.0000
    14220.1120220.1120100.0000
    15651.6410651.6410100.0000
    16914.7240914.7240100.0000
    Общая площадь:
    11929.032011929.0320100.0000

    А теперь детальная раскладка площадей пиков по элементам.
    Пик 1 площадью 208.248 содержит:
    Ar0.0000.000208.248
    K208.248208.2480.000
    Пик 2 площадью 687.458 содержит:
    K25.21425.2140.000
    Ca662.244662.244687.458
    Пик 3 площадью 182.113 содержит:
    Ca86.90186.90190.209
    Sc95.21295.21291.904
    Пик 4 площадью 138.503 содержит:
    Sc12.61612.61612.177
    Ti125.887125.887126.326
    Пик 5 площадью 125.651 содержит:
    Mn125.6510.0000.000
    Gd0.000125.651125.651
    Пик 6 площадью 5163.077 содержит:
    Mn17.4590.0000.000
    Fe5145.6185163.0775163.077
    Пик 7 площадью 726.460 содержит:
    Fe714.995717.421717.421
    Co11.4659.0399.039
    Пик 8 площадью 165.350 содержит:
    Cu165.350
    Пик 9 площадью 879.829 содержит:
    Zn879.829
    Пик 10 площадью 244.695 содержит:
    Zn124.542
    Ce120.153
    Пик 11 площадью 205.569 содержит:
    As205.569
    Пик 12 площадью 165.339 содержит:
    Kr165.339
    Пик 13 площадью 1250.263 содержит:
    Rb1250.263
    Пик 14 площадью 220.112 содержит:
    Zr220.112
    Пик 15 площадью 651.641 содержит:
    Nb651.641
    Пик 16 площадью 914.724 содержит:
    Mo914.724

    Оглавление