Как создать составной набор данных на HDF5 C # - PullRequest
0 голосов
/ 11 июня 2018

мне нужно записать некоторые данные в файл HDF5, у меня есть список объектов класса "OPC_UA" внутри класса "BV", я хочу создать набор данных с именем BV и внутри набора данных iЯ хочу иметь список объектов "OPC_UA", у класса OPC_UA есть 3 атрибута, Long int, одно значение с плавающей запятой и Datetime, которое я преобразую в метку времени, я не могу заставить его работать, маршал.SizeOf () не работает с классами, но я не могу сделать это как структуру ... Вот мой код:

 public void CriaHDF5Customizado(PackingConfigFile pf)
    {
        H5FileId fileId = H5F.create("pmdfq.h5", H5F.CreateMode.ACC_TRUNC);

        H5GroupId infoGroupId = H5G.create(fileId, "informations");
        H5G.close(infoGroupId);
        H5GroupId datasetGroupId = H5G.create(fileId, "datasets");

        long[] dims = new long[1];


        foreach(BasicVariable bv in pf.basicVariableList.bvList)
        {
            OPC_UA aux = new OPC_UA();
            var xx = bv.bvData;
            int tamanho = Marshal.SizeOf(typeof(OPC_UA));
            dims[0] = (long)bv.bvData.Count;
            // dims[1] = (long)4;
            H5DataSpaceId spaceId = H5S.create(H5S.H5SClass.SCALAR);
            H5DataTypeId dataTypeId = H5T.create(H5T.CreateClass.COMPOUND, Marshal.SizeOf(typeof(OPC_UA)));

            H5T.insert(dataTypeId, "TimeStamp", 0, new H5DataTypeId(H5T.H5Type.NATIVE_UINT));
            H5T.insert(dataTypeId, "Quality", Marshal.SizeOf(H5T.H5Type.NATIVE_UINT), new H5DataTypeId(H5T.H5Type.NATIVE_UINT));
            H5T.insert(dataTypeId, "Value", 2* Marshal.SizeOf(H5T.H5Type.NATIVE_UINT), new H5DataTypeId(H5T.H5Type.NATIVE_INT));

            H5DataSetId dataSetId = H5D.create(datasetGroupId, bv.bvTag, dataTypeId, spaceId);


            //H5D.write(dataSetId, new H5DataTypeId(H5T.H5Type.STD_REF_OBJ), new H5Array<OPC_UA>(bv.bvData.ToArray()));
            H5D.writeScalar(dataSetId, dataTypeId, ref xx);
            H5D.close(dataSetId);
        }
        H5G.close(datasetGroupId);


        H5F.close(fileId);
    }

А это OPC UA Class

   public class OPC_UA
{
    public DateTime timeStamp { get; set;  }
    public string data { get; set; }
    public Int64 quality { get; set; }

    public OPC_UA(DateTime? ts = null ,string dt = "",Int64 qlt = -99)
    {
        if (!ts.HasValue)
        {
            timeStamp = DateTime.Now;
        }
        data = dt;
        quality = qlt;
    }

1 Ответ

0 голосов
/ 03 августа 2018
public DateTime timeStamp { get; set;  } 

DateTime не является атомарным типом данных.Преобразуйте его в длинные тики Int64.Тогда вы могли бы написать это.

public DateTime timeStamp 
    {
        get { return new DateTime(StartTimeTicks); }
        set
        {
            StartTimeTicks = value.Ticks;
        }
    }
public long StartTimeTicks;

Конструктор также может препятствовать этому.

Обходной путь может быть создание структуры.Примечание. Создайте структуру полей или свойств в зависимости от полей (GetFields) или (GetProperties), которые вы будете использовать в отражении для чтения.

 public structure OPC_UA
 {

    public string data;
    public Int64 quality ;
    public DateTime timeStamp 
    {
        get { return new DateTime(StartTimeTicks); }
        set
        {
            StartTimeTicks = value.Ticks;
        }
    }
    public long StartTimeTicks;
 }

Hdf5DotnetTools - эторабочая оболочка C # на Hdf.PInvoke .Вы можете написать составной набор данных, используя структурный список C #.

Если у вас есть какие-либо трудности с использованием функций Hdf.PInvoke или Hdf5DotnetTools, вы можете использовать его проект UnitTest.

...