SOE.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #ifndef _SOE_H_
  2. #define _SOE_H_
  3. #include "Appconfig.h"
  4. #define SOE_ID_MASK 0xC5
  5. #define SOE_ID_ACK_NONE 0xFF
  6. #define SOE_ID_ACK_OK 0x00
  7. #ifdef SOE_PARA_ALL_SAVE
  8. #define MAX_EVENT_NUMBER 1024 // 最大事件记录数,带全参数的soe个数不能超过1024
  9. #else
  10. #define MAX_EVENT_NUMBER 1100 // 最大事件记录数,
  11. #endif
  12. #define MAX_VIP_NUMBER 512 //最大关键记录数,由于E2PROM大小限制,不能超过512
  13. #define MAX_OPERATE_NUMBER 512 //最大操作记录数,由于E2PROM大小限制,不能超过512
  14. #ifdef ADD_DEBUG_RECORD_FUN
  15. #define MAX_DEBUG_RECORD_NUMBER 512 //最大关键记录数,由于E2PROM大小限制,不能超过512
  16. #else
  17. #define MAX_DEBUG_RECORD_NUMBER MAX_VIP_NUMBER
  18. #endif
  19. #ifdef GD_AREA_ECZD_MAOMING
  20. #define EXT_ARG_NUMBER 15
  21. #else
  22. #define EXT_ARG_NUMBER 13
  23. #endif
  24. // 事件的类型
  25. enum
  26. {
  27. SOE_TYPE_EV=1, // 事件
  28. SOE_TYPE_YX, // 遥信
  29. SOE_TYPE_DPI, // 双点,值为双点
  30. SOE_TYPE_PLC, // PLC
  31. SOE_TYPE_LNK, // 级联,值为双点
  32. SOE_TYPE_TST, // 测试点
  33. SOE_TYPE_OPT, // 操作
  34. SOE_TYPE_NUM, // 类型个数
  35. };
  36. #define SOE_TYPE_ACK SOE_TYPE_TST // 类型小于此的都是需要确认的事件 6
  37. #define SOE_TYPE_MASK 0x0f // 事件类型屏蔽码
  38. #define SOE_TYPE_VIP 0x10 // 关键事件 标志 //保存全参数
  39. #define SOE_TYPE_DELAY_FHZ 0X20//等至开关分/合位,延迟保存SOE//#define SOE_TYPE_RSV2 0x20 // 保留位2
  40. #define SOE_TYPE_RSV3 0x40 // 保留位3 SOE_TYPE_VIP
  41. #define SOE_TYPE_FAULT 0x80 // 保留位4
  42. #define SOE_BUF_BITS 11//9->11 用于雪崩测试缓存不够
  43. #define SOE_BUF_NUMBER (1<<SOE_BUF_BITS) // 512
  44. // SOE buffer 索引
  45. typedef struct soe_buf_index
  46. {
  47. volatile u16 n : SOE_BUF_BITS;
  48. }sbi_t;
  49. // 由于E2PROM大小限制,此结构大小不允许变动,固定为24字节
  50. typedef struct EVENT_STRUCT
  51. {
  52. // 事件内容
  53. u8 ev_type; // 事件属性
  54. u8 ev_value; // 状态,双点用最低两位表示,单点用最低1位表示
  55. u16 ev_code; // 事件代码
  56. s32 ev_arg[3]; // 事件参数
  57. #ifdef SOE_PARA_ALL_SAVE
  58. s32 allarg[8]; // 全事件记录
  59. #endif
  60. struct timespec ts; // 事件发生时间
  61. }EVENT_STRUCT;
  62. // 由于E2PROM大小限制,此结构大小不允许变动,固定为28字节
  63. typedef struct EVENT_SAVE
  64. {
  65. // 事件保存用
  66. u8 es_flag; // 事件保存标志
  67. u8 es_ack; // 事件后台确认标志
  68. u16 es_id; // 事件序列号,事件的唯一性标识,用于文件中定位查找事件,特别是最新事件的位置。
  69. EVENT_STRUCT es_ev;
  70. }EVENT_SAVE;
  71. typedef struct EVENT_EXT_ARG
  72. {
  73. // 事件保存用
  74. u16 sw;
  75. BYTE type[EXT_ARG_NUMBER];
  76. s32 arg[EXT_ARG_NUMBER];
  77. }EVENT_EXT_ARG;
  78. #ifdef SOE_RECORD_DELAY
  79. #define DELAY_SOE_MAX 20
  80. typedef struct DELAY_SOE_DATA
  81. {
  82. //bool soe_delay_flag;
  83. //bool soe_wait_flag;
  84. u8 value;
  85. //u8 waitType; //等待类型,可等待分位或者合位保存SOE:1-分等待;2-合等待
  86. u16 code;
  87. long v1;
  88. long v2;
  89. long v3;
  90. struct timespec ts; // 事件发生时间
  91. }DELAY_SOE_DATA;
  92. #endif
  93. typedef struct SOE_QUEUE //SOE队列
  94. {
  95. // 事件队列指针
  96. sbi_t head;
  97. sbi_t tail_eep; // 保存尾指针
  98. sbi_t tail_send[COMM_CHANNEL_NUM]; // 发送尾指针
  99. sbi_t tail_ack [COMM_CHANNEL_NUM]; // 确认尾指针
  100. // 统计
  101. u32 stat_eep_over; // 保存溢出计数
  102. u32 stat_send_over[COMM_CHANNEL_NUM]; // 发送溢出计数
  103. u32 stat_ack_over[COMM_CHANNEL_NUM]; // 确认溢出计数
  104. u32 stat_cnt_type[SOE_TYPE_NUM]; // 按类型统计事件计数
  105. // 事件队列
  106. EVENT_SAVE soe[SOE_BUF_NUMBER]; //记录缓冲区
  107. EVENT_EXT_ARG tExtArg[SOE_BUF_NUMBER];
  108. #ifdef SOE_RELINK_DISCOS
  109. bool bSoeRelink[COMM_CHANNEL_NUM];
  110. sbi_t relink_tail_bak[COMM_CHANNEL_NUM]; // 发送尾指针
  111. #endif
  112. #ifdef SOE_RECORD_DELAY
  113. bool fzsoe_delay_flag; //fz转录启动标志
  114. bool fzsoe_wait_flag; //fzSOE QUEUE非空
  115. bool hzsoe_delay_flag; //fz转录启动标志
  116. bool hzsoe_wait_flag; //hzSOE QUEUE非空
  117. /*u8 value;
  118. u16 code;
  119. long v1;
  120. long v2;
  121. long v3;
  122. struct timespec ts; // 事件发生时间
  123. */
  124. u8 delay_fzsoe_count;
  125. u8 delay_hzsoe_count;
  126. DELAY_SOE_DATA delay_fzsoe_tab[DELAY_SOE_MAX];
  127. DELAY_SOE_DATA delay_hzsoe_tab[DELAY_SOE_MAX];
  128. #endif
  129. }SOE_QUEUE;
  130. typedef struct SOE_INF // 事件记录保存信息,上电时统计
  131. {
  132. // 事件记录
  133. u16 wEvNumber; // 事件记录数目
  134. u16 wEvIndex; // 事件记录保存位置
  135. u16 wEvID;
  136. u16 wEvAck; // 上电重新载入事件数
  137. // 操作记录
  138. u16 wOpNumber; //操作记录数目
  139. u16 wOpIndex; //操作记录保存位置
  140. u16 wOpID;
  141. // 关键记录
  142. u16 wVipNumber; //关键记录数目
  143. u16 wVipIndex; //关键记录保存位置
  144. u16 wVipID;
  145. // 事件显示
  146. u16 wDpAutoShow;
  147. bool bDpNew;
  148. bool bDpType; //操作记录标志
  149. u16 wDebugNumber; //调试记录数目
  150. u16 wDebugIndex; //调试记录保存位置
  151. u16 wDebugID;
  152. }SOE_INF;
  153. extern SOE_QUEUE g_soe_queue;
  154. extern SOE_INF g_soe_info;
  155. extern u32 g_ev_words[];
  156. extern u16 dwFaultAll; // 事故总
  157. extern DWORD dsWarnAll; //告警总
  158. static inline int soe_ev_is_on(EVENT_STRUCT *ev)
  159. {
  160. if(ev->ev_type == SOE_TYPE_DPI || ev->ev_type == SOE_TYPE_LNK )
  161. {
  162. return (ev->ev_value == SW_DI_TYPE_ON);
  163. }
  164. return ev->ev_value;
  165. }
  166. void soe_init(void);
  167. int soe_ev_set(u16 code,u8 v);
  168. int soe_yx2lp(u16 ev_code);
  169. u16 soe_lp2cp(u8 ev_type,u16 ev_code,s32 is_mix);
  170. void soe_record_ev (u16 code,u8 value,long v1,long v2,long v3 );
  171. void soe_record_yx (u16 code,u8 value,struct timespec * ts);
  172. void soe_record_lnk(u16 code,u8 value,struct timespec * ts,s32 v1,bool bmix,u32 cp_s);
  173. void soe_record_dpi(u16 code,u8 value,struct timespec * ts);
  174. void soe_record_plc(u16 code,u8 value, u32 flag);
  175. void soe_record_tst(u16 code,u8 value);
  176. void soe_record_opt(u16 code,long v1);
  177. #ifdef FUN_SET_CHANGE_SOE
  178. void soe_record_opt3(u16 code,long v1,long v2,long v3);
  179. #endif
  180. int soe_get(u8 ch,EVENT_STRUCT *ev);
  181. void soe_ack(u8 chnl,u16 ack);
  182. void soe_save(void);
  183. bool soe_check(u32 code);
  184. void soe_clear_ev(void);
  185. void soe_clear_opt(void);
  186. #endif