IECComm.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: IECComm.h
  4. 文件版本: 01.01
  5. 创建作者: xxxxxx
  6. 创建日期: 2012-03-28
  7. 功能说明: 应用系统初始化
  8. 其它说明:
  9. 修改记录:
  10. */
  11. #ifndef IECCOMM_H
  12. #define IECCOMM_H
  13. /*------------------------------- 头文件 --------------------------------------
  14. */
  15. /*------------------------------- 宏定义 --------------------------------------
  16. */
  17. #define IEC_BUF_LEN 256
  18. #define MAX_SOE_PER_FRAME 16
  19. #define IEC_RECV_BUF_SIZE 1024 // 主要考虑加解密需要的空间
  20. #define FILE_SEGMENT_BYTES 200 //文件传送时,段的字节数
  21. enum
  22. {
  23. IEC101_CHN=0,
  24. IEC103_CHN,
  25. IEC104_CHN, //一般通道
  26. IEC104_WAVE, //录波通道
  27. IEC_MODBUS_CHN, // modbus 主站规约
  28. IEC_FAULT_CHN, // 状态板通信
  29. IEC_HMI_CHN,
  30. IEC_MODBUS_M
  31. };
  32. enum
  33. {
  34. MASTER_MODBUS=0x13,
  35. MASTER_101=0x23,
  36. MASTER_103=0x33,
  37. MASTER_MSG=0x43,
  38. MASTER_GPRS=0x53,
  39. MASTER_104=0x63,
  40. MASTER_MAINTAIN=0X73,
  41. MASTER_NUM
  42. };
  43. // COT
  44. #define IEC_COT_SPONT 3 // 突发(自发)
  45. #define IEC_COT_INIT 4 // 初始化
  46. #define IEC_COT_REQ 5 // 请求
  47. #define IEC_COT_ACT 6 // 激活
  48. #define IEC_COT_ACTCON 7 // 激活确认
  49. #define IEC_COT_DEACT 8 // 停止激活
  50. #define IEC_COT_DEACTCON 9 // 停止激活确认
  51. #define IEC_COT_ACTTERM 10 // 激活终止
  52. #define IEC_COT_UN_TI 44 // 未知的类型标识
  53. #define IEC_COT_UN_COT 45 // 未知的传送原因
  54. #define IEC_COT_UN_CA 46 // 未知的应用服务数据单元公共地址
  55. #define IEC_COT_UN_OA 47 // 未知的信息对象地址
  56. #define IEC_COT_UN_DEACT 49 // 停止激活终止
  57. #define IEC_COT_T 0X80 // 试验位:0=未试验, 1=试验
  58. #define IEC_COT_PN 0X40 // 确认位:0=肯定确认,1=否定确认
  59. // QOI
  60. #define IEC_QOI_CALL_ALL_GROUP 20 //总召唤
  61. #define IEC_QOI_CALL_YX_BEGIN 21 //第 1 组
  62. #define IEC_QOI_CALL_YX_END 28 //第 8 组
  63. #define IEC_QOI_CALL_YC_BEGIN 29 //第 9 组
  64. #define IEC_QOI_CALL_YC_END 36 //第 16 组
  65. // 默认起始点号
  66. #define IEC_YX_OFFSET 0x0001 //遥信起始地址
  67. #define IEC_YC_OFFSET 0x4001 //遥测起始地址
  68. #define IEC_YK_OFFSET 0x6001 //遥控起始地址
  69. #define IEC_PULSE_OFFSET 0x6401 //电度起始地址
  70. // 带选择的类型标识
  71. extern u8 g_ti_select[];
  72. extern u8 TI_SELECT_NUM;
  73. //佛山局要求遥参定义
  74. #define FOS_PAR_READ_ONE 102 //单个读定值
  75. #define FOS_PAR_SET_ONE 48 //单个定值设置
  76. #define FOS_PAR_READ_MUL 108 //多个读定值
  77. #define FOS_PAR_SET_MUL 55 //多个定值设置
  78. //自定义扩展遥参
  79. #define FOS_PAR_READ_ONE_EXT 90 //单个读定值
  80. #define FOS_PAR_SET_ONE_EXT 91 //单个定值设置
  81. #define FOS_PAR_READ_MUL_EXT 92 //多个读定值
  82. #define FOS_PAR_SET_MUL_EXT 93 //多个定值设置
  83. #define FOS_PAR_STATR_ADDR 0X5001 //遥参起始地址
  84. #if defined GD_AREA_ZHONGSHAN_2020 || defined GD_AREA_ZHONGSHAN
  85. #define FOS_PAR_SW_NUM 130 //遥参单回路开关遥参数量
  86. #elif defined GD_AREA_ECZD_MAOMING
  87. #define FOS_PAR_SW_NUM 180 //遥参单回路开关遥参数量
  88. #else
  89. #define FOS_PAR_SW_NUM 50 //遥参单回路开关遥参数量
  90. #endif
  91. /*------------------------------ 类型结构 -------------------------------------
  92. */
  93. #ifdef GEN_QUEUE
  94. #define KEEP_QUEUE 0
  95. #define OVER_QUEUE 1
  96. typedef struct QTYPE /* 定义队列指针类型QTYPE*/
  97. {
  98. s32 count; /*数量*/
  99. s32 front; /*读指针*/
  100. s32 rear; /*写指针*/
  101. s32 maxsize; /*缓存区最大大小*/
  102. s32 s_size; /*单个元素大小*/
  103. u8* data; /*缓存区指针*/
  104. }QTYPE;
  105. enum
  106. {
  107. RCD_PRINT=0,
  108. PARA_PRINT,
  109. };
  110. s32 queue_init(QTYPE *queque, s32 maxsize,void *data,s32 s_size);
  111. s32 get_queue_count(QTYPE *queue);
  112. s32 add_data_queque(QTYPE *queue,u8 *data, u8 op_type);
  113. s32 get_data_queque(QTYPE *queue,u8 *data);
  114. s32 print_queque(QTYPE *queue,u8 type);
  115. s32 check_data_queque(QTYPE *queue,u8 *data);
  116. void del_data_queue(QTYPE *queue);
  117. #endif
  118. #define SET_UP_TYPE 179
  119. #ifdef RCD_STRAN_S
  120. #define RCD_TYPE 177 /*自定义查询录波类型标识*/
  121. #define NEWRCD_COUNT 64
  122. #define NEWRCD_SIZE 64
  123. #define RCD_MAX_BUF NEWRCD_COUNT*NEWRCD_SIZE
  124. typedef struct newrcd_queque
  125. {
  126. QTYPE queue;
  127. u8 data[RCD_MAX_BUF];
  128. }newrcd_queque;
  129. void iec_commadd_rcd(char *filename);
  130. #endif
  131. typedef struct SERIAL_COMM_STRUCT
  132. {
  133. // 规约结构体的地址
  134. u8 *ptBuf;
  135. // 发送
  136. u8 sendbuf[256]; // 第一个字节为发送长度,最大帧长为255
  137. #ifdef FUNC_ENCRY_IN_ONE_SERIAL
  138. u8 enc_sendbuf[256];
  139. #endif
  140. u8 nSendCnt;
  141. bool bSend;
  142. uint32_t us0_send;
  143. u8 extsendbuf[1024];
  144. #ifdef FUNC_ENCRY_IN_ONE_SERIAL
  145. u8 extsendbuf_1[1024];
  146. u8 extsendbuf_2[1024];
  147. u8 extsendbuf_3[1024];
  148. bool bextsend_1;
  149. u16 extsendcnt_1;
  150. u16 extsendlen_1;
  151. bool bextsend_2;
  152. u16 extsendcnt_2;
  153. u16 extsendlen_2;
  154. bool bextsend_3;
  155. u16 extsendcnt_3;
  156. u16 extsendlen_3;
  157. #endif
  158. u16 extsendcnt;
  159. u16 extsendlen;
  160. bool bextsend;
  161. // 接收
  162. bool b_recv_reset;
  163. uint32_t us0_recv;
  164. uint32_t us_recv_timeout;
  165. }SERIAL_COMM;
  166. // 接收BUF,用于接收主站一帧完整报文
  167. typedef struct iec_rbuf
  168. {
  169. u16 sts; // 接收状态
  170. u16 len; // 接收报文中的长度信息
  171. u16 cnt; // 接收数据计数
  172. u8 sum; // 校验和
  173. u8 chn; // 接收通道,统计计数用
  174. u8 *buf;
  175. }iec_rbuf_t;
  176. // 发送BUF的最大帧数,需考虑以下问题
  177. // 1、不允许出现BUF满的情况
  178. // 2、主站总召时,会带有ACK,所有只需考虑一次总召情况,目前假设一次总召小于24帧
  179. // 3、系统K值,目前限定小于48
  180. // 4、主动上送SOE或遥测每次都不会超过32帧(最大情况是上电时,E2PROM中的所有事件都需要发送)
  181. // 5、修改此值,注意同时修改发送BUF的指针位数
  182. #define IEC_TBUF_NUM 256 // 共有多少个buf
  183. #define IEC_TBUF_LEN 256 // 每个buf长度
  184. //规约发送缓冲头
  185. typedef struct iec_tbuf_head
  186. {
  187. u16 frm_attr; // 帧属性
  188. u16 soe_tail_send; // 本帧中最后SOE的索引
  189. u16 tb_SendNum; // 为了方便和104序号进行比较,其值也为待发送帧的序号
  190. u32 us0;
  191. }iec_tbuf_head_t;
  192. // 104发送缓冲区,在K值有效的情况下,其作用如下 :
  193. // 1、使用k值进行发送流量控制。
  194. // 2、通过ACK对已发送的SOE进行确认。
  195. // 3、发送帧确认超时检测
  196. typedef struct iec_tbuf
  197. {
  198. // buf指针,注意位数和MAX_104_FRAMES的对应关系
  199. volatile u8 tb_head ;
  200. volatile u8 tb_tail_send;
  201. volatile u8 tb_tail_ack;
  202. iec_tbuf_head_t tb_info[IEC_TBUF_NUM];
  203. u8 tb_data[IEC_TBUF_NUM][IEC_TBUF_LEN];
  204. }iec_tbuf_t;
  205. typedef struct TRANSFILE_DEF {
  206. WORD filename;
  207. WORD filelenth;
  208. WORD setctionnum;
  209. char *pdat; // 节内容对应指针,传输完毕后需释放
  210. DWORD InfoAddr; // 信息体地址,对应文件目录
  211. DWORD us0_file_trans;
  212. bool bFiletransing;
  213. bool bSegtransing;
  214. DWORD transBytes; //已传输的节的字节数
  215. DWORD sectionlenth;
  216. BYTE sectionchecksum; //节校验和
  217. BYTE filechecksum; //文件传输时的文件校验和
  218. BYTE transsection;
  219. }TRANSFILE;
  220. typedef struct T_FILE_DEF {
  221. char dirpath[64];
  222. DWORD id; // 文件标识
  223. DWORD filelenth; // 文件大小
  224. DWORD offset; //传输偏移
  225. DWORD us0_file_trans;
  226. char *pfilebuf; // 内容对应指针,传输完毕后需释放
  227. bool bTransing; // 文件开始传输
  228. bool bdatTraned; //内容已启动传输,判超时使用
  229. DWORD wId; //写文件ID
  230. DWORD wfilelenth; //写文件长度
  231. DWORD woffset;
  232. DWORD us0_file_write;
  233. char *writebuf; // 写文件缓存指针
  234. bool bdatwriting; //
  235. BYTE recvwrnum;
  236. BYTE vsq; //主站下发的 VSQ,在上送报文时返回
  237. char wfilename[64];
  238. // 文件升级
  239. bool bUpdateStart;
  240. bool bUpdateCancel;
  241. bool bUpdateReset;
  242. DWORD us0_updatereset;
  243. char updatefilename[64];
  244. }T_FILE;
  245. //为了节省空间,单独申请写字符串的结构体数组,最大允许16个定值
  246. #define RMT_STR_NUM 16
  247. typedef struct RMT_SET_DAT_DEF
  248. {
  249. WORD di[RMT_SET_NUMBER];
  250. float val[RMT_SET_NUMBER];
  251. struct
  252. {
  253. WORD di;
  254. char str[32];
  255. }t_str[RMT_STR_NUM];
  256. DWORD us0_preset; //预置参数
  257. bool bpreset; //预置参数标志
  258. }RMT_SET_DATA;
  259. #define RMT_FIXED_SET_NUM 14 // 固定定值
  260. typedef struct RMT_SET_VAL
  261. {
  262. WORD di;
  263. BYTE type;
  264. BYTE unit;
  265. BYTE len;
  266. BYTE str[32];
  267. }RMT_SET_VAL;
  268. typedef struct RMT_FIXED_TABLE
  269. {
  270. BYTE num;
  271. RMT_SET_VAL set[RMT_FIXED_SET_NUM];
  272. }RMT_FIXED_TABLE;
  273. #define IEC_FAULT_FRAMELEN (EXT_ARG_NUMBER*7+16)
  274. typedef struct FAULT_PARA_BUF_DEF
  275. {
  276. // buf指针,注意位数和MAX_104_FRAMES的对应关系
  277. volatile u8 head : 3;
  278. volatile u8 tail : 3;
  279. u8 data[8][IEC_FAULT_FRAMELEN]; // 参数报文遥信+13个遥测
  280. }FAULT_PARA_BUF;
  281. extern RMT_FIXED_TABLE g_fixedset;
  282. typedef struct YT_BUF
  283. {
  284. BYTE yc_data[256];
  285. }YT_BUF;
  286. extern DWORD dTpartime;
  287. /****************参数变化队列***************/
  288. typedef struct para_chg_single
  289. {
  290. u8 group_type;
  291. u16 setno;
  292. float val;
  293. struct rtc_time_t ct;
  294. u32 parId; //通信点号信息
  295. }para_chg_single;
  296. #define PARA_CHG_COUNT 1024 /*队列大小*/
  297. #define PARA_CHG_SIZE sizeof(para_chg_single)
  298. #define PARA_CHG_MAX_BUF PARA_CHG_COUNT*PARA_CHG_SIZE
  299. typedef struct para_chg_queque
  300. {
  301. QTYPE queue;
  302. u8 data[PARA_CHG_MAX_BUF];
  303. }para_chg_queque;
  304. extern para_chg_queque g_para_chg_queque[COMM_CHANNEL_NUM];
  305. /****************参数变化队列***************/
  306. #ifdef FUNC_MORE_PRESET
  307. extern YT_BUF PresetData101[256]; //预置报文暂存区
  308. extern YT_BUF SetData101[256]; //固化报文暂存区
  309. extern int WrongCount101[256]; //预置/固化报文出错暂存区
  310. extern int g_CountPreset101, g_CountSet101; //预置/固化/出错帧计数
  311. extern bool gb_101_yt; //101遥调标志
  312. /*意义同上*/
  313. extern YT_BUF PresetData104[256];
  314. extern YT_BUF SetData104[256];
  315. extern int WrongCount104[256];
  316. extern int g_CountPreset104, g_CountSet104;
  317. extern bool gb_104_yt; //104遥调标志
  318. #endif
  319. /*------------------------------ 变量声明 -------------------------------------
  320. */
  321. extern SERIAL_COMM g_tRsComm[];
  322. extern s8 UART_CHANNEL[];
  323. extern bool byc_filter; //遥测滤波,防止遥测没有稳定下来突发上送
  324. extern bool g_bCommLed;
  325. extern u32 g_comm_link_status; //通信连接状态,每个通道用一个bit表示
  326. extern bool g_bCommStatus;
  327. extern u8 g_arrIECBuf[];
  328. extern int g_link_uart_chnl;
  329. extern u8 uart_test_begin;
  330. extern u8 uart_test_flag[CFG_UART_NUM_MAX][2];
  331. extern s8 g_hmi_chnl,g_auxhmi_chnl;
  332. //定义预置/固化参数时用于比较的数组及变量
  333. extern BYTE buf_forCompare[256];
  334. extern int i_forCompare,j_forCompare;
  335. extern bool bfirst_sel;
  336. /*------------------------------ 函数声明 -------------------------------------
  337. */
  338. #define RS_Send_Enable(x)
  339. #define RS_Recv_Enable(x)
  340. #define RS_Ena_Init(x)
  341. void iec_ypara_chg_noty(void *pt,bool b104);
  342. void iec_ypara_chg_soe(void);
  343. #ifdef YPARA_LINK
  344. int get_ypara_linkch_write(void *pt,BYTE *pdat,BYTE vsq,bool b104);
  345. int iec_setread_mananger(void *pt,BYTE *pdat,BYTE vsq,bool b104);
  346. #endif
  347. #ifdef YPARA_LINK_S
  348. void set_para_flag(void);
  349. #endif
  350. void IEC_CommInit(void) ;
  351. void IECCommTask(void);
  352. //int asdu_get_event(u8 ch,u16 head,u8* pcos,u8 *psoe,u16 *psoe_no,int baddr3,bool *bf,EVENT_STRUCT *ev,u16 *extarg,u8 *yxtype);
  353. int asdu_get_event(u8 ch,u16 head,u8* pcos,u8 *psoe,u8* pcos1,u8 *psoe1,u16*psoe_sno,u16*psoe_dno, int baddr3,bool *bf,EVENT_STRUCT *ev,u16 *extarg,u8 *yxtype,u8 *pcosnum,u8 *pcosnum1);
  354. int asdu_get_event_104(u8 ch,u16 head,u8* pcos,u8 *psoe,u16 *psoe_no,int baddr3,bool *bf,EVENT_STRUCT *ev,u16 *extarg,u8 *yxtype);
  355. int asdu_get_event_yc(BYTE *dat,int baddr3,u16 arg_index);
  356. char * IEC_Getdir(DWORD di);
  357. void uart_isr(void);
  358. void uart_232_485_test(u8 *buf);
  359. int iec_setwrite(void *pt,BYTE *pdat,BYTE cot,BYTE vsq,bool b104);// dat从定值区号开始
  360. int iec_setread(void *pt,BYTE *pdat,BYTE vsq,bool b104) ;// dat从定值区号开始
  361. bool readRunParId(WORD sw, WORD parId, BYTE *pbuf);
  362. bool selectRunParId(WORD sw, WORD parId, BYTE *pbuf);
  363. bool wirteRunParId(WORD sw, WORD parId, BYTE *pbuf,u8 ti);
  364. int iec_file_app(void *pt,BYTE *dat,BYTE cot,u8 framelen,bool b104) ;// dat 从信息对象开始
  365. void iec_readfile_send(void *pt,bool b104) ;//
  366. void iec_freefile(T_FILE *ptfile);
  367. int iec_pro_update(void *pt,BYTE cot,BYTE ctype,bool b104) ;
  368. void iec_printfixedset(void);
  369. void iec_init_fixedset(void *pt,RMT_FIXED_TABLE *pfixedset,bool b104);
  370. void iec_GetMsgInfo(u8 *buf,int len,u8 *ti,u8 *cot,u8 *se,bool b101);
  371. int iec_findchardot(u8 *buf,u8 *str);
  372. bool getCommStatus(void);
  373. bool getIecLink101Status(void);
  374. #ifdef CPU_FUXI
  375. int uart_isr_thread_create(int ch);
  376. #endif
  377. #endif
  378. /*------------------------------ 文件结束 -------------------------------------
  379. */