Технология сбора данных играет важную роль в промышленном управлении и автоматизации, а также в других областях. Общий процесс сбора данных выглядит следующим образом:
①Отправьте команду выбора канала на карту захвата. ②Выберите номер канала, который необходимо собрать. ③Начать аналого-цифровое преобразование. ④Подождите, пока преобразование завершится. ⑤Считайте данные с карты сбора данных. Для многоканального сбора данных при разработке программы обычно используются два метода. Метод запроса или метод прерывания. Так называемый метод запроса заключается в использовании цикла для последовательного сбора каждого канала данных. Преимущество метода запроса состоит в том, что программа проста и удобна в реализации; недостатком является то, что в процессе сбора данных центральный процессор проводит большую часть времени в ожидании, что приводит к пустой трате ресурсов. Метод прерывания принимает форму аппаратного прерывания: сначала начинается аналого-цифровое преобразование, а в конце преобразования отправляется сигнал прерывания — ЦП считывает собранные данные при ответе на прерывание карты сбора данных. Таким образом, во время ожидания преобразования ЦП может выполнять другие вычисления, не находясь в состоянии ожидания. Преимущество метода прерываний заключается в том, что ресурсы могут быть полностью использованы; однако конструкция программы сложна, особенно когда ресурсы аппаратного прерывания системы ограничены, кроме того, легко вызвать конфликты прерываний в таких операционных системах, как Windows или; Win95 пользователям не разрешено устанавливать обработчики прерываний времени, этого добиться невозможно.
---- Два рассмотренных выше метода являются методами DOS и Win95, теперь есть лучший метод - многопоточная технология; Теперь мы можем воспользоваться преимуществами многопоточной технологии для сбора данных.
---- 1. Преимущества использования многопоточности для сбора данных
---- Самое популярное в Win95/98, помимо красивого интерфейса, это многопоточность и многозадачность. В среде DOS исполняемая программа может монополизировать все ресурсы; в среде Windows, хотя это немного элементарная многозадачная среда, ваша программа все равно может контролировать все время процессора так долго, как вам нравится. Однако в Windows95 и Windows NT программа не может монополизировать все время выполнения процессора. Более того, программа — это не одна строка от начала до конца. Напротив, программа может быть разделена на несколько программных фрагментов во время выполнения и выполняться одновременно. Эти фрагменты программы, которые могут выполняться одновременно, называются потоками. В Windows 95 и Windows NT операционная система может по очереди выполнять несколько программ одновременно, что является многозадачностью.
---- Использование многопоточности для сбора данных позволяет эффективно ускорить скорость ответа программы и повысить эффективность выполнения. Обычные программы должны обрабатывать ввод пользователя, но по сравнению со скоростью выполнения ЦП скорость ввода пользователя подобна ходьбе или полету. Таким образом, ЦП будет тратить много времени на ожидание ввода пользователя (например, в среде DOS). Если используется многопоточность, один поток может использоваться для ожидания ввода пользователя; другой поток может выполнять обработку данных или другую работу. Для программ сбора данных можно использовать отдельный поток для сбора данных. Таким образом, характер сбора данных в реальном времени может быть гарантирован в максимальной степени, в то время как другие потоки могут своевременно реагировать на операции пользователя или выполнять обработку данных. В противном случае программа не сможет реагировать на действия пользователя при сборе данных; она не сможет собирать данные при ответе на действия пользователя; Особенно когда объем собранных данных велик и задача обработки данных тяжелая, длительное ожидание во время сбора вполне приемлемо, если не используется многопоточность.
---- Однако многопоточность гораздо сложнее обычного программирования. Поскольку несколько потоков могут выполняться одновременно в любое время, многие переменные и данные могут быть изменены другими потоками. Это наиболее важная проблема управления синхронизацией между потоками в многопоточных программах.
---- 2. Проблемы, которые должен решить многопоточность при сборе данных
---- На самом деле сложность многопоточного программирования носит временный характер; если вы используете традиционный C для многопоточного проектирования, то вам придется самостоятельно управлять синхронизацией между потоками. Это было бы сложно. Однако если вы используете методы объектно-ориентированного проектирования и используете Delphi для многопоточного программирования, проблема будет намного проще. Это потому, что Delphi взял на себя всю сложность многопоточности за нас, и все, что нам нужно сделать, это наследовать.
---- В частности, многопоточный сбор данных должен выполнить следующую работу:
---- ① Создайте собственный класс SampleThread из класса TThread. Это класс, который мы используем для сбора данных. При сборе просто создайте экземпляр SampleThread.
---- ② Перегрузить метод Execute суперкласса TThread. В этом методе будет конкретно выполняться задача сбора данных.
---- ③ Если вы хотите собирать и отображать одновременно, напишите несколько процессов для отображения хода сбора для вызова метода Execute.
----Наиболее часто используемые атрибуты/методы в классе TThread:
Метод создания: конструктор Create
(CreateSuspended: Boolean);
----Параметр CreateSuspended определяет, будет ли поток выполняться сразу после его создания. Если True, новый поток приостанавливается после создания; если False, поток выполняется сразу после создания.
Атрибут FreeOnTerminate:
PROperty FreeOnTerminate: Boolean;
---- Этот атрибут определяет, несет ли программист ответственность за отмену потока. Если это свойство имеет значение True, VCL автоматически уничтожит объект потока при завершении потока. Его значение по умолчанию — False.
Свойства OnTerminate:
свойство OnTerminate: TNotifyEvent;
---- Этот атрибут определяет событие, которое происходит при завершении потока.
---- Давайте рассмотрим конкретный пример:
---- 3. Реализация многопоточного сбора данных
---- Это разработанная автором программа для измерения диаграммы производительности насосного агрегата. Его функция состоит в том, чтобы собрать данные о нагрузке и смещении точки подвеса насосной установки, а затем после обработки составить рабочую диаграмму насосной установки. На рисунке 1 (опущен) показан интерфейс во время сбора данных. После нажатия кнопки «Собрать данные» программа создаст новый поток и задаст его свойства. Этот новый поток завершит задачу сбора данных. Процедура следующая:
ПроцедураTsampleForm.
DoSampleBtnClick (Отправитель: TObject);
Начинать
ReDrawBtn.Enabled := Истина;
DoSampleBtn.Enabled := Ложь;
FFTBtn.Enabled := Истина;
TheSampler:= SampleThread.Create(False);
Создать тему сбора
TheSampler.OnTerminate := FFTBtnClick;
Задачи, которые необходимо выполнить после завершения сбора
TheSampler.FreeOnTerminate := True;
Отменить после завершения сбора
Конец;
----Определение класса потока сбора выглядит следующим образом:
Тип
SampleThread = класс (TThread)
Общественный
функция AdRead (ach: byte): целое число;
Функция чтения карты A/D
процедура UpdateCaption;
Отображение времени сбора
частный
{Частные заявления}
защищенный
thes, p: настоящий;
дт: настоящий;
идентификатор: целое число;
ст, изд: LongInt;
процедура Выполнить;
Это ключ.
Конец;
---- В этом классе определена функция AdRead для управления АЦП, и эти два процесса используются для отображения хода и времени сбора данных. Следует отметить, что функция AdRead написана на ассемблере, а формат вызова параметров должен быть SafeCall.
----Код перегруженного ключа метода Execute выглядит следующим образом:
Процедура SampleThread.Execute;
Начинать
StartTicker := GetTickCount;
идентификатор:= 0;
Повторить
thes := Adread(15) * ad2mv * mv2l;
Приобретение канала 15
thep := Adread(3) * ad2mv * mv2n;
Приобретение канала 3
дт: = GetTickCount - StartTicker;
sarray[id] := thes;
parray[id] := thep;
tarray[id]:= ДТ;
вкл (идентификатор);
Синхронизировать(UpdateCaption);
Примечание. Отображение хода сбора
До идентификатора >=4096;
ред: = GetTickCount;
Синхронизировать (ShowCostTime);
Примечание. Отображение затраченного времени.
конец;
---- Как видно из приведенного выше кода, Execute существенно не отличается от обычного кода. Разница лишь в том, что при отображении хода сбора и отображении времени соответствующие процедуры можно вызывать не напрямую, а косвенно, вызывая Synchronize. Это сделано для поддержания синхронизации между процессами.
---- 4. Заключение
----Вышеуказанная программа запрограммирована с использованием Delphi 4.0 и реализована на AMD-K6-2/300. Результаты теста следующие: при использовании многопоточности для набора 4096 баллов обычно требуется от 10 до 14 секунд, если многопоточность не используется, это занимает от 1 минуты до полутора минут; Видно, что многопоточность позволяет существенно повысить эффективность выполнения программы.