Saltar navegación

Documentación de FlexPro 2025

Trabajar con conjuntos de datos

Los conjuntos de datos de FlexPro están determinados esencialmente por las cuatro propiedades DataStructure, DataType, NumberOfRows y NumberOfColumns. La propiedad DataStructure determina la estructura de datos del conjunto de datos. FlexPro admite nueve estructuras de datos, seis de las cuales están formadas por un máximo de tres componentes X, Y y Z. La propiedad DataType determina el tipo de datos del conjunto de datos o, si tiene una estructura de datos compuesta, los tipos de datos de sus componentes individuales. FlexPro es compatible con una variedad de tipos de datos para números, textos, valores booleanos, tiempos y duraciones. No todos los tipos de datos están permitidos para todos los componentes de un conjunto de datos. Por ejemplo, las cadenas no están permitidas como tipo de datos para un conjunto de datos que tenga una estructura de datos compuesta. Las dos propiedades NumberOfRows y NumberOfColumns determinan el tamaño de un conjunto de datos. NumberOfRows se puede utilizar para todas las estructuras de datos excepto el valor escalar y determina el número de filas de datos. NumberOfColumns solo es relevante para las estructuras de datos bidimensionales matriz de datos y serie de señales, y determina el número de columnas. Para todas las demás estructuras de datos, esta propiedad tiene el valor uno y no puede modificarse. El cambio de NumberOfRows o NumberOfColumns puede afectar a varios componentes de un conjunto de datos. Por ejemplo, si aumenta el número de filas de una señal, aumentan sus componentes X e Y.

Crear un conjunto de datos

La forma más fácil de crear el código apropiado para crear un conjunto de datos es hacer que FlexPro lo cree por usted activando la grabadora de macros y luego creando un conjunto de datos con el asistente. El código generado tiene este aspecto, por ejemplo, para una serie de señales con tres columnas de 100 valores cada una:

With ActiveDatabase.RootFolder.Add("SignalSeries", fpObjectTypeDataSet)

    .DataStructure = fpDataStructureSignalSeries

    .DataType(fpDataComponentY) = fpDataTypeFloat64

    .DataType(fpDataComponentX) = fpDataTypeFloat64

    .NumberOfColumns = 3

    .NumberOfRows = 100

    .FillColumns "(NumberOfRows(i), FloatingPoint64 0, FloatingPoint64 0)"_

           , fpDataComponentY

    .FillColumns "(NumberOfRows(i), FloatingPoint64 0, FloatingPoint64 1)"_

           , fpDataComponentX

    .Update

End With

La secuencia correcta de utilización de las propiedades DataStructure, DataType, NumberOfRows y NumberOfColumns es importante para la creación eficaz del conjunto de datos. Dado que el conjunto de datos existente se reorganiza cada vez que se escribe en una de estas propiedades, el conjunto de datos solo debería alcanzar su tamaño completo con el último acceso. El asistente utiliza la secuencia correcta. En primer lugar, se define la estructura del conjunto de datos. Ahora se dispone de los componentes del conjunto de datos y se pueden determinar sus tipos. A continuación, se establece el número de columnas. El conjunto de datos solo tiene una fila con tres columnas, es decir, tres valores. El conjunto de datos solo crece hasta un total de 300 valores cuando se define el número de filas. A continuación, se inicializa el contenido de las columnas. Este paso puede omitirse si posteriormente se van a escribir datos en el conjunto de datos.

Escritura y lectura de los datos de un conjunto de datos

Si utiliza el método Value del objeto DataSet sin especificar argumentos, podrá acceder al contenido completo del conjunto de datos. Sin embargo, este procedimiento solo se recomienda para conjuntos de datos más pequeños, ya que todo el contenido debe copiarse a un campo de datos variante, es decir, a la memoria principal, para su transferencia. Si el conjunto de datos tiene una estructura de datos compuesta, Value transfiere todos los componentes como objeto de señal. Para la asignación a una variable en Visual Basic, debe utilizar la instrucción Set. El siguiente ejemplo lee una señal y luego calcula el delta-t a partir del componente X.

Dim S As Signal

Set S = SignalDataSet.Value

Dim Delta As Double

Delta = S.X(1) - S.X(0)

Tenga en cuenta también que el primer valor X en S.X tiene el índice cero. Al escribir en la propiedad Value, también hay que tener en cuenta que el valor con índice cero está contenido en el campo de datos.

Dim V(2) As Double

V(0) = 1

V(1) = 2

V(2) = 3

DataSet.Value = V

Un campo de datos dimensionado con (n) en Basic tiene, por tanto, n + 1 valores

FlexPro puede procesar eficazmente conjuntos de datos de varios gigabytes de tamaño. Esto es posible gracias a que los conjuntos de datos de un tamaño seleccionable se gestionan como archivos en el disco duro, es decir, no se cargan completamente en la memoria principal. Sin embargo, cuando se accede a los datos de un conjunto de datos a través del modelo de objetos de automatización, los datos que se van a transferir siempre se transfieren como un campo de datos variante y, por lo tanto, se copian completamente en la memoria principal. Por esta razón, solo debería acceder a partes de los datos en el caso de conjuntos de datos muy grandes. Utilizando los argumentos opcionales Row y Column de la propiedad Value, puede acceder específicamente a valores individuales, filas o columnas de un conjunto de datos.

El siguiente ejemplo accede a los valores de un área rectangular en el componente Y de una serie de señales y los pone a cero.

Dim Row, Col As Long

For Row = 1 To 4

    For Col = 1 To 2

        SignalSeriesDataSet.Value(fpDataComponentY, Col, Row) = 0

    Next

Next

También puede transferir datos en bloques. Para ello dispone del objeto ValueObjectRange, al que se accede mediante la propiedad Range del conjunto de datos. Esto permite el acceso de lectura/escritura a una sección de los datos del conjunto de datos.

El siguiente ejemplo copia los cinco primeros valores de la componente Y de una señal en las posiciones 6 a 10.

SignalDataSet.Value(fpDataComponentY, , 6, , 10).Value = _

    SignalDataSet.Range(fpDataComponentY, , 1, , 5).Value

Tenga en cuenta lo siguiente:

Los accesos de escritura y lectura al objeto ValueObjectRange se reenvían directamente al conjunto de datos. Por lo tanto, el objeto ValueObjectRange no contiene una copia de los datos de la sección.

El objeto ValueObjectRange también puede utilizarse para fórmulas y objetos de vínculo de datos y de análisis. Sin embargo, entonces solo se permite el acceso de lectura.

Puede utilizar la propiedad Value del objeto ValueObjectRange para acceder no solo a todo el rango, sino también a columnas, filas o valores individuales.

Los índices de ejecución del objeto ValueObjectRange empiezan siempre por uno, aunque el rango del conjunto de datos empiece por un índice superior.

Dim Range As ValueObjectRange

Set Range = SignalSeriesDataSet.Range(fpDataComponentY, 1, 2, 2, 5)

Dim Data As Variant

Data = Range.Value 'Data ist nun vom Typ variant/double(0 bis 1, 0 bis 3)

Transfiera grandes conjuntos de datos sección por sección

A menudo se plantea la tarea de almacenar datos que se generan continuamente, por ejemplo, durante una medición, en un conjunto de datos. La solución obvia a este problema es crear primero el conjunto de datos con la estructura y el tipo de datos correctos e inicializar el número de filas con cero. A medida que los datos se acumulan, el número de filas aumenta y el valor actual se transfiere al conjunto de datos a través de un objeto ValueObjectRange. El código para una serie de datos tiene el siguiente aspecto:

With DataSeries

    .NumberOfRows = .NumberOfRows + 1

    .Value( , , .NumberOfRows) = NewValue

End With

Sin embargo, este método tiene el inconveniente de que la velocidad de procesamiento es relativamente baja. Cada vez que se amplía el conjunto de datos, FlexPro debe copiar los valores internamente, lo cual es muy intensivo desde el punto de vista computacional, especialmente con conjuntos de datos más grandes. El volumen de datos transferidos por acceso a la interfaz de automatización FlexPro también es muy bajo. Puede evitar estos problemas recogiendo primero los datos en un campo de datos y transfiriendo después su contenido en conjunto.

Dim Data(1000000 - 1) As Double

For i =  0 to 100000 - 1

    Data(i) = NewValue

Next

With DataSeries

    .NumberOfRows = .NumberOfRows + 1000000

    .Range(fpDataComponentY, , .NumberOfRows - 1000000 + 1, _

           , .NumberOfRows).Value = Data

End With