/** * @file: $RCSfile: ied.h,v $ * @brief: $设备数据结构定义 * * @version: $Revision: 1.1 $ * @date: $Date: 2018/11/24 06:54:49 $ * @author: $Author: lizhongming $ * @state: $State: Exp $ * * @latest: $Id: ied.h,v 1.1 2018/11/24 06:54:49 lizhongming Exp $ * */ #ifndef _IED_STRUCT_H #define _IED_STRUCT_H #include "IEC60870DEF.h" //#include "drvcommon.h" typedef byte_t channel_size_type; #ifdef _OS_WIN32_ #pragma pack(push,1) #endif #define PRV_ANA_EXTENSION (1) //模拟量用户扩展属性 总数 #define PRV_DIGIT_EXTENSION (3) //遥信量用户扩展属性 总数 #define PRV_EVENT_EXTENSION (3) //事件量用户扩展属性 总数 #define PRV_PULSE_EXTENSION (2) //遥测量用户扩展属性 总数 //-----模拟量用户扩展---------------// #define ANA_EXTENSION_ALARM (0) //告警:告警等级;告警声音文件名 typedef struct analog_t analog_t; struct analog_t { byte_t type; /**< 电压/电流/有功功率/无功功率/频率/功率因素/其它 */ float initval; /**< 缺省值 */ float minimum; /**< 取值下限 */ float maximum; /**< 取值上限 */ float step; /**< 步长 */ byte_t integral; /**< precision ( n , m ) - n */ byte_t decimal; /**< precision ( n , m ) - m */ float offset; /**< 实际值转换基数 */ float factor; /**< 实际值转换系数 */ float threshold; /**< 门限值 */ float smooth; /**< 平滑系数 */ float lower; /**< 告警下限值 */ float higher; /**< 告警上限值 */ float lowest; /**< 下下限告警值 */ float highest; /**< 上上限告警值 */ float blur; /**< 阀值模糊系数 */ char dimension[SHORTNAME]; /**< 量纲ASCII格式(A/V/kV/kvar/kW/MW etc.) */ void *ext[PRV_ANA_EXTENSION]; /**< 保护管理机扩展 */ }ALIGNPACKED; typedef struct ana_extention_t ana_extention_t; struct ana_extention_t{ int alarm_level; int save_flag; char *high_alarm_sound; char *low_alarm_sound; char *recovery_alarm_sound; }; typedef struct digit_t digit_t; #define DGT_TYP_UNDEF 0x00 /**< 未定义 */ #define DGT_TYP_SAMPLING 0x01 /**< 采样 */ #define DGT_TYP_EVENT 0x02 /**< 事件 */ #define DGT_TYP_ALARM 0x03 /**< 告警 */ #define DGT_TYP_OPERATE 0x04 /**< 操作 */ #define DGT_TYP_SYSTEM 0x05 /**< 系统 */ /** 数字量私有属性 */ struct digit_t { byte_t type; /**< 采样/事件/告警/操作/系统 */ byte_t initval; /**< default zero value(0 or 1) */ byte_t level; /**< level */ byte_t snd_timer; /**< sound play timer (s) */ byte_t rst_timer; /**< auto restore timer (s) */ uint16_t act_lim; /**< (0 ==> 1)动作告警上限 */ uint16_t rst_lim; /**< (1 ==> 0)动作告警上限 */ uint16_t act_num; /**< (0 ==> 1)动作上限(不需界面录入) */ uint16_t rst_num; /**< (1 ==> 0)动作上限(不需界面录入) */ //第二版去掉 //char on[SHORTNAME]; /**< 0==>1动作名称(ASCII格式) */ //char off[SHORTNAME]; /**< 1==>0动作名称(ASCII格式) */ void *ext[PRV_DIGIT_EXTENSION]; /**< 保护管理机扩展 */ }ALIGNPACKED; #define DIGIT_STATE_0_DESCRIBE (0) #define DIGIT_STATE_1_DESCRIBE (1) #define DIGIT_STATE_2_DESCRIBE (2) #define DIGIT_STATE_3_DESCRIBE (3) #define DIGIT_OPEN_SOUND (0) #define DIGIT_CLOSE_SOUND (1) #define DIGIT_ALARM_SOUND (2) typedef struct state_describe_extention_t state_describe_extention_t; struct state_describe_extention_t{ char *state_describe[4]; /**< 状态0,1,2,3的描述 */ }; typedef struct sound_file_name_extention_t sound_file_name_extention_t; struct sound_file_name_extention_t{ char *sound_file_name[3]; /**< 开报警声、合报警声、事故报警声 */ }; typedef struct epfi_addt_extension_t epfi_addt_extension_t; struct epfi_addt_extension_t { uint32_t fun; uint32_t inf; }; typedef struct pulse_t pulse_t; /** Integrated totals private attr */ #define PLS_TYP_UNDEF 0x00 /**< 未定义 */ #define PLS_TYP_PLUS_POWER_HV 0x01 /**< 正向有功 */ #define PLS_TYP_PLUS_POWER_NO 0x02 /**< 正向无功 */ #define PLS_TYP_NEGATIVE_POWER_HV 0x03 /**< 反向有功 */ #define PLS_TYP_NEGATIVE_POWER_NO 0x04 /**< 反向无功 */ struct pulse_t { byte_t type; /**< 正向有功/正向无功/反向有功/反向无功 */ uint32_t save_flag; /**< 存储标记 */ uint32_t initval; /**< default value */ uint32_t minimum; /**< minimum value */ uint32_t maximum; /**< maximum value */ uint32_t step; /**< 步长 */ //changed by zhancg 2017-04-05 配系数 // uint32_t offset; /**< 实际值转换基数 */ // uint32_t factor; /**< 实际值转换系数 */ // uint32_t threshold; /**< 门限值 */ // uint32_t smooth; /**< 平滑系数 */ float offset; /**< 实际值转换基数 */ float factor; /**< 实际值转换系数 */ float threshold; /**< 门限值 */ float smooth; /**< 平滑系数 */ char dimension[SHORTNAME]; /**< 量纲ASCII格式(kvar/kW/MW etc.) */ void *ext[PRV_PULSE_EXTENSION]; }ALIGNPACKED; typedef struct pluse_stage_limits_extention_t pluse_stage_limits_extention_t; struct pluse_stage_limits_extention_t{ uint32_t limits[3]; /**< 峰电度限值,日电度限值,月电度限值 */ }; typedef struct pluse_stage_const_extention_t pluse_stage_const_extention_t; struct pluse_stage_const_extention_t{ char* stage[8]; /**< 峰时段1,峰时段2,峰时段3,峰时段4,谷时段1,谷时段2,谷时段3,谷时段4 */ }; // typedef struct command_t command_t; /** 命令消息结构 */ struct command_t { ticks_t ticks; /**< Ticks when command generated */ apr_time_t tmlimit; /**< 命令执行完成的限制时间 */ byte_t state; /**< ACTIVE、FINISH or TIMEOUT */ byte_t channel; /**< command channel no */ byte_t flag; /**< General、System or Special */ byte_t typ; /**< Command TYPE(IEC60870-5-101) */ uint32_t ied; /**< Controlled IED id */ uint32_t group; /**< Controlled group id */ uint32_t dot; /**< Controlled element */ byte_t cot; /**< Cause of transmission */ byte_t data[255]; /**< Command data */ }ALIGNPACKED; // /** status_t code definiens */ #define STATUS_NORMAL 0 /**< 正常 */ #define STATUS_NOINIT 1 /**< 未初始化 */ #define STATUS_OVERTIME 2 /**< 通信超时 */ #define STATUS_BREAKOFF 3 /**< 通信中断 */ #define STATUS_BLOCKED 4 /**< 封锁 */ #define STATUS_TESTING 5 /**< 测试 */ #define STATUS_NOTDEF 6 /**< 未配置(本运行状态没有配置) */ typedef uint16_t status_t; /**< 设备或通信节点的运行状态 */ typedef struct alias_t alias_t; /** 数据元素的别名结构 */ struct alias_t { /**< 数据元素的别名结构 */ uint32_t id; /**< 别名信息地址 */ uint32_t parent; /**< 所指代的IED */ uint32_t group; /**< 所指代的IED内的组号 */ uint32_t dot; /**< 所指代的IED内的序号 */ value_t* value; /**< 运行时刻实时数据 */ }; typedef struct ied_t ied_t; typedef struct group_t group_t; typedef struct element_t element_t; /** 数据信息元素的结构 */ struct element_t { uint32_t id; /**< Identification, Information Address */ uint32_t flags; /**< flags define */ byte_t type; /**< IEC60870-5-101 TYP.(IEC60870DEF.h) */ byte_t code; /**< Data code type.(BIN/ASCII/BCD/etc.) */ uint32_t parent; /**< 隶属设备 */ uint32_t group; /**< 数据组号 */ uint32_t dot; /**< 数据序号 */ uint16_t size; /**< 数据宽度(以字节为单位) */ char name[LONGNAME]; /**< 数据名称 */ char *aliasname; /**< 数据点别名,如用于中文名称对应的英文名称 ++EPFI++ */ void *owner; /**< 私有属性结构(analog_t/digit_t/..../etc.) */ void *script; /**< 关联的计算表达式 */ /** Runtime generate */ value_t value; /**< 运行时刻实时数据缓冲区 */ ticks_t last; /**< 最后变化时间 */ uint32_t state; /**< 数据状态 */ byte_t funtype; /**< 继承自所属组的类型,表示数据功能类型 */ uint16_t index; /**< 数据元素索引 */ uint16_t n_alias_add_1; /**< 分配的数据别名缓冲区的大小(预留1,动态定订购用) */ uint16_t n_alias; /**< 数据别名数组元素个数 */ alias_t* alias; /**< 数据别名索引数组 */ uint16_t alias_pos; /**< 数据别名当前位置 */ uint32_t offset; /**< 数据在设备数据缓冲区内的偏移索引 */ group_t *grp; /**< 所属数据组句柄 */ ied_t *ied; /**< 所属设备句柄 */ /* Extend property */ void *sys_ext; /**< 数据点的系统扩展属性,由基本库实现 */ void *app_ext; /**< 数据点的应用扩展属性,由应用库实现 */ void *usr_ext; /**< 数据点的用户扩展属性,由应用程序实现 */ }; /** group_t->type definiens */ #define GRP_CUSTOM 0 /**< User custom type */ #define GRP_ANALOGUE 1 /**< Analogue type */ #define GRP_DIGITAL 2 /**< Digital type */ #define GRP_PULSE 3 /**< Pulse type */ #define GRP_CONTROL 4 /**< Control type */ #define GRP_SYSTEM 5 /**< System operation type */ #define GRP_EVENT 6 /**< Protect event type */ #define GRP_ALARM 7 /**< Alarm type */ #define GRP_SETTING 8 /**< Fixed value type */ #define GRP_STATUS 9 /**< State of device */ #define GRP_VDI 10 /**< 软压板 type */ #define GRP_STEPPOS 11 /**< Step position type */ #define GRP_COMBO 12 /**< combo/compute type */ #define GRP_SIMANA 13 /**< 模拟量 */ #define GRP_SETAREA 14 /**< 定值区 */ #define GRP_ACCANA 15 /**< 录波模拟量 */ #define GRP_ACCDGT 16 /**< 录波开关量 */ #define GRP_SETPOINT 18 /**< Set point type for 101,104 protocol used only */ #define GRP_STEPCONTROL 19 /**< 步位置调节组 */ /** 数据组结构 */ struct group_t { uint32_t id; /**< Identification, Commond Address of Set */ uint32_t flags; /**< Flags definiens */ byte_t type; /**< Analogue/Digit/Control/Event/etc. */ char name[LONGNAME]; /**< 数据组的名称 */ uint16_t maxelems; /**< 允许包含elements的最大数目 */ element_t *elements; /**< 数据元素定义数组 */ // runtime generate uint16_t count; /**< 实际包含的数据元素数目 */ uint16_t index; /**< 数据组索引IED->groups的数组下标 */ value_t value; /**< 数据组缓冲区,顺序存放elements的实时值 */ ied_t *ied; /**< 所属设备句柄 */ apr_hash_t *htdots; /**< 数据元素定义哈希表 */ /* Extend property */ void *sys_ext; /**< 数据组的系统扩展属性,由基本库实现 */ void *app_ext; /**< 数据组的应用扩展属性,由应用库实现 */ void *usr_ext; /**< 数据组的用户扩展属性,由应用程序实现 */ }; //