Рис.61. Сравнение обычной программы (а) и динамического расширения (б).

В технологии DPE (Рис.61,б) стадии разработки и исполнения совмещены в одном сеансе работы. Это ценное качество для исследовательских задач, где алгоритмы обработки данных часто меняются. В пакет входит встроенный компилятор и редактор проектов Object Pascal, позволяя редактировать и компилировать динамические модули DLL (Dynamic Link Library). Программный интерфейс CRW API позволяет сразу же загружать созданные DLL модули, запускать на выполнение, выгружать, редактировать, компилировать и запускать снова, не прерывая сеанса работы. Это превращает пакет в «трансформер» - программу, которая может менять свой код. Становится возможным добавлять в пакет новые функции без изменения уже отлаженного кода, что повышает его стабильность. Поэтому большинство методов offline обработки данных реализовано в виде динамических расширений DPE.

Рассмотрим реализацию динамических расширений DPE. Загружаемая DLL библиотека расширения должна экспортировать единственную функцию CRW32_PLUGIN_FUNCTION с одним аргументом – экземпляром класса TCrwApi, возвращающую ноль при успешном вызове или ненулевой код при ошибке. Например, простейшая программа, выводящая сообщение «Hello, World!» в главную консоль пакета CRW-DAQ будет выглядеть так:

Library HelloWorld;

uses ShareMem, _CrwApi;

function PrintHelloWorld(CrwApi:TCrwApi):Integer; StdCall;

begin

CrwApi. GuiApi. Echo(‘Hello, World!’);

Result:=0;

end;

exports PrintHelloWorld name 'CRW32_PLUGIN_FUNCTION';

НЕ нашли? Не то? Что вы ищете?

end.

Класс TCrwApi объявлен в модуле _CrwApi.Pas (11,Листинг 1) и имеет только абстрактные виртуальные методы, конкретное наполнение которых реализовано в другом модуле, в дочернем классе внутри пакета CRW-DAQ. Класс TCrwApi содержит в полях другие интерфейсные классы (SysApi, GuiApi, DaqApi…), в свою очередь содержащие в полях ~500 функций, позволяющих обращаться к процедурам и данным пакета CRW-DAQ, которые необходимы для создания прикладных программ. Например, вызов CrwApi.GuiApi.Echo(…) выводит сообщение в главное консольное окно. Таким образом, через один аргумент CrwApi библиотека DLL получает доступ к большому набору функций и данных, содержащихся в скомпилированном и отлаженном ядре пакета CRW-DAQ. Описанный способ создания динамических расширений разработан автором самостоятельно и в литературе не встречался.

Отметим интересную особенность технологии DPE: хранимой единицей в ней является исходный программный код модулей на языке Object Pascal, который при отсутствии DLL тут же компилируется встроенным транслятором (раздел 1.4.2.4,Рис.61). Иначе говоря, технология DPE использует принцип JIT (Just In Time) компиляции «на лету», подобно технологиям Java и. NET.

5. Построение отказоустойчивых систем управления

Устройство пакета (раздел 1.4.2.6) является выражением общего принципа построения высоконадежных, отказоустойчивых систем управления (Рис.62), в основе которого лежат идеи дублирования (избыточности), параллелизма, изоляции, и иерархии управления [69]. Если взять простейшую программу сбора данных с централизованным управлением (Рис.62,а), где сбором данных занимается один процесс, то такая система не будет отказоустойчивой. Сбой в управляющей программе влечет потерю управления над всей системой.

Рис.62. Сравнение обычной централизованной (а) и высоконадежной иерархичной (б) структуры системы управления.

Чтобы сделать систему отказоустойчивой, надо отказаться от централизации и ввести иерархическую систему управления, основанную на автономных, параллельно работающих и изолированных управляющих процессах - контролёрах. Каждый контролёр имеет управляемый им набор аппаратуры (Рис.62,б), а для высокой надежности и отказоустойчивости – дублирующий (избыточный) набор аппаратуры, обозначенные на рисунке как «рабочий» и «дублёр» соответственно. Контролёр следит за состоянием аппаратуры и при необходимости отключает от управления вышедший из строя рабочий набор аппаратуры, заменяя его дублёром. Однако и сам контролёр может содержать ошибки, поэтому будет логично, чтобы за ним следил другой процесс-контролёр более высокого уровня, наблюдающий за состоянием подчиненных контролёров и перезапускающий их в случае сбоя или повисания. Иерархия продолжается вверх и далее, пока не останется один контролёр верхнего уровня, управляющий системой в целом. Принципиально важно, чтобы процессы работали параллельно и были максимально изолированы друг от друга, чтобы возможная ошибка локализовалась в одном процессе, не распространяясь на другие. Для повышения надежности можно также применять сторожевые таймеры (WDT, WatchDog Timer), перезапускающие процессы, которые долго не подают признаков жизни, т. е., возможно, повисшие.

Построенная таким образом система устойчива к сбоям как аппаратным (за счет дублирования), так и программным (за счет иерархии управления и изоляции ошибок). Параллелизм, как необходимое условие, естественно возникает из требования отказоустойчивости и живучести системы, т. е. сохранения её работоспособности при выходе из строя отдельных элементов (см. 10).

Рис.63. Иерархия управления в DAQ-системе пакета CRW-DAQ.

Если описывать структуру DAQ-системы в этих терминах, то контролёром верхнего уровня будет компонент DAQ Control (Рис.5), управляющий запуском и остановкой подчиненных ему контролёров – устройств Device1…Device N (Рис.63), которые входят в состав компонента DAQ Runtime и управляют аппаратурой непосредственно, либо через загружаемое расширение DPE (DLL). Виртуальная машина DAQ Pascal (Рис.14) обеспечивает изоляцию управляющих процессов.

Запускаемые из программ DAQ Pascal дочерние процессы (EXE) являются подчиненными контролёрами второго уровня. Изоляция процессов и дополнительные уровни иерархии управления повышают общую устойчивость системы. Расширения DPE не изолированы, потому их используют только для драйверов высокоскоростной аппаратуры, если скорости DAQ Pascal не хватает.

Для обеспечения работы АСКУ в реальном времени и быстрой реакции на события в системе управления, компонент DAQ разработан с учетом принципов параллелизма и разделения приоритетов, с максимальным использованием приоритетной вытесняющей многозадачности современных ОС. Параллелизм в АСКУ возникает не из желания ускорить вычисления путем разделения задачи между процессорами, как в вычислительной математике, а потому, что реальный мир параллелен и в нем одновременно происходит много процессов. Адекватно описать это можно только в параллельных вычислительных системах.

Обычные вычислительные или интерактивные программы имеют одну очередь событий и последовательную организацию вычислений (Рис.64,а), при которой задача разбивается на ряд последовательно выполняемых процедур.

Для систем управления в реальном времени этот подход непригоден, так как в общей очереди сообщений события с низким приоритетом (обработка, отображение) и высоким (измерения, управление) обрабатываются на равных правах, а значит, время реакции АСКУ становится непредсказуемым. Поэтому все АСКУ, разрабатываемые в пакете CRW‑DAQ, имеют параллельную организацию вычислений (Рис.64, б). Задача разбивается на ряд параллельно работающих служб (программных потоков или процессов), обменивающихся сообщениями и общими данными. Каждый поток обрабатывает только события одного приоритета, что позволяет высокоприоритетным потокам управления вытеснять при необходимости низкоприоритетные служебные потоки и работать без задержек.

Рис.64. Последовательная (а) и параллельная (б) организация вычислений.

Сама структура DAQ‑системы, построенной как многопоточное приложение, понуждает использовать параллелизм и приоритетную многозадачность, так как каждый драйвер, системная служба и прикладная программа на языке DAQ Pascal работает в своем программном потоке с регулируемым приоритетом и частотой опроса (Рис.16). Каждый из потоков решает свою простую и четко заданную задачу (обслуживает аппаратуру, обрабатывает данные) и взаимодействует с другими потоками через сообщения и хранилище RTDB. Регулируя приоритет и частоту опроса, можно добиться снижения влияния второстепенных потоков (визуализации и архивирования) на критически важные потоки (сбора данных и управления). Многопоточный режим организуется естественным образом, не требуя больших усилий от прикладного программиста, так как все прикладные библиотеки и встроенные функции пакета созданы для работы в многопоточной среде.

Кроме многопоточного режима поддерживается также многопроцессный режим работы алгоритмов. Благодаря созданной библиотеке функций, прикладные программы на языке DAQ Pascal могут запускать другие автономные программы в виде дочерних процессов, взаимодействующих с ними по анонимному каналу (Рис.16 и Приложение 11, Листинг 3). Обычно дочерние процессы реализуют общие службы (например, сервер речевых сообщений, DIM и Web сервер) или драйверы устройств. Выделение служб и драйверов в отдельные процессы повышает отказоустойчивость системы, так как сбой дочернего процесса не приводит к остановке всей системы, а «повисшие» или «погибшие» дочерние процессы могут быть легко перезапущены прикладной программой АСКУ.

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37