Формат файлов RIFF - Resource Interchange File Format - это, скорее, не конкретный формат файлов, а принцип построения двоичных файлов со сложной структурой, достаточно свободно расширяемой по мере надобности и, в отличие от более сложных форматов потоковой модели объектов, как в Delphi, и допускающий простое формальное описание, а следовательно, более простую переносимость. Основой RIFF служит блочная (chunk) структура. Блок состоит из заголовка фиксированной структуры и данных, структура которых определяется заголовком. Заголовок содержит всего два поля:
Простые блоки и формы
Можно выделить два вида блоков:
| Signature | Size | Data |
<----------> <-------> <---------->
LongInt LongInt Size bytes
Массив данных рассматривается в общем случае как бесструктурный массив байтов.
Если программа чтения не распознает сигнатуру блока, блок должен быть пропущен.
Это правило позволяет расширять формат без потери работоспособности старых версий программ, которые ничего не знают о новых полях.
Интерпретация блока также зависит от того, в какую форму она входит (смотри далее).
| Signature | Size | Data |
<---------> <---------> <---------------------------------------->
LongInt LongInt Size bytes
| FormID | Chunk 1 | . . . . . . | Chunk N|
<------->
LongInt
Форма является блоком, на структуру данных которого наложены такие условия:
RIFF WAVE fmt data fact ...
Идентификатор формы 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 содержит родительскую форму RIFF CRWF, включающую в себя все остальные блоки и формы. Правило Size=(размер файла-8) считается обязательным и служит для восстановления данных после неудачной записи. Форма RIFF CRW содержит в себе список форм ITEM XXXX, где XXXX - тип объекта. Формы ITEM XXXX могут содержать внутренние формы ITEM YYYY и так далее. Родительская форма определяет контекст интерпретации блоков, например, блок name может означать имя окна или имя кривой в окне. Объекты основной формы RIFF CRWF - это окна:
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.
Формат *.crc-файла текстовый, с разбиением на секции.
В секции [Circuit] содержится описание основного поля изображения:
[Circuit]
GeneralMap = ..\Bitmaps\demo_ctrl.bmp
Hint = Контрольная панель DEMO
ToolBarHeight = 0
StartupScript = [Circuit.StartupScript]
[]
[ConfigFileList] ; Включить стандартную инициализацию
ConfigFile = ~~\Resource\DaqSite\Default\Painter.crc
[]
[Circuit.StartupScript] ; Добавить свою инициализацию переменных
alarm1=100
alarm2=200
[]
[SensorList]
Sensor = Demo
[Demo]
Pos = 10, 10
LED = 7, 0, 3, %7.3f, [LedFont]
TagEval(v) = gt(v,alarm1)+gt(v,alarm2) ; Formula for ground picture
Tag#1 = 0, ..\BITMAPS\LED07L.BMP ; Lime ground if v < alarm1
Tag#2 = 1, ..\BITMAPS\LED07Y.BMP ; Yellow ground if v > alarm1
Tag#3 = 2, ..\BITMAPS\LED07R.BMP ; Red ground if v > alarm2
[]
В секции [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] содержится описание сенсора через такие переменные:
Sensor Painter routines
sensorwidth() - get sensor width
sensorheight() - get sensor height
setcursor(x,y) - set text cursor position
setpen(pencolor,penstyle,penmode,penwidth) - set pen style to draw lines
setbrush(brushcolor,brushstyle) - set brush style to fill bars
drawpoint(x1,y1,pointcolor,pointstyle) - draw a point with given marker
drawline(x1,y1,x2,y2) - draw a line with current pen
drawarrow(x1,y1,x2,y2,d1,d2) - draw a line with arraw ends d1,d2
drawbar(x1,y1,x2,y2) - draw a bar (filled rectangle)
drawellipse(x1,y1,x2,y2) - draw a filled ellipse
drawpie(x1,y1,x2,y2,x3,y3,x4,y4) - draw a filled ellipse pie
@print msg - draw a text (msg) at cursor
@textwidth msg - return text width
@textheight msg - return text height
@font charset/color/height/name/pitch/style value - assign value to font property like @font name PT Mono
where:
color=[R,G,B]=[clBlack,clMaroon,clGreen,clOlive,clNavy,clPurple,clTeal,clGray,clSilver,clRed,clLime,clYellow,
clBlue,clFuchsia,clAqua,clLtGray,clDkGray,clWhite]
penstyle=[0..6]=[psSolid,psDash,psDot,psDashDot,psDashDotDot,psClear,psInsideFrame]
penmode=[0..15]=[pmBlack,pmWhite,pmNop,pmNot,pmCopy,pmNotCopy,pmMergePenNot,pmMaskPenNot,pmMergeNotPen,
pmMaskNotPen,pmMerge,pmNotMerge,pmMask,pmNotMask,pmXor,pmNotXor]
penwidth=line width
barcolor=color of bar filling
barstyle=[0..7]=[bsSolid,bsClear,bsHorizontal,bsVertical,bsFDiagonal,bsBDiagonal,bsCross,bsDiagCross]
charset=[ANSI_CHARSET, DEFAULT_CHARSET, SYMBOL_CHARSET, MAC_CHARSET, SHIFTJIS_CHARSET, HANGEUL_CHARSET,
JOHAB_CHARSET, GB2312_CHARSET, CHINESEBIG5_CHARSET, GREEK_CHARSET, TURKISH_CHARSET, HEBREW_CHARSET,
ARABIC_CHARSET, BALTIC_CHARSET, RUSSIAN_CHARSET, THAI_CHARSET, EASTEUROPE_CHARSET, OEM_CHARSET]
font style=[0..15]=4 bits [fsBold,fsItalic,fsUnderline,fsStrikeOut]
font pitch=[0..2]=[fpDefault,fpVariable,fpFixed]
Более подробное описание и примеры можно найти в демо конфигурации DEMO_PAINT,
см. также её описание DemoPaint.htm.
' 123.456'Этот формат используется для отображения величин, которые меняются в заранее известном интервале. Если величина может меняться на много порядков, лучше использовать научный или свободный формат, так как при использовании формата с фиксированной точкой возможна потеря точности при отображении числа (если число очень мало), либо переполнение строки (если число очень велико).
'1.234E+02'Этот формат используется для отображения величин, которые меняются в заранее неизвестном или очень широком интервале. При этом всегда отображается экспонента (порядок) числа после символа E, даже если он не нужен. Если величина может меняться на много порядков, но чаще всего имеет небольшой порядок, лучше использовать свободный формат.
[DefaultCircuitFont]
CharSet = RUSSIAN ; кодировка фонта RUSSIAN_CHARSET=204
Color = Black ; цвет фонта
Height = -13 ; высота фонта, px
Size = 10 ; или размер фонта, pt
Name = PT Mono ; название фонта
Pitch = Fixed ; ширина символов фонта Default/Fixed/Variable
Style = [Bold] ; [Bold, Italic, Underline, StrikeOut]
[]
Если описание фонта заключено в квадратные скобки [...], то это описание интерпретируется
как ссылка на секцию с описанием используемого для отображения фонта.
Ссылка содержит имя секции, обязательно в квадратных скобках, в которой описан фонт.
Описание фонта имеет такой вид:
...
LED = 7, 3, 0, %7.3g, [LedFont]
...
[LedFont] ; описание фонта
CharSet = 204 ; кодировка фонта, обычно RUSSIAN_CHARSET=204
Color = $000000 ; цвет фонта, код RGB $GGBBRR или имя цвета
Height = -13 ; высота фонта
Name = Fixedsys ; название фонта
Pitch = Fixed ; ширина символов фонта Default/Fixed/Variable
Style = [] ; [Bold, Italic, Underline, StrikeOut]
[]
Обратите внимание, что высота фонта указывается отрицательная (таковы соглашения Delphi).
В описании фонтов можно использовать размеры шрифтов (Size) в пунктах (pt) вместо базовой высоты шрифтов (Height) в пикселях (px). Обратите внимание, что размер задается положительным числом, а высота - отрицательным (такие договоренности в Delphi, почему - не знаю). Например:
[StandardFont]
CharSet = RUSSIAN ; кодировка фонта ANSI=0,DEFAULT=1,RUSSIAN=204,OEM=255
Color = Black ; цвет фонта
Size = 10 ; размер фонта 10 pt
; Height = -13 ; соответствует базовой высоте фонта -13 px
Name = PT Mono ; название фонта
Pitch = Fixed ; ширина символов фонта Default/Fixed/Variable
Style = [] ; [Bold, Italic, Underline, StrikeOut]
[]
Зависимость высоты и размера фонта дается формулами:
Height = - ( Size * PPI / 72 )
Size = - ( Height * 72 / PPI )
PPI = Pixels Per Inch - вертикальное разрешение экрана, пиксель на дюйм.
В пакете всегда используется стандартное разрешение = 96 PPI.
Название Height ("базовая высота шрифта") не должно обманывать - реальная высота текста
отличается от базовой. Например, для фонта PT_Mono с высотой -13 реальная высота
текста будет 15 px. Таким образом, базовая высота шрифта задает некоторую характерную
величину размера большинства символов, которая несколько меньше реальной высоты текста.
Увеличение реальной высоты шрифта получается за счет вертикальных "пробелов" между символами
и "хвостиков", которые есть у некоторых символов.
В описании фонтов можно использовать имена цветов и имена кодовых страниц вместо их кодов.
Например:
[StandardFont]
CharSet = RUSSIAN ; кодировка фонта ANSI=0,DEFAULT=1,RUSSIAN=204,OEM=255
Color = Black ; цвет фонта
Height = -13 ; высота фонта
Name = PT Mono ; название фонта
Pitch = Fixed ; ширина символов фонта Default/Fixed/Variable
Style = [] ; [Bold, Italic, Underline, StrikeOut]
[]
Таблица допустимых имен цветов - такая же как используется в Painter(v),
см. тут, только без префикса cl.
LED = 7, 3, 0, %7.3g, Charset:Russian\Color:Black\Size:10\Name:PT_Mono\Pitch:Fixed\Style:[]\
Строка описания фонта интерпретируется следующим образом:
[StandardFont]
CharSet = RUSSIAN ; кодировка фонта ANSI=0,DEFAULT=1,RUSSIAN=204,OEM=255
Color = Black ; цвет фонта
Height = -13 ; высота фонта
Name = PT Mono ; название фонта
Pitch = Fixed ; ширина символов фонта Default/Fixed/Variable
Style = [] ; [Bold, Italic, Underline, StrikeOut]
[]
Это эквивалентно строке описания:
CharSet:RUSSIAN\Color:Black\Height:-13\Name:PT_Mono\Pitch:Fixed\Style:[]\
LED = 7, 3, 0, %7.3g, Size:16\Style:[Bold]\ - сокращенное описание фонта
В режиме логического индикатора (когда LED=0) таблица тегов используется для отображения графических элементов в виде картинок. При этом таблица должна быть согласована с основным файлом конфигурации в том смысле, что таблица тегов-картинок должна перекрывать все возможные значения ассоциированной кривой/тега.
В режиме числового поля таблица может (и должна) состоять из одного элемента, служащего фоном для отображаемой надписи. При этом значение параметра Tag должно присутствовать в таблице.
Пример файла описания мнемосхемы:
;***
;*** Основное поле мнемосхемы:
;*** Задается основное изображение 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]
[]
[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" - Параметр в кавычках
x'=fx(x,z), x=f-1x(x',z)обладающих тем свойством, что в 'линеаризованных' переменных {x’,y’} величина y’ не зависит от параметра z, а зависимость y'(x') является гладкой функцией, и следовательно, может быть достаточно точно описана полиномом y'=p(x'), где p(x)= a+bx+cx2+… ‘Линеаризующие’ функции заданы аналитически и зависят от типа калибруемых данных, а коэффициенты полинома подгоняются по МНК (методу наименьших квадратов) с весовыми множителями w. Это значит, что коэффициенты {a,b,c…} полинома y’=p(x’) минимизируют взвешенную сумму квадратов отклонений
y'=fy(y,z), y=f-1y(y',z)
измеренных значений y’i от теоретических p(x’i),
полученных в калибровочном измерении. В качестве веса wi i-го измерения берется, например, обратная дисперсия измерения.
Поиск коэффициентов полинома – стандартная задача МНК, решение которой не представляет проблемы и описано в учебниках по статистике.
Таким образом, в общем случае зависимость имеет вид
y= f-1y(p(fx(x,z)),z),
а подгонка полинома p(x) идет в линеаризованных переменных x',y' с весами w. Конечно, зависимость от параметра z, а также ‘линеаризующее’ преобразование необязательны. Проиллюстрируем сказанное тремя примерами.
| Тип шкалы | Комментарий. Источник данных, стандарт. | “Линеаризующие” преобразования 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 ом, DIN43760 | x'=F(x), x=F-1(x'), F(x)-таблица сопротивление-температура |
| SiDiodeD | кремниевый термодиод, тип D данные фирмы-изготовителя | x'=F(x), x=F-1(x'), F(x)-таблица напряжение-температура |


| Data | xname | yname | Weight | zname |  Заголовок данных зависит от xname,yname,zname |
| -6.458 |  -270 |  1 | 0 | ||
| 0 |  0 |  1 | 0 | ||
| 54.875 |  1372 |  1 | 0 |
делаются для повышения точности и устойчивости решения МНК-полинома, так как при плохом выборе масштаба и центра полинома МНК-система может быть плохо обусловлена.
В секции с именем [HelpTopicList] должны быть перечислены справочные разделы в формате:
HelpTopic = Имя справочного раздела
В секциях типа [HelpTopic "Имя справочного раздела"] размещается собственно текст справочной информации по разделу
"Имя справочного раздела".
Пример справочного файла:
[HelpTopicList] HelpTopic = Справка 1 HelpTopic = Справка 2 HelpTopic = Справка 3 … [HelpTopic "Справка 1"] Содержание справочного раздела 1. … [HelpTopic "Справка 2"] Содержание справочного раздела 2. … [HelpTopic "Справка 3"] Содержание справочного раздела 3. …
Файлы имеют имя
PPYYYYMMDD.DAT
Например: DATA_20061225.DAT
DATA_ - префикс
2006 - год
12 - месяц
25 - число
где
Пример *.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 – файлы, выбрать единицы времени, время начала отсчета
и отметить список кривых для ввода.См. также _datsave.pas - утилита сохранения в *.dat.
| 0 | 0 |
| 1 | 5 |
| 2 | 7 |
| 3 | 20 |
| ... | |
| 1021 | 100 |
| 1022 | 96 |
| 1023 | 81 |
| 0 | 0 |
| 1 | 5 |
| 2 | 7 |
| 3 | 20 |
| ... | |
| 1021 | 100 |
| 1022 | 96 |
| 1023 | 81 |
| Data | Chan | En | Weight |
| 0 | 0 | 1 | |
| 1024 | 10 | 1 |
| Data | Chan | Hw | Weight |
| 0 | 4 | 1 | |
| 1024 | 5 | 1 |
| Channel  | Energy  | Amplitude  | FWHM    | Area     | Ground  | LeftBound  | LeftGround  | RightBound  | RightGround  |
| 151.060 | 3.320 | 31.184 | 6.274 | 208.248 | 53.804 | 142.000 | 61.176 | -163.607 | 45.184 |
| 168.324 | 3.692 | 77.849 | 8.296 | 687.458 | 42.422 | -151.733 | 53.295 | -184.916 | 34.778 |
| ... | |||||||||
| 795.420 | 17.196 | 64.746 | 13.272 | 914.724 | 46.117 | -768.875 | 35.756 | 843.000 | 72.471 |
| Ar | 0.00000 | 0.00000 | 3336.56625 |
| K | 242.65727 | 242.65727 | 0.00000 |
| Ca | 565.21123 | 565.21123 | 586.73075 |
| Sc | 65.04302 | 65.04302 | 62.78278 |
| Ti | 66.77385 | 66.77385 | 67.00639 |
| Mn | 32.91601 | 0.00000 | 0.00000 |
| Fe | 1070.95920 | 1074.59305 | 1074.59305 |
| Co | 1.99472 | 1.57264 | 1.57264 |
| Gd | 0.00000 | 67.23938 | 67.23938 |
| Cu | 20.15533 |
| Zn | 90.27911 |
| Ge | 9.64634 |
| As | 14.59289 |
| Kr | 8.49382 |
| Rb | 57.67352 |
| Zr | 7.59404 |
| Nb | 20.59925 |
| Mo | 26.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 |
| N | Пик | Решение | Проценты |
| 1 | 208.2480 | 208.2480 | 100.0000 |
| 2 | 687.4580 | 687.4580 | 100.0000 |
| 3 | 182.1130 | 182.1130 | 100.0000 |
| 4 | 138.5030 | 138.5030 | 100.0000 |
| 5 | 125.6510 | 125.6510 | 100.0000 |
| 6 | 5163.0770 | 5163.0770 | 100.0000 |
| 7 | 726.4600 | 726.4600 | 100.0000 |
| 8 | 165.3500 | 165.3500 | 100.0000 |
| 9 | 879.8290 | 879.8290 | 100.0000 |
| 10 | 244.6950 | 244.6950 | 100.0000 |
| 11 | 205.5690 | 205.5690 | 100.0000 |
| 12 | 165.3390 | 165.3390 | 100.0000 |
| 13 | 1250.2630 | 1250.2630 | 100.0000 |
| 14 | 220.1120 | 220.1120 | 100.0000 |
| 15 | 651.6410 | 651.6410 | 100.0000 |
| 16 | 914.7240 | 914.7240 | 100.0000 |
| 11929.0320 | 11929.0320 | 100.0000 |
| N | Пик | Решение | Проценты |
| 1 | 208.2480 | 208.2480 | 100.0000 |
| 2 | 687.4580 | 687.4580 | 100.0000 |
| 3 | 182.1130 | 182.1130 | 100.0000 |
| 4 | 138.5030 | 138.5030 | 100.0000 |
| 5 | 125.6510 | 125.6510 | 100.0000 |
| 6 | 5163.0770 | 5163.0770 | 100.0000 |
| 7 | 726.4600 | 726.4600 | 100.0000 |
| 8 | 165.3500 | 165.3500 | 100.0000 |
| 9 | 879.8290 | 879.8290 | 100.0000 |
| 10 | 244.6950 | 244.6950 | 100.0000 |
| 11 | 205.5690 | 205.5690 | 100.0000 |
| 12 | 165.3390 | 165.3390 | 100.0000 |
| 13 | 1250.2630 | 1250.2630 | 100.0000 |
| 14 | 220.1120 | 220.1120 | 100.0000 |
| 15 | 651.6410 | 651.6410 | 100.0000 |
| 16 | 914.7240 | 914.7240 | 100.0000 |
| 11929.0320 | 11929.0320 | 100.0000 |
| N | Пик | Решение | Проценты |
| 1 | 208.2480 | 208.2480 | 100.0000 |
| 2 | 687.4580 | 687.4580 | 100.0000 |
| 3 | 182.1130 | 182.1130 | 100.0000 |
| 4 | 138.5030 | 138.5030 | 100.0000 |
| 5 | 125.6510 | 125.6510 | 100.0000 |
| 6 | 5163.0770 | 5163.0770 | 100.0000 |
| 7 | 726.4600 | 726.4600 | 100.0000 |
| 8 | 165.3500 | 165.3500 | 100.0000 |
| 9 | 879.8290 | 879.8290 | 100.0000 |
| 10 | 244.6950 | 244.6950 | 100.0000 |
| 11 | 205.5690 | 205.5690 | 100.0000 |
| 12 | 165.3390 | 165.3390 | 100.0000 |
| 13 | 1250.2630 | 1250.2630 | 100.0000 |
| 14 | 220.1120 | 220.1120 | 100.0000 |
| 15 | 651.6410 | 651.6410 | 100.0000 |
| 16 | 914.7240 | 914.7240 | 100.0000 |
| 11929.0320 | 11929.0320 | 100.0000 |
| Ar | 0.000 | 0.000 | 208.248 |
| K | 208.248 | 208.248 | 0.000 |
| K | 25.214 | 25.214 | 0.000 |
| Ca | 662.244 | 662.244 | 687.458 |
| Ca | 86.901 | 86.901 | 90.209 |
| Sc | 95.212 | 95.212 | 91.904 |
| Sc | 12.616 | 12.616 | 12.177 |
| Ti | 125.887 | 125.887 | 126.326 |
| Mn | 125.651 | 0.000 | 0.000 |
| Gd | 0.000 | 125.651 | 125.651 |
| Mn | 17.459 | 0.000 | 0.000 |
| Fe | 5145.618 | 5163.077 | 5163.077 |
| Fe | 714.995 | 717.421 | 717.421 |
| Co | 11.465 | 9.039 | 9.039 |
| Cu | 165.350 |
| Zn | 879.829 |
| Zn | 124.542 |
| Ce | 120.153 |
| As | 205.569 |
| Kr | 165.339 |
| Rb | 1250.263 |
| Zr | 220.112 |
| Nb | 651.641 |
| Mo | 914.724 |