modify.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. /*******************************************************************************
  2. 版权所有:
  3. 版本号: 1.00
  4. 文件名: modify.c
  5. 生成日期: 2019.6.24
  6. 作者: 邓良基
  7. 功能说明:定值参数修改定制
  8. 修改日志:
  9. 日志1:
  10. 修改者:
  11. 修改日期:
  12. 修改内容:
  13. 修改原因:
  14. ****************************************************************************/
  15. #include "head.h"
  16. #define MODIFY_DIR "/tmp/"
  17. extern void get_set_value(char *str,const TSETTABLE *pTable,float value);
  18. #if 0
  19. void updateModifyFile(void)
  20. {
  21. }
  22. void creatModifyFile(void)
  23. {
  24. struct file * pfile;
  25. loff_t pos;
  26. char tmpstr[256];
  27. char valstr[24];
  28. char *p=tmpstr;
  29. int i;
  30. u8 setgroup[GROUP_NUM];
  31. // 创建描述文件
  32. pfile = rt_file_open("/tmp/setdata_file.csv",O_CREAT|O_RDWR|O_TRUNC,0);
  33. if(IS_ERR(pfile))
  34. {
  35. return ;
  36. }
  37. pos = 0;
  38. if(!ReadEppData(EEP_SETGROUP_ADDR,setgroup,GROUP_NUM))
  39. {
  40. GetDefSetGroup(setgroup);
  41. }
  42. #ifdef PUB_SET_SECTION
  43. if(!ReadPara((void*)&m_SetBuf,EEP_PUB_ADDR+(PUB_SETSIZE*m_runsection),PUB_SET_NUMBER,&tPubSetTable[0]))
  44. {
  45. GetDefPara((void*)&m_SetBuf,PUB_SET_NUMBER,&tPubSetTable[0]);
  46. }
  47. #else
  48. /*读取压板定值*/
  49. if(!ReadPara((void*)m_SetBuf,EEP_PUB_ADDR,PUB_SET_NUMBER,&tPubSetTable[0]))
  50. {
  51. GetDefPara((void*)m_SetBuf,PUB_SET_NUMBER,&tPubSetTable[0]);
  52. }
  53. #endif
  54. sprintf(p,"TYPE,ID, 定值名称 ,UI显示,当前值,单位,最大值,最小值,转发点表\r\n",tPubSetTable[i].szName);
  55. rt_file_write(pfile,p,strlen(p),&pos);
  56. for(i=0;i<PUB_SET_NUMBER;i++)
  57. {
  58. //if((tPubSetTable[i].group==0||setgroup[tPubSetTable[i].group-1])) // 定值分类组为0 或显示定制为1
  59. {
  60. if(tPubSetTable[i].wType==SETTYPE_LABEL)
  61. {
  62. sprintf(p,"%d,%d,%s,\r\n",tPubSetTable[i].wType,i+1,tPubSetTable[i].szName);
  63. }
  64. else
  65. {
  66. get_set_value(valstr,&tPubSetTable[i],m_SetBuf[i].ff);
  67. sprintf(p,"%d,%d,%s,1,%s,%s,%f,%f,0x%04X\r\n",tPubSetTable[i].wType,i+1,tPubSetTable[i].szName,valstr,
  68. SetUints[tPubSetTable[i].wUnit],
  69. tPubSetTable[i].fMax,
  70. tPubSetTable[i].fMin,
  71. tPubSetTable[i].ParId
  72. );
  73. }
  74. rt_file_write(pfile,p,strlen(p),&pos);
  75. }
  76. }
  77. if(!ReadPara((void*)m_SetBuf,EEP_SET_ADDR+SETSIZE*(m_runsection),SW_SET_NUMBER,&tSwSetTable[0]))
  78. {
  79. GetDefPara((void*)m_SetBuf,SW_SET_NUMBER,&tSwSetTable[0]);
  80. }
  81. for(i=0;i<SW_SET_NUMBER;i++)
  82. {
  83. //if((tSwSetTable[i].group==0||setgroup[tSwSetTable[i].group-1])) // 定值分类组为0 或显示定制为1
  84. {
  85. if(tSwSetTable[i].wType==SETTYPE_LABEL)
  86. {
  87. sprintf(p,"%d,%d,%s,\r\n",tSwSetTable[i].wType,i+PUB_SET_NUMBER+1,tSwSetTable[i].szName);
  88. }
  89. else
  90. {
  91. get_set_value(valstr,&tSwSetTable[i],m_SetBuf[i].ff);
  92. sprintf(p,"%d,%d,%s,1,%s,%s,%f,%f,0x%04X\r\n",tSwSetTable[i].wType,i+PUB_SET_NUMBER+1,tSwSetTable[i].szName,valstr,
  93. SetUints[tSwSetTable[i].wUnit],
  94. tSwSetTable[i].fMax,
  95. tSwSetTable[i].fMin,
  96. tSwSetTable[i].ParId
  97. );
  98. }
  99. rt_file_write(pfile,p,strlen(p),&pos);
  100. }
  101. }
  102. rt_file_close(pfile,0);
  103. }
  104. void initModify(void)
  105. {
  106. }
  107. #endif
  108. /************************************************************************
  109. 函数名称:getCstValRangeString
  110. 函数版本:V0.01
  111. 作 者:
  112. 创建日期:2021.08.05
  113. 形参说明:group_type:定值组类别
  114. index:定值的索引号
  115. *p_str:缓存生成的字符串首地址
  116. str_bytes_max:缓存buff最大长度
  117. 函数说明:获取定值范围字符串文本
  118. 返 回 值:生成的字符串文本长度
  119. ************************************************************************/
  120. static int getCstValRangeString(int group_type,int index,char *p_str,const int str_bytes_max)
  121. {
  122. int i;
  123. int tmp_len,str_len;
  124. char str[256]={0};
  125. u32 val_min,val_max;
  126. const TSETTABLE *p_tmp_val=NULL;
  127. if(p_str == NULL){
  128. rt_printf("getSetValueScope函数形参p_str地址为空\r\n");
  129. return 0;
  130. }
  131. switch(group_type){
  132. case SETGROUP_TYPE_BH:
  133. p_tmp_val = &tSwSetTable[index];
  134. break;
  135. case SETGROUP_TYPE_PUB:
  136. p_tmp_val = &tPubSetTable[index];
  137. break;
  138. case SETGROUP_TYPE_PARA:
  139. p_tmp_val = &tEquipParaTable[index];
  140. break;
  141. case SETGROUP_TYPE_CSTSET:
  142. p_tmp_val = &tCstSetTable[index];
  143. break;
  144. default:
  145. rt_printf("定值组类型错误!\r\n");
  146. break;
  147. }
  148. if(p_tmp_val == NULL)
  149. return 0;
  150. str_len = 0;
  151. switch(p_tmp_val->wType){
  152. case SETTYPE_LIST:
  153. for(i=0; i<p_tmp_val->listnum; i++){
  154. tmp_len = strlen(p_tmp_val->list[i].str);
  155. memcpy(&str[str_len],p_tmp_val->list[i].str,tmp_len);
  156. str_len += tmp_len;
  157. if(i==(p_tmp_val->listnum-1))
  158. break;
  159. sprintf(&str[str_len],"、");
  160. str_len += 2;
  161. }
  162. break;
  163. case SETTYPE_F:
  164. sprintf(str,"%.3f~%0.3f",p_tmp_val->fMin,p_tmp_val->fMax);
  165. str_len = strlen(str);
  166. break;
  167. case SETTYPE_IP:
  168. val_min = (u32)p_tmp_val->fMin;
  169. val_max = 0xffffffff;
  170. sprintf(str,"%d.%d.%d.%d~%d.%d.%d.%d",(u8)(val_min>>24),(u8)(val_min>>16),(u8)(val_min>>8),(u8)(val_min>>0),(u8)(val_max>>24),(u8)(val_max>>16),(u8)(val_max>>8),(u8)(val_max>>0));
  171. str_len = strlen(str);
  172. break;
  173. case SETTYPE_YMD:
  174. val_min = (u32)p_tmp_val->fMin;
  175. val_max = (u32)p_tmp_val->fMax;
  176. sprintf(str,"%d年%d月%d日~%d年%d月%d日",2000+(u8)(val_min>>16),(u8)(val_min>>8),(u8)(val_min>>0),2000+(u8)(val_max>>16),(u8)(val_max>>8),(u8)(val_max>>0));
  177. str_len = strlen(str);
  178. break;
  179. case SETTYPE_HMS:
  180. val_min = (u32)p_tmp_val->fMin;
  181. val_max = (u32)p_tmp_val->fMax;
  182. sprintf(str,"%d:%d:%d秒~%d:%d:%d秒",(u8)(val_min>>16),(u8)(val_min>>8),(u8)(val_min>>0),(u8)(val_max>>16),(u8)(val_max>>8),(u8)(val_max>>0));
  183. str_len = strlen(str);
  184. break;
  185. case SETTYPE_UINT:
  186. case SETTYPE_5INT:
  187. case SETTYPE_LINT:
  188. case SETTYPE_4INT:
  189. val_min = (u32)p_tmp_val->fMin;
  190. val_max = (u32)p_tmp_val->fMax;
  191. sprintf(str,"%d~%d",val_min,val_max);
  192. str_len = strlen(str);
  193. break;
  194. default:
  195. rt_printf("非法值数据类型!\r\n");
  196. return 0;
  197. }
  198. if(str_len > str_bytes_max){
  199. rt_printf("getCstValRangeString_生成的字符串长度超出了缓存buff长度 str_len=%d str_bytes_max=%d\r\n",str_len,str_bytes_max);
  200. return 0;
  201. }
  202. memcpy(p_str,str,str_len);
  203. return str_len;
  204. }
  205. /************************************************************************
  206. 函数名称:getCstValTypeString
  207. 函数版本:V0.01
  208. 作 者:
  209. 创建日期:2021.08.05
  210. 形参说明:val_type:定值类型
  211. *p_str:缓存生成的字符串首地址
  212. str_bytes_max:缓存buff最大长度
  213. 函数说明:获取定值类型字符串文本
  214. 返 回 值:生成的字符串文本长度
  215. ************************************************************************/
  216. static int getCstValTypeString(int val_type,char *p_str,const int str_bytes_max)
  217. {
  218. int str_len;
  219. char str[24]={0};
  220. if(p_str == NULL){
  221. rt_printf("getCstValTypeString函数形参p_str地址为空\r\n");
  222. return 0;
  223. }
  224. switch(val_type){
  225. case SETTYPE_KG:
  226. sprintf(str,"控制字");
  227. break;
  228. case SETTYPE_LIST:
  229. sprintf(str,"选择列表");
  230. break;
  231. case SETTYPE_F:
  232. sprintf(str,"浮点型");
  233. break;
  234. case SETTYPE_UINT:
  235. case SETTYPE_4INT:
  236. case SETTYPE_5INT:
  237. case SETTYPE_LINT:
  238. sprintf(str,"整型");
  239. break;
  240. case SETTYPE_IP:
  241. sprintf(str,"IP地址");
  242. break;
  243. case SETTYPE_YMD:
  244. sprintf(str,"年月日");
  245. break;
  246. case SETTYPE_HMS:
  247. sprintf(str,"时分秒");
  248. break;
  249. default:
  250. rt_printf("非法值类型!\r\n");
  251. return 0;
  252. }
  253. str_len = strlen(str);
  254. if(str_len > str_bytes_max){
  255. rt_printf("getCstValTypeString_生成的字符串长度超出了缓存buff长度! str_len=%d str_bytes_max=%d\r\n",str_len,str_bytes_max);
  256. return 0;
  257. }
  258. memcpy(p_str,str,str_len);
  259. return str_len;
  260. }
  261. static void makeCstValueTableFile(struct file *p_file,loff_t *p_pos,const TSETTABLE *p_val_table,const int val_total,const int group_type)
  262. {
  263. int i;
  264. char val_default[24];
  265. char val_type[24];
  266. char val_range[256];
  267. char tmpstr[300]={0};
  268. char *p=tmpstr;
  269. u32 group_last=0;
  270. u8 *p_menu_show = NULL;
  271. switch(group_type){
  272. case SETGROUP_TYPE_BH:
  273. p_menu_show = bSwSetMenuShow;
  274. break;
  275. case SETGROUP_TYPE_PUB:
  276. p_menu_show = bPubSetMenuShow;
  277. break;
  278. case SETGROUP_TYPE_PARA:
  279. p_menu_show = bParaSetMenuShow;
  280. break;
  281. case SETGROUP_TYPE_CSTSET:
  282. p_menu_show = bCstSetMenuShow;
  283. break;
  284. default:
  285. rt_printf("定值组类型错误!\r\n");
  286. return;
  287. }
  288. sprintf(p,"类别,定值名称,整定范围,单位,初始值,说明\r\n");
  289. rt_file_write(p_file,p,strlen(p),p_pos);
  290. for(i=0;i<val_total;i++)
  291. {
  292. memset(p, 0, sizeof(p));
  293. if(p_val_table[i].wType==SETTYPE_LABEL || !p_menu_show[i])
  294. continue;
  295. memset(val_type, 0, sizeof(val_type));
  296. memset(val_range, 0, sizeof(val_range));
  297. memset(val_default, 0, sizeof(val_default));
  298. get_set_value(val_default,&p_val_table[i],p_val_table[i].fDef);
  299. getCstValRangeString(group_type,i,val_range,sizeof(val_range));
  300. getCstValTypeString(p_val_table[i].wType,val_type,sizeof(val_type));
  301. if(group_last != p_val_table[i].group)
  302. {
  303. int len=0;
  304. group_last = p_val_table[i].group;
  305. len = strlen(SetGroups[p_val_table[i].group].item_name)+strlen(p_val_table[i].szName)+strlen(val_range)+strlen(SetUints[p_val_table[i].wUnit])+strlen(val_default)+strlen(val_type);
  306. if(len > (sizeof(tmpstr)-7)) //7:5个逗号+一个回车符+一个换行符
  307. {
  308. sprintf(p,"字符串长度越限,定值生成失败!\r\n");
  309. rt_printf("字符串长度%d>%d越限,定值生成失败!\r\n",len,(sizeof(tmpstr)-7));
  310. }
  311. else
  312. sprintf(p,"%s,%s,%s,%s,%s,%s\r\n",SetGroups[p_val_table[i].group].item_name,p_val_table[i].szName,val_range,SetUints[p_val_table[i].wUnit],val_default,val_type);
  313. }
  314. else
  315. {
  316. int len=0;
  317. len = strlen(p_val_table[i].szName)+strlen(val_range)+strlen(SetUints[p_val_table[i].wUnit])+strlen(val_default)+strlen(val_type);
  318. if(len > (sizeof(tmpstr)-7)) //7:5个逗号+一个回车符+一个换行符
  319. {
  320. sprintf(p,"字符串长度越限,定值生成失败!\r\n");
  321. rt_printf("字符串长度%d>%d越限,定值生成失败!\r\n",len,(sizeof(tmpstr)-7));
  322. }
  323. else
  324. sprintf(p," ,%s,%s,%s,%s,%s\r\n",p_val_table[i].szName,val_range,SetUints[p_val_table[i].wUnit],val_default,val_type);
  325. }
  326. rt_file_write(p_file,p,strlen(p),p_pos);
  327. }
  328. }
  329. void updateModifyFile(void)
  330. {
  331. }
  332. void creatModifyFile(void)
  333. {
  334. loff_t pos=0;
  335. struct file *p_file;
  336. char str[512];
  337. // 创建描述文件
  338. p_file = rt_file_open("/tmp/setdata_file.csv",O_CREAT|O_RDWR|O_TRUNC,0);
  339. if(IS_ERR(p_file))
  340. return;
  341. sprintf(str,"附录 定值表\r\n 注:1、装置出厂默认设置为保护功能全部退出。请根据实际项目需求及工程配置进行相关更改。\r\n \
  342. 2、由于技术资料更新问题,装置定值与定值列表不一致,请以装置定值为准。\r\n");
  343. rt_file_write(p_file,str,strlen(str),&pos);
  344. memset(str, 0, sizeof(str));
  345. sprintf(str,"附录1 装置参数定值表\r\n");
  346. rt_file_write(p_file,str,strlen(str),&pos);
  347. makeCstValueTableFile(p_file,&pos,tEquipParaTable,EQUIP_PARA_NUMBER,SETGROUP_TYPE_PARA);
  348. memset(str, 0, sizeof(str));
  349. sprintf(str,"备注:\r\n (a) 凡是标明是选择列表类的参数,都可以通过界面列表来选择合适的选项。\r\n \
  350. (b) 遥测自动上送参数平衡101规约、104规约有效,如果退出,遥测数据只有总召时才会上送。\r\n \
  351. (c) 遥测发送间隔参数平衡101规约及104规约有效,如果遥测自动上送投入,遥测值、遥测发送间隔、遥测死区相 \
  352. 互配合可有效控制通信数据流量。\r\n (d) 不同以太网卡的IP地址必须设置为不同的网段。\r\n (e) 网关地址 \
  353. 整定为0.0.0.0代表使用系统默认网关。\r\n");
  354. rt_file_write(p_file,str,strlen(str),&pos);
  355. memset(str, 0, sizeof(str));
  356. sprintf(str,"附录2 公共定值表\r\n");
  357. rt_file_write(p_file,str,strlen(str),&pos);
  358. makeCstValueTableFile(p_file,&pos,tPubSetTable,PUB_SET_NUMBER,SETGROUP_TYPE_PUB);
  359. memset(str, 0, sizeof(str));
  360. sprintf(str,"附录3 线路定值表\r\n");
  361. rt_file_write(p_file,str,strlen(str),&pos);
  362. makeCstValueTableFile(p_file,&pos,tSwSetTable,SW_SET_NUMBER,SETGROUP_TYPE_BH);
  363. memset(str, 0, sizeof(str));
  364. sprintf(str,"备注:\r\n (a) 过流加速段电流定值:按躲过本线路最大负荷整定。\r\n (b) 零序加速段定值:\
  365. 按最小运行方式下本线路末端接地故障最小零序电流,并考虑一定裕量整定。\r\n (c) 零序加速段时间:按躲过断 \
  366. 路器最大不同时合闸时间整定,避免断路器不同时合闸产生的零序电流使加速元件误动作。\r\n");
  367. rt_file_write(p_file,str,strlen(str),&pos);
  368. memset(str, 0, sizeof(str));
  369. sprintf(str,"附录4 内部定值表\r\n");
  370. rt_file_write(p_file,str,strlen(str),&pos);
  371. makeCstValueTableFile(p_file,&pos,tCstSetTable,CSTSET_NUMBER,SETGROUP_TYPE_CSTSET);
  372. rt_file_close(p_file,0);
  373. }
  374. //========================== 本文件结束 =============================