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 Реально Эпикс уже вычисляет максимальный код в МЗР для всех каналов пикапстанции, поэтому все значения в поле «максимальное напряжение в МЗР» одинаковое для конкретного пикапа.