equ_fuxi.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474
  1. /******************************************************************************
  2. 版权所有:
  3. 文件名称: equ.c
  4. 文件版本: 01.01
  5. 创建作者: sunxi
  6. 创建日期: 2013-03-25
  7. 功能说明: 装置信息管理维护
  8. 其它说明:
  9. 修改记录:
  10. */
  11. /*------------------------------- 头文件 --------------------------------------
  12. */
  13. #include "head.h"
  14. /*------------------------------- 宏定义 --------------------------------------
  15. */
  16. #define EQU_SLOT_CHECK_TIMEOUT 4 // 子板检查超时,以秒为单位,不能小于4s
  17. /*------------------------------ 类型结构 -------------------------------------
  18. */
  19. //子板信息帧结构
  20. struct board_info_frame
  21. {
  22. u8 type; // 子板类型
  23. u8 status :4; // 子板状态
  24. u8 errcode:4; // 子板错误代码
  25. u16 crc; // 子板CRC
  26. u32 version; // 子板版本
  27. };
  28. /*------------------------------ 全局变量 -------------------------------------
  29. */
  30. // 控制板类型
  31. u32 g_brd_type_kz;
  32. // 采样板索引和插槽的对应关系
  33. const int g_ac_index_to_slot[EQU_SLOT_AC_NUM] = {1};
  34. // 采样板起始槽位,每种机箱不一样。
  35. u32 g_ac_slot_begin;
  36. // 记录频率对应ui通道的索引值
  37. int g_ui_freq[CFG_FREQ_NUM];
  38. // 模拟量对应关系
  39. static const s8 g_ac_index[BOARD_TYPE_KZ_NUM][EQU_SLOT_AC_CHN] =
  40. {
  41. {0X01, 0X03, 0X05, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0X00, 0X02, 0X04, 0X06, 0X0E, 0X0C, 0X0A, 0X08}, // 24款分布式 lch
  42. };
  43. //遥信转换表
  44. s8 g_change_di_index[BOARD_TYPE_KZ_NUM][EQU_DB_YX_NUM] =
  45. {
  46. {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, // 13
  47. {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, // 14 FB_V3_22_8 21,20,19,22,23,24,25,26,27,28,29,30,31,32}
  48. {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, // 15
  49. {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00}, // 16 FBV1_19_6
  50. {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, // 17 FB_V3_22_12
  51. {1, 2, 3, 5, 7, 9, 11, 13, 15, 19, 21, 23, 24, 18, 17, 4, 6, 8, 10, 12, 14, 16, 20, 22, 00, 00, 00, 00, 00, 00, 00, 00}, // 18 null
  52. {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, // 19 null
  53. {1, 2, 3, 5, 7, 9, 11, 13, 15, 19, 21, 23, 24, 18, 17, 4, 6, 8, 10, 12, 14, 16, 20, 22, 00, 00, 00, 00, 00, 00, 00, 00}, // 20 FB_V4_24_12
  54. {1, 2, 3, 5, 7, 9, 11, 13, 15, 19, 21, 23, 24, 18, 17, 4, 6, 8, 10, 12, 14, 16, 20, 22, 00, 00, 00, 00, 00, 00, 00, 00}, // 21 FB_V4.1_24_12
  55. {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 24, 23, 21, 22, 25, 26, 27, 28, 29, 30, 31, 32}, // 22 FB_V3.1_22_12
  56. {2, 4, 6, 8, 10, 12, 14, 15, 16, 1, 3, 5, 7, 9, 11, 13, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32}, // 23 FB_V3D_122_12
  57. {1, 3, 5, 7, 9, 11, 13, 15, 19, 21, 25, 27, 29, 2, 4, 6, 8, 10, 12, 14, 16, 20, 22, 26, 28, 30, 17, 18, 23, 24, 00, 00}, // 24 V4_D_30_12
  58. };
  59. // 开出对应关系
  60. static const s8 g_do_index[BOARD_TYPE_KZ_NUM][DO_NUM] =
  61. {
  62. {-1,-1,-1,-1-1,-1,-1,-1-1,-1,-1,-1},
  63. {DO_OUT8,DO_OUT0,DO_OUT1,DO_OUT6,DO_OUT5,DO_OUT2,DO_OUT3,DO_OUT4,DO_OUT7,-1}, //14
  64. {DO_OUT9,DO_OUT0,DO_OUT2,DO_OUT4,DO_OUT6,DO_OUT1,DO_OUT3,DO_OUT5,DO_OUT7,-1}, //15
  65. {-1,-1,-1,-1-1,-1,-1,-1-1,-1,-1,-1}, // 18 老版本分布式主板类型,不起作用
  66. {-1,-1,-1,-1-1,-1,-1,-1-1,-1,-1,-1}, // 19 老版本分布式主板类型,不起作用
  67. };
  68. /*------------------------------ 函数声明 -------------------------------------
  69. */
  70. unsigned int change_di_ch(unsigned int di)
  71. {
  72. register int i, rts = 0;
  73. #if 0
  74. static int di_bak;
  75. if(di_bak!=di)
  76. {
  77. rt_printf_time("change_di_ch di=%x \r\n",di);
  78. di_bak=di;
  79. }
  80. #endif
  81. for (i = 0; i < EQU_DB_YX_NUM; i++)
  82. {
  83. if (g_change_di_index[g_brd_type_kz][i] != 0 && g_change_di_index[g_brd_type_kz][i] <= EQU_DB_YX_NUM)
  84. {
  85. if (di >> (g_change_di_index[g_brd_type_kz][i] - 1) & 0x01)
  86. rts |= (1 << i);
  87. }
  88. }
  89. // rt_printf("%d %d 。。",rts,g_brd_type_kz);
  90. return rts;
  91. }
  92. /*------------------------------ 外部函数 -------------------------------------
  93. 外部函数供其它实体文件引用,必须仔细检查传入参数的合法性.
  94. */
  95. /**
  96. * @brief 远动参数投入之后 遥信防抖时间的更新
  97. * @return * int
  98. * @retval none
  99. *
  100. * @warning none
  101. * @note none
  102. */
  103. int equ_config_di_yd(void)
  104. {
  105. u32 i;
  106. struct equ_config_di *ecd;
  107. // 用户配置的保持时间、拥有者、类型
  108. ecd = g_equ_config_di;
  109. for(i=0;i<g_equ_config->di_num;i++)
  110. {
  111. // 开入扫描在156us中断,通过以下算法,得出对应不同防抖延时的最佳动态转换系数,理论误差为156us左右
  112. g_di_st[ecd->slot][ecd->index].tm_filter = (u32)tRunPara.wYXFD * 1000 / 156;
  113. ecd++;
  114. }
  115. return 0;
  116. }
  117. int equ_config_do_yd(void)
  118. {
  119. #if 0
  120. int i,index;
  121. struct equ_config_do *ecd;
  122. // 用户配置的保持时间
  123. ecd = g_equ_config_do;
  124. for(i=0;i<g_equ_config->do_num;i++)
  125. {
  126. u32 dotime=(u32)ecd->time_pulse;
  127. if(ecd->slot == EQU_SLOT_KZ)
  128. {
  129. // 如果定值参数中设置了分闸时间,覆盖
  130. if(ecd->owner&&((ecd->type == (SW_DO_FZ+1))||(ecd->type == (SW_DO_BHT+1))||(ecd->type == (SW_DO_YKT+1))))
  131. {
  132. if(pRunSet->bTT_RmtPara)
  133. {
  134. dotime=tRunPara.wFZMC;
  135. }
  136. }
  137. // 如果定值参数中设置了合闸时间,覆盖
  138. if(ecd->owner&&((ecd->type == (SW_DO_HZ+1))||(ecd->type == (SW_DO_BHH+1))||(ecd->type == (SW_DO_YKH+1))))
  139. {
  140. if(pRunSet->bTT_RmtPara)
  141. {
  142. dotime=tRunPara.wHZMC;
  143. }
  144. }
  145. index = equ_get_do_channel(ecd->index);
  146. g_do_st[index].us_keep = (u32)dotime;
  147. g_do_st[index].us_keep *= 1000; //ms转换为us
  148. }
  149. ecd++;
  150. }
  151. #endif
  152. return 0;
  153. }
  154. int equ_init_di(void)
  155. {
  156. int i,ui;
  157. struct equ_config_di *ecd;
  158. // 采样板起始槽位
  159. g_ac_slot_begin = EQU_SLOT_AC_BEGIN;
  160. #if !defined CPU_FUXI /* 注意t536版fuxi不使用这个配置 */
  161. // 检查频率硬件通道对应的UI。
  162. g_ui_freq[0] = UI_NUM;
  163. g_ui_freq[1] = UI_NUM;
  164. for (i = 0; i < g_equ_config->ac_num; i++)
  165. {
  166. // 频率通道必须是配置了的公共电压类型
  167. if (g_equ_config_ac[i].type == 0 || g_equ_config_ac[i].owner != 0)
  168. {
  169. continue;
  170. }
  171. ui = g_equ_config_ac[i].type - 1;
  172. if (ui >= PUB_AC_NUM)
  173. {
  174. continue;
  175. }
  176. // 确定频率对应电压通道
  177. if (ui < PUB_AC_NUM)
  178. {
  179. if (g_equ_config_ac[i].slot == 9 && g_equ_config_ac[i].index == 0)
  180. {
  181. g_ui_freq[0] = ui;
  182. }
  183. if (g_equ_config_ac[i].slot == 10 && g_equ_config_ac[i].index == 0)
  184. {
  185. g_ui_freq[1] = ui;
  186. }
  187. }
  188. }
  189. #endif
  190. // 初始化开入g_di_st结构
  191. memset((unsigned char *)g_di_st, 0, sizeof(g_di_st));
  192. ecd = g_equ_config_di;
  193. for (i = 0; i < g_equ_config->di_num; i++)
  194. {
  195. g_di_st[ecd->slot][ecd->index].tm_filter = ecd->filter_time;
  196. g_di_st[ecd->slot][ecd->index].owner = ecd->owner;
  197. g_di_st[ecd->slot][ecd->index].type = ecd->type;
  198. ecd++;
  199. }
  200. // 找到配置为开入板的板卡号
  201. for (i = 0; i < g_equ_config->equ_slot_num; i++)
  202. {
  203. if (g_board_info[i].type == BOARD_TYPE_FUXI_DI)
  204. {
  205. g_di_slot = i;
  206. break;
  207. }
  208. }
  209. // rt_printf("g_di_slot = %d\r\n", g_di_slot);
  210. return 0;
  211. }
  212. #ifdef BSP_CAN_ENABLE
  213. /******************************************************************************
  214. 函数名称: equ_board_info_update
  215. 函数版本: 01.01
  216. 创建作者: sunxi
  217. 创建日期: 2013-08-08
  218. 函数说明: 接收到子板的对时应答帧后,更新子板信息
  219. 参数说明:
  220. can_bus 从哪条can总线接收到的帧。
  221. frame 接收帧的buf指针
  222. 返回值:
  223. 0: 成功
  224. 其它: 失败
  225. 修改记录:
  226. */
  227. int equ_board_info_update(int can_bus,u8 * frame)
  228. {
  229. struct can_frame_head *cfh;
  230. struct board_info_frame *bif;
  231. struct board_info *bi;
  232. // 检查帧内容
  233. cfh = (struct can_frame_head *)frame;
  234. #ifdef CAN_SLAVE_BOARD
  235. if(cfh->src >= (EQU_SLOT_NUM_MAX+CAN_BOARD_NUM))
  236. #else
  237. if(cfh->src >= EQU_SLOT_NUM_MAX)
  238. #endif
  239. {
  240. return -1;
  241. }
  242. if(cfh->len != 8)
  243. {
  244. return -2;
  245. }
  246. // 比较子板类型
  247. bi = &g_board_info[cfh->src];
  248. bif = (struct board_info_frame *)(frame + sizeof(cfh));
  249. if(bif->type != bi->type)
  250. {
  251. // rt_printf("board type error(no=%d,bi_type=%d,gbi_type=%d)\r\n",cfh->src,bif->type,bi->type);
  252. // print_mem("frame",frame,16);
  253. return -3;
  254. }
  255. // 得到子板信息
  256. bi->status = bif->status;
  257. bi->errcode = bif->errcode;
  258. bi->crc = bif->crc;
  259. bi->version = bif->version;
  260. //rt_printf("%02d\t%02d\t%02d\t%04x\t%08x\t",bi->type,bi->status,bi->errcode,bi->crc,bi->version);
  261. // 得到子板时间
  262. clk_time_get(&bi->update_time);
  263. bi->us0 = ustimer_get_origin();
  264. bi->is_ok = 1;
  265. bi->can_bus = can_bus;
  266. return 0;
  267. }
  268. #endif
  269. /******************************************************************************
  270. 函数名称: equ_ac_channel_is_ok
  271. 函数版本: 01.01
  272. 创建作者: sunxi
  273. 创建日期: 2013-08-08
  274. 函数说明: 得到插槽中子板的模拟量通道对应的ADC采样通道。
  275. 参数说明:
  276. slot 插槽索引号
  277. index 子板上模拟量通道索引号
  278. 返回值: ADC采样通道索引号
  279. 修改记录:
  280. */
  281. int equ_ac_channel_is_ok(u32 index)
  282. {
  283. // 检查参数
  284. if(index >= CFG_ADC_CHANNEL)
  285. {
  286. return 0;
  287. }
  288. // 直接返回ok 板卡没有配置检测io
  289. return 1;
  290. // return g_ac_slot_is_ok[index/EQU_SLOT_AC_CHN];
  291. }
  292. /******************************************************************************
  293. 函数名称: equ_get_ac_channel
  294. 函数版本: 01.01
  295. 创建作者: sunxi
  296. 创建日期: 2013-08-08
  297. 函数说明: 得到插槽中子板的模拟量通道对应的ADC采样通道。
  298. 参数说明:
  299. slot 插槽索引号
  300. index 子板上模拟量通道索引号
  301. 返回值: ADC采样通道索引号
  302. 修改记录:
  303. */
  304. int equ_get_ac_channel(u32 slot,u32 index)
  305. {
  306. // 检查参数
  307. #if (0) /* 不检查 插槽索引号 lch 2025年12月5日17:29:28 */
  308. if(slot != BOARD_TYPE_FUXI_AC)
  309. {
  310. return -1;
  311. }
  312. #endif
  313. if(index >= CFG_ADC_CHANNEL)
  314. {
  315. return -2;
  316. }
  317. return g_ac_index[g_brd_type_kz][index];
  318. }
  319. /******************************************************************************
  320. 函数名称: equ_get_ac_slot
  321. 函数版本: 01.01
  322. 创建作者: xxxxxx
  323. 创建日期: 2014-10-09
  324. 函数说明: 得到采样通道对应的板卡
  325. 参数说明:
  326. owner 归属公共、开关
  327. type 采样类型
  328. 返回值: ADC采样通道索引号
  329. 修改记录:
  330. */
  331. int equ_get_ac_slot(u32 owner, u32 type)
  332. {
  333. u32 no;
  334. if (owner)
  335. {
  336. no = g_sw[owner].ac_cfg_index[type];
  337. }
  338. else
  339. {
  340. no = g_sw_pub.ac_cfg_index[type];
  341. }
  342. return g_equ_config_ac[no].slot;
  343. }
  344. /******************************************************************************
  345. 函数名称: equ_ac_index_to_slot
  346. 函数版本: 01.01
  347. 创建作者: sunxi
  348. 创建日期: 2013-08-08
  349. 函数说明: 将采样板索引号(和ADC通道号对应)转换为插槽号。
  350. 参数说明:
  351. ac_index 采样板索引号
  352. 返回值: 插槽号
  353. 修改记录:
  354. */
  355. int equ_ac_index_to_slot(int ac_index)
  356. {
  357. if((u32)ac_index >= EQU_SLOT_AC_NUM)
  358. {
  359. return 0;
  360. }
  361. return g_ac_index_to_slot[ac_index];
  362. }
  363. /******************************************************************************
  364. 函数名称: equ_get_do_channel
  365. 函数版本: 01.01
  366. 创建作者: sunxi
  367. 创建日期: 2013-08-08
  368. 函数说明: 配置子板上的开出资源
  369. 参数说明:
  370. slot 插槽索引号
  371. 返回值: 插槽号
  372. 0: 成功
  373. 其它: 失败
  374. 修改记录:
  375. */
  376. int equ_get_do_channel(u32 index)
  377. {
  378. return g_do_index[g_brd_type_kz][index];
  379. }
  380. /**
  381. * @brief 初始化rv核数据
  382. * @author lch (lch_work@foxmail.com)
  383. * @version 1.0
  384. * @date 20251222
  385. * @return * int
  386. * @retval none
  387. *
  388. * @warning none
  389. * @note none
  390. */
  391. int equ_init_rv_di(void)
  392. {
  393. #ifdef CPU_FUXI
  394. struct t_shmdata_di_astime t_di_cfg = {0};
  395. struct equ_config_di *ecd;
  396. ecd = g_equ_config_di;
  397. rt_printf("g_equ_config->di_num = %d\r\n", g_equ_config->di_num);
  398. for (int i = 0; i < g_equ_config->di_num; i++)
  399. {
  400. t_di_cfg.us_as_time[i] = ecd->filter_time;
  401. ecd++;
  402. }
  403. return shm_packet_write_v2(SHM_ADDR_R_DI_ASTIME, (uint8_t *)&t_di_cfg, sizeof(struct t_shmdata_di_astime));
  404. #endif
  405. }
  406. /*------------------------------ 内部函数 -------------------------------------
  407. 内部函数以下划线‘_’开头,不需要检查参数的合法性.
  408. */
  409. /*------------------------------ 测试函数 -------------------------------------
  410. 一个实体文件必须带一个本模块的测试函数来进行单元测试,如果的确不方便在本模块中
  411. 进行单元测试,必须在此注明实际的测试位置(例如在哪个实体文件中使用哪个测试函数).
  412. */
  413. /*------------------------------ 文件结束 -------------------------------------
  414. */