IECComm.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  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. #else
  87. #define FOS_PAR_SW_NUM 50 //遥参单回路开关遥参数量
  88. #endif
  89. /*------------------------------ 类型结构 -------------------------------------
  90. */
  91. #ifdef GEN_QUEUE
  92. #define KEEP_QUEUE 0
  93. #define OVER_QUEUE 1
  94. typedef struct QTYPE /* 定义队列指针类型QTYPE*/
  95. {
  96. s32 count; /*数量*/
  97. s32 front; /*读指针*/
  98. s32 rear; /*写指针*/
  99. s32 maxsize; /*缓存区最大大小*/
  100. s32 s_size; /*单个元素大小*/
  101. u8* data; /*缓存区指针*/
  102. }QTYPE;
  103. enum
  104. {
  105. RCD_PRINT=0,
  106. PARA_PRINT,
  107. };
  108. s32 queue_init(QTYPE *queque, s32 maxsize,void *data,s32 s_size);
  109. s32 get_queue_count(QTYPE *queue);
  110. s32 add_data_queque(QTYPE *queue,u8 *data, u8 op_type);
  111. s32 get_data_queque(QTYPE *queue,u8 *data);
  112. s32 print_queque(QTYPE *queue,u8 type);
  113. s32 check_data_queque(QTYPE *queue,u8 *data);
  114. void del_data_queue(QTYPE *queue);
  115. #endif
  116. #define SET_UP_TYPE 179
  117. #ifdef RCD_STRAN_S
  118. #define RCD_TYPE 177 /*自定义查询录波类型标识*/
  119. #define NEWRCD_COUNT 64
  120. #define NEWRCD_SIZE 64
  121. #define RCD_MAX_BUF NEWRCD_COUNT*NEWRCD_SIZE
  122. typedef struct newrcd_queque
  123. {
  124. QTYPE queue;
  125. u8 data[RCD_MAX_BUF];
  126. }newrcd_queque;
  127. void iec_commadd_rcd(char *filename);
  128. #endif
  129. typedef struct SERIAL_COMM_STRUCT
  130. {
  131. // 规约结构体的地址
  132. u8 *ptBuf;
  133. // 发送
  134. u8 sendbuf[256]; // 第一个字节为发送长度,最大帧长为255
  135. #ifdef FUNC_ENCRY_IN_ONE_SERIAL
  136. u8 enc_sendbuf[256];
  137. #endif
  138. u8 nSendCnt;
  139. bool bSend;
  140. uint32_t us0_send;
  141. u8 extsendbuf[1024];
  142. #ifdef FUNC_ENCRY_IN_ONE_SERIAL
  143. u8 extsendbuf_1[1024];
  144. u8 extsendbuf_2[1024];
  145. u8 extsendbuf_3[1024];
  146. bool bextsend_1;
  147. u16 extsendcnt_1;
  148. u16 extsendlen_1;
  149. bool bextsend_2;
  150. u16 extsendcnt_2;
  151. u16 extsendlen_2;
  152. bool bextsend_3;
  153. u16 extsendcnt_3;
  154. u16 extsendlen_3;
  155. #endif
  156. u16 extsendcnt;
  157. u16 extsendlen;
  158. bool bextsend;
  159. // 接收
  160. bool b_recv_reset;
  161. uint32_t us0_recv;
  162. uint32_t us_recv_timeout;
  163. }SERIAL_COMM;
  164. // 接收BUF,用于接收主站一帧完整报文
  165. typedef struct iec_rbuf
  166. {
  167. u16 sts; // 接收状态
  168. u16 len; // 接收报文中的长度信息
  169. u16 cnt; // 接收数据计数
  170. u8 sum; // 校验和
  171. u8 chn; // 接收通道,统计计数用
  172. u8 *buf;
  173. }iec_rbuf_t;
  174. // 发送BUF的最大帧数,需考虑以下问题
  175. // 1、不允许出现BUF满的情况
  176. // 2、主站总召时,会带有ACK,所有只需考虑一次总召情况,目前假设一次总召小于24帧
  177. // 3、系统K值,目前限定小于48
  178. // 4、主动上送SOE或遥测每次都不会超过32帧(最大情况是上电时,E2PROM中的所有事件都需要发送)
  179. // 5、修改此值,注意同时修改发送BUF的指针位数
  180. #define IEC_TBUF_NUM 256 // 共有多少个buf
  181. #define IEC_TBUF_LEN 256 // 每个buf长度
  182. //规约发送缓冲头
  183. typedef struct iec_tbuf_head
  184. {
  185. u16 frm_attr; // 帧属性
  186. u16 soe_tail_send; // 本帧中最后SOE的索引
  187. u16 tb_SendNum; // 为了方便和104序号进行比较,其值也为待发送帧的序号
  188. u32 us0;
  189. }iec_tbuf_head_t;
  190. // 104发送缓冲区,在K值有效的情况下,其作用如下 :
  191. // 1、使用k值进行发送流量控制。
  192. // 2、通过ACK对已发送的SOE进行确认。
  193. // 3、发送帧确认超时检测
  194. typedef struct iec_tbuf
  195. {
  196. // buf指针,注意位数和MAX_104_FRAMES的对应关系
  197. volatile u8 tb_head ;
  198. volatile u8 tb_tail_send;
  199. volatile u8 tb_tail_ack;
  200. iec_tbuf_head_t tb_info[IEC_TBUF_NUM];
  201. u8 tb_data[IEC_TBUF_NUM][IEC_TBUF_LEN];
  202. }iec_tbuf_t;
  203. typedef struct TRANSFILE_DEF {
  204. WORD filename;
  205. WORD filelenth;
  206. WORD setctionnum;
  207. char *pdat; // 节内容对应指针,传输完毕后需释放
  208. DWORD InfoAddr; // 信息体地址,对应文件目录
  209. DWORD us0_file_trans;
  210. bool bFiletransing;
  211. bool bSegtransing;
  212. DWORD transBytes; //已传输的节的字节数
  213. DWORD sectionlenth;
  214. BYTE sectionchecksum; //节校验和
  215. BYTE filechecksum; //文件传输时的文件校验和
  216. BYTE transsection;
  217. }TRANSFILE;
  218. typedef struct T_FILE_DEF {
  219. char dirpath[64];
  220. DWORD id; // 文件标识
  221. DWORD filelenth; // 文件大小
  222. DWORD offset; //传输偏移
  223. DWORD us0_file_trans;
  224. char *pfilebuf; // 内容对应指针,传输完毕后需释放
  225. bool bTransing; // 文件开始传输
  226. bool bdatTraned; //内容已启动传输,判超时使用
  227. DWORD wId; //写文件ID
  228. DWORD wfilelenth; //写文件长度
  229. DWORD woffset;
  230. DWORD us0_file_write;
  231. char *writebuf; // 写文件缓存指针
  232. bool bdatwriting; //
  233. BYTE recvwrnum;
  234. BYTE vsq; //主站下发的 VSQ,在上送报文时返回
  235. char wfilename[64];
  236. // 文件升级
  237. bool bUpdateStart;
  238. bool bUpdateCancel;
  239. bool bUpdateReset;
  240. DWORD us0_updatereset;
  241. char updatefilename[64];
  242. }T_FILE;
  243. //为了节省空间,单独申请写字符串的结构体数组,最大允许16个定值
  244. #define RMT_STR_NUM 16
  245. typedef struct RMT_SET_DAT_DEF
  246. {
  247. WORD di[RMT_SET_NUMBER];
  248. float val[RMT_SET_NUMBER];
  249. struct
  250. {
  251. WORD di;
  252. char str[32];
  253. }t_str[RMT_STR_NUM];
  254. DWORD us0_preset; //预置参数
  255. bool bpreset; //预置参数标志
  256. }RMT_SET_DATA;
  257. #define RMT_FIXED_SET_NUM 14 // 固定定值
  258. typedef struct RMT_SET_VAL
  259. {
  260. WORD di;
  261. BYTE type;
  262. BYTE unit;
  263. BYTE len;
  264. BYTE str[32];
  265. }RMT_SET_VAL;
  266. typedef struct RMT_FIXED_TABLE
  267. {
  268. BYTE num;
  269. RMT_SET_VAL set[RMT_FIXED_SET_NUM];
  270. }RMT_FIXED_TABLE;
  271. #define IEC_FAULT_FRAMELEN (EXT_ARG_NUMBER*7+16)
  272. typedef struct FAULT_PARA_BUF_DEF
  273. {
  274. // buf指针,注意位数和MAX_104_FRAMES的对应关系
  275. volatile u8 head : 3;
  276. volatile u8 tail : 3;
  277. u8 data[8][IEC_FAULT_FRAMELEN]; // 参数报文遥信+13个遥测
  278. }FAULT_PARA_BUF;
  279. extern RMT_FIXED_TABLE g_fixedset;
  280. typedef struct YT_BUF
  281. {
  282. BYTE yc_data[256];
  283. }YT_BUF;
  284. extern DWORD dTpartime;
  285. /****************参数变化队列***************/
  286. typedef struct para_chg_single
  287. {
  288. u8 group_type;
  289. u16 setno;
  290. float val;
  291. struct rtc_time_t ct;
  292. u32 parId; //通信点号信息
  293. }para_chg_single;
  294. #define PARA_CHG_COUNT 1024 /*队列大小*/
  295. #define PARA_CHG_SIZE sizeof(para_chg_single)
  296. #define PARA_CHG_MAX_BUF PARA_CHG_COUNT*PARA_CHG_SIZE
  297. typedef struct para_chg_queque
  298. {
  299. QTYPE queue;
  300. u8 data[PARA_CHG_MAX_BUF];
  301. }para_chg_queque;
  302. extern para_chg_queque g_para_chg_queque[COMM_CHANNEL_NUM];
  303. /****************参数变化队列***************/
  304. #ifdef FUNC_MORE_PRESET
  305. extern YT_BUF PresetData101[256]; //预置报文暂存区
  306. extern YT_BUF SetData101[256]; //固化报文暂存区
  307. extern int WrongCount101[256]; //预置/固化报文出错暂存区
  308. extern int g_CountPreset101, g_CountSet101; //预置/固化/出错帧计数
  309. extern bool gb_101_yt; //101遥调标志
  310. /*意义同上*/
  311. extern YT_BUF PresetData104[256];
  312. extern YT_BUF SetData104[256];
  313. extern int WrongCount104[256];
  314. extern int g_CountPreset104, g_CountSet104;
  315. extern bool gb_104_yt; //104遥调标志
  316. #endif
  317. /*------------------------------ 变量声明 -------------------------------------
  318. */
  319. extern SERIAL_COMM g_tRsComm[];
  320. extern s8 UART_CHANNEL[];
  321. extern bool byc_filter; //遥测滤波,防止遥测没有稳定下来突发上送
  322. extern bool g_bCommLed;
  323. extern u32 g_comm_link_status; //通信连接状态,每个通道用一个bit表示
  324. extern bool g_bCommStatus;
  325. extern u8 g_arrIECBuf[];
  326. extern int g_link_uart_chnl;
  327. extern u8 uart_test_begin;
  328. extern u8 uart_test_flag[CFG_UART_NUM_MAX][2];
  329. extern s8 g_hmi_chnl,g_auxhmi_chnl;
  330. //定义预置/固化参数时用于比较的数组及变量
  331. extern BYTE buf_forCompare[256];
  332. extern int i_forCompare,j_forCompare;
  333. extern bool bfirst_sel;
  334. /*------------------------------ 函数声明 -------------------------------------
  335. */
  336. #define RS_Send_Enable(x)
  337. #define RS_Recv_Enable(x)
  338. #define RS_Ena_Init(x)
  339. void iec_ypara_chg_noty(void *pt,bool b104);
  340. void iec_ypara_chg_soe(void);
  341. #ifdef YPARA_LINK
  342. int get_ypara_linkch_write(void *pt,BYTE *pdat,BYTE vsq,bool b104);
  343. int iec_setread_mananger(void *pt,BYTE *pdat,BYTE vsq,bool b104);
  344. #endif
  345. #ifdef YPARA_LINK_S
  346. void set_para_flag(void);
  347. #endif
  348. void IEC_CommInit(void) ;
  349. void IECCommTask(void);
  350. //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);
  351. 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);
  352. 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);
  353. int asdu_get_event_yc(BYTE *dat,int baddr3,u16 arg_index);
  354. char * IEC_Getdir(DWORD di);
  355. void uart_isr(void);
  356. void uart_232_485_test(u8 *buf);
  357. int iec_setwrite(void *pt,BYTE *pdat,BYTE cot,BYTE vsq,bool b104);// dat从定值区号开始
  358. int iec_setread(void *pt,BYTE *pdat,BYTE vsq,bool b104) ;// dat从定值区号开始
  359. bool readRunParId(WORD sw, WORD parId, BYTE *pbuf);
  360. bool selectRunParId(WORD sw, WORD parId, BYTE *pbuf);
  361. bool wirteRunParId(WORD sw, WORD parId, BYTE *pbuf,u8 ti);
  362. int iec_file_app(void *pt,BYTE *dat,BYTE cot,u8 framelen,bool b104) ;// dat 从信息对象开始
  363. void iec_readfile_send(void *pt,bool b104) ;//
  364. void iec_freefile(T_FILE *ptfile);
  365. int iec_pro_update(void *pt,BYTE cot,BYTE ctype,bool b104) ;
  366. void iec_printfixedset(void);
  367. void iec_init_fixedset(void *pt,RMT_FIXED_TABLE *pfixedset,bool b104);
  368. void iec_GetMsgInfo(u8 *buf,int len,u8 *ti,u8 *cot,u8 *se,bool b101);
  369. int iec_findchardot(u8 *buf,u8 *str);
  370. bool getCommStatus(void);
  371. bool getIecLink101Status(void);
  372. #ifdef CPU_FUXI
  373. int uart_isr_thread_create(int ch);
  374. #endif
  375. #endif
  376. /*------------------------------ 文件结束 -------------------------------------
  377. */