/*Fuction: 处理电子铅封流程(装油、卸油、施封、破封、屏上显示等)*/ #include "Elec_Seal.h" #include "TerminalSlave485.h" #include "CollectMaster485.h" #include "KeySlave485.h" #include "Dwin.h" #include #include "tim.h" #include "spi.h" //李伟增加宏定义 20210227 李伟修改 Full_Oil_Info_TypeDef Full_Oil_allinfo; uint8_t Send_data_nu = 0;//发送命令编号 0表示空白 1表示实时状态发送 2表示询问装油、卸油信息 3表示切换窗口 uint8_t Auto_unload_clear_info_flag = 0,Auto_unload_clear_start_flag = 0;//清除空仓破封信息标志 开始清除标志 uint8_t FUll_to_Oil_time =0;// uint8_t SealedOK_backup =0;//解封时备份施封信息 uint8_t Full_oil_flag =0;//允许装油标注 uint8_t Dislpay_flag =0;//装油动画只显示一次 uint8_t Star_fulloil_flag =0;//1 开始装油 2等待关闭所有阀门 3装油完成 进行施封 4.等待打开所有阀门 uint8_t Fill_Oil_fish_ID = 0,Fill_Oil_Nfish_ID = 0; uint32_t PID=0; extern uint8_t flag_En_BlankSeal;//1=允许空仓施封 0=禁止空仓施封 extern uint8_t (*ptrIO_EachCang)[64]; extern uint8_t Cang01_IO[64]; extern uint8_t Cang02_IO[64]; extern uint8_t Cang03_IO[64]; extern uint8_t Cang04_IO[64]; extern uint8_t Cang05_IO[64]; extern uint8_t Cang06_IO[64]; extern uint8_t Cang07_IO[64]; extern uint8_t Cang08_IO[64]; //装油逻辑开始处理 void Fill_Oil( void)//装油 { //全自动装油 if((Full_Oil_allinfo.Start_Full_flag ==1)&&(Full_Oil_allinfo.Start_Decrease_flag ==0))//开始装油 { //2.检查打开的阀门确认上装和下装 int i =0; //没有操作仓需要显示空仓 Full_oil_flag for(i= 0;i0))//防止被人提前按了施封//防止被人提前按了施封 { PID = 0; Full_Oil_allinfo.Start_Seal_flag =0; Full_Oil_allinfo.Start_Full_flag =0; Go_homepage(); } } if(Star_fulloil_flag == 1)//开始装油 { int i =0; for(i= 0;i0))//手动施封 { if((IO_Date.IO_unload_switch&Full_Oil_allinfo.Real_operation_ID)>0)//==Full_Oil_allinfo.Real_operation_ID) 只要操作了有油就可以施封 // if(1)//20210104 李伟更改 只要按下F2按键,不管有没有油均可以施封(根据周例会同童赟、张毅的讨论结果,龚经理拍板:按下F2键,强制阀门关闭状态下可以施封,不管有没有油,不管二合一传感器) { Full_Oil_allinfo.Read_NULL_ID |= IO_Date.IO_unload_switch&Full_Oil_allinfo.Real_operation_ID; /* AT24CXX_WriteOneByte(2032,Full_Oil_allinfo.Read_NULL_ID);//保存信息,用于开机是否检查对应的仓是否有油*/ Full_Oil_allinfo.Auto_sealedOK_ID |= Fill_Oil_fish_ID&IO_Date.IO_unload_switch; if(SealedOK_backup>0) { Full_Oil_allinfo.Auto_sealedOK_ID |=SealedOK_backup; } Full_Oil_allinfo.Auto_sealedNOK_ID |=Fill_Oil_Nfish_ID; // Full_Oil_allinfo.Break_sealing_Id = 0; Full_Oil_allinfo.Start_Full_flag =0; Full_Oil_allinfo.Start_Seal_flag = 0;// Sealing_Data.Sealing_up_datetype = 2;//上报报平台,进行施封 Full_Oil_allinfo.Auto_Write_history_flag =1;//写入历史数据 Full_Oil_allinfo.Save_flag =1;//保存到EEPROM //发送标志 Dislpay_flag =0; Star_fulloil_flag = 0; Fill_Oil_Nfish_ID =0; Fill_Oil_fish_ID = 0; Full_Oil_allinfo.Real_operation_ID = 0; FUll_to_Oil_time =2; Go_homepage(); } else//没有油进行施封,或者操作仓不匹配,施封掉有油的,没有的不施封 { //Full_Oil_allinfo.Read_NULL_ID &= (IO_Date.IO_unload_switch); Full_Oil_allinfo.Null_ID &= ~(IO_Date.IO_unload_switch&Full_Oil_allinfo.Real_operation_ID); Full_Oil_allinfo.Read_NULL_ID = ~Full_Oil_allinfo.Null_ID; /* AT24CXX_WriteOneByte(2032,Full_Oil_allinfo.Read_NULL_ID);//保存信息,用于开机是否检查对应的仓是否有油*/ Full_Oil_allinfo.Start_Full_flag =0; Full_Oil_allinfo.Start_Seal_flag = 0;// Dislpay_flag =0; Star_fulloil_flag = 0; Fill_Oil_Nfish_ID =0; Fill_Oil_fish_ID = 0; Full_Oil_allinfo.Real_operation_ID = 0; Go_homepage(); } PID = 0; Full_oil_flag =0; Full_Oil_allinfo.Auto_full_oil_mode =0; //FM25L16B_WriteByte(100,Full_Oil_allinfo.Auto_sealedOK_ID);//保存施封状态20200423 FM25L16B_WriteByte(ADDR_Auto_sealedOK_ID,Full_Oil_allinfo.Auto_sealedOK_ID);//保存施封状态20200423 } else { if((IO_Date.IO_unload_switch&Full_Oil_allinfo.Real_operation_ID)==0)//没装进去油 { // Full_Oil_allinfo.Null_ID &= ~(IO_Date.IO_unload_switch&Full_Oil_allinfo.Real_operation_ID); // Full_Oil_allinfo.Read_NULL_ID = ~Full_Oil_allinfo.Null_ID; // AT24CXX_WriteOneByte(2032,Full_Oil_allinfo.Read_NULL_ID);//保存信息,用于开机是否检查对应的仓是否有油 Full_Oil_allinfo.Start_Full_flag =0; Full_Oil_allinfo.Start_Seal_flag = 0;// Dislpay_flag =0; Star_fulloil_flag = 0; Fill_Oil_Nfish_ID =0; Fill_Oil_fish_ID = 0; Full_Oil_allinfo.Real_operation_ID = 0; Full_Oil_allinfo.Auto_full_oil_mode = 0; } } } } /*骏鹏要求有油就可以施封,不需要施封流程*/ //if(Full_Oil_allinfo.Start_Seal_flag ==1)//保存施封状态20200604 { // Star_fulloil_flag=3; #if 0 // if ((Config_info_all.Config_fun_id&0x08) == 0x08) //?? 李工让苏祥临时做的修改,只要有油就可施封。4-5 ,note by Daiyf at 2021-4-12. // {//==0x08对应于bit3-----可以重复施封 uint8_t j = 0; for(j = 0;j < StoreNumber;j ++) { switch (j) { case 0: ptrIO_EachCang = &Cang01_IO; break; case 1: ptrIO_EachCang = &Cang02_IO; break; case 2: ptrIO_EachCang = &Cang03_IO; break; case 3: ptrIO_EachCang = &Cang04_IO; break; case 4: ptrIO_EachCang = &Cang05_IO; break; case 5: ptrIO_EachCang = &Cang06_IO; break; case 6: ptrIO_EachCang = &Cang07_IO; break; case 7: ptrIO_EachCang = &Cang08_IO; break; default: ptrIO_EachCang = &Cang01_IO; break; } if(((Full_Oil_allinfo.Break_sealing_Id&(1<0)&&(Full_Oil_allinfo.Start_Full_flag!=1))//检测到指纹 { if(Full_Oil_allinfo.Auto_sealedOK_ID>0)//1 1 1 { if(SealedOK_backup ==0) { SealedOK_backup = Full_Oil_allinfo.Auto_sealedOK_ID;//备份施封仓 //去掉施封的锁 Full_Oil_allinfo.Auto_sealedOK_ID = 0; } } PID =0; } if(SealedOK_backup>0) { for(i= 0;i #include "FreeRTOS.h" #include "task.h" void Break_Seal(void) { if(Full_Oil_allinfo.Auto_sealedOK_ID>0)//有施封的仓 { int i =0; for(i= 0;i= TIME_OF_Break_seal_cnt) //???原来设了30,造成实际破封延时有约8S,引起客户投诉,现在改为7,约1.8S; By Daiyf at 2021-02-03. { ////门限次数判定算法---早期的传感器算法不稳定,多次连续破封才判定为破封------开始 Full_Oil_allinfo.Break_sealing_Id |= 0x01 << i; //破仓报警 表示破封的仓号 将破封的对应bit置1 IO_Date.Temp_IO_state[0] = IO_Date.IO_state[0];//破封原因 IO_Date.Temp_IO_normalstate[0] = IO_Date.IO_normalstate[0]; Sealing_Data.Sealing_up_datetype = 3; //通知平台 Full_Oil_allinfo.Auto_sealedOK_ID &= ~(0x01 << i); Sealing_Data.Sealing_up_datetype = 3; //通知平台 // Full_Oil_allinfo.Car_state =1;//车辆状态NOK Full_Oil_allinfo.Auto_Write_history_flag = 1; //做记录 Full_Oil_allinfo.Auto_Write_history_ID = i + 1; //仓号 Full_Oil_allinfo.Save_flag = 1; //保存到EEPROM flag_Seal_Break = 1; //破封声音控制 Break_seal_cnt_10[i] = 0; Send_alarm10S(); //破封报警发送 HAL_Delay(10 * 2); //阻塞时间 ////李伟添加 20211027 破封时保存当前的破封信息 memcpy(ValStateArr_PoFeng_0x13, ValStateArr_0x13, 64); memcpy(ValStateArr_PoFeng_0x20, ValStateArr_0x20, 64); //KeySlave485_Send_Data((uint8_t *)ValStateArr_0x13, 64); TerminalSlave485_Send_Data((uint8_t *)ValStateArr_0x13,64); // memset(PrintBuff,0,sizeof(PrintBuff)); // HAL_GPIO_TogglePin(GPIOC, DWI_Pin); //看门狗sp706 //__NOP(); //HAL_Delay(10 * 2); //阻塞时间 //KeySlave485_Send_Data((uint8_t *)ValStateArr_0x13, 64); //memset(PrintBuff,0,sizeof(PrintBuff)); // HAL_GPIO_TogglePin(GPIOC, DWI_Pin); //看门狗sp706 //__NOP(); //HAL_Delay(10 * 2); //阻塞时间 //KeySlave485_Send_Data((uint8_t *)ValStateArr_0x20, 64); TerminalSlave485_Send_Data((uint8_t *)ValStateArr_0x20, 64); // HAL_GPIO_TogglePin(GPIOC, DWI_Pin); //看门狗sp706 Full_Oil_allinfo.Auto_sealedOK_ID &= ~(1 << i); //破封后清除施封信息 将施封的对应bit置0 FM25L16B_WriteByte(ADDR_Auto_sealedOK_ID, Full_Oil_allinfo.Auto_sealedOK_ID); //保存施封状态20200423 FM25L16B_WriteByte(ADDR_Break_sealing_Id, (uint8_t)Full_Oil_allinfo.Break_sealing_Id); //保存破封状态20200423 } ////门限次数判定算法---早期的传感器算法不稳定,多次连续破封才判定为破封------结束 } //满足破封条件则破封bit置1 -------如果该仓位非破封状态 即破封bit=0------结束 } else { Break_seal_cnt_10[i]=0; } }/////////////阀门均为关闭状态;但是异常状态事件使得破封条件成立----开始 else//施封仓有一个阀门被打开了,破封报警 {/////////////任何一个阀门由关闭变为打开的状态导致状态由破封变为施封-----开始 // debug_point_01: setup by Daiyf if(((Full_Oil_allinfo.Break_sealing_Id&(1<=TIME_OF_Break_seal_cnt) //20210608经龚经理,童赟,讨论后由7次变更为2次--因为二合一传感器已经做了滤波 李伟修改 { //taskENTER_CRITICAL(); IO_Date.Temp_IO_state[0] = IO_Date.IO_state[0];//破封原因 IO_Date.Temp_IO_normalstate[0] = IO_Date.IO_normalstate[0]; IO_Date.Updata_TempVar[i] = 1; Full_Oil_allinfo.Break_sealing_Id |=0x01<0)//??????????????????????????????????????????????????PID { PID=0; Full_Oil_allinfo.Auto_sealedOK_ID &=~(0x01<4 IO_Date.IO_state[0]&=~a;//置0c IO_Date.IO_normalstate[0]|=a;//置1 报异常 } else { int a = 1<<(i*4+0); // IO_Date.IO_state[0] &=~a;//把当前位置0 // IO_Date.IO_state[0] |= Statetemp.rkgx[i]<<(i*4+0);//获取当前位的值 IO_Date.IO_state[0] =( IO_Date.IO_state[0]&~a)| Statetemp.rkgx[i]<<(i*4+0); IO_Date.IO_normalstate[0] &=~a;//置0,取消异常 } if(Statetemp.xyf[i] ==0x55)//卸油阀 { int a = 1<<(i*4+2); IO_Date.IO_state[0]&=~a;//置0 IO_Date.IO_normalstate[0]|=a;//置1 报异常 } else { int a = 1<<(i*4+2); //int a=0; // IO_Date.IO_state[0] &=~a;//把当前位置0 // IO_Date.IO_state[0] |= Statetemp.xyf[i]<<(i*4+2);//获取当前位的值 IO_Date.IO_state[0] = (IO_Date.IO_state[0]&(~a))|Statetemp.xyf[i]<<(i*4+2);//0<<(i*4+2);// IO_Date.IO_normalstate[0] &=~a;//置0,取消异常 } if(Statetemp.bottm[i] ==0x55)//异常 底阀 { int a = 1<<(i*4+3); IO_Date.IO_state[0]&=~a;//置0 IO_Date.IO_normalstate[0]|=a;//置1 报异常 } else //正常 { int a = 1<<(i*4+3); // IO_Date.IO_state[0] &=~a;//把当前位置0 // IO_Date.IO_state[0] |= Statetemp.bottm[i]<<(i*4+3);//获取当前位的值 IO_Date.IO_state[0] = (IO_Date.IO_state[0]&(~a))|Statetemp.bottm[i]<<(i*4+3); IO_Date.IO_normalstate[0] &=~a;//置0,取消异常 } // } #if 0 //获取卸尽传感器的IO状态,因为太敏感,所以除了装油和运输以为,卸完油不在监测是否还有油 if((Config_info_all.Config_fun_id&0x10)==0x00)//默认一边有油则有油,两边无油则无油 { int j = (Config_info_all.Dump_info & 0x0f) / StoreNumber; int mask=0,k; for(k=0;kStoreNumber)// { IO_Date.IO_unload_switch =((((IO_Date.IO_Discharge_state>>4)&0x01)|((IO_Date.IO_Discharge_state>>5)&0x01))<<0)|\ ((((IO_Date.IO_Discharge_state>>6)&0x01)|((IO_Date.IO_Discharge_state>>7)&0x01))<<1);//2个卸油阀并一个卸油阀 只有2仓车会用到的 } else { IO_Date.IO_unload_switch = IO_Date.IO_Discharge_state>>4;//高四位; } } */ if((Full_Oil_allinfo.Break_sealing_Id&(1<0) // { // if(IO_Date.Temp_IO_state[0]!=IO_Date.IO_state[0])//状态改变 // { // IO_Date.Temp_IO_state[0] = IO_Date.IO_state[0]; // Temp_data_flag = 0; // } // if(Temp_data_flag == 0) // { // IO_Date.IO_emergencyflag |=1<<7; //开关打开 重要数据 // Temp_data_flag = 1; // } // else // { // IO_Date.IO_emergencyflag &=~(0x80); // } // } // } } Car_stateUpdate();//车辆状态判断 }