SOE.h 5.3 KB

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