[石油能源] 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数据文件结构。