Содержание

Сокращения

  • DIM - Distrubuted Information Manager.
  • DNS - Distributed Name Server.
  • DID - Distributed Information Display.
  • DAQ - Data AcQuisition, система сбора данных.
  • CRW - CuRve in Windows, пакет сбора и обработки данных.
  • CRW-DAQ - система сбора данных в рамка пакета CRW.
  • CERN - Центрально-Европейский комплекс ускорителей (Женева).

DIM сервер для CRW-DAQ


DIM - сетевая технология, разработанная в CERN для задач автоматизации больших экспериментов на ускорителях и задач автоматизации распределенных систем реального времени. Эта технология базируется на TCP/IP, однако предоставляет сервис более высокого уровня, чем TCP/IP сам по себе. Справка по DIM входит в дистрибутив CRW-DAQ, поэтому рекомендуется с ней ознакомиться.

С точки зрения пользователя, DIM - это библиотека функций на языках C, C++, Fortran, Pascal, позволяющих достаточно просто организовать обмен данными в распределенных измерительных системах. Технология TCP/IP (например, в виде сокетов) оперирует понятиями типа "канал связи", "соединение" и пользователь должен сам заботиться об установлении сеанса связи, приеме и передаче данных и т.д. Технология DIM вместо этого оперирует понятиями "сервис", "набор данных", скрывая от пользователя детали установления связи, низкоуровневые протоколы обмена данными и т.д. Хотя внутри DIM, конечно, используются те же самые сокеты.

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

Большим плюсом и достоинством DIM являются:

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


DIM, DNS, DID


Конфигурирование DIM сервера требует указания DNS и его запуска, поэтому для начала надо понять, что такое DNS.

DNS - это сервер имен DIM. Для чего он нужен? Надо сказать, что DIM построен по классической технологии клиент-сервер. Сервер предоставляет клиенту информационные ресурсы, клиент их потребляет. Клиент может воздействовать на сервер путем посылки команд.

Сервер может обслуживать много клиентов, то есть предоставлять нескольким клиентам одну и ту же информацию. Поэтому отношение передачи данных "сервер -> клиент" есть отношение типа "один ко многим".

Сервер может обслуживать также команды (запросы) многих клиентов одновременно, выстраивая запросы в очередь и выполняя их один за другим. Поэтому отношение передачи данных "клиент -> сервер" есть отношение типа "многие к одному".

В чем недостаток классической клиент-серверной технологии? В принципе, каждое соединение клиент-сервер есть соединение "point to point", требующее описания клиента и сервера, включая сюда имя компьютера клиента и сервера, идентификатор сеанса связи и т.д. По установленному каналу связи данные передаются по известному клиенту и серверу протоколу. При таком подходе сервер должен знать имена каждого клиента, чтобы делать рассылку данных, а каждый из клиентов должен знать имя сервера. В системах со сложной топологией дело осложняется тем, что каждый компьютер одновременно может выступать как клиент и как сервер - для разных наборов данных. К этому надо добавить, что имена и адреса компьютеров не есть постоянная величина. А на этапе проектирования эти имена вообще неизвестны. Таким образом, конфигурирование классической клиент-серверной системы представляется громоздким и неудобным.

DIM предлагает другую концепцию. Основным понятием DIM является не "канал связи", а "сервис". Сервис есть просто поименованный набор данных. Сервер берется предоставлять этот поименованный набор данных клиентам. Технология DIM обеспечивает передачу данных клиентам, привязанную к именам наборов данных, а подробности передачи данных скрываются. В конце концов, клиенту именно это и надо - получать от сервера данные. Сеанс связи - это для клиента лишние детали, а не результат.

Однако, поскольку имена компьютеров знать все же надо, DIM использует сервер имен DNS. Сервер имен - это программа, запускаемая на одном из компьютеров сети, которая хранит информацию о клиентах и серверах. Когда сервер начинает работу, он соединяется с DNS-сервером имен и передает ему список сервисов, которые он публикует, то есть может предоставить клиентам. Когда клиент начинает работу, он обращается к DNS-серверу с просьбой дать адрес сервера, который обслуживает интересующий клиента сервис. Получив адрес сервера, клиент устанавливает соединение. После установления соединения DNS-сервер, в принципе, уже не нужен, по крайней мере для данной пары клиент-сервер. Однако, поскольку связь может рваться, а клиенты - отсоединяться и вновь присоединяться, DNS-сервер работает как постоянная служба. Что-то вроде службы знакомств.

Таким образом, вместо пары (имя клиента, имя сервера) технология DIM использует пару (имя DNS-сервера, имя сервиса). Достоинство в том, что имя DNS-сервера одно для всех компьютеров в рамках данной сети, а имя сервиса есть константа, определяемая проектировщиком измерительной системы произвольно. При смене имен компьютеров ничего не меняется, проектировщик измерительной системы ничего не должен знать о компьютерах сети, кроме того, как называется DNS-сервер.

Как следствие, сервер и клиент благодаря DIM могут ничего не знать друг о друге (с точки зрения пользователя). Сервер просто публикует данные своих сервисов, не заботясь, какие клиенты их берут и сколько их подключено. Клиент просто берет данные по имени сервиса, не заботясь о том, какой сервер их предоставил. Сплошная идиллия.

Надо заметить, что DNS-сервер следит также за порядком в своей сети. Если какой-то сервер зарегистрировал сервис и запускается другой сервер, который тоже хочет опубликовать сервис с таким же именем, то этому запускаемому серверу будет мягко предложено покончить жизнь самоубийством, поскольку место под солнцем уже занято. Поэтому проектировщик измерительной системы должен позаботиться об уникальности имен сервисов.

Наконец, для обзора текущего содержимого DNS-сервера служит утилита DID. Эта утилита незаменима при отладке DIM приложений, позволяя узнавать, какие серверы есть в сети, какие сервисы они публикуют, какие клиенты к ним подключены и т.д.

Наконец, надо сказать, что если выбрать в качестве сервера имен одну из машин, где будет запускаться DIM-сервер для CRW-DAQ, то служба DNS (файл dns.exe) будет запущена автоматически. Если это не так, надо позаботиться о запуске DNS, иначе соединение между клиентами и серверами не будет установлено.


Состав DIM сервера для CRW-DAQ


Сервер DIM для CRW-DAQ логически состоит из трех частей:
  1. Автономно работающего исполняемого файла DIMSRV.EXE, запускаемого как отдельный процесс,
  2. Программы DIMSRV.PAS на языке Daq Pascal, работающей в составе системы CRW-DAQ,
  3. Конфигурации, описывающей параметры сервера.

С точки зрения пользователя системы CRW-DAQ, программы DIMSRV.PAS,DIMSRV.EXE являются готовым инструментом, модифицировать их не надо. Все, что надо пользователю - грамотно составить конфигурацию сервера, то есть описать, какие данные и каким образом надо автоматически пересылать.

С точки зрения исполнения и управления, основной (ведущей) является встроенная программа DIMSRV.PAS. Она запускается в составе системы CRW-DAQ и отвечает за конфигурирование, запуск и останов автономной программы DIMSRV.EXE. При сбое автономной программы сервера, она будет автоматически перезапущена. Автономная программа общается с встроенной программой по анонимному каналу. Впрочем, для пользователя это лишние подробности.

Файлы сервера помещаются в каталог ~~\Resource\DaqSite\DimServer, где ссылка ~~ заменяет каталог, где находится основной исполняемый файл системы CRW-DAQ. Для работы сервера нужны (не считая файлов конфигурации) такие файлы:

  1. borlndmm.dll - менеджер памяти Object Pascal (Delphi).
  2. dim.dll - библиотека времени исполнения DIM.
  3. msvcr80.dll - библиотека времени исполнения C++.
  4. msvcp80.dll - библиотека времени исполнения C++.
  5. msvcm80.dll - библиотека времени исполнения C++.
  6. Microsoft.VC80.CRT.manifest - файл нужен для библиотеки времени исполнения C++.
  7. DIMSRV.DPR - исходный текст автономного сервера DIM для CRW-DAQ.
  8. DIMSRV.EXE - исполняемый файл автономного сервера DIM для CRW-DAQ.
  9. DIMSRV.HTM - описание сервера DIM для CRW-DAQ.
  10. DIMLIB.PAS - библиотека для сервера DIM для CRW-DAQ.
  11. DIMSRV.PAS - исходный текст встроенного сервера DIM для CRW-DAQ.
Кроме того, используются файлы, находящиеся в каталоге Crw32exe и Crw32exe\resource\DimSite\Dim дистрибутива CRW-DAQ, а также используются библиотечные файлы CRW-DAQ в каталоге Crw32exe\resource\Dcc32\syslib, наиболее важный из которых - файл _DIM.PAS. Файлы borlndmm.dll, dim.dll, msvcr80.dll могут перед первым запуском сервера отсутствовать, так как они автоматически копируются из дистрибутива CRW-DAQ при запуске сервера. Файл DIMSRV.EXE может быть сгенерирован из файла DIMSRV.DPR.

Конфигурирование DIM сервера для CRW-DAQ


Прежде всего, надо сказать, что DIM-сервер (&DimSrv) номинально один на любую конфигурацию. Один DIM-сервер &DimSrv может обслуживать много сервисов и поэтому нет необходимости в запуске нескольких серверов в рамках одной конфигурации. Пользуясь тем, что секции конфигураций можно разносить по разным файлам, каждая подсистема в своем файле может добавлять свои сервисы в одну общую секцию [&DimSrv.ServiceList] описания DIM-сервисов.

Сначала надо объявить программу - сервер DIM для CRW-DAQ. Это делается путем включения ссылки на стандартную конфигурацию:

   [ConfigFileList]                                      ; Включаем в конфигурационный файл
   ConfigFile = ~~\resource\daqsite\default\dimsrv.cfg   ; Ссылка на стандартную конфигурацию &DimSrv
   []

   [&DimSrv]                                             ; Параметры конфигурации сервера &DimSrv:
   DIM_TASK = DEMO/SERVER                                ; Имя сервера, уникальное в пределах DIM-сети
   DIM_DNS_NODE = .                                      ; Имя DIM DNS сервера, для localhost - точка
   []
  
Стандартная конфигурация &DimSrv включает пути поиска [DAQ] SearchPath = … , которые нужны для поиска необходимых для сервера программ. Кроме того, стандартная конфигурация содержит набор параметров, подходящих для подавляющего большинства задач, кроме DIM_TASK и DIM_DNS_NODE, которые задаются индивидуально для каждой системы.
Сервер имеет такие параметры конфигурации:

Следующее, что надо сделать - объявить сервисы, которые будет обслуживать сервер. Это делается примерно так:

   [&DimSrv.ServiceList]
   dis_info_nick = dis_info TEST1/INFO_SERVICE
   dis_cmnd_nick = dis_cmnd TEST1/CMD_SERVICE
   dic_info_nick = dic_info TEST2/INFO_SERVICE
   dic_cmnd_nick = dic_cmnd TEST2/CMD_SERVICE
  
Здесь:

Следующее, что надо сделать - описать объявленные сервисы, которые будет обслуживать сервер. Это делается примерно так:

   [dis_info_nick]
   tag   dis_info_i
   tag   dis_info_r
   tag   dis_info_s
   polling   MONITORED,0
   filling   /////w==  ////  &DimCtrl

   [dis_cmnd_nick]
   tag   dis_cmnd_i, dis_cmnd_r,   dis_cmnd_s
   devPostMsg   &DimCtrl #dis_cmnd_receive

   [dic_info_nick]
   tag   dic_info_i
   tag   dic_info_r
   tag   dic_info_s
   devPostMsg   &DimCtrl #dic_info_receive
   polling   MONITORED,0
   filling   /////w==  ////  &DimCtrl

   [dic_cmnd_nick]
   tag   dic_cmnd_i, dic_cmnd_r, dic_cmnd_s
   polling   TIMED,1000
  
Здесь:


Сообщения от DIM сервера клиентам


Сообщения от DIM-сервера другим программам (клиентам) задаются командами (devmsg, devsend, devsendmsg, devpost,devpostmsg) при описании сервисов. Для сервисов Эти сообщения пересылаются клиентам после приема данных по сети и записи данных в теги для уведомления. Каждое сообщение задается отдельной строкой. Число элементов в списке сообщений ничем не ограничено.

В сообщениях можно использовать также следующие выражения:

Например:
   devPostMsg &Client dic_info_data=%**
   devSendMsg &Client dic_info_tags=%01,%02,%03
  
Использование этих подстановок позволяет организовать самостоятельную обработку сообщений клиентами. Это позволяет также обрабатывать команды без потерь, то есть выполнять сериализацию потока сообщений.

Сериализация - это выстраивание одновременных событий в очередь FIFO с последующей асинхронной выборкой из очереди и обработкой. Без сериализации сообщения могут быть потеряны. Дело в том, что если сообщение (сервис) было принято по сети несколько раз за данный квант времени, первые значения тегов будет затерты последующими, так как теги истории не имеют. При необходимости сериализации (обработки всех поступающих сообщений без потерь, по порядку) можно пересылать данные клиенту, пусть сам разбирается. При этом сообщения теряться не будут.

Сериализация нужна не всегда. Например, сериализация не нужна при редких событиях, четко разнесенных по времени или для отображения медленно меняющихся величин. При обработке команд от клиентов сериализация может понадобиться, так как клиенты могут одновременно вызывать различные команды, а сервер должен их все выполнять. Именно в этих случаях имеет смысл переложить обработку на другие программы, пересылая им "сырые" данные.

Сериализация при посылке сообщений (для постановки команд в очередь), если нужна, делается либо посылкой сообщения с установкой данных, либо так:

  1. Данные записываются в теги.
  2. DIM-серверу посылается команда обновления сервиса devPostMsg('&DimSrv ##'+str(tag)).
  3. Делается задержка либо ожидается приход уведомления о посылке данных от сервера. При ожидании уведомления в конфигурации надо его прописать (через соответствующий devmsg).
  4. Следующее сообщение этому сервису посылается только после задержки или уведомления.



Сообщения от клиентов к DIM серверу


Сообщения серверу &DimSrv:


DIM-мосты DimBridge


DIM-мосты (DimBridge.exe) служат для связи между разными DIM-сетями. Под DIM-сетью здесь понимается группа компьютеров, использующая один сервер имен DNS. В физической сети может быть несколько DIM-сетей, которые "завязаны" на разные серверы имен DNS. Поскольку именно сервер имен играет роль связующего звена между клиентом и сервером, разные DIM-сети могут спокойно сосуществовать, не мешая друг другу, если их обслуживают разные DNS со своими пространствами имен. Однако может возникнуть ситуация, когда нужно связать DIM-сети в одно информационное пространство. Эту задачу и решает DimBridge.exe.

Если у нас есть, например, две DIM-сети с серверами dns1.net и dns2.net, и в сети dns1 есть группа сервисов с маской DNS1/DATA/*, то мы можем экспортировать эти сервисы в сеть dns2, вызвав команду
  DimBridge.exe dns1.net dns2.net DNS1/DATA/*
  
Есть веская причина использовать мосты в измерительных системах. Допустим, есть несколько серверов (например host1, host2, host3, ...), которые обслуживают автономные подсистемы и могут работать независимо друг от друга, а также центральный сервер (например, simply). Если DNS-сервер по какой-то причине будет недоступен, то клиент/серверные процессы не смогут связаться друг с другом, даже если они расположены на одном компьютере. При этом использование DIM для связи процессов, работающих на одной машине, является распространенной практикой. Часто даже один процесс выступает клиентом по отношению к самому себе - например, при разработке распределенного графического интерфейса.

Чтобы каждый из DIM-серверов был работоспособен независимо от других, целесообразно на каждом сервере запускать свой локальный DNS (для этого задается DIM_DNS_NODE = . ), а компьютеры можно связывать друг с другом через DIM-мосты. Локальный DNS-сервер доступен всегда, поэтому локальные клиент-серверы, находящиеся на одном компьютере, гарантированно будут работать, даже если связи по сети нет. Удаленные клиент-серверы будут доступны при наличии связи. При этом, чтобы сохранить централизацию, мостовую связь можно осуществлять через центральный компьютер. Например:
   На сервере host1:
    DimBridge.exe host1.net simply.net HOST1/DATA/*     ; экспорт данных с серверного на центральный компьютер
    
   На клиенте host2:
    DimBridge.exe simply.net host2.net HOST1/DATA/*     ; экспорт данных с центрального на клиентский компьютер
  
При этом мостов может быть несколько, в зависимости от числа серверов, участвующих во взаимодействии. Эти мосты надо как-то запускать, а также отслеживать их состояние, чтобы перезапускать "упавшие" мосты.

Для облегчения работы с несколькими мостами в &DimSrv добавлены следующие команды:
  @StatPeriod 60000                      ; задать период печати статистики,    ms (0-отключить)
  @DimBridge Period 60000                ; период проверки/перезапуска мостов, ms (0-отключить)
  @DimBridge host1.net host2.net DATA/*  ; добавление моста данных DATA/* из host1 в host2
  @DimBridge View                        ; просмотр списка мостов
  @DimBridge Init                        ; удалить все мосты, привести в начальное состояние
  @DimBridge Stop                        ; остановить все работающие процессы мостов
  @DimBridge Start                       ; запустить     все процессы мостов
  @DimBridge Restart                     ; перезапустить все процессы мостов
  @IfHostName n c                        ; выполнить команду c, если полное имя компьютера (FQHN) равно n
  @IfNotHostName n c                     ; выполнить команду c, если полное имя компьютера (FQHN) не равно n
  @IfComputerName n c                    ; выполнить команду c, если краткое имя компьютера равно n
  @IfNotComputerName n c                 ; выполнить команду c, если краткое имя компьютера не равно n
  
Приведенные команды (@DimBridge) позволяют запускать до 32 мостов и следить за их состоянием (с периодом @DimBridge Period). Если процесс моста (DimBridge.exe) "упал", то он перезапускается. Эти команды вызываются, например, в секции [&DimSrv.StartupScript]:
  [&DimSrv.StartupScript]
  @StatPeriod 60000
  @DimBridge Period 60000
  @IfComputerName egp-mzbs @DimBridge egp-mzbs.dep0404.ru simply.dep0404.ru EGP/MZBS/*
  @IfComputerName egp-main @DimBridge simply.dep0404.ru egp-main.dep0404.ru EGP/MZBS/*
  []
  
  Обратите внимание - на разных компьютерах будут запускаться разные мосты.
  В данном примере на сервере egp-mzbs данные копируются из egp-mzbs на simply,
  а на клиенте egp-main данные копируются из simply на egp-main.
  
Таким образом, в одной конфигурации можно описать клиент-серверную систему с локальными DNS (для надежной локальной связи) и центральным DNS (для объединения в систему).

Недостатком использования мостов является увеличение трафика (вдвое) и задержки обмена (на несколько десятков миллисекунд), т.к. в этом случае данные проходят через мосты, а не напрямую от сервера к клиенту. Поэтому мосты рекомендуется использовать при умеренном трафике.


DIM-порты и утилита DimPorts.cmd


Для работы DIM необходимо разрешить TCP порт 2505, нужный для работы DNS, а также TCP порты 5100, 5101, 5102, ... , используемые для приемо-передачи данных DIM-сервера. На данном компьютере может быть запущен только один сервер имен DNS (что логично), и несколько DIM-серверов. При этом каждый экземпляр DIM-сервера занимает три последовательных порта, начиная с 5100.

Для облегчения настройки DIM-портов в Firewall сделана утилита DimPorts.cmd, вызов которой доступен также командой @DimPorts в консоли &DimSrv. Она разрешает/запрещает/показывает DIM-порты TCP 2505,5100..5108. Этого достаточно для работы DNS и трех экземпляров DIM-сервера.
   Из консоли CMD:
    DimPorts add enable  - разрешить DIM-порты TCP 2505,5100..5108
    DimPorts delete      - удалить разрешения для DIM-портов
    DimPorts show        - показать разрешения Firewall
    
   Из консоли &DimSrv:
    @DimPorts add enable  - разрешить DIM-порты TCP 2505,5100..5108
    @DimPorts delete      - удалить разрешения для DIM-портов
    @DimPorts show        - показать разрешения Firewall
  
Команда также доступна в меню Инструменты\Консольные утилиты.


Ограничения данной версии


В текущей версии действуют следующие ограничения:


Курякин Алексей Валерьевич, kouriakine@mail.ru.