La tecnología de adquisición de datos juega un papel importante en el control y la automatización industrial y otros campos. El proceso general de recogida de datos es el siguiente:
①Envíe el comando de selección de canal a la tarjeta de captura. ②Seleccione el número de canal que se recopilará. ③Inicie la conversión A/D. ④Espere hasta que se complete la conversión. ⑤Leer datos de la tarjeta de adquisición. Para la adquisición multicanal, generalmente se utilizan dos métodos en el diseño de programas. Método de consulta o método de interrupción. El llamado método de consulta consiste en utilizar un bucle para recopilar cada canal de datos en secuencia. La ventaja del método de consulta es que el programa es simple y fácil de implementar; la desventaja es que durante el proceso de recopilación, la CPU pasa la mayor parte del tiempo esperando, lo que resulta en un desperdicio de recursos. El método de interrupción adopta la forma de interrupción de hardware: primero inicie la conversión A/D y envíe una señal de interrupción al final de la conversión; la CPU lee los datos recopilados cuando responde a la interrupción de la tarjeta de adquisición. De esta manera, mientras espera la conversión, la CPU puede realizar otros cálculos sin estar en estado de espera. La ventaja del método de interrupción es que los recursos se pueden utilizar por completo; sin embargo, el diseño del programa es complejo, especialmente cuando los recursos de interrupción del hardware del sistema son escasos, es fácil causar conflictos de interrupción, además, en sistemas operativos como Windows o; Win95, los usuarios no pueden instalar controladores de interrupciones, esto no se puede lograr.
---- Los dos métodos discutidos anteriormente son métodos en DOS en Win95; ahora existe un método mejor: la tecnología de subprocesos múltiples. Ahora podemos aprovechar la tecnología de subprocesos múltiples para la recopilación de datos.
---- 1. Ventajas de utilizar subprocesos múltiples para la recopilación de datos
---- Lo más popular de Win95/98, además de la hermosa interfaz, es el multiproceso y la multitarea. En el entorno DOS, el programa en ejecución puede monopolizar todos los recursos en el entorno Windows, aunque es un entorno multitarea ligeramente rudimentario, su programa aún puede controlar todo el tiempo de la CPU tanto como desee. Sin embargo, en Windows95 y Windows NT, un programa no puede monopolizar todo el tiempo de ejecución de la CPU. Además, un programa no es una línea de principio a fin. Por el contrario, un programa puede dividirse en varios fragmentos de programa durante la ejecución y ejecutarse simultáneamente. Estos fragmentos de programa que se pueden ejecutar simultáneamente se denominan subprocesos. En Windows 95 y Windows NT, el sistema operativo puede turnarse para ejecutar múltiples programas al mismo tiempo, lo cual es multitarea.
---- El uso de subprocesos múltiples para la recopilación de datos puede acelerar efectivamente la velocidad de respuesta del programa y aumentar la eficiencia de la ejecución. Los programas generales deben procesar la entrada del usuario, pero en comparación con la velocidad de ejecución de la CPU, la velocidad de entrada del usuario es como caminar o volar. De esta manera, la CPU perderá mucho tiempo esperando la entrada del usuario (como en un entorno DOS). Si se utilizan subprocesos múltiples, se puede usar un subproceso para esperar la entrada del usuario; el otro subproceso puede realizar el procesamiento de datos u otro trabajo. Para los programas de recopilación de datos, se puede utilizar un hilo separado para la recopilación de datos. De esta manera, se puede garantizar en la mayor medida la naturaleza de la recopilación en tiempo real, mientras que otros subprocesos pueden responder a las operaciones del usuario o realizar el procesamiento de datos de manera oportuna. De lo contrario, el programa no puede responder a las operaciones del usuario al recopilar datos; Especialmente cuando la cantidad de datos recopilados es grande y la tarea de procesamiento de datos es pesada, la larga espera durante la recopilación es muy aceptable si no se utilizan subprocesos múltiples.
---- Sin embargo, el subproceso múltiple es mucho más complejo que la programación ordinaria. Dado que se pueden ejecutar varios subprocesos al mismo tiempo en cualquier momento, otros subprocesos pueden modificar muchas variables y datos. Este es el problema de control de sincronización más crítico entre subprocesos en programas multiproceso.
---- 2. Problemas que deberían resolverse mediante subprocesos múltiples para la recopilación de datos
---- De hecho, la complejidad de la programación de subprocesos múltiples es temporal; si usa C tradicional para el diseño de subprocesos múltiples, debe controlar la sincronización entre subprocesos usted mismo. Eso sería complicado. Sin embargo, si utiliza métodos de diseño orientado a objetos y utiliza Delphi para programación multiproceso, el problema será mucho más sencillo. Esto se debe a que Delphi ha manejado la complejidad de los subprocesos múltiples por nosotros y todo lo que tenemos que hacer es heredar.
---- Específicamente, la recopilación de datos de subprocesos múltiples debe completar el siguiente trabajo:
---- ① Derive su propia clase SampleThread de la clase TThread. Esta es la clase que utilizamos para la recopilación de datos. Al recopilar, simplemente cree una instancia de SampleThread.
---- ② Sobrecargue el método Execute de la superclase TThread. En este método, la tarea de recolección de datos se realizará específicamente.
---- ③ Si desea recopilar y mostrar al mismo tiempo, escriba varios procesos para mostrar el progreso de la recopilación para que lo llame el método Execute.
----Los atributos/métodos más utilizados en la clase TThread son los siguientes:
Método de creación: constructor Crear
(Crear suspendido: booleano);
----El parámetro CreateSuspended determina si el hilo se ejecutará inmediatamente después de su creación. Si es Verdadero, el nuevo hilo se suspende después de la creación; si es Falso, el hilo se ejecuta inmediatamente después de la creación.
Propiedad FreeOnTerminate:
Propiedad FreeOnTerminate: booleano;
---- Este atributo determina si el programador es responsable de cancelar este hilo. Si esta propiedad es Verdadera, VCL destruirá automáticamente el objeto del subproceso cuando el subproceso finalice. Su valor predeterminado es Falso.
Propiedades al terminar:
propiedad OnTerminate: TNotifyEvent;
---- Este atributo especifica un evento que ocurre cuando termina el hilo.
---- Veamos un ejemplo específico:
---- 3. Implementación de recopilación de datos multiproceso
---- Este es un programa desarrollado por el autor para medir el diagrama de rendimiento de una unidad de bombeo. Su función es recopilar los datos de carga y desplazamiento del punto de suspensión de la unidad de bombeo y luego hacer un diagrama de trabajo de la unidad de bombeo después del procesamiento. La Figura 1 (omitida) muestra la interfaz durante la recopilación de datos. Después de hacer clic en el botón "Recopilar datos", el programa creará un nuevo hilo y establecerá sus propiedades. Este nuevo hilo completará la tarea de recopilación de datos. El procedimiento es el siguiente:
ProcedimientoTsampleForm.
DoSampleBtnClick(Remitente: TObject);
Comenzar
ReDrawBtn.Enabled:= Verdadero;
DoSampleBtn.Enabled := Falso;
FFTBtn.Enabled:= Verdadero;
TheSampler := SampleThread.Create(False);
Crear hilo de colección
TheSampler.OnTerminate := FFTBtnClick;
Tareas a realizar una vez finalizada la recogida.
TheSampler.FreeOnTerminate: = Verdadero;
Deshacer una vez completada la recopilación
Fin;
----La definición de clase del hilo de colección es la siguiente:
Tipo
SampleThread = clase(TThread)
Público
función AdRead(ach: byte): entero; llamada segura;
Función para leer tarjeta A/D
procedimiento UpdateCaption;
Mostrar el tiempo de recogida
privado
{Declaraciones privadas}
protegido
thes, thep: real;
dt: real;
identificación: número entero;
st, ed: LongInt;
procedimiento Ejecutar; anular;
Ésta es la clave.
Fin;
---- En esta clase, se define una función AdRead para operar la tarjeta A/D, y los dos procesos se utilizan para mostrar el progreso y el tiempo de recolección. Cabe señalar que la función AdRead está escrita en ensamblador y el formato de llamada de parámetros debe ser una llamada segura.
----El código del método de clave sobrecargada Ejecutar es el siguiente:
Procedimiento SampleThread.Execute;
Comenzar
IniciarTicker := GetTickCount;
identificación: = 0;
Repetir
estos := Adread(15) * ad2mv * mv2l;
Adquirir el canal 15
thep := Adread(3) * ad2mv * mv2n;
Adquirir canal 3
dt := GetTickCount - IniciarTicker;
sarray[id] := estos;
parray[id] := thep;
tarray[id] := dt;
inc(identificación);
Sincronizar(UpdateCaption);
Nota: Mostrar el progreso de la recopilación
Hasta id >=4096;
ed := GetTickCount;
Sincronizar(ShowCostTime);
Nota: Muestra el tiempo empleado.
fin;
---- Como se puede ver en el código anterior, no existe una diferencia esencial entre Ejecutar y el código ordinario. La única diferencia es que al mostrar el progreso de la recopilación y mostrar el tiempo transcurrido, los procedimientos respectivos no se pueden llamar directamente, sino indirectamente llamando a Synchronize. Esto se hace para mantener la sincronización entre procesos.
---- 4. Conclusión
----El programa anterior está programado usando Delphi 4.0 e implementado en AMD-K6-2/300. Los resultados de la prueba son los siguientes: cuando se utilizan subprocesos múltiples, generalmente se necesitan de 10 a 14 segundos para acumular 4096 puntos; si no se utilizan subprocesos múltiples, se necesitan de 1 minuto a 1 minuto y medio; Se puede ver que el subproceso múltiple puede mejorar significativamente la eficiencia de ejecución del programa.