Elec_Seal.c 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087
  1. /*Fuction: 处理电子铅封流程(装油、卸油、施封、破封、屏上显示等)*/
  2. #include "Elec_Seal.h"
  3. #include "TerminalSlave485.h"
  4. #include "CollectMaster485.h"
  5. #include "KeySlave485.h"
  6. #include "Dwin.h"
  7. #include <math.h>
  8. #include "tim.h"
  9. #include "spi.h"
  10. //李伟增加宏定义 20210227 李伟修改
  11. Full_Oil_Info_TypeDef Full_Oil_allinfo;
  12. uint8_t Send_data_nu = 0;//发送命令编号 0表示空白 1表示实时状态发送 2表示询问装油、卸油信息 3表示切换窗口
  13. uint8_t Auto_unload_clear_info_flag = 0,Auto_unload_clear_start_flag = 0;//清除空仓破封信息标志 开始清除标志
  14. uint8_t FUll_to_Oil_time =0;//
  15. uint8_t SealedOK_backup =0;//解封时备份施封信息
  16. uint8_t Full_oil_flag =0;//允许装油标注
  17. uint8_t Dislpay_flag =0;//装油动画只显示一次
  18. uint8_t Star_fulloil_flag =0;//1 开始装油 2等待关闭所有阀门 3装油完成 进行施封 4.等待打开所有阀门
  19. uint8_t Fill_Oil_fish_ID = 0,Fill_Oil_Nfish_ID = 0;
  20. uint32_t PID=0;
  21. extern uint8_t flag_En_BlankSeal;//1=允许空仓施封 0=禁止空仓施封
  22. extern uint8_t (*ptrIO_EachCang)[64];
  23. extern uint8_t Cang01_IO[64];
  24. extern uint8_t Cang02_IO[64];
  25. extern uint8_t Cang03_IO[64];
  26. extern uint8_t Cang04_IO[64];
  27. extern uint8_t Cang05_IO[64];
  28. extern uint8_t Cang06_IO[64];
  29. extern uint8_t Cang07_IO[64];
  30. extern uint8_t Cang08_IO[64];
  31. //装油逻辑开始处理
  32. void Fill_Oil( void)//装油
  33. {
  34. //全自动装油
  35. if((Full_Oil_allinfo.Start_Full_flag ==1)&&(Full_Oil_allinfo.Start_Decrease_flag ==0))//开始装油
  36. {
  37. //2.检查打开的阀门确认上装和下装
  38. int i =0;
  39. //没有操作仓需要显示空仓 Full_oil_flag
  40. for(i= 0;i<StoreNumber;i++)//注意对特殊仓没有做处理
  41. {
  42. //((Full_Oil_allinfo.Null_ID&(0x01<<i))==(0x01<<i))||(FUll_to_Oil_time ==0)
  43. if(((IO_Date.IO_unload_switch&(0x01<<i))!=(0x01<<i)))//找到空仓 或短时进油可以装油||(FUll_to_Oil_time ==0)
  44. // if(((Full_Oil_allinfo.Break_sealing_Id&(0x01<<i))!=(0x01<<i))&&((Full_Oil_allinfo.Auto_sealedOK_ID&(0x01<<i))!=(0x01<<i))) //没有施封或者没有破封就可以进行装油
  45. {
  46. if(((IO_Date.IO_state[0]&(0x0c<<(i*4)))==(0x0c<<(i*4)))\
  47. &&((IO_Date.IO_normalstate[0]&(0x0c<<(i*4)))==0))//底阀和卸油阀同时打开 且没有异常 为下装 下装优先
  48. {
  49. Full_Oil_allinfo.Real_operation_ID |= (0x01<<i);
  50. if((Full_Oil_allinfo.Real_operation_ID&(0x01<<i))!=(Full_Oil_allinfo.Loading_Oil_state&(0x01<<i)))
  51. {
  52. Full_Oil_allinfo.Full_Oil_Mode = 0x00; //装油仓提前打开了阀门
  53. Full_Oil_allinfo.Loading_Oil_state |= (0x01<<i);
  54. Jump_page_id(Run_mode_key_info.Full_oil_id);//进入装油界面
  55. FULL_oil_draw(Full_Oil_allinfo.Full_Oil_Mode,Full_Oil_allinfo.Loading_Oil_state);//显示装油动画
  56. Star_fulloil_flag = 1;
  57. }
  58. }
  59. else if(((IO_Date.IO_state[0]&(0x03<<(i*4)))==(0x03<<(i*4)))\
  60. &&((IO_Date.IO_normalstate[0]&(0x03<<(i*4)))==0))//人孔盖和人空小盖同时打开且没有异常 为上装
  61. {
  62. Full_Oil_allinfo.Real_operation_ID |= (0x01<<i);
  63. if((Full_Oil_allinfo.Real_operation_ID&(0x01<<i))!=(Full_Oil_allinfo.Loading_Oil_state&(0x01<<i)))
  64. {
  65. Full_Oil_allinfo.Full_Oil_Mode = 0x01;//装油仓提前打开了阀门
  66. Star_fulloil_flag = 1;
  67. Full_Oil_allinfo.Loading_Oil_state |= (0x01<<i);
  68. FULL_oil_draw(Full_Oil_allinfo.Full_Oil_Mode,Full_Oil_allinfo.Loading_Oil_state);//5
  69. }
  70. }
  71. }
  72. }
  73. if(Full_Oil_allinfo.Real_operation_ID ==0)
  74. {
  75. if((Full_Oil_allinfo.Start_Seal_flag ==1)||(PID>0))//防止被人提前按了施封//防止被人提前按了施封
  76. {
  77. PID = 0;
  78. Full_Oil_allinfo.Start_Seal_flag =0;
  79. Full_Oil_allinfo.Start_Full_flag =0;
  80. Go_homepage();
  81. }
  82. }
  83. if(Star_fulloil_flag == 1)//开始装油
  84. {
  85. int i =0;
  86. for(i= 0;i<StoreNumber;i++)
  87. {
  88. if((Full_Oil_allinfo.Loading_Oil_state&(0x01<<i))== (0x01<<i))//仓
  89. {
  90. if(Full_Oil_allinfo.Full_Oil_Mode ==0)//下装
  91. {
  92. if(((IO_Date.IO_state[0])&(0x0c<<(i*4)))!=(0x0c<<(i*4)))
  93. {
  94. // Star_fulloil_flag = 2;//装油结束跳出
  95. Full_Oil_allinfo.Read_NULL_ID |= (0x01<<i);//开始判断对应仓是否有油
  96. Full_Oil_allinfo.Loading_Oil_state &=~(1<<i);
  97. FULL_oil_draw(Full_Oil_allinfo.Full_Oil_Mode,Full_Oil_allinfo.Loading_Oil_state);//5
  98. }
  99. }
  100. else//上装
  101. {
  102. if(((IO_Date.IO_state[0])&(0x03<<(i*4)))!=(0x03<<(i*4)))
  103. {
  104. // Star_fulloil_flag = 2;//装油结束跳出
  105. Full_Oil_allinfo.Read_NULL_ID |= (0x01<<i);//开始判断对应仓是否有油
  106. Full_Oil_allinfo.Loading_Oil_state &=~(1<<i);
  107. FULL_oil_draw(Full_Oil_allinfo.Full_Oil_Mode,Full_Oil_allinfo.Loading_Oil_state);//5
  108. }
  109. }
  110. }
  111. }
  112. if(Full_Oil_allinfo.Loading_Oil_state ==0)
  113. {
  114. Star_fulloil_flag =2;
  115. }
  116. }
  117. if(Star_fulloil_flag == 2)
  118. {
  119. int i = 0;
  120. for(i= 0;i<StoreNumber;i++)
  121. {
  122. if((Full_Oil_allinfo.Real_operation_ID&(0x01<<i)))
  123. {
  124. if(((~IO_Date.IO_state[0])&(0x0f<<(i*4)))==(0x0f<<(i*4)))//底阀和卸油阀、人孔盖和人孔小盖同时全关 且没有异常
  125. {
  126. if((IO_Date.IO_normalstate[0]&(0x0f<<(i*4)))==0) //传感器是否异常
  127. Fill_Oil_fish_ID |=0x01<<i;
  128. else
  129. {
  130. Fill_Oil_Nfish_ID |=0x01<<i;
  131. }
  132. }
  133. }
  134. }
  135. if(((Fill_Oil_fish_ID &Full_Oil_allinfo.Real_operation_ID )\
  136. |(Fill_Oil_Nfish_ID&Full_Oil_allinfo.Real_operation_ID))\
  137. ==Full_Oil_allinfo.Real_operation_ID)
  138. {
  139. Star_fulloil_flag = 3;
  140. }
  141. }
  142. //装油完成,装油仓的所有阀门关闭,自动施封仓号 ****************************************************??????????????????
  143. if(Star_fulloil_flag ==3)
  144. {
  145. // //自动需要换手动
  146. if((Full_Oil_allinfo.Start_Seal_flag ==1)||(PID>0))//手动施封
  147. {
  148. if((IO_Date.IO_unload_switch&Full_Oil_allinfo.Real_operation_ID)>0)//==Full_Oil_allinfo.Real_operation_ID) 只要操作了有油就可以施封
  149. // if(1)//20210104 李伟更改 只要按下F2按键,不管有没有油均可以施封(根据周例会同童赟、张毅的讨论结果,龚经理拍板:按下F2键,强制阀门关闭状态下可以施封,不管有没有油,不管二合一传感器)
  150. {
  151. Full_Oil_allinfo.Read_NULL_ID |= IO_Date.IO_unload_switch&Full_Oil_allinfo.Real_operation_ID;
  152. /* AT24CXX_WriteOneByte(2032,Full_Oil_allinfo.Read_NULL_ID);//保存信息,用于开机是否检查对应的仓是否有油*/
  153. Full_Oil_allinfo.Auto_sealedOK_ID |= Fill_Oil_fish_ID&IO_Date.IO_unload_switch;
  154. if(SealedOK_backup>0)
  155. {
  156. Full_Oil_allinfo.Auto_sealedOK_ID |=SealedOK_backup;
  157. }
  158. Full_Oil_allinfo.Auto_sealedNOK_ID |=Fill_Oil_Nfish_ID;
  159. // Full_Oil_allinfo.Break_sealing_Id = 0;
  160. Full_Oil_allinfo.Start_Full_flag =0;
  161. Full_Oil_allinfo.Start_Seal_flag = 0;//
  162. Sealing_Data.Sealing_up_datetype = 2;//上报报平台,进行施封
  163. Full_Oil_allinfo.Auto_Write_history_flag =1;//写入历史数据
  164. Full_Oil_allinfo.Save_flag =1;//保存到EEPROM
  165. //发送标志
  166. Dislpay_flag =0;
  167. Star_fulloil_flag = 0;
  168. Fill_Oil_Nfish_ID =0;
  169. Fill_Oil_fish_ID = 0;
  170. Full_Oil_allinfo.Real_operation_ID = 0;
  171. FUll_to_Oil_time =2;
  172. Go_homepage();
  173. }
  174. else//没有油进行施封,或者操作仓不匹配,施封掉有油的,没有的不施封
  175. {
  176. //Full_Oil_allinfo.Read_NULL_ID &= (IO_Date.IO_unload_switch);
  177. Full_Oil_allinfo.Null_ID &= ~(IO_Date.IO_unload_switch&Full_Oil_allinfo.Real_operation_ID);
  178. Full_Oil_allinfo.Read_NULL_ID = ~Full_Oil_allinfo.Null_ID;
  179. /* AT24CXX_WriteOneByte(2032,Full_Oil_allinfo.Read_NULL_ID);//保存信息,用于开机是否检查对应的仓是否有油*/
  180. Full_Oil_allinfo.Start_Full_flag =0;
  181. Full_Oil_allinfo.Start_Seal_flag = 0;//
  182. Dislpay_flag =0;
  183. Star_fulloil_flag = 0;
  184. Fill_Oil_Nfish_ID =0;
  185. Fill_Oil_fish_ID = 0;
  186. Full_Oil_allinfo.Real_operation_ID = 0;
  187. Go_homepage();
  188. }
  189. PID = 0;
  190. Full_oil_flag =0;
  191. Full_Oil_allinfo.Auto_full_oil_mode =0;
  192. //FM25L16B_WriteByte(100,Full_Oil_allinfo.Auto_sealedOK_ID);//保存施封状态20200423
  193. FM25L16B_WriteByte(ADDR_Auto_sealedOK_ID,Full_Oil_allinfo.Auto_sealedOK_ID);//保存施封状态20200423
  194. }
  195. else
  196. {
  197. if((IO_Date.IO_unload_switch&Full_Oil_allinfo.Real_operation_ID)==0)//没装进去油
  198. {
  199. // Full_Oil_allinfo.Null_ID &= ~(IO_Date.IO_unload_switch&Full_Oil_allinfo.Real_operation_ID);
  200. // Full_Oil_allinfo.Read_NULL_ID = ~Full_Oil_allinfo.Null_ID;
  201. // AT24CXX_WriteOneByte(2032,Full_Oil_allinfo.Read_NULL_ID);//保存信息,用于开机是否检查对应的仓是否有油
  202. Full_Oil_allinfo.Start_Full_flag =0;
  203. Full_Oil_allinfo.Start_Seal_flag = 0;//
  204. Dislpay_flag =0;
  205. Star_fulloil_flag = 0;
  206. Fill_Oil_Nfish_ID =0;
  207. Fill_Oil_fish_ID = 0;
  208. Full_Oil_allinfo.Real_operation_ID = 0;
  209. Full_Oil_allinfo.Auto_full_oil_mode = 0;
  210. }
  211. }
  212. }
  213. }
  214. /*骏鹏要求有油就可以施封,不需要施封流程*/
  215. //if(Full_Oil_allinfo.Start_Seal_flag ==1)//保存施封状态20200604
  216. {
  217. // Star_fulloil_flag=3;
  218. #if 0
  219. // if ((Config_info_all.Config_fun_id&0x08) == 0x08) //?? 李工让苏祥临时做的修改,只要有油就可施封。4-5 ,note by Daiyf at 2021-4-12.
  220. // {//==0x08对应于bit3-----可以重复施封
  221. uint8_t j = 0;
  222. for(j = 0;j < StoreNumber;j ++)
  223. {
  224. switch (j)
  225. {
  226. case 0:
  227. ptrIO_EachCang = &Cang01_IO;
  228. break;
  229. case 1:
  230. ptrIO_EachCang = &Cang02_IO;
  231. break;
  232. case 2:
  233. ptrIO_EachCang = &Cang03_IO;
  234. break;
  235. case 3:
  236. ptrIO_EachCang = &Cang04_IO;
  237. break;
  238. case 4:
  239. ptrIO_EachCang = &Cang05_IO;
  240. break;
  241. case 5:
  242. ptrIO_EachCang = &Cang06_IO;
  243. break;
  244. case 6:
  245. ptrIO_EachCang = &Cang07_IO;
  246. break;
  247. case 7:
  248. ptrIO_EachCang = &Cang08_IO;
  249. break;
  250. default:
  251. ptrIO_EachCang = &Cang01_IO;
  252. break;
  253. }
  254. if(((Full_Oil_allinfo.Break_sealing_Id&(1<<j))!=(1<<j)))//如果该仓不是施封状态?????待核实
  255. {//如果该仓不是施封状态?????待核实
  256. if(((~IO_Date.IO_state[0])&(0x0f<<(j*4)))==(0x0f<<(j*4))) //4个bit代表的阀门状态均为1
  257. {
  258. if(flag_En_BlankSeal==0x01)
  259. {//允许空仓施封
  260. if(((IO_Date.IO_unload_switch&(0x01<<j))==(0x01<<j)) || (flag_En_BlankSeal==1))//该仓的卸尽传感器状态 卸尽开关监测 有油=1,无油=0
  261. { //如果该仓有油则允许施封----开始
  262. Full_Oil_allinfo.Auto_sealedOK_ID |= (0x01<<j); //施封对应的仓位
  263. Full_Oil_allinfo.Start_Seal_flag = 0;
  264. Sealing_Data.Sealing_up_datetype = 2;//上报报平台,进行施封
  265. FM25L16B_WriteByte(ADDR_Auto_sealedOK_ID,Full_Oil_allinfo.Auto_sealedOK_ID);//保存施封状态20200604
  266. } //如果该仓有油则允许施封----结束
  267. else
  268. Full_Oil_allinfo.Start_Seal_flag = 0;
  269. }//允许空仓施封
  270. else
  271. {//不允许空仓施封
  272. //if(*ptrIO_EachCang+18==0x00)
  273. {//专门针对人孔盖
  274. if(((IO_Date.IO_unload_switch&(0x01<<j))==(0x01<<j)))//该仓的卸尽传感器状态 卸尽开关监测 有油=1,无油=0
  275. { //如果该仓有油则允许施封----开始
  276. Full_Oil_allinfo.Auto_sealedOK_ID |= (0x01<<j); //施封对应的仓位
  277. Full_Oil_allinfo.Start_Seal_flag = 0;
  278. Sealing_Data.Sealing_up_datetype = 2;//上报报平台,进行施封
  279. FM25L16B_WriteByte(ADDR_Auto_sealedOK_ID,Full_Oil_allinfo.Auto_sealedOK_ID);//保存施封状态20200604
  280. } //如果该仓有油则允许施封----结束
  281. else
  282. Full_Oil_allinfo.Start_Seal_flag = 0;
  283. }
  284. }//不允许空仓施封
  285. }
  286. else
  287. Full_Oil_allinfo.Start_Seal_flag = 0;
  288. }//如果该仓不是施封状态?????待核实
  289. else
  290. Full_Oil_allinfo.Start_Seal_flag = 0;
  291. }
  292. //}
  293. #endif
  294. }
  295. }
  296. uint8_t Finish_Decreaceoil_flag = 0;
  297. //u8 Pro_unload_id = 0;//上一次卸油的仓号
  298. uint8_t Off_loading_mark = 0;//卸油的仓号
  299. uint8_t Star_Decreaceoil_flag =0;// 1 开始卸油 2等待打开所有阀门 4卸油完成 进行跳转 3.等待关闭所有阀门
  300. //卸油
  301. void Offloading_Oil( void)//卸油
  302. {
  303. // u16 temp_Null =0;
  304. uint8_t i = 0;
  305. //新的卸油方式,去掉触摸操作Full_oil_flag
  306. //不是空仓
  307. if(Full_Oil_allinfo.Start_Full_flag ==0)//没有装油&&(FUll_to_Oil_time==2)
  308. {
  309. for(i= 0;i<StoreNumber;i++)//循环
  310. {
  311. //1.判断是否有油
  312. if(((IO_Date.IO_unload_switch&(1<<i))==(1<<i))&&((Full_Oil_allinfo.Break_sealing_Id&(1<<i))==(1<<i)))//有油&破封
  313. {
  314. //2.判断是否在卸油
  315. //3.查找打开的阀门
  316. if((IO_Date.IO_state[0]&(0x0c<<(i*4)))==(0x0c<<(i*4)))//底阀打开
  317. {
  318. //4.记录卸油的仓号
  319. Full_Oil_allinfo.Real_operation_ID |= 1<<i;//卸油的仓号
  320. Full_Oil_allinfo.Start_Decrease_flag |= 1<<i;//卸油的仓号
  321. //Off_loading_mark
  322. if(Off_loading_mark!=Full_Oil_allinfo.Start_Decrease_flag)
  323. //if((Full_Oil_allinfo.Real_operation_ID&Full_Oil_allinfo.Start_Decrease_flag)==0)
  324. {
  325. Off_loading_mark = Full_Oil_allinfo.Start_Decrease_flag;
  326. Jump_page_id(Run_mode_key_info.offLoading_oil_id);//进入卸油界面
  327. Off_loading_draw(Full_Oil_allinfo.Start_Decrease_flag);//5
  328. Star_Decreaceoil_flag =1;//开始卸油
  329. //7.判断本仓是否破封或者施封,上报给平台
  330. if(((Full_Oil_allinfo.Auto_sealedOK_ID &(0x01<<i))==(0x01<<i))||(Full_Oil_allinfo.Break_sealing_Id&(0x01<<i))==(0x01<<i))//有破封或者施封进行上报
  331. {
  332. // Sealing_Data.Sealing_up_datetype = 1;//开始解封,上报
  333. }
  334. else//没有破封和施封
  335. {
  336. //不处理
  337. }
  338. }
  339. }
  340. }
  341. }
  342. if(Star_Decreaceoil_flag ==1)//开始卸油
  343. {
  344. for(i= 0;i<StoreNumber;i++)
  345. {
  346. if((Full_Oil_allinfo.Start_Decrease_flag&(0x01<<i))== (0x01<<i))//仓
  347. {
  348. if((((IO_Date.IO_state[0])&(0x0c<<(i*4)))!=(0x0c<<(i*4)))||((IO_Date.IO_unload_switch&(1<<i))==(0<<i)))//底阀卸油阀有一个关闭了
  349. {
  350. Full_Oil_allinfo.Start_Decrease_flag &=~(1<<i);
  351. Off_loading_draw(Full_Oil_allinfo.Start_Decrease_flag);//5
  352. }
  353. }
  354. }
  355. if(Full_Oil_allinfo.Start_Decrease_flag ==0)//没有卸完关闭阀门或者卸尽
  356. {
  357. Off_loading_mark =0;
  358. Star_Decreaceoil_flag =2;
  359. }
  360. }
  361. if(Star_Decreaceoil_flag == 2)
  362. {
  363. for(i= 0;i<StoreNumber;i++)
  364. {
  365. if((Full_Oil_allinfo.Real_operation_ID&(1<<i))==(1<<i))
  366. {
  367. Full_Oil_allinfo.Real_operation_ID &=~(1<<i);
  368. Star_Decreaceoil_flag = 0;
  369. if((IO_Date.IO_unload_switch&(1<<i))==(0<<i))//本仓没有油了
  370. {
  371. Full_Oil_allinfo.Auto_Sealing_state =0;//解封状态
  372. Full_Oil_allinfo.Break_sealing_Id &=~(0x01<<i);//Full_Oil_allinfo.Real_operation_ID;//破封的仓清除
  373. Full_Oil_allinfo.Auto_sealedOK_ID &=~(0x01<<i);//施封信息清零
  374. Full_Oil_allinfo.Auto_sealedNOK_ID &=~(0x01<<i);
  375. Full_Oil_allinfo.Null_ID |=(0x01<<i);//置空仓
  376. Full_Oil_allinfo.Read_NULL_ID &=~(0x01<<i);//不在读取本仓是否有油
  377. /* AT24CXX_WriteOneByte(2032,Full_Oil_allinfo.Read_NULL_ID);//保存标志*/
  378. FM25L16B_WriteByte(ADDR_Break_sealing_Id,(uint8_t)Full_Oil_allinfo.Break_sealing_Id);//保存破封状态20200423
  379. }
  380. }
  381. }
  382. if(Full_Oil_allinfo.Real_operation_ID ==0)
  383. {
  384. Full_Oil_allinfo.Start_Decrease_flag = 0;
  385. Jump_page_id(Run_mode_key_info.Main_Page_id);//进入主界面//5
  386. }
  387. }
  388. }
  389. }
  390. //上报解封码,等待解封成功
  391. void Un_sealing_loading(void)
  392. {
  393. uint8_t i =0;
  394. //指纹解封
  395. if((PID>0)&&(Full_Oil_allinfo.Start_Full_flag!=1))//检测到指纹
  396. {
  397. if(Full_Oil_allinfo.Auto_sealedOK_ID>0)//1 1 1
  398. {
  399. if(SealedOK_backup ==0)
  400. {
  401. SealedOK_backup = Full_Oil_allinfo.Auto_sealedOK_ID;//备份施封仓
  402. //去掉施封的锁
  403. Full_Oil_allinfo.Auto_sealedOK_ID = 0;
  404. }
  405. }
  406. PID =0;
  407. }
  408. if(SealedOK_backup>0)
  409. {
  410. for(i= 0;i<StoreNumber;i++)
  411. {
  412. if((SealedOK_backup&(0x01<<i)))//找到施封的仓
  413. {
  414. //监测打开的阀门
  415. if(((IO_Date.IO_state[0])&(0x0f<<(i*4)))!=(0x00<<(i*4)))//有一个打开
  416. {
  417. SealedOK_backup&=~(0x01<<i);//去掉施封
  418. Sealing_Data.Sealing_up_datetype = 1;
  419. }
  420. }
  421. }
  422. }
  423. //监测打开的阀门
  424. //没有打开的阀门的仓自动施封(10分钟)
  425. if(Full_Oil_allinfo.finger_mark_time ==1)
  426. {
  427. Full_Oil_allinfo.finger_mark_time =0;
  428. //自动施封
  429. Full_Oil_allinfo.Auto_sealedOK_ID |= SealedOK_backup ;
  430. SealedOK_backup = 0;
  431. }
  432. }
  433. //破封
  434. uint8_t Break_seal_cnt_10[8]={0};//破封次数
  435. #include<string.h>
  436. #include "FreeRTOS.h"
  437. #include "task.h"
  438. void Break_Seal(void)
  439. {
  440. if(Full_Oil_allinfo.Auto_sealedOK_ID>0)//有施封的仓
  441. {
  442. int i =0;
  443. for(i= 0;i<StoreNumber;i++)
  444. {//所有仓位依次遍历--开始
  445. if((Full_Oil_allinfo.Auto_sealedOK_ID&(0x01<<i)))//找到施封的仓
  446. {//找到施封的仓----如果该仓位是施封状态----开始
  447. if(((~IO_Date.IO_state[0])&(0x0f<<(i*4)))==(0x0f<<(i*4)))//底阀和卸油阀、人孔盖和人孔小盖同时全关
  448. {/////////////阀门均为关闭状态;但是异常状态事件使得破封条件成立----开始
  449. if ((IO_Date.IO_normalstate[0] & (0x0f << (i * 4))) != 0) //人孔小盖、人孔盖、卸油阀、底阀有一个有异常
  450. {
  451. if ((Full_Oil_allinfo.Break_sealing_Id & (0x01 << i)) != (0x01 << i)) //破封报警 -------如果该仓位非破封状态 即破封bit=0
  452. { //满足破封条件则破封bit置1 -------如果该仓位非破封状态 即破封bit=0------开始
  453. // Full_Oil_allinfo.Break_sealing_taiId = i+1;
  454. Break_seal_cnt_10[i]++;
  455. if (Break_seal_cnt_10[i] >= TIME_OF_Break_seal_cnt) //???原来设了30,造成实际破封延时有约8S,引起客户投诉,现在改为7,约1.8S; By Daiyf at 2021-02-03.
  456. { ////门限次数判定算法---早期的传感器算法不稳定,多次连续破封才判定为破封------开始
  457. Full_Oil_allinfo.Break_sealing_Id |= 0x01 << i; //破仓报警 表示破封的仓号 将破封的对应bit置1
  458. IO_Date.Temp_IO_state[0] = IO_Date.IO_state[0];//破封原因
  459. IO_Date.Temp_IO_normalstate[0] = IO_Date.IO_normalstate[0];
  460. Sealing_Data.Sealing_up_datetype = 3; //通知平台
  461. Full_Oil_allinfo.Auto_sealedOK_ID &= ~(0x01 << i);
  462. Sealing_Data.Sealing_up_datetype = 3; //通知平台
  463. // Full_Oil_allinfo.Car_state =1;//车辆状态NOK
  464. Full_Oil_allinfo.Auto_Write_history_flag = 1; //做记录
  465. Full_Oil_allinfo.Auto_Write_history_ID = i + 1; //仓号
  466. Full_Oil_allinfo.Save_flag = 1; //保存到EEPROM
  467. flag_Seal_Break = 1; //破封声音控制
  468. Break_seal_cnt_10[i] = 0;
  469. Send_alarm10S(); //破封报警发送
  470. HAL_Delay(10 * 2); //阻塞时间
  471. ////李伟添加 20211027 破封时保存当前的破封信息
  472. memcpy(ValStateArr_PoFeng_0x13, ValStateArr_0x13, 64);
  473. memcpy(ValStateArr_PoFeng_0x20, ValStateArr_0x20, 64);
  474. //KeySlave485_Send_Data((uint8_t *)ValStateArr_0x13, 64);
  475. TerminalSlave485_Send_Data((uint8_t *)ValStateArr_0x13,64);
  476. // memset(PrintBuff,0,sizeof(PrintBuff));
  477. // HAL_GPIO_TogglePin(GPIOC, DWI_Pin); //看门狗sp706
  478. //__NOP();
  479. //HAL_Delay(10 * 2); //阻塞时间
  480. //KeySlave485_Send_Data((uint8_t *)ValStateArr_0x13, 64);
  481. //memset(PrintBuff,0,sizeof(PrintBuff));
  482. // HAL_GPIO_TogglePin(GPIOC, DWI_Pin); //看门狗sp706
  483. //__NOP();
  484. //HAL_Delay(10 * 2); //阻塞时间
  485. //KeySlave485_Send_Data((uint8_t *)ValStateArr_0x20, 64);
  486. TerminalSlave485_Send_Data((uint8_t *)ValStateArr_0x20, 64);
  487. // HAL_GPIO_TogglePin(GPIOC, DWI_Pin); //看门狗sp706
  488. Full_Oil_allinfo.Auto_sealedOK_ID &= ~(1 << i); //破封后清除施封信息 将施封的对应bit置0
  489. FM25L16B_WriteByte(ADDR_Auto_sealedOK_ID, Full_Oil_allinfo.Auto_sealedOK_ID); //保存施封状态20200423
  490. FM25L16B_WriteByte(ADDR_Break_sealing_Id, (uint8_t)Full_Oil_allinfo.Break_sealing_Id); //保存破封状态20200423
  491. } ////门限次数判定算法---早期的传感器算法不稳定,多次连续破封才判定为破封------结束
  492. } //满足破封条件则破封bit置1 -------如果该仓位非破封状态 即破封bit=0------结束
  493. }
  494. else
  495. {
  496. Break_seal_cnt_10[i]=0;
  497. }
  498. }/////////////阀门均为关闭状态;但是异常状态事件使得破封条件成立----开始
  499. else//施封仓有一个阀门被打开了,破封报警
  500. {/////////////任何一个阀门由关闭变为打开的状态导致状态由破封变为施封-----开始
  501. // debug_point_01: setup by Daiyf
  502. if(((Full_Oil_allinfo.Break_sealing_Id&(1<<i))!=(1<<i))&&(PID==0))//????????????????????PID
  503. {//-------如果该仓为非破封状态 即破封bit=0----开始
  504. // Full_Oil_allinfo.Car_state =1;//车辆状态NOK
  505. HAL_GPIO_TogglePin(GPIOE,LED5_Pin); // 有破风信息,LED5闪亮提示。 By Daiyf at 2021-02-03.
  506. Break_seal_cnt_10[i]++;
  507. //???原来设了30,造成实际破封延时有约8S,引起客户投诉,现在改为7,约1.8S; By Daiyf at 2021-02-03.
  508. if(Break_seal_cnt_10[i]>=TIME_OF_Break_seal_cnt) //20210608经龚经理,童赟,讨论后由7次变更为2次--因为二合一传感器已经做了滤波 李伟修改
  509. {
  510. //taskENTER_CRITICAL();
  511. IO_Date.Temp_IO_state[0] = IO_Date.IO_state[0];//破封原因
  512. IO_Date.Temp_IO_normalstate[0] = IO_Date.IO_normalstate[0];
  513. IO_Date.Updata_TempVar[i] = 1;
  514. Full_Oil_allinfo.Break_sealing_Id |=0x01<<i;//破仓报警
  515. Full_Oil_allinfo.Auto_sealedOK_ID &=~(0x01<<i);
  516. Sealing_Data.Sealing_up_datetype = 3;//通知平台
  517. Full_Oil_allinfo.Auto_Write_history_flag = 1;
  518. Full_Oil_allinfo.Auto_Write_history_ID = i+1;//仓号
  519. Full_Oil_allinfo.Save_flag =1;//保存到EEPROM
  520. flag_Seal_Break =1;//破封声音控制
  521. Break_seal_cnt_10[i]=0;
  522. Send_alarm10S();//破封报警发送
  523. HAL_Delay(10*2);//阻塞时间
  524. // //李伟添加 20211027 破封时保存当前的破封信息
  525. memcpy(ValStateArr_PoFeng_0x13,ValStateArr_0x13,64);
  526. memcpy(ValStateArr_PoFeng_0x20_Cang01,ValStateArr_0x20_Cang01,64);
  527. memcpy(ValStateArr_PoFeng_0x20_Cang02,ValStateArr_0x20_Cang02,64);
  528. //KeySlave485_Send_Data((uint8_t *)ValStateArr_0x13,64);
  529. TerminalSlave485_Send_Data((uint8_t *)ValStateArr_0x13,64);
  530. // memset(PrintBuff,0,sizeof(PrintBuff));
  531. // HAL_GPIO_TogglePin(GPIOC, DWI_Pin);//看门狗sp706
  532. __NOP();
  533. HAL_Delay(10*1);//阻塞时间
  534. //KeySlave485_Send_Data((uint8_t *)ValStateArr_0x13,64);
  535. TerminalSlave485_Send_Data((uint8_t *)ValStateArr_0x13,64);
  536. // memset(PrintBuff,0,sizeof(PrintBuff));
  537. // HAL_GPIO_TogglePin(GPIOC, DWI_Pin);//看门狗sp706
  538. __NOP();
  539. HAL_Delay(10*1);//阻塞时间
  540. //KeySlave485_Send_Data((uint8_t *)ValStateArr_0x20_Cang01,64);
  541. TerminalSlave485_Send_Data((uint8_t *)ValStateArr_0x20_Cang01,64);
  542. // HAL_GPIO_TogglePin(GPIOC, DWI_Pin);//看门狗sp706
  543. HAL_Delay(10*1);//阻塞时间
  544. //KeySlave485_Send_Data((uint8_t *)ValStateArr_0x20_Cang02,64);
  545. TerminalSlave485_Send_Data((uint8_t *)ValStateArr_0x20_Cang02,64);
  546. // HAL_GPIO_TogglePin(GPIOC, DWI_Pin);//看门狗sp706
  547. HAL_Delay(10*1);//阻塞时间
  548. //KeySlave485_Send_Data((uint8_t *)Array_Of_IO_0xA1,64);
  549. TerminalSlave485_Send_Data((uint8_t *)Array_Of_IO_0xA1,64);
  550. // HAL_GPIO_TogglePin(GPIOC, DWI_Pin);//看门狗sp706
  551. //taskEXIT_CRITICAL();
  552. Full_Oil_allinfo.Auto_sealedOK_ID &=~(1<<i);//施封清除破封信息
  553. FM25L16B_WriteByte(ADDR_Auto_sealedOK_ID,Full_Oil_allinfo.Auto_sealedOK_ID);//保存施封状态20200423
  554. FM25L16B_WriteByte(ADDR_Break_sealing_Id,(uint8_t)Full_Oil_allinfo.Break_sealing_Id);//保存施封状态20200423
  555. HAL_GPIO_WritePin(GPIOE, LED5_Pin, GPIO_PIN_RESET); // 破风信息成立,LED5长亮。 By Daiyf at 2021-02-03.
  556. }
  557. //做记录
  558. }//-------如果该仓为非破封状态 即破封bit=0----开始
  559. else
  560. {
  561. if(PID>0)//??????????????????????????????????????????????????PID
  562. {
  563. PID=0;
  564. Full_Oil_allinfo.Auto_sealedOK_ID &=~(0x01<<i);
  565. Sealing_Data.Sealing_up_datetype = 1;//通知平台
  566. Full_Oil_allinfo.Auto_Write_history_flag = 1;
  567. }
  568. Break_seal_cnt_10[i]=0;
  569. }
  570. }/////////////任何一个阀门由关闭变为打开的状态导致状态由破封变为施封-----结束
  571. }//找到施封的仓----如果该仓位是施封状态----结束
  572. }//所有仓位依次遍历--结束
  573. }
  574. }
  575. //卸尽检测,并去除破封信息,防止卸油时还存有底油,去除底油信息
  576. void Auto_unload_clear_info(void)
  577. {
  578. uint8_t i = 0;
  579. for(i = 0;i<StoreNumber;i++)
  580. {//for(i = 0;i<StoreNumber;i++)
  581. if((Full_Oil_allinfo.Null_ID&(1<<i))==(1<<i))//是空仓
  582. {//该仓位是空仓----开始
  583. if((Full_Oil_allinfo.Break_sealing_Id&(1<<i))==(1<<i))//有破封
  584. {//该仓位铅封状态是破封状态----开始
  585. if((IO_Date.IO_state[0]&(0x0c<<(i*4)))==(0x0c<<(i*4)))//底阀和卸油阀都开
  586. {//底阀和卸油阀都开----开始
  587. //一定需要开30S,否则会有漏洞
  588. if(Auto_unload_clear_start_flag == 1)//10S
  589. {
  590. Full_Oil_allinfo.Break_sealing_Id &=~(1<<i);//空仓清除破封信息
  591. // Full_Oil_allinfo.Auto_sealedOK_ID &=~(1<<i);//施封清除破封信息
  592. Full_Oil_allinfo.Read_NULL_ID &=~(1<<i);//不在读取本仓信息
  593. Auto_unload_clear_start_flag = 0;
  594. // FM25L16B_WriteByte(ADDR_Auto_sealedOK_ID,Full_Oil_allinfo.Auto_sealedOK_ID);//保存施封状态20200423
  595. FM25L16B_WriteByte(ADDR_Break_sealing_Id,Full_Oil_allinfo.Break_sealing_Id);//保存施封状态20200423
  596. }
  597. else
  598. {
  599. if(Auto_unload_clear_info_flag == 0)
  600. Auto_unload_clear_info_flag = 1;//开始计时
  601. }
  602. }//底阀和卸油阀都开----结束
  603. else
  604. {
  605. if(Auto_unload_clear_start_flag == 1)//阀门没开或者开的时间不够,标志清掉
  606. Auto_unload_clear_start_flag = 0;
  607. }
  608. }//该仓位铅封状态是破封状态----结束
  609. }//该仓位是空仓----结束
  610. }//for(i = 0;i<StoreNumber;i++)
  611. }
  612. //自动监测施封所有装油仓
  613. /*
  614. 思路:装完油,拔出静电控制器,没有脉冲,10分钟,所有的阀门关闭,则自动施封,置施封标志为1
  615. */
  616. /*
  617. void Auto_check_Seal_all(void)
  618. {
  619. if((Config_info_all.Config_fun_id&0x01)==0x01)//开启自动施封功能
  620. {
  621. if((overflow_cnt ==0)&&(Full_Oil_allinfo.Start_Full_flag ==1))
  622. {
  623. if(Start_auto_seal_flag ==1)//计时达到10分钟
  624. {
  625. Full_Oil_allinfo.Start_Seal_flag =1;//开始施封
  626. Start_auto_seal_flag =0;
  627. }
  628. }
  629. }
  630. }
  631. */
  632. //电子铅封系统处理
  633. void Elect_cover(void)
  634. {
  635. Fill_Oil();//装油检测
  636. Break_Seal();//破封检测
  637. Offloading_Oil();//卸油检测
  638. // Write_State_history();//历史数据记录
  639. // Save_elect_data();//保存数据到EEPROM
  640. //清除空仓破封信息
  641. Auto_unload_clear_info();//智能清除破封信息
  642. Un_sealing_loading();//智能解封
  643. /*
  644. Auto_check_Seal_all();//装完后关闭所有阀门,10min后自动施封
  645. */
  646. //#endif
  647. }
  648. //车辆状态判断,0 OK,1 NOK
  649. void Car_stateUpdate(void)
  650. {
  651. uint8_t temp =0;//3 4 1 1 2 3 3 7 4 15 2^n-1
  652. temp = pow(2,StoreNumber)-1;
  653. if(((Full_Oil_allinfo.Break_sealing_Id &temp) !=0))//没有异常并且没有破封
  654. {
  655. Full_Oil_allinfo.Car_state =2;//车辆状态破封
  656. }
  657. else if(IO_Date.IO_normalstate[0] != 0)
  658. {
  659. Full_Oil_allinfo.Car_state =1;//车辆状态NOK
  660. }
  661. else
  662. Full_Oil_allinfo.Car_state =0;//车辆状态OK
  663. }
  664. void Oil_Generater(void)
  665. {
  666. IO_Date.IO_unload_switch = 0;
  667. if (Config_info_all.Dump_info & 0x0f)
  668. {
  669. if (Collect485.UnloadState_Num1 != 0x55)
  670. {
  671. if (Collect485.UnloadState_Num1 & 1)
  672. {
  673. IO_Date.IO_unload_switch |= 1;
  674. }
  675. }
  676. if (Collect485.UnloadState_Num2 != 0x55)
  677. {
  678. if (Collect485.UnloadState_Num2 & 1)
  679. {
  680. IO_Date.IO_unload_switch |= 2;
  681. }
  682. }
  683. if (Collect485.UnloadState_Num3 != 0x55)
  684. {
  685. if (Collect485.UnloadState_Num3 & 1)
  686. {
  687. IO_Date.IO_unload_switch |= 4;
  688. }
  689. }
  690. if (Collect485.UnloadState_Num4 != 0x55)
  691. {
  692. if (Collect485.UnloadState_Num4 & 1)
  693. {
  694. IO_Date.IO_unload_switch |= 8;
  695. }
  696. }
  697. if (Collect485.UnloadState_Num5 != 0x55)
  698. {
  699. if (Collect485.UnloadState_Num5 & 1)
  700. {
  701. IO_Date.IO_unload_switch |= 0x10;
  702. }
  703. }
  704. if (Collect485.UnloadState_Num6 != 0x55)
  705. {
  706. if (Collect485.UnloadState_Num6 & 1)
  707. {
  708. IO_Date.IO_unload_switch |= 0x20;
  709. }
  710. }
  711. if (Collect485.UnloadState_Num7 != 0x55)
  712. {
  713. if (Collect485.UnloadState_Num7 & 1)
  714. {
  715. IO_Date.IO_unload_switch |= 0x40;
  716. }
  717. }
  718. if (Collect485.UnloadState_Num8 != 0x55)
  719. {
  720. if (Collect485.UnloadState_Num8 & 1)
  721. {
  722. IO_Date.IO_unload_switch |= 0x80;
  723. }
  724. }
  725. }
  726. }
  727. //uint8_t Temp_data_flag = 0;
  728. //实时获取阀门状态
  729. void Test_get_state(void)
  730. {
  731. uint8_t i;
  732. IO_Date.IO_allnum=4*StoreNumber; //IO总数 m u8
  733. IO_Date.IO_statenum=IO_Date.IO_allnum/32+1; //IO状态组数 n(1~8) n=(m/32)+1 u8
  734. //20210227 李伟更改 同龚天平、张毅商定之后的结论
  735. IO_Date.IO_allnum = 8;//4*StoreNumber; //IO总数 m u8
  736. IO_Date.IO_statenum = 3;//IO_Date.IO_allnum/32+1; //IO状态组数 n(1~8) n=(m/32)+1 u8
  737. if((IO_Date.IO_allnum/32)<1)
  738. {
  739. Oil_Generater();
  740. for(i=0;i<StoreNumber;i++)
  741. {
  742. // if(Sealing_Data.TerminalOnLineFlag == False)
  743. // {
  744. if(Statetemp.rkg[i]== 0x55)
  745. {
  746. int a = 1<<(i*4+1);
  747. IO_Date.IO_state[0]&=~a;//置0
  748. IO_Date.IO_normalstate[0]|=a;//置1 报异常
  749. }
  750. else
  751. {
  752. int a = 1<<(i*4+1);
  753. IO_Date.IO_state[0] = (IO_Date.IO_state[0]&(~a))|Statetemp.rkg[i]<<(i*4+1);
  754. IO_Date.IO_normalstate[0] &=~a;//置0,取消异常
  755. }
  756. if(Statetemp.rkgx[i]== 0x55)
  757. {
  758. int a = 1<<(i*4+0);//8->4
  759. IO_Date.IO_state[0]&=~a;//置0c
  760. IO_Date.IO_normalstate[0]|=a;//置1 报异常
  761. }
  762. else
  763. {
  764. int a = 1<<(i*4+0);
  765. // IO_Date.IO_state[0] &=~a;//把当前位置0
  766. // IO_Date.IO_state[0] |= Statetemp.rkgx[i]<<(i*4+0);//获取当前位的值
  767. IO_Date.IO_state[0] =( IO_Date.IO_state[0]&~a)| Statetemp.rkgx[i]<<(i*4+0);
  768. IO_Date.IO_normalstate[0] &=~a;//置0,取消异常
  769. }
  770. if(Statetemp.xyf[i] ==0x55)//卸油阀
  771. {
  772. int a = 1<<(i*4+2);
  773. IO_Date.IO_state[0]&=~a;//置0
  774. IO_Date.IO_normalstate[0]|=a;//置1 报异常
  775. }
  776. else
  777. {
  778. int a = 1<<(i*4+2);
  779. //int a=0;
  780. // IO_Date.IO_state[0] &=~a;//把当前位置0
  781. // IO_Date.IO_state[0] |= Statetemp.xyf[i]<<(i*4+2);//获取当前位的值
  782. IO_Date.IO_state[0] = (IO_Date.IO_state[0]&(~a))|Statetemp.xyf[i]<<(i*4+2);//0<<(i*4+2);//
  783. IO_Date.IO_normalstate[0] &=~a;//置0,取消异常
  784. }
  785. if(Statetemp.bottm[i] ==0x55)//异常 底阀
  786. {
  787. int a = 1<<(i*4+3);
  788. IO_Date.IO_state[0]&=~a;//置0
  789. IO_Date.IO_normalstate[0]|=a;//置1 报异常
  790. }
  791. else //正常
  792. {
  793. int a = 1<<(i*4+3);
  794. // IO_Date.IO_state[0] &=~a;//把当前位置0
  795. // IO_Date.IO_state[0] |= Statetemp.bottm[i]<<(i*4+3);//获取当前位的值
  796. IO_Date.IO_state[0] = (IO_Date.IO_state[0]&(~a))|Statetemp.bottm[i]<<(i*4+3);
  797. IO_Date.IO_normalstate[0] &=~a;//置0,取消异常
  798. }
  799. // }
  800. #if 0
  801. //获取卸尽传感器的IO状态,因为太敏感,所以除了装油和运输以为,卸完油不在监测是否还有油
  802. if((Config_info_all.Config_fun_id&0x10)==0x00)//默认一边有油则有油,两边无油则无油
  803. {
  804. int j = (Config_info_all.Dump_info & 0x0f) / StoreNumber;
  805. int mask=0,k;
  806. for(k=0;k<j;++k)
  807. {
  808. mask<<=1;
  809. mask |=1;
  810. }
  811. IO_Date.IO_unload_switch=0;
  812. if ((((Config_info_all.Dump_info & 0x0f) % StoreNumber) == 0) && j)
  813. {
  814. if (Collect485.UnloadState_Num1 != 0x55)
  815. {
  816. if(Collect485.UnloadState_Num1&mask)
  817. {
  818. IO_Date.IO_unload_switch |= 1;
  819. }
  820. }
  821. if (Collect485.UnloadState_Num2 != 0x55)
  822. {
  823. if(Collect485.UnloadState_Num2&mask)
  824. {
  825. IO_Date.IO_unload_switch |= 2;
  826. }
  827. }
  828. if (Collect485.UnloadState_Num3 != 0x55)
  829. {
  830. if(Collect485.UnloadState_Num3&mask)
  831. {
  832. IO_Date.IO_unload_switch |= 4;
  833. }
  834. }
  835. if (Collect485.UnloadState_Num4 != 0x55)
  836. {
  837. if(Collect485.UnloadState_Num4&mask)
  838. {
  839. IO_Date.IO_unload_switch |= 8;
  840. }
  841. }
  842. if (Collect485.UnloadState_Num5 != 0x55)
  843. {
  844. if(Collect485.UnloadState_Num5&mask)
  845. {
  846. IO_Date.IO_unload_switch |= 0x10;
  847. }
  848. }
  849. if (Collect485.UnloadState_Num6 != 0x55)
  850. {
  851. if(Collect485.UnloadState_Num6&mask)
  852. {
  853. IO_Date.IO_unload_switch |= 0x20;
  854. }
  855. }
  856. if (Collect485.UnloadState_Num7 != 0x55)
  857. {
  858. if(Collect485.UnloadState_Num7&mask)
  859. {
  860. IO_Date.IO_unload_switch |= 0x40;
  861. }
  862. }
  863. if (Collect485.UnloadState_Num8 != 0x55)
  864. {
  865. if(Collect485.UnloadState_Num8&mask)
  866. {
  867. IO_Date.IO_unload_switch |= 0x80;
  868. }
  869. }
  870. }
  871. }
  872. else if((Config_info_all.Config_fun_id&0x10)==0x10)//一边无油则无油,两边有油则有油
  873. {
  874. int j = (Config_info_all.Dump_info & 0x0f) / StoreNumber;
  875. int mask=0,k;
  876. for(k=0;k<j;++k)
  877. {
  878. mask<<=1;
  879. mask |=1;
  880. }
  881. IO_Date.IO_unload_switch=0;
  882. if (Collect485.UnloadState_Num1 != 0x55)
  883. {
  884. if((Collect485.UnloadState_Num1&mask)==mask)
  885. {
  886. IO_Date.IO_unload_switch |= 1;
  887. }
  888. }
  889. if (Collect485.UnloadState_Num2 != 0x55)
  890. {
  891. if((Collect485.UnloadState_Num2&mask)==mask)
  892. {
  893. IO_Date.IO_unload_switch |= 2;
  894. }
  895. }
  896. if (Collect485.UnloadState_Num3 != 0x55)
  897. {
  898. if((Collect485.UnloadState_Num3&mask)==mask)
  899. {
  900. IO_Date.IO_unload_switch |= 4;
  901. }
  902. }
  903. if (Collect485.UnloadState_Num4 != 0x55)
  904. {
  905. if((Collect485.UnloadState_Num4&mask)==mask)
  906. {
  907. IO_Date.IO_unload_switch |= 8;
  908. }
  909. }
  910. if (Collect485.UnloadState_Num5 != 0x55)
  911. {
  912. if((Collect485.UnloadState_Num5&mask)==mask)
  913. {
  914. IO_Date.IO_unload_switch |= 0x10;
  915. }
  916. }
  917. if (Collect485.UnloadState_Num6 != 0x55)
  918. {
  919. if((Collect485.UnloadState_Num6&mask)==mask)
  920. {
  921. IO_Date.IO_unload_switch |= 0x20;
  922. }
  923. }
  924. if (Collect485.UnloadState_Num7 != 0x55)
  925. {
  926. if((Collect485.UnloadState_Num7&mask)==mask)
  927. {
  928. IO_Date.IO_unload_switch |= 0x40;
  929. }
  930. }
  931. if (Collect485.UnloadState_Num8 != 0x55)
  932. {
  933. if((Collect485.UnloadState_Num8&mask)==mask)
  934. {
  935. IO_Date.IO_unload_switch |= 0x80;
  936. }
  937. }
  938. }
  939. #endif
  940. /*
  941. else
  942. {
  943. //new
  944. IO_Date.IO_Discharge_state =(IO_Date.IO_Discharge_state&(0xf0));//|((Pneumatic_newPR1<<0)|(Pneumatic_newPR2<<1)|(Pneumatic_newPR3<<2)|(Pneumatic_newPR4<<3));
  945. if((Config_info_all.Dump_info&0x0f)>StoreNumber)//
  946. {
  947. IO_Date.IO_unload_switch =((((IO_Date.IO_Discharge_state>>4)&0x01)|((IO_Date.IO_Discharge_state>>5)&0x01))<<0)|\
  948. ((((IO_Date.IO_Discharge_state>>6)&0x01)|((IO_Date.IO_Discharge_state>>7)&0x01))<<1);//2个卸油阀并一个卸油阀 只有2仓车会用到的
  949. }
  950. else
  951. {
  952. IO_Date.IO_unload_switch = IO_Date.IO_Discharge_state>>4;//高四位;
  953. }
  954. }
  955. */
  956. if((Full_Oil_allinfo.Break_sealing_Id&(1<<i))==(1<<i))//有破封
  957. {
  958. if(((IO_Date.IO_unload_switch&(1<<i))==(0<<i))&&((IO_Date.IO_state[0]&(0x08<<(i*4)))==(0x08<<(i*4))))//底阀打开并且没油则为无油
  959. {
  960. Full_Oil_allinfo.Null_ID |=(1<<i);
  961. }
  962. else //if((IO_Date.IO_unload_switch&(1<<i))==(1<<i))//有油则为有油
  963. {
  964. Full_Oil_allinfo.Null_ID &=~(1<<i);
  965. }
  966. }
  967. else
  968. {
  969. if((IO_Date.IO_unload_switch&(1<<i))==(0<<i))//&&((IO_Date.IO_state[0]&(0x08<<(i*4)))==(0x08<<(i*4))))//底阀打开并且没油则为无油1有油0无油
  970. {
  971. Full_Oil_allinfo.Null_ID |=(1<<i);
  972. FUll_to_Oil_time =0;
  973. }
  974. else //if((IO_Date.IO_unload_switch&(1<<i))==(1<<i))//有油则为有油 --------------------解封可能有问题-------------------------
  975. {
  976. Full_Oil_allinfo.Null_ID &=~(1<<i);
  977. if(FUll_to_Oil_time ==0)
  978. {
  979. FUll_to_Oil_time =1;
  980. }
  981. }
  982. }
  983. if((IO_Date.IO_unload_switch ==0)&&(Full_Oil_allinfo.Start_Decrease_flag == 0)&&(Full_Oil_allinfo.Break_sealing_Id == 0))//没有并且完成卸油了
  984. FUll_to_Oil_time =0;
  985. }
  986. // if(IO_Date.IO_normalstate[0] == 0)
  987. // {
  988. // IO_Date.IO_normaldata=0; //不带异常数据
  989. // if(IO_Date.IO_state[0]>0)
  990. // {
  991. // if(IO_Date.Temp_IO_state[0]!=IO_Date.IO_state[0])//状态改变
  992. // {
  993. // IO_Date.Temp_IO_state[0] = IO_Date.IO_state[0];
  994. // Temp_data_flag = 0;
  995. // }
  996. // if(Temp_data_flag == 0)
  997. // {
  998. // IO_Date.IO_emergencyflag |=1<<7; //开关打开 重要数据
  999. // Temp_data_flag = 1;
  1000. // }
  1001. // else
  1002. // {
  1003. // IO_Date.IO_emergencyflag &=~(0x80);
  1004. // }
  1005. // }
  1006. // }
  1007. }
  1008. Car_stateUpdate();//车辆状态判断
  1009. }