Travailler avec des ensembles de données
Les ensembles de données FlexPro sont largement déterminés par ces quatre propriétés : DataStructure, DataType, NumberOfRows et NumberOfColumns. La propriété DataStructure détermine la structure des données de l'ensemble de données. FlexPro offre un support pour neuf structures de données, dont six sont composées d'un maximum de trois composants : La propriété DataType détermine le type de données de l'ensemble de données ou, si l'ensemble de données a une structure de données agrégée, les types de données des composants individuels qu'il contient. FlexPro supporte également plusieurs types de données pour les nombres, le texte, les valeurs booléennes, les temps et les durées. Tous les types de données ne sont pas autorisés pour tous les composants d'un ensemble de données. Les chaînes de caractères, par exemple, ne peuvent pas être utilisées comme type de données pour les ensembles de données qui ont une structure de données agrégée. Les deux propriétés NumberOfRows et NumberOfColumns déterminent la taille d'un ensemble de données. NumberOfRows peut être utilisé avec toutes les structures de données, sauf les valeurs scalaires, et détermine le nombre de lignes de données. NumberOfColumns n'est pertinent que pour les structures de données bidimensionnelles data matrix et signal series, et détermine le nombre de colonnes. Pour toutes les autres structures de données, cette propriété a la valeur Un et ne peut être modifiée. Une modification du NumberOfRows ou du NumberOfColumns peut affecter plusieurs composants d'un ensemble de données. Si, par exemple, vous augmentez le nombre de lignes d'un signal, ses composantes X et Y augmenteront.
Création d'un ensemble de données
La meilleure pratique consiste à utiliser FlexPro pour générer le code adéquat pour la création d'un ensemble de données en activant l'enregistreur de macro et en créant ensuite un ensemble de données à l'aide de l'assistant. Par exemple, pour une série de signaux avec trois colonnes contenant chacune 100 valeurs, le code devrait ressembler à ceci :
Avec 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
Un aspect important de la création efficace d'un ensemble de données consiste à appliquer les propriétés DataStructure, DataType, NumberOfRows et NumberOfColumns dans l'ordre correct. Comme l'ensemble de données est restructuré à chaque accès en écriture à l'une de ces propriétés, cet ensemble de données ne devrait atteindre sa taille maximale que lors du dernier accès. L'assistant utilise la séquence correcte. Tout d'abord, la structure de l'ensemble de données est déterminée. Les composants de l'ensemble de données sont maintenant disponibles, et leurs types de données peuvent être déterminés. Enfin, le nombre de colonnes est spécifié. L'ensemble de données est constitué d'une seule ligne contenant trois colonnes, c'est-à-dire trois valeurs. Une fois que le nombre de lignes est spécifié, l'ensemble de données s'agrandit pour inclure 300 valeurs. Enfin, le contenu des colonnes est initialisé. Cette étape peut être omise si l'ensemble de données doit être rempli de données ultérieurement.
Lecture et écriture des données d'un ensemble de données
Si vous utilisez la méthode Value de l'objet DataSet sans spécifier d'arguments, vous pouvez accéder au contenu complet de l'ensemble de données. Cette approche n'est recommandée que pour les petits ensembles de données, car le contenu complet doit être transféré dans un tableau de variantes, c'est-à-dire dans la mémoire principale. Si l'ensemble de données possède une structure de données agrégée, Value transmet tous les composants en tant qu'objet de signal. Si vous voulez affecter une variable en Visual Basic, vous devez utiliser l'instruction Set. L'exemple suivant lit un signal et calcule ensuite le Delta-t à partir de la composante X.
Dim S As Signal
Ensemble S = SignalDataSet.Value
Dim Delta As Double
Delta = S.X(1) - S.X(0)
Veuillez noter que la première valeur X dans S.X a l'indice zéro. Lors de l'accès en écriture à la propriété Value, vous devez également tenir compte du fait que la valeur ayant l'indice zéro est contenue dans le tableau.
Dim V(2) As Double
V(0) = 1
V(1) = 2
V(2) = 3
DataSet.Value = V
Ainsi, un tableau qui est dimensionné avec (n) dans Basic a n + 1 valeurs !
FlexPro peut traiter efficacement des ensembles de données de plusieurs gigaoctets. Cela est possible parce que les ensembles de données d'une certaine taille personnalisable ou plus grands sont gérés comme des fichiers sur le disque dur et ne doivent donc pas être chargés complètement dans la mémoire principale. Lorsque l'on accède aux données d'un ensemble de données via le modèle d'objet d'automatisation, les données à transférer sont toujours déplacées sous forme de tableau de variantes et donc copiées intégralement dans la mémoire principale. Avec de très grands ensembles de données, vous ne devriez donc accéder qu'à certaines parties des données. En utilisant les arguments facultatifs Row et Column de la propriété Value, vous pouvez accéder directement aux valeurs individuelles, aux lignes ou aux colonnes d'un ensemble de données.
L'exemple suivant accède aux valeurs d'une zone rectangulaire dans la composante Y d'une série de signaux et les met à zéro.
Dim Row, Col As Long
For Row = 1 To 4
Pour Col = 1 à 2
SignalSeriesDataSet.Value(fpDataComponentY, Col, Row) = 0
Suivant
Suivant
Vous pouvez également transférer les données bloc par bloc. Pour ce faire, vous pouvez utiliser l'objet ValueObjectRange, auquel vous pouvez accéder en utilisant la propriété Range de l'ensemble de données. Cela permet un accès en lecture/écriture à une section des données de l'ensemble de données.
L'exemple suivant copie les cinq premières valeurs de la composante Y d'un signal aux positions 6 à 10.
SignalDataSet.Value(fpDataComponentY, , 6, , 10).Value = _
SignalDataSet.Range(fpDataComponentY, , 1, , 5).Value
Veuillez noter ce qui suit :
•Les accès en lecture et en écriture à l'objet ValueObjectRange sont transmis directement à l'ensemble de données. L'objet ValueObjectRange ne conserve pas de copie des données de la section.
•L'objet ValueObjectRange peut également être utilisé pour les formules, les objets de liaison de données et les objets d'analyse. Dans ce cas, cependant, seul l'accès en lecture est autorisé.
•En utilisant la propriété Value de l'objet ValueObjectRange, vous pouvez non seulement accéder à la plage complète, mais aussi aux colonnes, aux lignes ou aux valeurs individuelles.
•Les indices séquentiels de l'objet ValueObjectRange commencent toujours par un, même si la plage de l'ensemble de données commence par un indice supérieur.
Dim Range As ValueObjectRange
Set Range = SignalSeriesDataSet.Range(fpDataComponentY, 1, 2, 2, 5)
Dim Data As Variant
Data = Range.Value 'Les données sont maintenant de type variant/double(0 à 1, 0 à 3)
Transfert de grands ensembles de données Section par section
L'enregistrement de données générées en continu sous forme d'ensemble de données, par exemple pendant un processus de mesure, est très courant. La solution évidente à ce problème est de créer l'ensemble de données avec la structure de données et le type de données corrects et d'initialiser le nombre de lignes avec zéro. À la réception des données, le nombre de lignes est alors augmenté ; un objet ValueObjectRange est utilisé pour introduire la valeur la plus récente dans l'ensemble de données. Pour une série de données, le code de cette procédure se présente comme suit :
Avec DataSeries
.NumberOfRows = .NumberOfRows + 1
.Value( , , .NumberOfRows) = NewValue
End With
L'inconvénient de cette procédure est toutefois que la vitesse de traitement est comparativement faible. À chaque augmentation de l'ensemble de données, FlexPro doit copier les valeurs en interne, ce qui est très coûteux, en particulier avec des ensembles de données plus importants. En outre, le volume de données transféré par chaque accès à l'interface d'automatisation de FlexPro est très faible. Vous pouvez éviter ces problèmes en rassemblant d'abord les données générées dans un tableau, puis en transférant le contenu du tableau dans son ensemble.
Dim Data(1000000 - 1) As Double
Pour i = 0 à 100000 - 1
Data(i) = NewValue
Suivant
Avec DataSeries
.NumberOfRows = .NumberOfRows + 1000000
.Range(fpDataComponentY, , .NumberOfRows - 1000000 + 1, , .NumberOfRows).Value = Data
End With