v4orb2.wiki

описание пикапов и диссектора ВЭПП3-4
git clone https://star.inp.nsk.su/~bekhte/v4orb2.wiki.git
Log | Files | Refs

kserv.md (21899B)


      1 Title: Описание сервиса частичного импорта данных из EPICS
      2 CSS:     table.css
      3 
      4 {{TOC}}
      5 
      6 Описание сервиса частичного импорта данных  из EPICS
      7 для системы измерения положения пучка ВЭПП-3.
      8 
      9 # Методика измерений
     10 
     11 Принцип работы системы измерения положения пучка
     12 ВЭПП-3 основан на одновременном измерении сигналов с 4-х
     13 электродов пикапа четырьмя независимыми каналами, каждый из
     14 которых включает аналоговый канал с регулируемым усилением
     15 и АЦП. В качестве сигнала используется 18-я гармоника частоты
     16 обращения (72.54 МГц). Глубина регулировки усиления каналов – 28 дБ.
     17 
     18 Сигнал интегрируется в течение каждого оборота пучка.
     19 Далее сигналы за отдельные обороты складываются, образуя
     20 быстрые данные (результат накопления сигнала за Nav = 1-30000 оборотов)
     21 и медленные данные (результат накопления сигнала за
     22 Nturns = 1-2 миллиона оборотов). Таким образом, возможно
     23 получение 3-х типов данных:
     24 
     25 1.	Медленные данные (Slow Data)  – значения координат X, Z и ток пучка (пропорциональный сумме сигналов с 4-х электродов пикапа);
     26 
     27 2. 	Быстрые данные (Fast Data) – 2 массива координат X, Z емкостью 1024 числа каждый;
     28 
     29 3.	Данные пооборотных измерений (Turn-by-turn Data) емкостью до 131072 чисел (для TCP пикапстанций 16384).
     30 
     31 Длительность элементарного цикла измерения  Nav и общую
     32 длительность полного цикла измерения Nturns можно устанавливать
     33 программно. Нужно только следить, чтобы общая длительность
     34 полного цикла измерения Nturns была больше 1024×Nav.
     35 
     36 # Краткое описание сервера
     37 
     38 Сервер для работы с двадцатью пикап-станциями обеспечивает
     39 прокси доступ к системе управления на базе EPICS, и
     40 производит все действия по работе с железом пикап станций.
     41 
     42 Сервер управляется через шелл скрипт [v3bpmd](vXbpmd). Шелл скрипт
     43  доступен из командной строки **pult6**, располагается в директории пути поиска пользователя **vepp4** (физически расположен /opt/ppc860/v3bpm_build_cache), репозиторий проекта
     44  «http://www.inp.nsk.su/~bekhte/v3orb2.git». Запускается
     45  сервер на **PULT6** вместе с остальными программами работы с пикап станциями.
     46 
     47 Для того чтобы соединиться с сервером, программа-клиент вызывает функцию:
     48 
     49  sock = connect_it(IP_ADDR, BASE_PORT),
     50 
     51 где sock – сокет, IP_ADDR – IP адрес машины PULT6, где работает
     52  сервер, BASE_PORT=2101 – номер порта сервера.
     53 
     54 Затем клиент посылает код команды в сервер из 1-го байта. В связи с последними нововведениями полностью безопасными являются команды получения данных [2](#2), [3](#3), [4](#4), [5](#5), [51](#51), [69](#69), [8](#8), [9](#9). Сервер пикап станции самостоятельно следит за правильным коэффициентом усиления, и вроде нет необходимости вмешиваться в его работу. Поэтому пользоваться командами [64](#64), [65](#65), [96](#96), [67](#67) для установки коэффициента усиления постоянной необходимости нет. Основные EPICS сервера постоянно производят медленные измерения производят подстройку усиления, и всегда имеют актуальные данные по медленным измерениям.
     55 
     56 ## Коды команд[code]
     57 
     58 ### 64
     59 
     60 Код = 64 – посылка параметров  в сервер (5 параметров + маску  пикап-станций к которым применяются настройки), [описание см.](#param);
     61 
     62 запрос:
     63 
     64 * параметры
     65 * *uint32_t* - маска  
     66 
     67 ответ:
     68 
     69 * нет
     70 
     71 ### 65
     72 
     73 Код = 65 – тоже что [64](#64), дополнительно возвращает результат исполнения 4 байта ( результат всегда 0, что означает успех, поскольку сервер теперь не работает напрямую с железом)
     74 
     75 запрос:
     76 
     77 * параметры
     78 * *uint32_t* - маска  
     79 
     80 ответ:
     81 
     82 * *uint32_t* - 0
     83 
     84 
     85 ### 96
     86 
     87 Код = 96 – тоже что [65](#96)
     88 
     89 ### 67
     90 
     91 Код = 67 – посылка параметров  в сервер (в формате кода [64](#64)), и получение медленных данных для всех 20-и пикап-станций, независимо включена та или иная станция или нет. Формат медленных данных [описан ниже](#slow).
     92 
     93 запрос:
     94 
     95 * параметры
     96 * *uint32_t* - маска  
     97 
     98 ответ:
     99 
    100 * [медленные данные](#slow)
    101 
    102 ### 6
    103 Код = 6 – запуск быстрых измерений по маске, формат маски тот же что и в [параметрах](#param).
    104 
    105 запрос:
    106 
    107 * *uint32_t* - маска  
    108 
    109 ответ:
    110 
    111 * нет
    112 
    113 ### 7
    114 
    115 Код = 7 – запуск пооборотных измерений по маске, формат маски тот же что и в [параметрах](#param).
    116 
    117 запрос:
    118 
    119 * *uint32_t* - маска  
    120 
    121 ответ:
    122 
    123 * нет
    124 
    125 ### 2
    126 
    127 Код = 2 – чтение медленных данных для всех 20-и пикап-станций, если есть пикапстанции работающие в режиме 3 Гц то происходит ожидание свежих данных от них, для остальных пикап станций отдаются последние актуальные данные. Если нет пикапстанций в режиме 3 Гц, ответ отдается мгновенно. Формат ответа тотже что код [67](#67);
    128 
    129 запрос:
    130 
    131 * нет  
    132 
    133 ответ:
    134 
    135 * [медленные данные](#slow)
    136 
    137 ### 3
    138 
    139 Код = 3 – тоже что [2](#2).
    140 
    141 ### 4
    142 
    143 Код = 4 – ожидание окончания измерения (код [6](#6)) и чтение 2-х массивов быстрых данных (координат X, Z) по 1024 вещественных чисел каждый. После посылки кода команды в сервер посылается еще один байт – номер пикап-станции (0-19), для которой надо прочитать результат измерений.  Команда ожидает окончание измерения конкретной пикапстанцией, только после этого из сервера приходят массивы данных. Данные будут достоверны только, если соответствующая пикап-станция включена и с ней есть связь по Ethernet.
    144 
    145 запрос:
    146 
    147 * *uint8_t* - пикап id  
    148 
    149 ответ:
    150 
    151 * быстрые данные
    152 
    153 ### 69
    154 
    155 Код = 69 – ожидание окончания измерения(код [7](#7)) и чтение 3-х массивов данных пооборотных измерений (координат X, Z, I) по Nt вещественных чисел каждый. Размер читаемых массивов пооборотных данных Nt может устанавливаться программно (см. [ниже](#t_bufer)): 2048, 4096, 8192, 16384, 32768, 65536 или 131072 чисел. После посылки кода команды в сервер посылается еще один байт – номер пикап-станции (0-19), откуда нужно прочитать данные. Только после этого из сервера приходят массивы данных.
    156 
    157 запрос:
    158 
    159 * *uint8_t* - пикап id  
    160 
    161 ответ:
    162 
    163 * пооборотные данные
    164 
    165 ### 5
    166 
    167 Код = 5 – тоже что [69](#69).
    168 
    169 ### 51
    170 
    171 Код = 51 – ожидание окончания измерения(код [7](#7)) и чтение 4-х массивов данных пооборотных измерений (напряжения в вольтах U1, U2, U3, U4). После посылки кода команды в сервер посылается один байт – номер пикап-станции (0-19), откуда нужно прочитать данные. И количество точек запрашиваемых данных - целое число 4 байта в диапазоне 1-131072 (128k). Число прочитанных данных должнобыть меньше или равно размеру запрашиваемых измерений(задается командой [64](#64)), если это не так, хвост данных недостоверен.
    172 
    173 запрос:
    174 
    175 * *uint8_t* - пикап id  
    176 * *uint32_t* - размер массивов 1-131072  
    177 
    178 ответ:
    179 
    180 * *uint16_t* - магик
    181 * *float\[\]* - пооборотные данные U1
    182 * *float\[\]* - пооборотные данные U2
    183 * *float\[\]* - пооборотные данные U3
    184 * *float\[\]* - пооборотные данные U4
    185 
    186 
    187 ### 8
    188 
    189 Код = 8 – чтение маски реально работающих пикап-станций – 4 байт. Каждый бит этого байта (0-31) соответствует определенной пикап-станции. Реально работающая пикап-станция должна быть включена не только программно, но и электрически, то есть с ней должна быть связь по Ethernet.
    190 
    191 запрос:
    192 
    193 * нет  
    194 
    195 ответ:
    196 
    197 * *uint32_t* - маска
    198 
    199 ### 9
    200 
    201 Код = 9 – чтение буфера последних медленных измерений для выбранного пикапа. После кода команды сервер ожидает один байт с номером пикап-станции (0-19), и один байт с длинной массива n-1 (0-255 соответствует длине массива 1-256). В ответ отвечает:  
    202 
    203 запрос:
    204 
    205 * *uint8_t* - пикап id  
    206 * *uint8_t* - кол-во точек
    207 
    208 ответ:
    209 
    210 * магическое число 2 байта (0x55aa)
    211 * координата X, n точек в формате _float_
    212 * координата Y, n точек в формате _float_
    213 * ток I, n точек в формате _float_
    214 * время измерения в секундах с момента запуска программы, n точек в формате _float_
    215 
    216 Вполне реально поставить время медленных измерения 5мс, и наблюдать колебания пучка в полосе 100Гц. Это никак не будет конфликтовать с пооборотными и быстрыми измерениями. Время измерения можно использовать для сшивки данных.
    217 
    218 ### 20
    219 
    220 Код = 20 – установка параметров режима _timeback_  
    221   запрос:  
    222 
    223   * _int_ 	– разрешение моды _timeback_, 1 – разрешено, 0 запрещено.  
    224   * _int_ 	– автоматическое продление моды _timeback_, 0 – после срабатывания _timeback_, мода сбрасывается и пикап переходит в режим обычных измерений. 1 – после срабатывания пикап остается в моде _timeback_.  
    225   * _int_ 	– проценты при которых срабатывает _timeback_.  
    226   * _float_ 	– уровень тока при значении которого меньше, считается что сигнал отсутствует, срабатывание не происходит при отсутствии сигнала.  
    227   * _int_ 	-  сколько оборотов измерять после срабатывания.  
    228   * *uint8_t* – маска, пикапов к которым применяются настройки.  
    229 
    230   ответ:  
    231 
    232   * нет
    233 
    234 ### 21
    235 
    236 Код = 21 – запрос состояния режима _timeback_.  
    237   запрос:
    238 
    239   * нет  
    240 
    241 
    242   ответ:
    243 
    244   * *uint32_t* – маска пикапов у которых сработал режим _timeback_, при чтении флаг сбрасывается автоматически
    245 
    246 ### 22
    247 
    248 Код = 22 – чтение пооборотных данных _timeback_,  
    249   запрос:  
    250 
    251   * *uitn8_t* – номер пикапа (0-19)  
    252 
    253 
    254   ответ:  
    255 
    256   * массивы X, Y, I, размер массивов определяется параметром [t_bufer], тоже что и для пооборотных данных.  
    257 
    258 
    259  Максимальные коды АЦП не должны выходить за границы ±8191, иначе измерения будут неправильными. Код усиления (0-28) выставляется такой, чтобы максимальные значения АЦП  были на уровне 5-7 тысяч. Но еще лучше не управлять самому кодом усиления, а поручить это дело автогэйну ЭПИКСА.
    260 
    261 ## Загружаемые параметры по порядку следования[param]
    262 
    263 ```
    264 struct {
    265   int nturn;
    266   int nav;
    267   int gain[20];
    268   int t_buffer;
    269   int ext_start;
    270 };
    271 ```
    272 
    273 ### nturn
    274 
    275 nturn – задает общую длительность полного цикла измерения в оборотах (Nturns);
    276 
    277 ### nav
    278 
    279 nav – задает длительность элементарного цикла измерения в оборотах (Nav) для быстрых данных, величина nav лежит в диапазоне 0-16000, при этом общая длительность полного цикла измерения Nturns должна быть больше 1024×nav;
    280 
    281 ### gain
    282 
    283 gain\[20\] – 20 значений усиления в децибелах (0-28) для пикап-станций 0-19,  для большого тока пучка (~150 мА в двух сгустках) усиление должно быть около 17, при меньших токах оно желательно устанавливается больше (чтобы максимальные значения АЦП  были на уровне 5-7 тысяч);
    284 
    285 ### t_bufer
    286 
    287 t_bufer – задает размер читаемых массивов пооборотных данных:
    288 
    289 *  t_bufer = 0 – размер массива Nt = 2048
    290 *  t_bufer = 1 – размер массива Nt = 4096
    291 *  t_bufer = 2 – размер массива Nt = 8192
    292 *  t_bufer = 3 – размер массива Nt = 16384
    293 *  t_bufer = 4 – размер массива Nt = 32768
    294 *  t_bufer = 5 – размер массива Nt = 65536
    295 *  t_bufer = 6 – размер массива Nt = 131072
    296 
    297 ### ext_start
    298 
    299 ext_start – выбор источника запуска. Запускать цикл измерения от внутреннего запуска (0x00), от внешнего запуска (0x01), от 3Гц 0x02. Внешний запуск осуществляется импульсом “Впуск”, поступающим на соответствующий вход блока электроники. Значение 1-го бита: Запуск от импульса 3Гц осуществляется импульсом 3Гц, поступающим на вход 3Гц;
    300 
    301 ### mask_bl
    302 
    303 mask_bl – маска работающих блоков электроники (или пикап-станций) – 4 байта. Каждый бит этого байта (0-19) соответствует определенной пикап-станции, бит 0 соответствует пикап-станции №0, бит 1 соответствует пикап-станции №1 и т.д. Если бит, например, №2 равен 1, значит пикап-станция №2 включена, если бит №2 равен 0, значит пикап-станция №2 выключена.
    304 Соответствие битов маски и пикпапов:
    305 
    306 | id | маска        | пикап     |
    307 |----|--------------|-----------|
    308 |  0 | 0x00000001  | VEPP3:1P1 |
    309 |  1 | 0x00000002  | VEPP3:1P2 |
    310 |  2 | 0x00000004  | VEPP3:1P3 |
    311 |  3 | 0x00000008  | VEPP3:1P5 |
    312 |  4 | 0x00000010  | VEPP3:1P6 |
    313 |  5 | 0x00000020  | VEPP3:1P7 |
    314 |  6 | 0x00000040  | VEPP3:2P3 |
    315 |  7 | 0x00000080  | VEPP3:2P4 |
    316 |  8 | 0x00000100  | VEPP3:2P5 |
    317 |  9 | 0x00000200  | VEPP3:2P6 |
    318 | 10 | 0x00000400  | VEPP3:3P1 |
    319 | 11 | 0x00000800  | VEPP3:3P2 |
    320 | 12 | 0x00001000  | VEPP3:3P3 |
    321 | 13 | 0x00002000  | VEPP3:3P5 |
    322 | 14 | 0x00004000  | VEPP3:3P6 |
    323 | 15 | 0x00008000  | VEPP3:3P8 |
    324 | 16 | 0x00010000  | VEPP3:4P2 |
    325 | 17 | 0x00020000  | VEPP3:4P4 |
    326 | 18 | 0x00040000  | VEPP3:4P5 |
    327 | 19 | 0x00080000  | VEPP3:4P6 |
    328 
    329 ## Формат медленных данных[slow]
    330 
    331 Для чтения результатов медленных измерений клиент вызывает функцию:
    332 
    333 recv(sock, \*buf, size, 0),
    334 
    335 где sock – сокет, \*buf – указатель на начало массива типа char, куда приходят читаемые данные, size – число принимаемых байт.
    336 
    337 Данные приходят из блока электроники только после окончания измерения. Для кода = 67 должно приходить 2+20×8×4 = 642 байт ( 2 байта – “головная” часть, равная 0х55аа, плюс 32 байта на пикап). Если величина тока равна нулю, значит пучка нет, или он меньше ~50 мкА.
    338 
    339 формат данных:
    340 
    341 <a name="tab1"></a>
    342 
    343 <table width="617" cellpadding="4" cellspacing="0" border="1" style="page-break-before: always">
    344 <caption>Таблица 2. формат данных</caption>
    345 	<tr valign="top">
    346 	    <td>группа, байт</td>
    347       <td>	поле, байт	</td>
    348       <td> пикап	</td>
    349       <td> тип	</td>
    350       <td> описание</td>
    351   </tr>
    352   <tr valign="top">
    353       <td>2</td>
    354       <td>2</td>
    355       <td></td>
    356   	  <td>uint16_t</td>
    357       <td>магическое число (0x55aa)</td>
    358   </tr>
    359   <tr valign="top">
    360     <td rowspan="8"> 32 </td>
    361     <td> 4 </td>
    362     <td rowspan="8">1</td>
    363     <td> char[4] </td>
    364     <td> имя пикапа </td>
    365   </tr>
    366   <tr valign="top">
    367     <td> 4 </td>
    368     <td> float </td>
    369     <td> X </td>
    370   </tr>
    371   <tr valign="top">
    372     <td> 4 </td>
    373     <td> float </td>
    374     <td> Y </td>
    375   </tr>
    376   <tr valign="top">
    377     <td> 4 </td>
    378     <td> float </td>
    379     <td> I </td>
    380   </tr>
    381   <tr valign="top">
    382     <td> 4 </td>
    383     <td> uint32_t </td>
    384     <td> максимальное напряжение в МЗР </td>
    385   </tr>
    386   <tr valign="top">
    387     <td> 4 </td>
    388     <td> uint32_t </td>
    389     <td align="center"> - // - </td>
    390   </tr>
    391   <tr valign="top">
    392     <td> 4 </td>
    393     <td> uint32_t </td>
    394     <td  align="center"> - // - </td>
    395   </tr>
    396   <tr valign="top">
    397     <td> 4 </td>
    398     <td> uint32_t </td>
    399     <td  align="center"> - // - </td>
    400   </tr>
    401   <tr valign="top">
    402     <td> 32 </td>
    403     <td> … </td>
    404     <td> 2 </td>
    405     <td> … </td>
    406     <td> … </td>
    407   </tr>
    408   <tr valign="top">
    409     <td> 32 </td>
    410     <td> … </td>
    411     <td> … </td>
    412     <td> … </td>
    413     <td> … </td>
    414   </tr>
    415   <tr valign="top">
    416     <td> 32 </td>
    417     <td> … </td>
    418     <td> 19 </td>
    419     <td> … </td>
    420     <td> … </td>
    421   </tr>
    422   <tr valign="top">
    423     <td> 32 </td>
    424     <td> … </td>
    425     <td> 20 </td>
    426     <td> … </td>
    427     <td> … </td>
    428   </tr>
    429   <tr valign="top">
    430     <td colspan="5"> 642	всего байт </td>
    431   </tr>
    432 </table>
    433 
    434 Реально Эпикс уже вычисляет максимальный код в МЗР для всех каналов пикапстанции,  поэтому все значения в поле «максимальное напряжение в МЗР» одинаковое для конкретного пикапа.