[石油能源] WIS文件说明及相关算法

WIS(Well Information Standard)是中国石油天然气总公司推出的Forward 测
井处理平台所采用的一种测井数据记录格式,WIS 数据格式可记录以下测井数据:
⑴ 常规测井曲线(深度连续)。
⑵ 点测井斜曲线(深度不连续)。
⑶ 波形数据(深度连续,时间连续,时间范围相同)。
⑷ 地层测试数据(深度离散,时间连续,时间范围不定)。
⑸ 生产测井数据(时间离散(不同次测井),深度离散,时
间离散)。
⑹ 二维表格数据。
⑺ 二进制数据流(参数文件,图片,其他各种数据)

图1.1为WIS数据存储结构:

 
WIS数据总共分为三大块:文件头、数据对象头和数据对象记录体。其中文件头由10字节文件标识和56字节文件头组成,共占用66字节。

文件头:记录WIS文件创建的日期,数据量,文件大小及机器类型等信息。在读写WIS文件的时候,它将是相当重要的依据。

数据对象头:用于记录每个数据对象的相关信息,包括:对象的主、子属性,修改时间,对象状态及数据体偏移量等信息。

在WIS数据文件中,包含的三大数据对象:通道对象、表对象、流对象。

其中,通道对象又分分对象数据头及对象维度信息。

对象数据头包含单位、别名、单位别名、极值、维数量及数据类型等信息。

对象维度信息包含指定维的名称、单位、别名、起始值、增量及数据采样点数量信息(这些信息足够根据相关的算法计算相关数据)

接下来,WIS数据的又一大对象——流对象。它存在的目的是可以存储测井工程计算的时候,比如一些参数信息及相关配置和二进制数据信息(可存储任何二进制数据)

WIS文件头结构定义:

    /// <summary>
    /// WIS数据文件结构体定义
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct WISDATAFILE
    {
        /// <summary>
        /// WIS文件标识(默认值 WIS 1.0)
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 10)]
        public string Version;
        [MarshalAs(UnmanagedType.Struct)]
        public WISDATAHEAD WisDataHead;

    }
    /// <summary>
    /// WIS数据文件头结构定义
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct WISDATAHEAD
    {
        /// <summary>
        /// 创建设备的类型
        /// PC=0; SUN=1; IBM=2; HP=3;
        /// </summary>
        public short wMachineType;
        /// <summary>
        /// WIS文件允许最大的对象数量(缺省:512)
        /// </summary>
        public short wMaximumRecord;
        /// <summary>
        /// WIS文件当前对象数量
        /// </summary>
        public short wCurrentRecord;
        /// <summary>
        /// WIS文件对象占用磁盘块长
        /// </summary>
        /// <remarks>
        /// WIS文件对象占用磁盘空间以块为单位,该值指示每一数据块的字节数
        /// </remarks>
        public short wBlockLength;
        /// <summary>
        /// 对象入口记录从文件开始的偏移量
        /// </summary>
        public uint dwEntryOffset;
        /// <summary>
        /// 对象数据记录从文件开始的偏移量
        /// </summary>
        public uint dwDataOffset;
        /// <summary>
        /// WIS数据文件的字节数大小
        /// </summary>
        public uint dwFileSize;
        /// <summary>
        /// WIS文件创建的时间
        /// </summary>
        public uint dwCreationDateTime;
        /// <summary>
        /// 保留字节
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string Reserved;
    }

  WIS数据对象入口结构:

    /// <summary>
    /// WIS数据结构对象入口
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct WISDATAOBJECTENTRY
    {
        /// <summary>
        /// 名称
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string Name;
        /// <summary>
        /// 状态
        /// [正常:0 抛弃:1 删除:2]
        /// </summary>
        public uint Status;
        /// <summary>
        /// 主属性
        /// [通道对象=1; 表对象=2; 流对象=3;]
        /// </summary>
        public short wAttr;
        /// <summary>
        /// 子属性
        /// 通道对象子属性[曲线对象=1; 波形对象=2; 地层测试对象=3; 时深时对象=4;]
        /// 流对象子属性[ASCII码流=1; 二进制流=2;]
        /// </summary>
        public short wSubAttr;
        /// <summary>
        /// 对象数据体从文件开始处的偏移量
        /// </summary>
        public uint dwPosOffset;
        /// <summary>
        /// 对象数据体占用磁盘的块数。
        /// </summary>
        public uint dwBlock;
        /// <summary>
        /// 对象产生的时间
        /// </summary>
        public uint dwTimeCreate;
        /// <summary>
        /// 对象最近修改时间
        /// </summary>
        public uint dwTimeWrite;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string Reserved;
    }

  WIS数据结构通道对象及通道维信息定义:

    /// <summary>
    /// WIS数据结构通道对象定义
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct WISDATACHANNEL
    {
        /// <summary>
        /// 单位
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
        public string Unit;
        /// <summary>
        /// 别名
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string AliasName;
        /// <summary>
        /// 单位别名
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string AliasUnit;
        /// <summary>
        /// 数据类型
        /// </summary>
        public short wDataType;
        /// <summary>
        /// 数据类型长度
        /// </summary>
        public short wDataLength;
        /// <summary>
        /// 最小值(测井曲线缺省左刻度值)
        /// </summary>
        public float wMinValue;
        /// <summary>
        /// 最大值(测井曲线缺省右刻度值)
        /// </summary>
        public float wMaxValue;
        /// <summary>
        /// 保留字节
        /// </summary>
        public short Reserved;
        /// <summary>
        /// 维信息数量
        /// </summary>
        public short wDimension;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
        public WISDATADIMENSION[] DataDimension;
    }

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct WISDATADIMENSION
    {
        /// <summary>
        /// 名称
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
        public string Name;
        /// <summary>
        /// 单位
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 8)]
        public string Unit;
        /// <summary>
        /// 别名
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
        public string AliasName;
        /// <summary>
        /// 开始值
        /// </summary>
        public float StartValue;
        /// <summary>
        /// 增量
        /// </summary>
        public float Increment;
        /// <summary>
        /// 采样点数量
        /// </summary>
        public uint dwSample;
        /// <summary>
        /// 最大采样点数量
        /// </summary>
        public uint dwMaximumSample;
        /// <summary>
        /// 采样点占用字节数
        /// </summary>
        public uint dwBytesOfSample;
        /// <summary>
        /// 数据类型
        /// </summary>
        public short wDataType;
        /// <summary>
        /// 保留字节
        /// </summary>
        public short wReserved;
    }

  WIS数据文件表结构相关定义:

    /// <summary>
    /// WIS数据文件表结构
    /// </summary>
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct WISDATATABLE
    {
        /// <summary>
        /// 名称
        /// </summary>
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
        public string Name;
        /// <summary>
        /// 数据类型
        /// </summary>
        public short wFieldType;
        /// <summary>
        /// 数据类型长度
        /// </summary>
        public short wFieldLength;
        /// <summary>
        /// 保留字节
        /// </summary>
        public uint dwReserved;
    }

  特别值在表结构这说一下的是,表结构由于存放的是二维表结构数据,在国内目前只有中海油准备实施二维核磁测井,所以国内暂无任何相关的解决方案,包括Forword在处理表结构的时候也没实现将表字段对象存入至WIS文件中,而是在系统目录通过定义一个defulttable.ini文件来完成随时修改的表结构数据(当然,我们在项目中也可以将它存入流对象^_^)

WIS数据文件流结构:

    /// <summary>
    /// WIS数据文件流结构
    /// </summary>
    [StructLayout(LayoutKind.Sequential, Pack = 1)]
    public struct WISDATASTREAM
    {
        /// <summary>
        /// 数据流长度
        /// </summary>
        public uint dwStreamLength;
    }

  以上便是基本的WIS数据文件结构。

原文地址:https://www.cnblogs.com/briny/p/2822563.html