::обозначения::

Byte      байт
Word      слово - сташий байт, младший байт
String    строка, последовательность символов до терминального 0x00
String[7] последовательность из 7 строк
ByteZone  байт, разделитель зон 0xAA
...       произвольное повторение предыдущей конструкции
??        поле зарезервировано или под вопросом


----------------------------------------------------------------------------------------------------------------
Назначение записи                 Тип    | смещение Тип  Примечание 
                                  записи |        
- - - - - - - - - - - - - - - - - - - - -| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    DescLen                              |  0x00   :Word длина дескриптора (в байтах) (без учета исполняемого кода)
                                         |
    FVersion                             |  0x02   :Word версия дескриптора = 0x0002
                                         |
                                         |               Таблица содержания дескриптора
                                         |
запись MODBUS                   = нет    |  0x04   :Word абсолютный адрес зоны MODBUS
                                         |        
запись измерения                = 0x01   |  0x06   :Word абсолютный адрес зоны измерения
запись видимое измерение          0x03   |
                                         |
запись        "Дискретный вход" = 0x11   |  0x08   :Word абсолютный адрес записи Дискретный вход
запись        "Реле"            = 0x12   |  0x0a   :Word абсолютный адрес записи Реле
запись        "Светодиод"       = 0x13   |  0x0c   :Word абсолютный адрес записи Светодиод
запись        "Виртульный вход" = 0x14   |  0x0e   :Word абсолютный адрес записи Виртульный вход
запись        "Виртульный выход"= 0x15   |  0x10   :Word абсолютный адрес записи Виртульный выход
запись продолжения параметра    = 0x10   |  
                                         |
запись перечисляемого параметра = 0x21   |  0x12   :Word абсолютный адрес зоны параметров
запись числового параметра      = 0x22   |        
--запись двойного числового     = 0x23   |        
запись строкового параметра     = 0x24   |        
запись числового параметра(prim)= 0x26   |        
запись числового параметра(sec) = 0x27   |        
                                         |        
запись уставка перечисляемая    = 0x31   |  0x14   :Word абсолютный адрес зоны уставок
запись уставка числовая         = 0x32   |        
                                         |        
запись "измерение события"      = 0x41   |  0x16   :Word абсолютный адрес зоны измерений и битовых регистров событий
запись "регистр modbus события" = 0x42   |          уточнение: адрес первой записи измерений и битовых регистров событий
                                         |
запись "событие"                = 0x43   |  0x18   :Word абсолютный адрес зоны событий (аварий)
запись "авария"                 = 0x44   |        
                                         |        
запись осциллограммы измерения  = 0x51   |  0x1a   :Word абсолютный адрес зоны осциллограмм
запись осциллограммы дискр.сигн.= 0x52   |  
                                         |        
запись "промежуточный узел"     = 0x61   |  0x1c   :Word абсолютный адрес зоны меню
запись "оконечный узел"         = 0x62   |        
                                         |        
запись "системное событие"      = 0x71   |  0x1e   :Word абсолютный адрес зоны системных событий
                                         |        
запись активный modbus (прием)  = 0x81   |  0x20   :Word абсолютный адрес зоны активный modbus (прием)
       для дискретных сигналов           |        
запись активный modbus (прием)  = 0x82   |        
       для регистров                     |        
                                         |
запись активный modbus(передача)= 0x83   |  0x22   :Word абсолютный адрес зоны активный modbus (передача)
       для дискретных сигналов           |        
запись активный modbus(передача)= 0x84   |        
       для регистров                     |        
                                         |
                                         |  0x24   :Word абсолютный адрес исполняемого кода
                                         |
зона SPECIAL-EEPROM                      |  0x26   :Word абсолютный адрес зоны SPECIAL-EEPROM
адрес таблицы констант                   |  0x28   :Word
адрес таблицы калибровок                 |  0x2a   :Word
hashcode                                 |  0x2c   :DWord
                                         |  0x30
----------------------------------------------------------------------------------------------------------------

позиция 0x0030

Зона MODBUS
-----------
фиксированная область

размер такой, как в списке идентификаторов

размещается сразу после заголовков

содержит прямые ссылки на записи дескриптора для каждого регистра modbus или ссылку на пустую запись, 
если регистр modbus не определен



позиция 0x0830

Фиксированная область сразу за зоной MODBUS:

смещение  bb bb bb bb   описание
-------------------------------------------
0x0830    tt aa         пустая запись
0x0832    dd mm yy yy   дата ядра (2-10 код)
0x0836    dd mm yy yy   дата дескриптора (2-10 код)
0x083a    rr rr rr rr   контрольная сумма файла идентификаторов
0x083e    mm mm         адрес узла меню ($62) тип параметра==$1d (время) младшим байтом вперед



пустая запись (описание)

    FType                   :Byte      пустая запись = 0x00
    Код доступа             :Byte      нет доступа   = 0x00



позиция 0x0840

Зона измерений
--------------

    FType                   :Byte      запись измерения = 0x01 
                                                видимое = 0000 ..11
                                     дополнительный код = 0000 .1.1
                                       признак смещения = 0000 1..1
    Код доступа             :Byte
    адрес SRAM              :Word
--    адрес EEPROM            :Word      (не использ)
    FPrimVal                :Word      ******** адрес первичного значения (SRAM)
    FPrimValMult            :Byte      ******** порядок 10 (0,1,2,3)
    FSecVal                 :Word      ******** адрес вторичного значения (SRAM)
    FSecValDiv              :Byte      ******** порядок 10 (0,1,2,3)
--    FCCAddr                 :Word      адрес (SRAM) калибр.коэффициента (для монитора) (сдвиг в градусах 0..359)
    FOffset                 :Word      смещение (если задан признак смещения)
    FShortName              :String    (в кодировке прибора)
    FName                   :String

    ...                                другие записи измерений


    ByteZone                :Byte      разделитель зон


примечание
----------
  для целей калибровки в конец зоны добавляются невидимые угловые измерения для прямых измерений

Зона параметров
---------------

    FParamVarAddr           :Word      общая часть
    FParamVarSize           :Word
    FParamValAddr           :Word
    FParamValSize           :Word

    FDDOUstav1              :Word      группа уставок 1 
    FDDOUstav2              :Word      группа уставок 2 

    FType                   :Byte      запись продолжения (многословного) параметра = 0x10
    Код доступа             :Byte
    адрес SRAM              :Word
    адрес EEPROM            :Word

    FType                   :Byte      запись битового регистра "Дискретный вход" = 0x11
    Код доступа             :Byte                               "Реле"            = 0x12
    адрес SRAM              :Word                               "Светодиод"       = 0x13
    адрес EEPROM            :Word      (не использ)             "Виртульный вход" = 0x14
--    FParamStatus            :Byte                             "Виртульный выход"= 0x15
    FNameList.Count         :Byte
    FShortNameList          :String,...
    FNameList               :String,...

    FType                   :Byte      запись типа "дата" = 0x1d
    Код доступа             :Byte
    адрес SRAM              :Word

    FType                   :Byte      запись типа "статус" = 0x1e
    Код доступа             :Byte
    адрес SRAM              :Word

    FType                   :Byte      запись перечисляемого параметра = 0x21
    Код доступа             :Byte
    адрес SRAM              :Word
    адрес EEPROM            :Word
--    FParamStatus            :Byte
    FNameList.Count         :Byte
    FShortName              :String
    FShortNameList          :String,...
    FName                   :String
    FNameList               :String,...

    FType                   :Byte      запись числового параметра = 0x22
    Код доступа             :Byte                                   0x26 первичное значение
    адрес SRAM              :Word                                   0x27 вторичное значение
    адрес EEPROM            :Word
--    FParamStatus            :Byte
    FKoef                   :Byte      ******** порядок 10 (0,1,2,3)
    FValMin                 :Word
    FValMax                 :Word
    FShortName              :String
    FName                   :String

    FType                   :Byte      запись строкового параметра = 0x24
    Код доступа             :Byte
    адрес SRAM              :Word
    адрес EEPROM            :Word
--    FParamStatus            :Byte
    FSize                   :Byte      длина в словах
    FPasswdChar             :Byte      0x00 строки, '*' пароли
    FShortName              :String
    FName                   :String

    ...                                другие записи параметров

    ByteZone                :Byte      разделитель зон

Зона уставок
------------

    Count                   :Byte      количество уровней
    FUstavLevel             :String[Count] список уровней

    FType                   :Byte      запись уставка перечисляемая 1й группы = 0x31
    Код доступа             :Byte                     битовая       1й группы = 0x35
    адрес SRAM              :Word      
    адрес EEPROM            :Word
    FNameList.Count         :Byte
    FShortName              :String
    FShortNameList          :String,...
    FName                   :String
    FNameList               :String,...
    FLevel                  :Byte      ************** номер уровня

    FType                   :Byte      запись уставка      числовая 1й группы = 0x32
    Код доступа             :Byte
    адрес SRAM              :Word      
    адрес EEPROM            :Word
    FMeasureAddr            :Word      ******** адрес записи измерения
    FRawValMin              :Word
    FRawValMax              :Word
    FShortName              :String
    FName                   :String
    FLevel                  :Byte      ************** номер уровня

    FType                   :Byte      запись уставка перечисляемая 2й группы = 0x33
    Код доступа             :Byte                     битовая       2й группы = 0x36
    адрес SRAM              :Word      
    адрес EEPROM            :Word

    FType                   :Byte      запись уставка      числовая 2й группы = 0x34
    Код доступа             :Byte
    адрес SRAM              :Word      
    адрес EEPROM            :Word

    ...                                другие уставки

    ByteZone                :Byte      разделитель зон

Зона измерений и битовых регистров событий
------------------------------------------
                                       общая часть
    Count                   :Byte      количество уровней
    FEventLevel             :String[Count] 

--    FEventCodeOffset        :Byte      ???
--    FEventFrontOffset       :Byte      ???
--    FEventTimeOffset        :Byte      ???

    FType                   :Byte      запись измерения события = 0x41
--    FMeasureOff             :Byte      смещение в буфере измерений
    FMeasureAddr            :Word      адрес SRAM измерения
    FShortNameAddr          :Word      адрес наименования измерения
--    FFlag                   :Byte      флаг
--                                       .... ...1 событие (==1)
--                                       .... ..1. авария

    FType                   :Byte      запись регистр modbus события = 0x42
    FBitRegAddr             :Word      адрес SRAM битового регистра
--    FFlag                   :Byte      флаг
--                                       .... ...1 событие
--                                       .... ..1. авария

    ...                                другие измерения и регистры modbus

    ByteZone                :Byte      разделитель зон

Зона событий и аварий
---------------------

    FType                   :Byte      запись события = 0x43
    FCode                   :Byte              аварии = 0x44
    FLevel                  :Byte
    FName                   :String    в кодировке контроллера
    
    ...                                другие события и аварии
    
    ByteZone                :Byte      разделитель зон


Зона осциллограмм
-----------------

    FType                   :Byte      запись осциллограммы измерения = 0х51 (цикличность=1)
    FMeasureOff             :Byte      смещение в массиве отсчетов измерений (в байтах)
    FMeasureAddr            :Word      адрес SRAM измерения
--    цикличность сохранения  :Byte      сохранение значений в файле осц (изменить чтение осц)


    FType                   :Byte      запись осциллограммы дискр сигналы = 0х52 (цикличность=18)
    FMeasureBitReg          :Word      адрес SRAM дискр сигналаа

    ...                                другие записи осциллограмм

    ByteZone                :Byte      разделитель зон




Зона меню индикатора
--------------------

    1 байт   тип = 0x61                запись "промежуточный узел"   -- корневой узел уставок 0x68 - 1 группа
??  2 байта  ссылка на parent узел                                   --                       0x69 - 2 группа
    2 байта  ссылка на предыдущий sibling узел 
    2 байта  ссылка на следующий sibling узел 
    2 байта  ссылка на 1й child узел 
    N байт   текстовая строка, в конце 0
             тип записи может быть изменен путем внесения в текст кода вида "($55)" - породит тип 0x55

    1 байт   тип = 0x62                запись "оконечный узел"
??  2 байта  ссылка на parent узел
    2 байта  ссылка на предыдущий sibling узел 
    2 байта  ссылка на следующий sibling узел 
    2 байта  адрес записи дескриптора

?-    1 байт   тип = 0x6A                запись "оконечный узел битовой уставки"
?-??  2 байта  ссылка на parent узел
?-    2 байта  ссылка на предыдущий sibling узел 
?-    2 байта  ссылка на следующий sibling узел 
?-    2 байта  адрес записи дескриптора
?-    2 байта  адрес наименования бита
?-    2 байта  маска бита

--    1 байт   тип = 0x63                запись "событие"
--??  2 байта  ссылка на parent узел
--    2 байта  ссылка на предыдущий sibling узел 
--    2 байта  ссылка на следующий sibling узел 
--    2 байта  ссылка на 1й child узел - всегда на первое измерение (отдельная ветка)
--    1 байт   код события
--    N байт   текстовая строка, в конце 0

    1 байт   тип = 0x63                запись "событие"
??  2 байта  ссылка на parent узел
--    2 байта  ссылка на предыдущий sibling узел 
--    2 байта  ссылка на следующий sibling узел 
    2 байта  ссылка на 1й child узел - всегда на первое измерение (отдельная ветка)
    1 байт   количество событий
             массив событий:
    1 байт   код события
    2 байт   адрес наименования события

    1 байт   тип = 0x64                запись "авария"
??  2 байта  ссылка на parent узел
    2 байта  ссылка на предыдущий sibling узел 
    2 байта  ссылка на следующий sibling узел 
    2 байта  ссылка на 1й child узел - всегда на первое измерение (отдельная ветка)
    N байт   текстовая строка, в конце 0

    1 байт   тип = 0x65                запись "измерение собітий" (отдельная ветка)
??  2 байта  ссылка на parent узел
    2 байта  ссылка на предыдущий sibling узел 
    2 байта  ссылка на следующий sibling узел 
    2 байта  адрес записи дескриптора

    ...                                другие записи

    ByteZone                :Byte      разделитель зон

Зона системные события НЕ ИСПОЛЬЗУЕТСЯ
----------------------

    1 байт   тип = 0x71                запись "системное событие"
    1 байт   вид события - кнопка, таймер, ...
    1 байт   номер
--    1 байт   контекст
--                1 навигация 
--                2 редактирование
    1 байт   реакция 
                1 навигация по дереву вправо
                2 навигация по дереву влево
                3 навигация по дереву вниз
                4 навигация по дереву вверх
                5 прокручивание вправо
                6 прокручивание влево
               10 фиксированный переход (для таймера)
               11 программируемый переход
               12 редактирование
               13 программирование перехода
    2 байта  адрес перехода

    ...                                другие записи

    ByteZone                :Byte      разделитель зон



Зона активный modbus     порядок записей: 0x81 0x82 0x83 0x84
--------------------

    FType                   :Byte      запись активный modbus = 0x81        примечание:
    адрес подчиненного устр :Byte      для дискретных сигналов              нормализованные маски совпадают
    адрес регистра подч.устр:Word               (прием)                     
    маска регистра подч.устр:Word
    адрес регистра устр     :Word
    маска регистра устр     :Word
    значение по умолч       :Word
    ...                                другие записи


    FType                   :Byte      запись активный modbus = 0x82
    адрес подчиненного устр :Byte      для регистров
    адрес регистра подч.устр:Word               (прием)
    адрес регистра устр     :Word
    значение по умолч       :Word
    ...                                другие записи


    FType                   :Byte      запись активный modbus = 0x83
    адрес подчиненного устр :Byte      для дискретных сигналов
    адрес регистра подч.устр:Word               (передача)
    маска регистра подч.устр:Word
    адрес регистра устр     :Word
    маска регистра устр     :Word
    ...                                другие записи


    FType                   :Byte      запись активный modbus = 0x84
    адрес подчиненного устр :Byte      для регистров
    адрес регистра подч.устр:Word               (передача)
    адрес регистра устр     :Word
    ...                                другие записи

    ByteZone                :Byte      разделитель зон
    ByteZone                :Byte      разделитель зон


Зона SPECIAL-EEPROM
--------------------
                                       записи фиксированной длині

    1 байт                  :Byte      количество записей

                                       структура записи
    1 байт                  :Byte      количество байт для копирования
    2 байта                 :Word      адрес EEPROM
    2 байта                 :Word      адрес SRAM

    ...                                другие записи


Зона исполняемый код
--------------------

начало зоны выравнивается на границу слова дополнительным разделителем зон

-- дополнительно выравнивается на границу полуфрейма (128) для упрощения переноса в контроллере

--    длина зоны              :Word
    область кода            :Word      количество слов = длина зоны



                                                    
                                                    
                                                    *  *  *




Структура файла событий
-----------------------

1. Файл событий содержит 256 последних событий устрйства

2. Если событий в устройстве менее 256 -- в записи нули

3. Файл событий передается записями, одна запись содержит одно событие

4a. Структура запроса

   b       номер устройства
   b       команда чтение файла = $1с
   b       номер файла = $80
   b       номер записи (старший байт)
   b       номер записи (младший байт)
   b       контрольная сумма (старший байт)
   b       контрольная сумма (младший байт)

4b. Структура ответа

   b       номер устройства
   b       команда чтение файла = $1с
   b       номер файла = $80
   b       номер записи (старший байт)
   b       номер записи (младший байт)
   b       год   (двоично-десятичное две последние цифры)
   b       месяц (двоично-десятичное)
   b       день  (двоично-десятичное)
   b       час   (двоично-десятичное)
   b       минута(двоично-десятичное)
   b       секунда(двоично-десятичное)
   b       сотая секунды(двоично-десятичное)
   b       код события (см. спецификацию дескриптора, запись $43)
   b       установившееся значение 0 или 1 (младший разряд)
   w * N1  значения измерений (см. спецификацию дескриптора, запись $41) старшим байтом вперед
   w * N2  значения битовых регистров (см. спецификацию дескриптора, запись $42) старшим байтом вперед
   b       контрольная сумма (старший байт)
   b       контрольная сумма (младший байт)



Структура файла заголовка осциллограмм
--------------------------------------

номер файла 0x84

                                фиксированная область 12 байт
--  ss.Read(FVersion,1);   
  ss.Read(len,1);               + количество осциллограмм
  ss.Read(FHeadRecSize,1);      + 
--  ss.Read(FAnalogCount,1);    количество измерений (записи 0x51 дескриптора)
--  ss.Read(FDICount,1);        количество битовых регистров брать из дескриптора
--  ss.Read(FDOCount,1);        количество битов брать из дескриптора
--  ss.Read(FLedCount,1);       
--  ss.Read(FVICount,1);        
--  ss.Read(FVOCount,1);        
                                
  ss.Read(FTimeSegm,1);         + в секундах
                                
  ss.Read(b,1);                 + на потом (скорость загрузки осциллограмм)
       if b=0 then FResponseBaudRate:=9600
  else if b=1 then FResponseBaudRate:=19200
  else if b=2 then FResponseBaudRate:=38400
  else if b=3 then FResponseBaudRate:=115200
  else raise Exception.Create('unsupported ResponseBaudRate index: '+ IntToStr(b));

--  ss.Read(FPreHist,1);          + в сегментах

--  ss.Read(maxlen,1);            // максимальное количество osc

  ss.Seek(16,soFromBeginning);  + резерв (шапка шапок всего 16)



                                  всего 12 байт
    ss.Seek(3,soFromCurrent);   +
    ss.Read(osch.FMoment[0],7); +
    ss.Read(osch.FPreHist,1);   + добавлено в сегментах
    ss.Read(osch.FSegmCount,1); +


2015-07-03

  файл заголовков осциллограмм имеет размер 16 + 12 * maxlen = 496 байт (4 полуфрейма когда maxlen==40)
  заголовки читаем с конца файла по 12 байт
  число заголовков берем из 1-го байта файла




<<<

скоростная передача osc
-----------------------

запрос чтения (стандартная скорость modbus)
  1 номер устройства
  1 0xXX код команды
  1 номер осциллограммы
  2 номер блока по 512 байт
  1 количество блоков
  1 скорость обмена (0-стандарт, 1 - 1024, 2 - 2048, 3 - 4196)
  2 КС crc16

ответ чтения (стандартная скорость modbus)
  1 номер устройства
  1 0xXX код команды
  1 номер осциллограммы
  2 номер блока по 512 байт
  1 количество блоков
  1 скорость обмена (0-стандарт, 1 - 1024, 2 - 2048, 3 - 4196)
  N поток (размер = 512 * количество блоков)
  2 КС crc16

запрос чтения (высокая скорость, указана в ответе чтения)
  1 номер устройства
  1 0xXX код команды
  1 номер осциллограммы
  2 номер блока по 512 байт
  1 количество блоков
  1 скорость обмена (0-стандарт, 1 - 1024, 2 - 2048, 3 - 4196)
  2 КС простая

ответ чтения (высокая скорость, указана в ответе чтения)
  1 номер устройства
  1 0xXX код команды
  1 номер осциллограммы
  2 номер блока по 512 байт
  1 количество блоков
  1 скорость обмена (0-стандарт, 1 - 1024, 2 - 2048, 3 - 4196)
  N поток (размер = 512 * количество блоков)
  2 КС простая


Протокол скоростной передачи osc
--------------------------------
rev.1

1L) запрос установки скорости (стандартная скорость) - переход на высокую скорость
2L) ответ установки скорости (стандартная скорость)

3H) запрос чтения (высокая скорость, указана в 2L)
4H) ответ чтения (высокая скорость, указана в 2L) содержит данные osc
...

1H) запрос установки скорости (высокая скорость, указана в 2L) - переход на стандартную скорость
2H) ответ установки скорости (высокая скорость, указана в 2L)

Если на высокой скорости получено 2 ош подряд или нет ответа, 
то через 100 msec обмен продолжается на стандартной скорости



Протокол скоростной передачи osc
--------------------------------
rev.2

1L) запрос чтения (стандартная скорость) - переход на высокую скорость
2L) ответ чтения (стандартная скорость)

1H) запрос чтения (высокая скорость, указана в 1L)
2H) ответ чтения (высокая скорость, указана в 1L) содержит данные osc
...

Если на запрос чтения (1L) получен отказ (код команды содержит бит ошибки), то  
обмен продолжается на стандартной скорости

Если на запрос чтения (1L) получен нормальный ответ, то  
обмен продолжается на высокой скорости

Если на запрос чтения (1H) получен нормальный ответ, то  
обмен продолжается на высокой скорости

По завершению приема на высокой скорости выдерживается пауза (от приема 
последнего байта) 100 msec и обмен продолжается на стандартной скорости) (50 на мк)

Если на высокой скорости получен отказ (код команды содержит бит ошибки или неправильная КС), 
то запрос чтения повторяется 1 раз на высокой скорости

Если на высокой скорости получено 2 отказа подряд или нет ответа или неправильный ответ, 
то через 100 msec обмен продолжается на стандартной скорости

>>>>


Файл внешней FLASH
------------------

1. номер файла $8C

2. параметры внешней FLASH по адресу адресу ADR_CONST
   2b размер фрейма в байтах
   2b размер FLASH во фреймах
   2b размер блока во фреймах

3. 0й фрейм содержит таблицу подфайлов
   структура таблицы
   1b константа = $01
   1b количество строк таблицы
   2b адрес начала подфайла 1 во фреймах
   2b адрес начала подфайла 2 во фреймах
   ...

4. Перезаписываемый подфайл - последний, его адрес выровнен на границу блока

5. структура подфайла
   4b размер данных в байтах
   4b hash
   nnn... данные

