⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pqdif_ph.h

📁 电能质量PQDIF文件格式IEEE标准物理层定义
💻 H
字号:
/***  PQDIF - Power Quality Data Interchange Format**  Version 1.5****  File name:          $Workfile: pqdif_ph.h $**  Last modified:      $Modtime: 1/07/02 3:59p $**  Last modified by:   $Author: Erich $****  VCS archive path:   $Archive: /PQDIF/Document/IEEE/pqdif_ph.h $**  VCS revision:       $Revision: 22 $ ****  PHYSICAL FORMAT DEFINITIONS**  ======================================================================**  This file contains the complete definitions for the physical**  format of a PQDIF file. It contains no information about the**  _logical_ structure, which is defined in PQDIF_LG.H**  **  ======================================================================**  The current version of this file and related information**  can be found at URL:****  http://grouper.ieee.org/groups/1159/3/docs.html**  **  ======================================================================*/#ifndef PQDIF_PH_H#define PQDIF_PH_H//  The structures must be 1-byte packed.#ifdef __BORLANDC__    #pragma pack( 1 )#elif _MSC_VER    #pragma pack( push, 1 )#else    #pragma pack( 1 )#endif/***  PHYSICAL TYPE IDs AND DEFINITIONS**  ======================================================================**  The physical types are intended to be fully portable. **  ======================================================================*//***  Physical representation IDs****  NOTE:   Larger objects such as strings and BLOBs (Binary Large OBject)**          are represented as vectors of other primitive types.****  Examples**  --------**      ASCII string    Vector of ID_PHYS_TYPE_CHAR1, NULL-terminated**                      (i.e., the last character must be a NULL, to **                      correspond to a C-style string).****      Unicode string  Vector of ID_PHYS_TYPE_CHAR2.****      BLOB            vector of ID_PHYS_TYPE_INTEGER1 or**                      ID_PHYS_TYPE_UNS_INTEGER1.*/#define ID_PHYS_TYPE_BOOLEAN1           1#define ID_PHYS_TYPE_BOOLEAN2           2#define ID_PHYS_TYPE_BOOLEAN4           3#define ID_PHYS_TYPE_CHAR1              10  //  ASCII#define ID_PHYS_TYPE_CHAR2              11  //  Unicode//  Signed integers#define ID_PHYS_TYPE_INTEGER1           20#define ID_PHYS_TYPE_INTEGER2           21#define ID_PHYS_TYPE_INTEGER4           22//  Unsigned integers#define ID_PHYS_TYPE_UNS_INTEGER1       30#define ID_PHYS_TYPE_UNS_INTEGER2       31#define ID_PHYS_TYPE_UNS_INTEGER4       32//  Real/complex#define ID_PHYS_TYPE_REAL4              40#define ID_PHYS_TYPE_REAL8              41#define ID_PHYS_TYPE_COMPLEX8           42  //  Two REAL4s: real, imag#define ID_PHYS_TYPE_COMPLEX16          43  //  Two REAL8s: real, imag//  Date/time variations#define ID_PHYS_TYPE_TIMESTAMPPQDIF     50  //  Physical: TIMESTAMPPQDIF (total 12 bytes)//  GUID#define ID_PHYS_TYPE_GUID               60  //  Physical: GUID (total 16 bytes)/***  Portable primitive type definitions*/typedef char            BOOL1;typedef short           BOOL2;typedef long            BOOL4;typedef char            CHAR1;  //  ASCII string charactertypedef short           CHAR2;  //  Unicode string charactertypedef char            INT1;typedef short           INT2;typedef long            INT4;typedef unsigned char   UINT1;typedef unsigned short  UINT2;typedef unsigned long   UINT4;typedef float           REAL4;typedef double          REAL8;typedef struct _complex8    {    REAL4   real;    REAL4   image;    } COMPLEX8;typedef struct _complex16    {    REAL8   real;    REAL8   image;    } COMPLEX16;/***  Types used in structures (but not used as primitives for elements)*/typedef long            LINKABS4;typedef long            LINKREL4;typedef long            SIZE4;/***  Portable physical time structure definition****  (Modified version of time tracking used by Excel**  Excel counts days since 1900, converts to a double**  and adds to this a number less than 1.0 that**  is the fractional day.  This structure enhances**  accuracy of this method by separating out the**  days since 1900 and seconds since midnight.)*/typedef struct ts    {    UINT4   day;        //  days since January 1, 1900 UCT                        //  0xFFFFFFFF -> 4294967295 days -> a long time    REAL8   sec;        //  fractional seconds since midnight of day    } TIMESTAMPPQDIF;/***  GUID (Globally Unique IDentifier) definition**  (Used for tagging sections to identify them logically)****  The Unique Universal Identifier (UUID) is also known**  as a Globally Unique Identifier (GUID).  It is**  a randomly generated number that due to its size,**  is guaranteed to be unique in the universe.  This**  guarantees that the tags will be unique and anyone**  can generate "private" tags which will never conflict**  with the standard tags.****  GUID tags are used to mark the header of each record,**  as well as identify the elements in the internal structures.*/#ifndef GUID_DEFINED#define GUID_DEFINEDtypedef struct _GUID    {    unsigned long  Data1;    unsigned short Data2;    unsigned short Data3;    unsigned char  Data4[8];    } GUID;#endif /* GUID_DEFINED *//***  PHYSICAL TYPE HELPER INFORMATION**  ======================================================================**  Time structure helpers****  The following constant is the number of days between**  1/1/1900 and 1/1/1970.  This is used to convert between**  "C Time" and Excel style day counts**  "C Time" is a 4 byte integer representing the number of**  seconds elapsed since  January 1, 1970.**  Excel time is an 8 byte real number that represents**  the number of days elapsed since 1/1/1900.  The fractional**  part is therefore convertable to seconds since midnight.*/#define EXCEL_DAYCOUNT_ADJUST   25569L#define SECONDS_PER_DAY         86400L/***  Define GUID helpers*/#define PQDIF_IsEqualGUID(rguid1, rguid2) (!memcmp(&rguid1, &rguid2, sizeof(GUID)))#define PQDIF_DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8) \        const GUID name = { l, w1, w2, { b1, b2,  b3,  b4,  b5,  b6,  b7,  b8 } }/***  HIGH-LEVEL FILE STRUCTURE**  ======================================================================**  The top-level structure is a series of independent records with**  header and body sections.****  ======================================================================**  Fundamental premise for file format writing: File must be capable of**  being written to incrementally. For this reason, the basic structure**  is a series of independent records. Additional records can be appended**  to the file at any time.****  ======================================================================**  The top-level structure is a series of independent records with**  header and body sections:**  **      +--------------------------------+**      | Record 0 Header                |**  /---+--------------------------------+**  |   | Record 0 Body                  |**  |   +--------------------------------+**  \-->+--------------------------------+**      | Record 1 Header                |**  /---+--------------------------------+**  |   | Record 1 Body                  |**  |   +--------------------------------+** ... ...**  \-->+--------------------------------+**      | Record n Header                |**      +--------------------------------+**      | Record n Body                  |**      +--------------------------------+**  **  ======================================================================**  Note that each record header has a LINKABS4 -- an absolute offset in**  the file -- to the next record. This allows new records to be inserted**  in the middle of the file, and obsolete records to be deleted.****  ======================================================================**  All references which are defined by the type LINKREL4 are offsets **  within the record body itself -- they are not absolute offsets to the **  entire file. Thus, each record body is independent of the others. Only**  the record header need be modified if a record is moved, deleted, or**  inserted.****  ======================================================================*//***  Record header****  The header contains a GUID signature (for testing corruptness), **  header size, the size of the record that follows, record tag, and**  fill bytes to make the header 64 bytes in length*/struct c_record_mainheader    {    GUID        guidRecordSignature;    //  Signature to verify a valid header    GUID        tagRecordType;          //  Tag to identify the record type                                        //  (This also identifies the first                                        //  collection in the record.)    SIZE4       sizeHeader;             //  Size of this header in bytes    SIZE4       sizeData;               //  Size of the body in bytes (record data                                         //  that follows header)    LINKABS4    linkNextRecord;         //  Offset to the next record -- absolute                                         //  reference within the file. If 0, this                                         //  is the last record in the file.    UINT4       checksum;               //  Optional checksum (such as a 32-bit CRC)                                        //  of the record body to verify decompression.    UINT4       auiReserved[ 4 ];       //  Reserved to fill structure to 64 bytes                                        //  -- should be filled with 0    };/***  RECORD BODY STRUCTURE**  ======================================================================**  The record body always begins with a Collection element. This is**  defined below in the record structure. **  **  ======================================================================**  The fundamental premise for the standard structures is to**  assure 4 byte alignment. All of the structures conform to this **  premise. In addition, the data values associated with scalars and**  vectors must be padded out to 4-byte multiples. This _total_ size**  will be specified in the c_collection_element structure (sizeElement).****  ======================================================================**  The three main elements are:****      1. Collection   Holds an array of pointers to other elements**                      (it could contain another collection)**      2. Scalar       Holds a single data value (of a physical type)**      3. Vector       Holds an array of data values (of a physical type)**  ======================================================================*/#define ID_ELEMENT_TYPE_COLLECTION  1#define ID_ELEMENT_TYPE_SCALAR      2#define ID_ELEMENT_TYPE_VECTOR      3/***  The collection element****  ... is made by combining a c_collection with an array of **  c_collection_element, which provide pointers to the**  other elements in the collection.*/struct c_collection    {    SIZE4                   count;          //  The number of elements in this                                            //  collection.//  c_collection_element    ceElements[];   //  Array [count] of the elements                                            //  in the collection.    };struct c_collection_element    {    GUID        tagElement;     //  Identifier for this element in the collection.    //  (4) 1-byte members keep the structure 4-byte aligned.    INT1        typeElement;    //  Type of element (ID_ELEMENT_TYPE_COLLECTION,                                 //  _SCALAR or _VECTOR).    INT1        typePhysical;   //  Physical type of the value which follows                                //  (ID_PHYS_TYPE_INTEGER1, etc.). This is unused                                //  if the element is a collection and should be                                //  set to 0.    BOOL1       isEmbedded;     //  FALSE (0) - use the link to find the next element                                //  TRUE  (1) - the scalar data value is embedded                                //              (may not be used with vectors)    INT1        reserved;       //  Fill with 0    //  The following 8 bytes can point to another location in the record    //  or it can hold the actual data value (if it fits in 8 bytes).    //  This allows small scalars to be stored with much less space overhead.    union        {        //  isEmbedded  What to use        //  ----------  -------------------------------------------------        //  FALSE       Use link to find the next element (and its size).        //  TRUE        Use valueEmbedded to find the data directly.        struct            {            LINKREL4    linkElement;    //  Offset to the element -- this offset                                        //  is relative within the record body.            SIZE4       sizeElement;    //  Specifies actual size of the element                                        //  -- should be padded to even                                        //  multiples of 4 bytes            } link;        UINT1       valueEmbedded[ 8 ]; //  The scalar data value                                        //  (less than or equal to 8 bytes)        };    };/***  The scalar element****  This structure has no members, but is included**  for completeness.****      struct c_scalar**          {**      //  (type)      value;          //  A single value follows of variable length, **                                      //  depending on the physical type.**          };*//***  The vector element*/struct c_vector    {    SIZE4       count;//  (type)      values[];       //  An array of values [count] follows of                                 //  variable length, depending on the                                 //  physical type.    };/***  NOTE**  ======================================================================**  For more detailed information about how to use these physical **  structures to create a PQDIF file, see the logical structure header**  file -- PQDIF_LG.H*///  Return to previous packing value#ifdef __BORLANDC__  #include <poppack.h>#elif _MSC_VER    #pragma pack( pop )#else    #pragma pack()#endif#endif  //  PQDIF_PH_H

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -