Версия 2.4
  • история версий
  • описание
     канал ALRM
     канал CTRL
     канал DEMO
     канал FILE
     канал LOG
     канал MYSQL
     канал RS232
     каналы SSL-TX/SSL-RX
     каналы TCP-TX/TCP-RX
     каналы UDP-TX/UDP-RX
  • лицензия (GPL): rus, eng
  • download
  • протокол DTP/DIA
    Версия 2.3
  • описания:
     dia
     dia_pro
     dia_file
  • dia-on-floppy (lite)
  • download (for win32 only)
  • лицензия:
     (LGPL) rus, eng
     коммерческая
    ENGLISH
  • short description
  • thermo on Palm OS
  • IETF internet draft of DTP/DIA

    ОСНОВНОЙ МОДУЛЬ
    ver.2.3 build 0028B, 2002-02-05

    Описание

    Данный продукт условно называется "программой". Библиотека функций по приему, обработке и передаче данных в виде DTP/DIA пакетов снабжена неким интерфейсом, в некоторых случаях позволяющем использовать ее без вспомогательного программного обеспечения. В этом руководстве данный продукт преимущественно будет именоваться "программой" или "основным модулем", а в лицензионном соглашении - "библиотекой".

    Программа содержит набор объектов для реализации сборщиков / источников данных в соответствии с протоколом DTP/DIA. В роли источника данных программа выступает, передавая (ретранслируя) пакеты DTP/DIA. Программа может быть использована для построения мелких и средних распределенных информационно-измерительных систем (ИИС) (до ~100-500 устройств).

    Библиотечная ориентированность программы предоставляет гибкие средства для расширения возможностей и адаптирования к конкретной ИИС. Основной модуль содержит базовый набор функций, реализующих DTP/DIA, а также функции для работы с локально подключенными (по последовательному интерфейсу) устройствами. Существуют дополнительные модули, позволяющие заносить поступающие данные в логи, в базу данных MySQL, передавать и получать данные по TCP и UDP.

    Программа распространяется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. Данная программа является свободным программным обеспечением, вы можете распространять ее в соответствии с условиями Менее Общей Публичной Лицензии GNU.

    В этом описании следующие термины имеют специальное значение:

     

    Программа скомпилирована для двух платформ: Linux и Win32. Исходный текст общий для обеих платформ. Под Linux использовался компилятор GNU C/C++ Compiler 2.95.2. Win32-версия собрана при помощи Borland C++ 5.5 free command-line tools.

    Linux-версия тестировалась на ядрах 2.2.xx, требует библиотеки GNU libc 2.хх (кроме стандартной, использует "libdl.so" - Dynamic Linking).

    Win32-версия тестировалась под Windows 95/98, Windows 2000 и Windows XP. Не требует других библиотек, кроме стандартных: kernel32.dll, gdi32.dll, user32.dll, version.dll, shell32.dll, advapi32.dll, ctl3d32.dll, comctl32.dll, comdlg32.dll, wsock32.dll.

     

    При запуске в командной строке можно указать имя файла конфигурации. Если файл конфигурации не указан, используется файл "dia.ini" в текущем каталоге. Если файл конфигурации не найден, используются настройки по умолчанию. Следует отметить, что основной модуль не позволяет создавать каналы и устройства динамически (в процессе работы), поэтому запуск без конфигурационного файла имеет смысл только с модулем dia_pro.

    В результате работы программы создается журнал программы, который выводится в файл, указанный в настройках программы (ключ Journal). В журнале фиксируется создание / удаление каналов / устройств, выполнение процедуры идентификации, ошибки, информационные сообщения (пакеты типа 6). Данные с устройств в журнал не заносятся - для этой цели надо использовать специальные каналы, реализованные в одном из внешних модулей.

    Особенности версии для Win32

    Если имя файла конфигурации не указано в командной строке, то используется значение ключа системного реестра HKEY_LOCAL_MACHINE\Software\Lab127 Team\Dia\Profile, в который заносится имя последнего использовавшегося файла конфигурации. Если такой ключ в реестре отсутствует, то в текущем каталоге ищется файл dia.ini.

    Для каждого устройства создается дочернее окошко (клиент MDI). В таком окошке есть три поля:

    Если используется корректировка значения (ключ Adjust), то в основном поле окошка устройства выводится откорректированное значение, а в поле Acquired value - полученное значение.

    Вертикальные пределы для графика выбираются автоматически так, чтобы между верхним и нижним пределом укладывалась сетка из 2, 5, 10 или 20 делений (Значения пределов выводятся в левом нижнем и левом верхнем углах.) Число видимых узлов на графике определяется в настройках программы (ключ GraphSize). Между каждой парой узлов графика строится трехзвенная ломаная. Наклоны звеньев ломаной вычисляются на основе информации о соседних точках так, чтобы график выглядел "более плавным". На графике отображаются неоткорректированные значения даже при использовании ключа Adjust.

    Закрытие окошка устройства не приводит к уничтожению соответствующего объекта - окошко лишь временно скрывается. Снова отобразить дочернее окошко можно, сделав его активным (выбрав его имя в меню Window). Если доступно только одно устройство, то его окошко скрыть нельзя.

    Программа также создает независимое (немодальное) диалоговое окно со списком каналов. Для каждого канала в списке указано:

    Программа может выводить текущее (откорректированное) значение с одного из устройств на "панель индикации" (System Tray). В System Tray выводится значение от устройства, окошко которого активно в данный момент. Выводятся первые две значащих цифры значения и десятичная запятая, если она попадает в "поле зрения". (Например, число 1,384 будет отображено как "1.3", число 0,423 - как ".42", число 73 - как "73.", а 0,0736 - как "73") Косая черта в нижней части иконки указывает знак числа: "\" - означает минус, а "/" - плюс. Всплывающая подсказка на этой иконке содержит идентификатор устройства и полную величину текущего значения. "Левый" щелчок мыши на этой иконке переводит окно программы на передний план, а "правый" вызывает специальное меню, содержащее список устройств (выбор устройства в этом списке приводит к активизации соответствующего окошка и, как следствие, отображению его текущего значения в System Tray), команды выбора цветовой схемы иконки (Light icon - светлая иконка, Dark icon - темная иконка) и команду завершения работы программы.

    Главное меню программы:

    Функционирование программы в "тихом" режиме (ключ SilentMode) определяется типом системы и привилегиями пользователя.

    В Windows 95/98/Me запуск программы в "тихом" режиме приводит к тому, что ни главное окно программы, ни окно списка каналов не отображаются. Программа регистрирует себя как псевдо-сервис Windows 95, поэтому не отображается в списке задач и не завершается при выходе пользователя из системы (logoff). Чтобы обеспечить безусловный автоматический запуск программы при старте системы, следует создать в реестре в секции HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices текстовый параметр "Dia", содержащий путь к исполняемому файлу, например: "c:\dia\dia.exe". При необходимости укажите имя файла конфигурации. Следует учесть, что в этом случае текущим каталогом будет корневой каталог системного диска (т.е. "C:\"). Возможность отображения иконки в System Tray определяется ключом SysTrayIcon, однако при при автозапуске, а также после logoff иконка отображаться не будет.

    В Windows NT (2000, XP) программа пытается стартовать как сервис, если указан ключ SilentMode. Она открывает диспетчер управления сервисами (Service Contol Manager) и регистрирует, если это необходимо, сервис "dia". Затем запускает этот сервис и завершает работу. В режиме сервиса никакие элементы графического интерфейса программы не отображаются. Результаты работы заносятся в журнал программы и логи каналов. По умолчанию устанавливается ручной запуск сервиса, если это необходимо, в диспетчере сервисов можно установить автоматический запуск, тогда сервис "dia" будет стартовать при запуске операционной системы. Следует отметить, что сервис определяет имя файла конфигурации по ключу HKEY_LOCAL_MACHINE\Software\Lab127 Team\Dia\Profile в системном реестре. При этом текущим каталогом для сервиса становится каталог, в котором находится исполняемый файл. Если программа запущена пользователем, не обладающим привилегиями, достаточными для управления сервисами, то она запускается как обычный процесс, но не отображает главное окно.

    Если расположение исполняемых модулей программы будет изменено, то система не сможет запустить программу как сервис. В таком случае следует вручную обновить информацию в реестре о месторасположении исполняемого файла (или вообще удалить эту информацию). (Лучше это сделать с помощью специальных средств из WinNT Resorce Kit.) Как правило, после такой операции требуется перезагрузка системы.

    При возникновении нештатной ситуации, повлекшей за собой UAE (Unrecovered Application Error), в журнал заносится сообщение 'Caught EXCEPTION, aborting...' и информация об ошибке (код ошибки, адрес, параметры ошибки, регистры процессора), а работа программы завершается.

    Особенности версии для Linux

    Программа может быть запущена как консольное приложение либо как демон - режим работы определяется ключом SilentMode. Журнал программы создается в файле, заданном ключом Journal. Если ключ отсутствует, то в консольном режиме журнал выдается на стандартный вывод (stdout), а в режиме демона журнал не ведется.

    В режиме демона программу можно запускать на стадии инициализации системы, поместив предлагаемый сценарий (diad) в каталог /etc/rc.d/init.d. Этот сценарий может быть использован с одним из трех параметров: start, stop или restart. Перед использованием сценария следует корректно установить переменные окружения, заданные в начале файла:

    Чтобы запуск демона происходил автоматически при старте системы, следует создать соответствующие ссылки при помощи команды /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> - общие настройки программы.

    Ключ GMT
     Win32[+] Linux[+]
    Если этот ключ присутствует, то в пакетах DTP/DIA передается время GMT (Greenwich Mean Time). При отсутствии ключа - местное время (локальное).
    Ключ SilentMode
     Win32[+] Linux[+]
    Win32: Если ключ присутствует, программа пытается запуститься как сервис (или псевдо-сервис - в Windows 95/98).
    Linux: Если ключ присутствует, программа запускается в фоновом режиме (как демон).
    Ключ Journal
     Win32[+] Linux[+]
    Если этот ключ присутствует и содержит корректное имя файла, указанный файл используется как журнал программы, в него заносятся информационные и диагностические сообщения. Если ключ отсутствует, журнал не ведется (в Linux в консольном режиме выдается на stdout).
    Ключ ExtraJrnMsg
     Win32[+] Linux[+]
    Когда ключ присутствует, в журнал помещаются дополнительные сообщения о ходе работы программы (регистрация / добавление / удаление каналов источников / ретрансляторов, создание / удаление устройств). Если ключ отсутствует, в журнал выводятся только важные сообщения.
    Ключ TimerInterval
     Win32[+] Linux[+]
    Данные будут фиксироваться и ретранслироваться не чаще, чем через заданное этим ключом время (в сек). Если за этот промежуток времени придет несколько значений, то зафиксировано будет среднее арифметическое.
    По умолчанию: 60. Мин.значение: 1.
    Ключ RetryOnError
     Win32[+] Linux[+]
    Если при работе с каким-либо каналом произойдет ошибка, то канал будет переинициализирован не позже, чем через заданное этим ключом время (в сек).
    По умолчанию: 60. Мин.значение: 5.
    Ключ StrictConn
     Win32[+] Linux[+]
    Если этот ключ имеет ненулевое значение, то сборщику после инициализации канала обязательно посылается предложение идентификации. Если от сборщика не приходит корректный запрос устройства, то не позже, чем через заданное этим ключом время (в сек), соединение разрывается. По умолчанию ключ имеет нулевое значение: предложение идентификации отсылается сборщикам только, если доступно более одного устройства, а пакет запроса устройства от сборщика ожидается бесконечно долго.
    Ключ ModList
     Win32[+] Linux[+]
    Содержит список модулей (не более 16), загружаемых в начале работы. Имена файлов модулей разделяются запятыми. В Linux-версии важно указать точный путь к файлу (например: './dia_pro.so'). Если ключ отсутствует, то загружаются все динамические библиотеки в текущем каталоге, имена которых начинаются на 'dia_'. Чтобы предотвратить загрузку любых библиотек, надо использовать этот ключ с пустым значением.
    Ключ ModVersCheck
     Win32[+] Linux[+]
    Если ключ присутствует, то перед загрузкой каждого модуля проверяется его версия. Если версия модуля не совпадает с версией программы, то модуль не загружается. При отсутствии ключа такая проверка не выполняется.
    Ключ SysTrayIcon
     Win32[+] Linux[-]
    Если ключ присутствует, то в System Tray помещается иконка с текущей температурой на выбранном устройстве. (Показать / убрать иконку можно также при помощи команды меню в главном окне программы).
    Ключ ChannelList
     Win32[+] Linux[-]
    Если ключ присутствует, то отображается окошко с состоянием каналов. (Показать / спрятать это окошко можно также при помощи команды меню в главном окне программы).
    Ключ GraphSize
     Win32[+] Linux[+]
    Задает количество элементов в ассоциированном с каждым устройством массиве последних значений.
    Win32: используется для построения графика.
    Linux: в основном модуле не используется.
    По умолчанию: 10. Мин.значение: 10.

    Секция <Device> - описание устройства.

    В конфигурационном файле может быть любое количество таких секций. Встретив такую секцию, программа создает объект-устройство с указанными параметрами. Если устройство с указанным идентификатором уже объявлено, то секция игнорируется без предупреждения.

    Ключ ID
     Win32[+] Linux[+]
    Задает идентификатор устройства в формате, описанном в спецификации DTP/DIA. Секция без этого ключа игнорируется.
    Ключ Adjust
     Win32[+] Linux[+]
    Для ретранслирующих каналов, у которых указан ключ Adjusted последнее полученное значение (X) перед посылкой будет корректироваться в соответствии с полиномом:
     a0+a1*X+a2*X2+a3*X3+...
    При этом усреднение не выполняется. Коэффициенты a0,a1,... задаются через запятую. Количество коэффициентов ограничено размером строки (256 симв). Если ключ отсутствует, то корректировка не выполняется.
    Ключ RxChannel
     Win32[+] Linux[+]
    Определяет канал, по которому будут поступать данные от этого устройства. Канал может быть задан тремя способами:
    1. RxChannel=ANY - данные с этого устройства могут поступать по любому каналу.
    2. RxChannel=ChnlName - данные с этого устройства могут поступать по каналу с именем "ChnlName".
    3. RxChannel=(ParmName1=ParmVal1;ParmName2=ParmVal2;...) - создается канал с указанными параметрами и ассоциируется с этим устройством. Обязательно надо указать тип канала. Автоматически подставляется параметр ID, равный идентификатору устройства. Среди параметров можно указать имя устройства и использовать его в дальнейшем.
    Таких ключей в одной секции может быть несколько. Значение по умолчанию отсутствует.
    Ключ TxChannel
     Win32[+] Linux[+]
    Определяет канал, по которому разрешается передавать данные от этого устройства. (Регистрация канала, как ретранслятора, происходит во время работы программы). Канал может быть задан тремя способами:
    1. TxChannel=ANY - данные с этого устройства могут ретранслироваться по любому каналу.
    2. TxChannel=ChnlName - данные с этого устройства разрешено ретранслировать по каналу с именем "ChnlName".
    3. TxChannel=(ParmName1=ParmVal1;ParmName2=ParmVal2;...) - создается канал с указанными параметрами и включается в список разрешенных. Обязательно надо указать тип канала. Автоматически подставляется параметр ID, равный идентификатору устройства. Среди параметров можно указать имя устройства и использовать его в дальнейшем.
    Таких ключей в одной секции может быть несколько. Значение по умолчанию отсутствует.

    Секция <Channel> - описание канала.

    В конфигурационном файле может быть любое количество таких секций. Встретив такую секцию, программа создает канал с указанными параметрами. Обязательно наличие ключа "Type". Секция без этого параметра игнорируется без предупреждения. Виды ключей зависят от типа канала. Можно использовать "сокращенный" вариант объявления канала (записывается с начала строки вне других секций):
     (ParmName1=ParmVal1;ParmName2=ParmVal2;...)

    Общие для всех типов каналов ключи:
    Ключ Type
     Win32[+] Linux[+]
    Задает тип канала. Ключ обязателен.
    Ключ Name
     Win32[+] Linux[+]
    Задает имя канала (макс. - 47 симв.) Имя должно быть уникальным. Программа без предупреждения сама назначит имя каналу, если имя не указано или неуникальное.
    Ключ Adjusted
     Win32[+] Linux[+]
    Используется только для ретранслирующих каналов при использовании корректировки (ключ Adjust в секции <Device>). Если ключ присутствует, то в канал передается откорректированное последнее значение, в противном случае - среднее за TimerInterval значение.
    Встроенные реализации каналов

    Параметры каналов типа DEMO.

    Каналы типа DEMO связывают программу с виртуальным устройством, генерирующим случайные числа в диапазоне 0,3 ... 1,3 с интервалом времени, заданным ключом TimerInterval из секции <General>. Эти каналы могут использоваться лишь для приема данных.

    Ключ ID
     Win32[+] Linux[+]
    Задает идентификатор виртуального устройства в формате, описанном в спецификации DTP/DIA. Код типа и подтипа устройства игнорируются (подставляется 0.0).
    По умолчанию: 0.0/1.

    Параметры каналов типа RS232.

    Каналы типа RS232 обеспечивают работу программы с последовательным портом. Эти каналы могут использоваться лишь для приема данных.

    Ключ Device
     Win32[+] Linux[+]
    Имя последовательного порта.
    Win32: По умолчанию: COM2.
    Linux: По умолчанию: /dev/ttyS1.
    Ключ Params
     Win32[+] Linux[+]
    Параметры последовательного порта (32-битное целое число).
    Win32: фрагмент структуры Device Control Block (по умолчанию - 0x00081011)
    бит 0 :fBinary(binary mode, no EOF check)
    бит 1 :fParity(enable parity checking)
    бит 2 :fOutxCtsFlow(CTS output flow control)
    бит 3 :fOutxDsrFlow(DSR output flow control)
    биты 4-5 :fDtrControl(DTR flow control type (0:dis,1:en,2:handshk))
    бит 6 :fDsrSensitivity(DSR sensitivity)
    бит 7 :fTXContinueOnXoff(XOFF continues Tx)
    бит 8 :fOutX(XON/XOFF out flow control)
    бит 9 :fInX(XON/XOFF in flow control)
    бит 10 :fErrorChar(enable error replacement)
    бит 11 :fNull(enable null stripping)
    биты 12-13 :fRtsControl(RTS flow control (0:dis,1:en,2:handshk,3:toggle))
    бит 14 :fAbortOnError(abort reads/writes on error)
    бит 15 :(reserv)
    биты 16-19 :ByteSize(number of bits/byte, 4-8)
    биты 20-23 :Parity(0-4=no,odd,even,mark,space)
    биты 24-27 :StopBits(0,1,2 = 1, 1.5, 2)
    Linux: поле c_cflag в структуре termios (по умолчанию: 0x000008B0)
    биты 4-5 :CSIZE(CS5=0, CS6=1, CS7=2, CS8=3)
    бит 6 :CSTOP(0: 1 stop bit, 1: 2 stop bits)
    бит 7 :CREAD(read enable)
    бит 8 :PARENB(enable parity control
    бит 9 :PARODD(odd parity)
    бит 10 :HUPCL(hang up on close)
    бит 11 :CLOCAL(ignore modem lines)
    бит 31 :CRTSCTS(flow control)
    Ключ Bitrate
     Win32[+] Linux[+]
    Скорость обмена по интерфейсу RS232. В Linux-версии ограничена рядом чисел: 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200.
    По умолчанию: 9600.

    Пример файла конфигурации

    <General>
     Journal=dia.log
     ExtraJrnMsg
     TimerInterval=60
     RetryOnError=300
     StrictConn=23
    ;Использование ключа ModList без значения предотвращает
    ;загрузку дополнительных модулей
     ModList
    ;Следующие три ключа используются только в Win32-версии
     SysTrayIcon
     ChannelList
     GraphSize=50
    </General>
    ;Отсутствие ключа GMT приводит к тому, что для приходящих 
    ;пакетов будет фиксироваться локальное время.
    ;Отсутствие ключа SilentMode приводит к запуску программы в нормальном режиме.
    
    <Device>
     ID=0.1/1
     Adjust=-1.25,1,-1.1E-16
    ;В этом примере используется Win32-семантика именования портов.
     RxChannel=(Type=RS232;Device=COM1)
    ;В основном модуле нет каналов, обеспечивающих передачу (ретрансляцию),
    ;поэтому следующая строка не играет никакой роли.
     TxChannel=ANY
    <Device>