DIA
ver.2.4, build 0032, 2007-05-03
Описание
Программа содержит набор объектов для реализации сборщиков / источников данных в соответствии с протоколом DTP/DIA. В роли источника данных программа выступает, передавая (ретранслируя) пакеты DTP/DIA. Программа может быть использована для построения мелких и средних распределенных информационно-измерительных систем (ИИС) (до ~100-500 устройств).
Программа распространяется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. Данная программа является свободным программным обеспечением, вы можете распространять ее в соответствии с условиями Общей Публичной Лицензии GNU.
В этом описании следующие термины имеют специальное значение:
- Канал - внутренний объект программы, скрывающий от нее способ появления/передачи данных (пакетов DTP/DIA). Такой объект реализует работу с каким-либо коммуникационным ресурсом: последовательный порт, TCP-сокет и т.п. Перед началом работы с программой пользователь должен задать количество и параметры использующихся коммуникационных ресурсов.
- Устройство - внутренний объект программы, хранящий данные от какого-либо устройства в ИИС. Такой объект интерпретирует и обрабатывает пакет DTP/DIA. Перед началом работы с программой пользователь должен описать ИИС: перечислить все устройства (их идентификаторы), указать, по каким каналам будут поступать данные от этих устройств, и указать, требуется ли ретрансляция полученных данных в другие узлы распределенной ИИС.
- Ключ - выражение, записываемое в файле конфигурации, определяющее какой-либо параметр программы. (В командной строке при запуске программы можно указать только один параметр - имя файла конфигурации. Никаких других параметров командной строки для программы не существует.)
Компиляция
Программа может быть скомпилирована под Linux или FreeBSD. Перед компиляцией следует запустить сценарий configure, который в зависимости от системы и различных настроек подготовит необходимый сценарий компиляции Makefile.
Состав программного обеспечения:
- Makefile.in - шаблон сценария компиляции (используется скриптом configure);
- config.h.in - шаблон заголовочного файла config.h, определяющего макросы конфигурации (используется скриптом configure);
- configure - сценарий автоконфигурирования параметров компиляции;
- configure.in - шаблон сценария автоконфигурирования для программы autoconf (не требуется для компиляции);
- dia.ini - пример файла конфигурации для программы dia;
- dia.h - заголовочный файл с константами программы;
- dia_devel.h - заголовочный файл с описанием интерфейсов базовых классов программы;
- dia.cpp - исходный текст основного блока программы;
- dia_device.cpp - исходный текст класса Device;
- dia_channel.cpp - исходный текст класса Channel;
- diacnl_*.cpp - исходные тексты классов, реализующих тот или иной канал;
- gpl.txt - лицензия GNU GPL.
Сценарий автоконфигурирования допускает следующие опции (краткую подсказку можно получить по команде ./configure --help):
--with-dl --without-dl |
Компилировать с поддержкой dynamic linking loader. Если опция не указана, сценарий пытается автоматически определить поддержку системой библиотеки dl. Если программа скомпилирована без поддержки dl, она сможет использовать только встроенные каналы (ключ ModList не распознается). | ||||||||||||||||||||||
--enable-all | Все каналы, за исключением указанных явно, компилируются как встроенные. | ||||||||||||||||||||||
--disable-all | Ни один канал, за исключением явно указанных, не встраивается в основной блок программы. Если не указан ни один из ключей --enable-all и --disable-all, используются явно указанные опции и настройки по умолчанию (см.ниже). | ||||||||||||||||||||||
--enable-CHNL | Указанный канал CHNL компилируется как встроенный. | ||||||||||||||||||||||
--enable-CHNL=MODULE | Указанный канал CHNL компилируется в модуле dia_MODULE.so. | ||||||||||||||||||||||
--disable-CHNL | Указанный канал CHNL не компилируется. Если не указан ни один из ключей --enable-CHNL и --disable-CHNL, компиляция канала CHNL определяется ключом --enable-all или --disable-all, а если не указаны и они, то настройками по умолчанию:
| ||||||||||||||||||||||
--enable-ctrl-select --disable-ctrl-select |
Если FIFO канала CTRL открыт в режиме неблокирующего чтения, то в некоторых системах (FreeBSD) вызов select сообщает, что данные доступны (достигнут конец файла), если другой процесс не подсоединен к этому FIFO, что не позволяет использовать select для обнаружения подсоединения другого процесса к FIFO. В таком случае эта ситуация проверяется периодически по таймеру. Когда указан ключ --enable-ctrl-select дескриптор FIFO проверяется вызовом select. Если указан ключ --disable-ctrl-select дескриптор FIFO опрашивается по таймеру вызовом IOCTL FIONREAD. Если не указан ни один из ключей, сценарий определяет необходимый механизм автоматически. |
Сценарий автоконфигурирования тестировался в оболочке bash 2.x.
Программа тестировалась на Linux RedHat 6.0, Linux Mandrake 8.2/9.0 (ядра 2.2.5, 2.2.14, 2.2.25, 2.4.7, 2.4.18-2.4.21; gcc 2.91.66, 2.96, 3.0-3.2; GNU libc 2.1.1, 2.1.3, 2.2.4, 2.2.5) и FreeBSD 4.5-RELEASE.
Запуск
При запуске программы в командной строке можно указать имя файла конфигурации. Если файл конфигурации не указан, используется файл "dia.ini" в текущем каталоге.
В результате работы программы создается журнал программы, который выводится в файл, указанный в настройках программы (ключ Journal). В журнале фиксируется создание / удаление каналов / устройств, выполнение процедуры идентификации, ошибки, информационные сообщения (пакеты типа 6).
Программа может быть запущена как консольное приложение либо как демон - режим работы определяется ключом SilentMode. Журнал программы создается в файле, заданном ключом Journal. Если ключ отсутствует, то в консольном режиме журнал выдается на стандартный вывод (stdout), а в режиме демона журнал не ведется.
В режиме демона программу можно запускать на стадии инициализации системы, поместив предлагаемый сценарий (diad) в каталог /etc/rc.d/init.d. Этот сценарий может быть использован с одним из трех параметров: start, stop или restart. Перед использованием сценария следует корректно установить переменные окружения, заданные в начале файла:
- DIAUSER - имя пользователя, с правами которого запускается программа. Программе требуются права root в том и только в том случае, если настройки каналов требуют использования TCP или UDP портов меньше 1024 или использования специфического устройства (например, /dev/ttyS1). (В последнем случае права для доступа к такому устройства можно изменить так, чтобы оно было доступно непривилегированному пользователю или группе пользователя, от имени которого запускается программа). В остальных случаях программа может работать с правами любого другого непривилегированного пользователя.
- DIAWORKDIR - рабочий каталог программы (становится текущим в момент запуска программы).
- DIACFGFILE - конфигурационный файл программы (можно задать путь от каталога DIAWORKDIR).
Чтобы запуск демона происходил автоматически при старте системы,
следует создать соответствующие ссылки при помощи команды /sbin/chkconfig.
Например:
/sbin/chkconfig --level 35 diad on
В результате выполнения этой команды сценарий diad будет запускаться
автоматически при переходе системы в обычный многопользовательский режим
(run-level 3) или режим X-Windows (run-level 5).
Работа программы завершается при получении сигнала SIGTERM или SIGINT (При этом в журнал заносится сообщение 'Caught termination signal...')
Сигнал SIGHUP вызывает перезапуск программы (при этом заново перечитывается файл конфигурации).
При возникновении нештатной ситуации, повлекшей за собой генерацию сигнала SIGSEGV (Segmentation fault), в журнал заносится сообщение 'Caught SIGSEGV, aborting...' и восстанавливается стандартная последовательность действий в этой ситуации: аварийное завершение работы программы и создание файла-образа процесса (core dump).
Настройки программы
В конфигурационном файле игнорируются пустые строки, строки, начинающиеся с символов '#' или ';', а также текст вне секций (кроме "сокращенного" объявления каналов - см. ниже). Маркеры начала и конца секции (<SectName> и </SectName>) должны находиться в начале строки.
В текущей версии программы маркер конца секции распознается
только по первым двум символам '</', остальные символы
до конца строки игнорируются (т.е. можно ввести "упрощенную"
форму маркера типа '</>', однако не гарантируется,
что в последующих версиях программы эта возможность останется...)
В одной строке может находиться лишь один ключ:
KeyName=KeyValue
Имени ключа (KeyName) может предшествовать любое количество пробелов и
табуляций. Имена ключей чувствительны к регистру букв. Нераспознанные ключи
игнорируются без предупреждения. Если ключ не требует присваивания значения,
то знак равно ('=') можно не указывать. Если ключу задается какое-то значение
(KeyValue), то "вокруг" знака присваивания пробелов, не относящихся к
значению ключа, не должно быть. За значением ключа строка должна сразу же
завершаться. Численные значения ключей могут быть заданы в десятичном или
шестнадцатиричном виде (в последнем случае перед числом указывается '0x').
Максимальный размер строки - 256 символов. Ключи в секциях могут
быть расположены в любом порядке. Если специально не оговорено, то ключ в
секции может быть задан только один раз (все последующие определения будут
проигнорированы без предупреждения).
Секция <General> - общие настройки программы.
- Ключ SilentMode
- Win32[+] Unix[+]
- Win32: Если ключ присутствует, программа пытается запуститься как сервис
(или псевдо-сервис - в Windows 95/98).
Linux: Если ключ присутствует, программа запускается в фоновом режиме (как демон). - Ключ Journal
- Win32[+] Unix[+]
- Если этот ключ присутствует и содержит корректное имя файла, указанный файл используется как журнал программы, в него заносятся информационные и диагностические сообщения. Если ключ отсутствует, журнал не ведется (в Linux в консольном режиме выдается на stdout).
- Ключ ExtraJrnMsg
- Win32[+] Unix[+]
- Когда ключ присутствует, в журнал помещаются дополнительные сообщения о ходе работы программы (регистрация / добавление / удаление каналов источников / ретрансляторов, создание / удаление устройств). Если ключ отсутствует, в журнал выводятся только важные сообщения.
- Ключ TimerInterval
- Win32[+] Unix[+]
- Данные будут фиксироваться и ретранслироваться не чаще, чем через заданное
этим ключом время (в сек). Если за этот промежуток времени придет несколько
значений, то зафиксировано будет среднее арифметическое.
По умолчанию: 60. Мин.значение: 1. - Ключ RetryOnError
- Win32[+] Unix[+]
- Если при работе с каким-либо каналом произойдет ошибка, то
канал будет переинициализирован не позже, чем через заданное этим
ключом время (в сек).
По умолчанию: 60. Мин.значение: 5. - Ключ StrictConn
- Win32[+] Unix[+]
- Если этот ключ имеет ненулевое значение, то сборщику после инициализации канала обязательно посылается предложение идентификации. Если от сборщика не приходит корректный запрос устройства, то не позже, чем через заданное этим ключом время (в сек), соединение разрывается. По умолчанию ключ имеет нулевое значение: предложение идентификации отсылается сборщикам только, если доступно более одного устройства, а пакет запроса устройства от сборщика ожидается бесконечно долго.
- Ключ ModList
- Win32[+] Unix[+]
- Содержит список модулей (не более 16), загружаемых в начале работы. Имена файлов модулей разделяются запятыми. В Linux-версии важно указать точный путь к файлу (например: './dia_pro.so'). Если ключ отсутствует, то загружаются все динамические библиотеки в текущем каталоге, имена которых начинаются на 'dia_'. Чтобы предотвратить загрузку любых библиотек, надо использовать этот ключ с пустым значением. Если программа скомпилирована с опцией --without-dl, ключ не распознается.
- Ключ ModVersCheck
- Win32[+] Unix[+]
- Если ключ присутствует, то перед загрузкой каждого модуля проверяется его версия. Если версия модуля не совпадает с версией программы, то модуль не загружается. При отсутствии ключа такая проверка не выполняется. Если программа скомпилирована с опцией --without-dl, ключ не распознается.
Секция <Device> - описание устройства.
В конфигурационном файле может быть любое количество таких секций. Встретив такую секцию, программа создает объект-устройство с указанными параметрами. Если устройство с указанным идентификатором уже объявлено, то секция игнорируется без предупреждения.
- Ключ ID
- Win32[+] Unix[+]
- Задает идентификатор устройства в формате, описанном в спецификации DTP/DIA. Секция без этого ключа игнорируется.
- Ключ Adjust
- Win32[+] Unix[+]
- Для ретранслирующих каналов, у которых указан ключ
Adjusted последнее полученное значение (X)
перед посылкой будет корректироваться в соответствии с полиномом:
a0+a1*X+a2*X2+a3*X3+...
При этом усреднение не выполняется. Коэффициенты a0,a1,... задаются через запятую. Количество коэффициентов ограничено размером строки (256 симв). Если ключ отсутствует, то корректировка не выполняется. - Ключ RxChannel
- Win32[+] Unix[+]
- Определяет канал, по которому будут поступать данные от этого устройства.
Канал может быть задан тремя способами:
- RxChannel=ANY - данные с этого устройства могут поступать по любому каналу.
- RxChannel=ChnlName - данные с этого устройства могут поступать по каналу с именем "ChnlName".
- RxChannel=(ParmName1=ParmVal1;ParmName2=ParmVal2;...) - создается канал с указанными параметрами и ассоциируется с этим устройством. Обязательно надо указать тип канала. Автоматически подставляется параметр ID, равный идентификатору устройства. Среди параметров можно указать имя устройства и использовать его в дальнейшем.
- Ключ TxChannel
- Win32[+] Unix[+]
- Определяет канал, по которому разрешается передавать данные от этого
устройства. (Регистрация канала, как ретранслятора, происходит во время
работы программы). Канал может быть задан тремя способами:
- TxChannel=ANY - данные с этого устройства могут ретранслироваться по любому каналу.
- TxChannel=ChnlName - данные с этого устройства разрешено ретранслировать по каналу с именем "ChnlName".
- TxChannel=(ParmName1=ParmVal1;ParmName2=ParmVal2;...) - создается канал с указанными параметрами и включается в список разрешенных. Обязательно надо указать тип канала. Автоматически подставляется параметр ID, равный идентификатору устройства. Среди параметров можно указать имя устройства и использовать его в дальнейшем.
Секция <Channel> - описание канала.
В конфигурационном файле может быть любое количество таких секций. Встретив
такую секцию, программа создает канал с указанными параметрами. Обязательно
наличие ключа "Type". Секция без этого параметра игнорируется без
предупреждения. Виды ключей зависят от типа канала. Можно использовать
"сокращенный" вариант объявления канала (записывается с начала строки вне
других секций):
(ParmName1=ParmVal1;ParmName2=ParmVal2;...)
- Общие для всех типов каналов ключи:
- Ключ Type
- Win32[+] Unix[+]
- Задает тип канала. Ключ обязателен.
- Ключ Name
- Win32[+] Unix[+]
- Задает имя канала (макс. - 47 симв.) Имя должно быть уникальным. Программа без предупреждения сама назначит имя каналу, если имя не указано или неуникальное.
- Ключ Adjusted
- Win32[+] Unix[+]
- Используется только для ретранслирующих каналов при использовании корректировки (ключ Adjust в секции <Device>). Если ключ присутствует, то в канал передается откорректированное последнее значение, в противном случае - среднее за TimerInterval значение.
- Ключ MinVal
- Unix[+]
- Определяет диапазон значений, принимаемых за корректные. Если пакет содержит значение, меньше заданного этим ключом, значение отбрасывается, а в журнал программы заносится соответствующее предупреждение (должна быть включена опция ExtraJrnMsg). По умолчанию проверка диапазона не выполняется.
- Ключ MaxVal
- Unix[+]
- Определяет диапазон значений, принимаемых за корректные. Если пакет содержит значение, больше заданного этим ключом, значение отбрасывается, а в журнал программы заносится соответствующее предупреждение (должна быть включена опция ExtraJrnMsg). По умолчанию проверка диапазона не выполняется.
Пример файла конфигурации:
<General> Journal=dia.log ExtraJrnMsg TimerInterval=60 RetryOnError=300 StrictConn=23 ;Использование ключа ModList без значения предотвращает ;загрузку дополнительных модулей ModList </General> ;Отсутствие ключа SilentMode приводит к запуску программы в нормальном режиме. <Device> ID=0.1/1 Adjust=-1.25,1,-1.1E-16 RxChannel=(Type=RS232;Device=/dev/ttyS1) TxChannel=ANY <Device>